123 lines
2.6 KiB
JavaScript
123 lines
2.6 KiB
JavaScript
var fs = require( "fs" );
|
|
var path = require( "path" );
|
|
var spawn = require( "spawnback" );
|
|
|
|
exports.getAuthors = getAuthors;
|
|
exports.updateAuthors = updateAuthors;
|
|
exports.updatePackageJson = updatePackageJson;
|
|
|
|
var banners = {
|
|
count: "Authors ordered by number of contributions",
|
|
date: "Authors ordered by first contribution"
|
|
};
|
|
|
|
var orderBy = {
|
|
count: function( authors ) {
|
|
var count = {};
|
|
return authors
|
|
.filter( unique( count ) )
|
|
.sort(function( a, b ) {
|
|
return count[ b ] - count[ a ];
|
|
});
|
|
},
|
|
|
|
date: function( authors ) {
|
|
return authors
|
|
.reverse()
|
|
.filter( unique() );
|
|
}
|
|
};
|
|
|
|
function getAuthors( options, callback ) {
|
|
spawn( "git",
|
|
[ "log", "--pretty=%aN <%aE>", options.dir || "." ],
|
|
function( error, result ) {
|
|
if ( error ) {
|
|
return callback( error );
|
|
}
|
|
|
|
options = getOptions( options );
|
|
|
|
var authors = result.trimRight().split( "\n" )
|
|
.concat( (options.priorAuthors || []).reverse() );
|
|
|
|
authors = orderBy[ options.order ]( authors );
|
|
|
|
callback( null, authors );
|
|
});
|
|
}
|
|
|
|
function getOptions( options ) {
|
|
if ( !orderBy.hasOwnProperty( options.order ) ) {
|
|
options.order = "date";
|
|
}
|
|
return options;
|
|
}
|
|
|
|
function unique( count ) {
|
|
count = count || {};
|
|
return function( key ) {
|
|
if ( !(key in count) ) {
|
|
count[ key ] = 0;
|
|
}
|
|
count[ key ]++;
|
|
return count[ key ] === 1;
|
|
};
|
|
}
|
|
|
|
function updateAuthors( options, callback ) {
|
|
getAuthors( options, function( error, authors ) {
|
|
if ( error ) {
|
|
return callback( error );
|
|
}
|
|
|
|
options = getOptions( options );
|
|
|
|
var banner = options.banner || banners[ options.order ];
|
|
var dir = options.dir || ".";
|
|
var filename = path.join( dir, options.filename || "AUTHORS.txt" );
|
|
|
|
fs.writeFile( filename,
|
|
banner + "\n\n" + authors.join( "\n" ) + "\n",
|
|
function( error ) {
|
|
if ( error ) {
|
|
return callback( error );
|
|
}
|
|
|
|
callback( null, filename );
|
|
});
|
|
});
|
|
}
|
|
|
|
function updatePackageJson( options, callback ) {
|
|
getAuthors( options, function( error, authors) {
|
|
if ( error ) {
|
|
return callback( error );
|
|
}
|
|
|
|
options = getOptions( options );
|
|
|
|
var dir = options.dir || ".";
|
|
var filename = path.join( dir, "package.json" );
|
|
|
|
fs.readFile( filename, { encoding: "utf8" }, function( error, content ) {
|
|
if ( error ) {
|
|
return callback( error );
|
|
}
|
|
|
|
var indentation = content.match( /\n([\t\s]+)/ )[ 1 ];
|
|
var package = JSON.parse( content );
|
|
package.contributors = authors;
|
|
content = JSON.stringify( package, null, indentation ) + "\n";
|
|
|
|
fs.writeFile( filename, content, function( error ) {
|
|
if ( error ) {
|
|
return callback( error );
|
|
}
|
|
|
|
callback( null );
|
|
});
|
|
});
|
|
});
|
|
}
|