You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by sh...@apache.org on 2016/08/24 18:27:32 UTC
cordova-coho git commit: CB-11749 - Added --stats-only,
--json and --sort-ascending flag to list-pulls command.
Repository: cordova-coho
Updated Branches:
refs/heads/master 187be3f03 -> 700161c48
CB-11749 - Added --stats-only, --json and --sort-ascending flag to list-pulls command.
--json only works with --stats-only and outputs the stats in JSON format (false by default).
--sort-ascending only works with --stats-only and sorts the results by fresh pull requests (false by default).
--json output starts on the second line, filter it out by piping the output to `tail -n +2`
`old` pull requests are PRs that are older than `--max-age`.
`stale` pull requests are PRs that are `old` and last commented on by `--hide-user`
This closes #134
Project: http://git-wip-us.apache.org/repos/asf/cordova-coho/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-coho/commit/700161c4
Tree: http://git-wip-us.apache.org/repos/asf/cordova-coho/tree/700161c4
Diff: http://git-wip-us.apache.org/repos/asf/cordova-coho/diff/700161c4
Branch: refs/heads/master
Commit: 700161c4890c2421bf82278871b993c5203ee9f7
Parents: 187be3f
Author: Shazron Abdullah <sh...@apache.org>
Authored: Tue Aug 23 17:50:42 2016 -0700
Committer: Shazron Abdullah <sh...@apache.org>
Committed: Wed Aug 24 11:27:17 2016 -0700
----------------------------------------------------------------------
src/list-pulls.js | 143 ++++++++++++++++++++++++++++++++++++++-----------
1 file changed, 111 insertions(+), 32 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cordova-coho/blob/700161c4/src/list-pulls.js
----------------------------------------------------------------------
diff --git a/src/list-pulls.js b/src/list-pulls.js
index 8aff9c4..65fe63e 100644
--- a/src/list-pulls.js
+++ b/src/list-pulls.js
@@ -48,7 +48,9 @@ function addLastCommentInfo(repo, pullRequests, callback) {
// For simplicity, we want to end up with the newest comment first, so reverse sort on create date.
return new Date(b.created_at) - new Date(a.created_at);
});
- pullRequest.lastUpdatedBy = comments[0] ? comments[0].user.login : pullRequest.user.login;
+ if (comments.length > 0) {
+ pullRequest.lastUpdatedBy = comments[0] ? comments[0].user.login : pullRequest.user.login;
+ }
if (--remaining === 0) {
callback();
}
@@ -108,7 +110,7 @@ function getPullRequestComments(url, existingComments, callback) {
});
}
-function listGitHubPullRequests(repo, maxAge, hideUser, short, callback) {
+function listGitHubPullRequests(repo, maxAge, hideUser, short, statsOnly, callback) {
var url = GITHUB_API_URL + 'repos/' + GITHUB_ORGANIZATION + '/' + repo + '/pulls';
request.get({ url: url, headers: { 'User-Agent': 'Cordova Coho' }}, function(err, res, pullRequests) {
@@ -133,17 +135,33 @@ function listGitHubPullRequests(repo, maxAge, hideUser, short, callback) {
});
var countAfterDateFilter = pullRequests.length;
- addLastCommentInfo(repo, pullRequests, next);
+ if (hideUser) {
+ addLastCommentInfo(repo, pullRequests, next);
+ } else {
+ next();
+ }
function next() {
+ var cbObj = {
+ "repo": repo,
+ "fresh-count": 0,
+ "old-count": 0,
+ "stale-count": 0,
+ "total-count": origCount,
+ "message": null
+ };
+
if (hideUser) {
pullRequests = pullRequests.filter(function(p) {
return p.lastUpdatedBy != hideUser;
});
}
var count = pullRequests.length;
+ cbObj['fresh-count'] = count;
- pullRequests.sort(function(a,b) {return (a.updated_at > b.updated_at) ? -1 : ((b.updated_at > a.updated_at) ? 1 : 0);} );
+ if (!statsOnly) {
+ pullRequests.sort(function(a,b) {return (a.updated_at > b.updated_at) ? -1 : ((b.updated_at > a.updated_at) ? 1 : 0);} );
+ }
var countMsg = count + ' Pull Requests';
if (countAfterDateFilter !== origCount || count !== countAfterDateFilter) {
@@ -151,42 +169,50 @@ function listGitHubPullRequests(repo, maxAge, hideUser, short, callback) {
}
if (countAfterDateFilter !== origCount) {
countMsg += (origCount - countAfterDateFilter) + ' old';
+ cbObj['old-count'] = (origCount - countAfterDateFilter);
if (count !== countAfterDateFilter) {
countMsg += ', ';
}
}
if (count !== countAfterDateFilter) {
countMsg += (countAfterDateFilter - count) + ' stale';
+ cbObj['stale-count'] = (countAfterDateFilter - count);
}
if (countAfterDateFilter !== origCount || count !== countAfterDateFilter) {
countMsg += ')';
}
- console.log('\x1B[31m========= ' + repo + ': ' + countMsg + '. =========\x1B[39m');
-
- pullRequests.forEach(function(pullRequest) {
- var updatedDate = new Date(pullRequest.updated_at);
- var daysAgo = Math.round((new Date() - updatedDate) / (60 * 60 * 24 * 1000));
- console.log('\x1B[33m-----------------------------------------------------------------------------------------------\x1B[39m');
- console.log('PR #' + pullRequest.number + ': ' + pullRequest.user.login + ': ' +
- pullRequest.title + ' (\x1B[31m' + (pullRequest.lastUpdatedBy || '<no comments>') + ' ' + daysAgo + ' days ago\x1B[39m)');
- console.log('\x1B[33m-----------------------------------------------------------------------------------------------\x1B[39m');
- console.log('* ' + pullRequest.html_url);
- // console.log('To merge: curl "' + pullRequest.patch_url + '" | git am');
- if (!pullRequest.head.repo) {
- console.log('NO REPO EXISTS!');
- } else {
- console.log('To merge: coho merge-pr --pr ' + pullRequest.number);
- }
- if (pullRequest.body) {
- if (short && pullRequest.body.length > 100) {
- console.log(pullRequest.body.substring(0, 100) + '...');
+
+ if (!statsOnly) {
+ console.log('\x1B[31m========= ' + repo + ': ' + countMsg + '. =========\x1B[39m');
+ }
+
+ if (!statsOnly) {
+ pullRequests.forEach(function(pullRequest) {
+ var updatedDate = new Date(pullRequest.updated_at);
+ var daysAgo = Math.round((new Date() - updatedDate) / (60 * 60 * 24 * 1000));
+ console.log('\x1B[33m-----------------------------------------------------------------------------------------------\x1B[39m');
+ console.log('PR #' + pullRequest.number + ': ' + pullRequest.user.login + ': ' +
+ pullRequest.title + ' (\x1B[31m' + (pullRequest.lastUpdatedBy || '<no comments>') + ' ' + daysAgo + ' days ago\x1B[39m)');
+ console.log('\x1B[33m-----------------------------------------------------------------------------------------------\x1B[39m');
+ console.log('* ' + pullRequest.html_url);
+ // console.log('To merge: curl "' + pullRequest.patch_url + '" | git am');
+ if (!pullRequest.head.repo) {
+ console.log('NO REPO EXISTS!');
} else {
- console.log(pullRequest.body);
+ console.log('To merge: coho merge-pr --pr ' + pullRequest.number);
}
- }
- console.log('');
- });
- callback();
+ if (pullRequest.body) {
+ if (short && pullRequest.body.length > 100) {
+ console.log(pullRequest.body.substring(0, 100) + '...');
+ } else {
+ console.log(pullRequest.body);
+ }
+ }
+ console.log('');
+ });
+ }
+ cbObj.message = countMsg;
+ callback(cbObj);
}
});
}
@@ -203,6 +229,18 @@ function *listPullRequestsCommand() {
desc: 'Hide PRs where the last comment\'s is by this github user.',
type: 'string'
})
+ .options('stats-only', {
+ desc: 'List stats for PRs in the repos specified.',
+ type: 'bool'
+ })
+ .options('sort-ascending', {
+ desc: 'Used in conjunction with --stats-only. Sort the PRs ascending.',
+ type: 'bool'
+ })
+ .options('json', {
+ desc: 'Used in conjunction with --stats-only. Output the report in JSON format.',
+ type: 'bool'
+ })
.options('short', {
desc: 'Truncates PR body description',
type: 'bool'
@@ -211,8 +249,11 @@ function *listPullRequestsCommand() {
'\n' +
'Example usage: $0 list-pulls --hide-user="agrieve" | tee pulls.list | less -R\n' +
'Example usage: $0 list-pulls --max-age=365 --repo=.\n' +
+ 'Example usage: $0 list-pulls --max-age=365 --repo=. --stats-only --json --sort-ascending --hide-user=cordova-qa | tail -n +2\n' +
'\n' +
- 'Please note that GitHub rate limiting applies. See http://developer.github.com/v3/#rate-limiting for details.\n');
+ 'Please note that GitHub rate limiting applies. See http://developer.github.com/v3/#rate-limiting for details.\n' +
+ 'You can also set the CORDOVA_GIT_ACCOUNT environment variable with your Github API key: https://github.com/settings/tokens\n'
+ );
var argv = opt.argv;
if (argv.h) {
@@ -221,11 +262,47 @@ function *listPullRequestsCommand() {
}
var repos = flagutil.computeReposFromFlag(argv.r);
+ var report = {
+ "title" : "coho list-pulls report",
+ // "command" : process.argv,
+ "timestamp" : new Date().toJSON(),
+ "max-age": argv['max-age'],
+ "repos" : []
+ };
+ var simple_report = [];
+
+ function next(reportObject) {
+ if (reportObject && argv['stats-only']) {
+ if (argv.json) {
+ report.repos.push(reportObject);
+ } else {
+ simple_report.push(reportObject);
+ }
+ }
- function next() {
if (repos.length) {
var repo = repos.shift();
- listGitHubPullRequests(repo.repoName, argv['max-age'], argv['hide-user'], argv.short, next);
+ listGitHubPullRequests(repo.repoName, argv['max-age'], argv['hide-user'], argv.short, argv['stats-only'], next);
+ } else if (argv['stats-only']){ // done
+ function compareFunc(a, b) {
+ if (a['fresh-count'] < b['fresh-count']) {
+ return argv['sort-ascending']? -1 : 1;
+ }
+ if (a['fresh-count'] > b['fresh-count']) {
+ return argv['sort-ascending']? 1 : -1;
+ }
+ return 0;
+ };
+
+ if (argv.json) {
+ report.repos.sort(compareFunc);
+ console.log(JSON.stringify(report, null, 4));
+ } else {
+ simple_report.sort(compareFunc);
+ simple_report.forEach(function(report) {
+ console.log(report.repo + ' --> ' + report.message);
+ });
+ }
}
}
@@ -233,7 +310,9 @@ function *listPullRequestsCommand() {
repos.forEach(function(repo) {
url += '+repo%3Aapache%2F' + repo.repoName;
});
- console.log(url);
+ if (!(argv['stats-only'] && argv['json'])) {
+ console.log(url);
+ }
next();
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cordova.apache.org
For additional commands, e-mail: commits-help@cordova.apache.org