123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- module.exports = version;
- module.exports.pin = pin;
- var fs = require('fs');
- var path = require('path');
- var exec = require('child_process').exec;
- var root = null;
- function pin() {
- return version().then(function (v) {
- version.pinned = v;
- });
- }
- function version(callback) {
- // first find the package.json as this will be our root
- var promise = findPackage(path.dirname(module.parent.filename))
- .then(function (dir) {
- // now try to load the package
- var v = require(path.resolve(dir, 'package.json')).version;
- if (v && v !== '0.0.0-development') {
- return v;
- }
- root = dir;
- // else we're in development, give the commit out
- // get the last commit and whether the working dir is dirty
- var promises = [
- branch().catch(function () { return 'master'; }),
- commit().catch(function () { return '<none>'; }),
- dirty().catch(function () { return 0; }),
- ];
- // use the cached result as the export
- return Promise.all(promises).then(function (res) {
- var branch = res[0];
- var commit = res[1];
- var dirtyCount = parseInt(res[2], 10);
- var curr = branch + ': ' + commit;
- if (dirtyCount !== 0) {
- curr += ' (' + dirtyCount + ' dirty files)';
- }
- return curr;
- });
- }).catch(function (error) {
- console.log(error.stack);
- throw error;
- });
- if (callback) {
- promise.then(function (res) {
- callback(null, res);
- }, callback);
- }
- return promise;
- }
- function findPackage(dir) {
- if (dir === '/') {
- return Promise.reject(new Error('package not found'));
- }
- return new Promise(function (resolve) {
- fs.stat(path.resolve(dir, 'package.json'), function (error, exists) {
- if (error || !exists) {
- return resolve(findPackage(path.resolve(dir, '..')));
- }
- resolve(dir);
- });
- });
- }
- function command(cmd) {
- return new Promise(function (resolve, reject) {
- exec(cmd, { cwd: root }, function (err, stdout, stderr) {
- var error = stderr.trim();
- if (error) {
- return reject(new Error(error));
- }
- resolve(stdout.split('\n').join(''));
- });
- });
- }
- function commit() {
- return command('git rev-parse HEAD');
- }
- function branch() {
- return command('git rev-parse --abbrev-ref HEAD');
- }
- function dirty() {
- return command('expr $(git status --porcelain 2>/dev/null| ' +
- 'egrep "^(M| M)" | wc -l)');
- }
|