in src/list-pulls.js [112:222]
function listGitHubPullRequests (repo, maxAge, hideUser, short, statsOnly, callback) {
const url = GITHUB_API_URL + 'repos/' + GITHUB_ORGANIZATION + '/' + repo + '/pulls';
request.get({ url, headers: { 'User-Agent': 'Cordova Coho' } }, function (err, res, pullRequests) {
if (err) {
apputil.fatal('Error getting pull requests from GitHub: ' + err);
} else if (!pullRequests) {
apputil.fatal('Error: GitHub returned no pull requests');
} else if (res.headers['x-ratelimit-remaining'] && res.headers['x-ratelimit-remaining'] === 0) {
const resetEpoch = new Date(res.headers['x-ratelimit-reset'] * 1000);
const expiration = resetEpoch.getHours() + ':' + resetEpoch.getMinutes() + ':' + resetEpoch.getSeconds();
apputil.fatal('Error: GitHub rate limit exceeded, wait till ' + expiration + ' before trying again.\n' +
'See http://developer.github.com/v3/#rate-limiting for details.');
}
pullRequests = JSON.parse(pullRequests);
const origCount = pullRequests.length;
if (pullRequests.message === 'Bad credentials') {
apputil.fatal('Error: GitHub Bad credentials. Check your CORDOVA_GIT_ACCOUNT environment variable which should be set with your Github API token: https://github.com/settings/tokens.',
'CORDOVA_GIT_ACCOUNT used: ' + process.env.CORDOVA_GIT_ACCOUNT);
}
pullRequests = pullRequests.filter(function (p) {
const updatedDate = new Date(p.updated_at);
const daysAgo = Math.round((new Date() - updatedDate) / (60 * 60 * 24 * 1000));
return daysAgo < maxAge;
});
const countAfterDateFilter = pullRequests.length;
if (hideUser) {
addLastCommentInfo(repo, pullRequests, next);
} else {
next();
}
function next () {
const cbObj = {
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;
});
}
const count = pullRequests.length;
cbObj['fresh-count'] = count;
if (!statsOnly) {
pullRequests.sort(function (a, b) { return (a.updated_at > b.updated_at) ? -1 : ((b.updated_at > a.updated_at) ? 1 : 0); });
}
let countMsg = count + ' Pull Requests';
if (countAfterDateFilter !== origCount || count !== countAfterDateFilter) {
countMsg += ' (plus ';
}
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 += ')';
}
if (!statsOnly) {
console.log('\x1B[31m========= ' + repo + ': ' + countMsg + '. =========\x1B[39m');
}
if (!statsOnly) {
pullRequests.forEach(function (pullRequest) {
const updatedDate = new Date(pullRequest.updated_at);
const 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) + '...');
} else {
console.log(pullRequest.body);
}
}
console.log('');
});
}
cbObj.message = countMsg;
callback(cbObj);
}
});
}