Yellow Bike Project Hours and Transaction Database for Community Bike Shops
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

147 lines
4.5 KiB

var fs = require('fs'),
path = require('path'),
https = require('https');
var localeDir = path.join('src', 'locale');
var args = process.argv.slice(2);
function help() {
console.log(process.argv[1], '[list|mention|find-commenters] ARGS');
console.log();
console.log(' list show all authors in all locales');
console.log(' mention show all authors in all locales, ready to copy-paste in github issue');
console.log(' find-commenters #ID finds all people that participated in a github conversation');
}
function extract() {
var authors = {};
fs.readdirSync(localeDir).forEach(function (locale) {
var content = fs.readFileSync(path.join(localeDir, locale), {encoding: 'utf-8'}),
localeCode = locale.split('.')[0],
localeAuthors = [];
content.split('\n').forEach(function (line) {
var match = line.match(/^\/\/! author.*github[.]com\/(.*)$/);
if (match !== null) {
// console.log(" ", line);
localeAuthors.push(match[1]);
}
});
if (localeAuthors.length === 0) {
// use to debug
content.split('\n').forEach(function (line) {
var match = line.match(/^\/\/! author(.*)$/);
if (match !== null) {
localeAuthors.push('---' + match[1]);
}
});
console.log(localeCode, localeAuthors);
} else {
authors[localeCode] = localeAuthors;
}
});
return authors;
}
function list() {
var authors = extract();
Object.keys(authors).forEach(function (localeCode) {
console.log(localeCode, authors[localeCode]);
});
}
function mention() {
var authors = extract();
Object.keys(authors).forEach(function (localeCode) {
console.log('- [ ]', localeCode, authors[localeCode].map(function (author) { return '@' + author; }).join(' '));
});
}
function findCommenters(postId) {
function fetchComments(page, callback) {
var options = {
hostname: 'api.github.com',
port: 443,
path: '/repos/moment/moment/issues/' + postId + '/comments?page=' + page,
method: 'GET',
headers: {
'User-Agent': 'node script'
}
},
links = {};
console.log('fetching', options.path);
https.get(options, function (res) {
if ('link' in res.headers) {
res.headers.link.split(', ').forEach(function(linkStr) {
var pieces = linkStr.split('; ');
var key = pieces[1].split('=')[1];
var link = pieces[0];
key = key.substr(1, key.length - 2);
link = link.substr(1, link.length - 2);
links[key] = link;
});
}
var bodyChunks = [], body;
res.on('data', function (chunk) {
bodyChunks.push(chunk);
});
res.on('end', function () {
body = bodyChunks.join('');
callback(page, JSON.parse(body), links);
});
});
}
var commenters = {};
var maxPage = 1;
fetchComments(1, function (page, body, links) {
handleBody(body, page);
if ('last' in links) {
maxPage = parseInt(links.last.split('=')[1], 10);
}
var pagesLeft = maxPage - 1;
for (var p = 2; p <= maxPage; p += 1) {
fetchComments(p, function (page, body, links) {
handleBody(body, page);
pagesLeft -= 1;
if (pagesLeft === 0) {
handleCommenters(Object.keys(commenters));
}
});
}
});
function handleBody(body, page) {
body.forEach(function (comment) {
console.log(page, comment.user.login);
commenters[comment.user.login] = 1;
});
}
function handleCommenters(commenters) {
console.log('len of commenters', commenters.length);
console.log(commenters);
}
}
if (args.length === 0) {
help();
process.exit(0);
}
switch (args[0]) {
case 'list':
list();
break;
case 'mention':
mention();
break;
case 'find-commenters':
findCommenters(args[1]);
break;
default:
console.log('unknown argument', args[0]);
break;
}