#!/usr/bin/env node
var https = require('https');
var path = require('path');
var fs = require('fs');
var argv = require('optimist').argv;
var request = require('request');
function split_equal(array, length) {
var result = [];
var len = array.length;
if (len < length) {
return [array];
} else if (length < 0) {
throw new Error("split_equal: length can't be negative");
}
for (var i = 0; i < len; i += length) {
result.push(array.slice(i, i + length));
}
return result;
}
function get(url, query) {
var options = {
url: url,
qs: query,
headers: {
'User-Agent': 'Node.js'
}
};
if (argv.auth) {
var [user,pass] = argv.auth.split(':');
options.auth = {
user,
pass
};
}
//return;
return new Promise(function(resolve, reject) {
request(options, function(error, res, body) {
if (res.statusCode == 200) {
resolve(JSON.parse(body));
} else if (+res.headers['x-ratelimit-remaining'] == 0) {
var date = new Date(+res.headers['x-ratelimit-reset']*1000);
reject('Rate limit util ' + date);
} else {
reject('Error code ' + res.statusCode);
}
});
});
}
function get_file(filename) {
return new Promise(function(resolve, reject) {
fs.readFile(filename, function(err, data) {
if (err) {
reject(err);
} else {
resolve(JSON.parse(data.toString()));
}
});
});
}
function get_api(argv) {
var user = argv.u;
var repo = argv.r;
var path = '/repos/' + user + '/' + repo + '/contributors';
var query = {
"per_page": 100
};
if (argv.t) {
query['access_token'] = argv.t;
}
return get('https://api.github.com' + path, query).then(function(contributors) {
return Promise.all(contributors.map(function(contributor) {
var path = contributor.url.replace(/https:\/\/[^\/]+/, '');
return get('https://api.github.com' + path, query).then(function(user) {
if (user.name || user.login) {
var object = {
name: user.name || user.login
};
if (user.email) {
object.email = user.email;
}
if (user.blog) {
object.url = user.blog;
} else {
object.url = "https://github.com/" + user.login
}
object.avatar = contributor.avatar_url;
object.login = user.login;
return object;
}
});
}).filter(Boolean));
});
}
if ((argv.f && argv.m) || (argv.u && argv.r)) {
(argv.f ? get_file(argv.f) : get_api(argv)).then(function(contributors) {
if (argv.m) {
var split = split_equal(contributors, 7);
var align = new Array(split[0].length + 1).join('| :---: ') + ' |';
var rows = split.map(function(list) {
return '| ' + list.map(function(contributor) {
return '[
' +
'
' + contributor.name + '](' +
contributor.url + ')
[commits](https://github.com/jcubic' +
'/jquery.terminal/commits?author=' + contributor.login + ')';
}).join(' | ') + ' |';
});
rows.splice(1, 0, align);
console.log(rows.join('\n'));
} else {
console.log(JSON.stringify(contributors, null, 2));
}
}).catch(function(error) {
console.log('ERROR: ' + error);
});
} else {
var script = path.basename(process.argv[1]);
console.log('usage: \n' + script + '-u -r ' +
'[--auth githubUsername:githubPassword] [-m]\n' +
script + ' -f -m');
}