You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					101 lines
				
				2.4 KiB
			
		
		
			
		
	
	
					101 lines
				
				2.4 KiB
			| 
											3 years ago
										 | 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)'); | ||
|  | } |