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)');
							 | 
						||
| 
								 | 
							
								}
							 |