Path: blob/master/web-gui/buildyourownbotnet/assets/js/jquery-terminal/scripts/contributors.js
1293 views
#!/usr/bin/env node12var https = require('https');3var path = require('path');4var fs = require('fs');5var argv = require('optimist').argv;6var request = require('request');789function split_equal(array, length) {10var result = [];11var len = array.length;12if (len < length) {13return [array];14} else if (length < 0) {15throw new Error("split_equal: length can't be negative");16}17for (var i = 0; i < len; i += length) {18result.push(array.slice(i, i + length));19}20return result;21}2223function get(url, query) {24var options = {25url: url,26qs: query,27headers: {28'User-Agent': 'Node.js'29}30};31if (argv.auth) {32var [user,pass] = argv.auth.split(':');33options.auth = {34user,35pass36};37}38//return;39return new Promise(function(resolve, reject) {40request(options, function(error, res, body) {41if (res.statusCode == 200) {42resolve(JSON.parse(body));43} else if (+res.headers['x-ratelimit-remaining'] == 0) {44var date = new Date(+res.headers['x-ratelimit-reset']*1000);45reject('Rate limit util ' + date);46} else {47reject('Error code ' + res.statusCode);48}49});50});51}5253function get_file(filename) {54return new Promise(function(resolve, reject) {55fs.readFile(filename, function(err, data) {56if (err) {57reject(err);58} else {59resolve(JSON.parse(data.toString()));60}61});62});63}6465function get_api(argv) {66var user = argv.u;67var repo = argv.r;68var path = '/repos/' + user + '/' + repo + '/contributors';69var query = {70"per_page": 10071};72if (argv.t) {73query['access_token'] = argv.t;74}75return get('https://api.github.com' + path, query).then(function(contributors) {76return Promise.all(contributors.map(function(contributor) {77var path = contributor.url.replace(/https:\/\/[^\/]+/, '');78return get('https://api.github.com' + path, query).then(function(user) {79if (user.name || user.login) {80var object = {81name: user.name || user.login82};83if (user.email) {84object.email = user.email;85}86if (user.blog) {87object.url = user.blog;88} else {89object.url = "https://github.com/" + user.login90}91object.avatar = contributor.avatar_url;92object.login = user.login;93return object;94}95});96}).filter(Boolean));97});98}99100101if ((argv.f && argv.m) || (argv.u && argv.r)) {102(argv.f ? get_file(argv.f) : get_api(argv)).then(function(contributors) {103if (argv.m) {104var split = split_equal(contributors, 7);105var align = new Array(split[0].length + 1).join('| :---: ') + ' |';106var rows = split.map(function(list) {107return '| ' + list.map(function(contributor) {108return '[<img src="' + contributor.avatar + '" width="100px;"/>' +109'<br /><sub>' + contributor.name + '</sub>](' +110contributor.url + ')<br>[commits](https://github.com/jcubic' +111'/jquery.terminal/commits?author=' + contributor.login + ')';112}).join(' | ') + ' |';113});114rows.splice(1, 0, align);115console.log(rows.join('\n'));116} else {117console.log(JSON.stringify(contributors, null, 2));118}119}).catch(function(error) {120console.log('ERROR: ' + error);121});122} else {123var script = path.basename(process.argv[1]);124console.log('usage: \n' + script + '-u <user> -r <repo> ' +125'[--auth githubUsername:githubPassword] [-m]\n' +126script + ' -f <json filename> -m');127}128129130