gengojs
Version:
the best i18n middleware for Node.js
117 lines (96 loc) • 3.9 kB
JavaScript
var URL = require('url');
var request = require('request');
var userAgent = require('../util/userAgent');
var log = require('../log');
var moment = require('moment');
var q = require('q');
function commitMessages(options) {
var deferred = q.defer();
// TODO: better argument check and url fix, or just use npm project name
var repoURL = URL.parse(options.repo.replace(/\.git$/, ''));
var project = repoURL.pathname;
if (!project) {
deferred.reject(new Error('that\'s no github url i know of'));
}
// remove leading /'s
project = project.replace(/^\//g, '');
var url = 'https://api.github.com/repos/' + project + '/commits?per_page=250';
log.debug('requesting: ' + url);
request({uri: url, json: true, headers: {'User-Agent': userAgent}}, function (err, res, data) {
log.debug('complete: ' + url);
if (err) {
return deferred.reject(err);
}
if (!data.map) {
return deferred.reject('Unknown Github Repo: ' + options.repo + '. ' + (data.message || JSON.stringify(data)));
}
var changes = data.map(function(change){
var date = new Date(change.commit.committer.date);
var message = change.commit.message;
return {
date: date,
message: message
};
});
deferred.resolve({
project: {
github: project,
repository: 'https://github.com/' + project
},
changes: changes,
versions: options.versions
});
});
return deferred.promise;
}
function changelog(repo, releaseRequested) {
return commitMessages({repo: repo})
.then(function(data) {
var versionsArray = [];
var versionsCache = {};
if (data && data.changes) {
data.changes.forEach(function(change){
if (change) {
var date = change.date;
var simpleDate = moment(date).format("YYYY-MM-DD");
versionsCache[simpleDate] = versionsCache[simpleDate] || { date: new Date(simpleDate), changes: [] };
versionsCache[simpleDate].changes.push(change);
}
});
}
Object.keys(versionsCache).forEach(function(simpleDate) {
versionsArray.push(versionsCache[simpleDate]);
});
// THIS SHOULD GO AWAY
if (releaseRequested) {
var tmpVersions = [];
var i;
// All == all versions
if (releaseRequested.toString().toLowerCase() === 'all') {
tmpVersions = versionsArray;
}
// Latest == Latest single version
else if (releaseRequested.toString().toLowerCase() === 'latest') {
tmpVersions.push(versionsArray[0]);
// Integer == that many versions. 1 = one version.
} else if (parseInt(releaseRequested, 10) === releaseRequested) {
for (i = 0; i < Math.min(releaseRequested, versionsArray.length - 1); i++) {
tmpVersions.push(versionsArray[i]);
}
// Require valid version
} else {
throw new Error('Github\'s API does not yet support release versions. See https://github.com/github/developer.github.com/issues/17 for more info.');
}
versionsArray = tmpVersions;
}
return{
project: data.project,
versions: versionsArray
};
});
}
module.exports = {
commitMessages: commitMessages,
changelog: changelog
};
;