UNPKG

@buildo/hophop

Version:

A minimal tool to accelerate the GitHub workflow from the command line.

328 lines (260 loc) 9.78 kB
'use strict'; var _Promise = require('babel-runtime/core-js/promise')['default']; var _regeneratorRuntime = require('babel-runtime/regenerator')['default']; var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default']; exports.__esModule = true; var _argparse = require('argparse'); var _lodash = require('lodash'); var _ramda = require('ramda'); var _ramda2 = _interopRequireDefault(_ramda); var _octonode = require('octonode'); var _octonode2 = _interopRequireDefault(_octonode); var _child_process = require('child_process'); var _child_process2 = _interopRequireDefault(_child_process); var _fs = require('fs'); var _fs2 = _interopRequireDefault(_fs); var _es6Promisify = require('es6-promisify'); var _es6Promisify2 = _interopRequireDefault(_es6Promisify); var _semver = require('semver'); var _semver2 = _interopRequireDefault(_semver); var _inquirer = require('inquirer'); var _inquirer2 = _interopRequireDefault(_inquirer); var _cliColor = require('cli-color'); var _cliColor2 = _interopRequireDefault(_cliColor); var cmdoutc = _cliColor2['default'].blackBright; var issuec = _cliColor2['default'].bold; var warning = _cliColor2['default'].xterm(184); function log(l) { console.log(l); // eslint-disable-line no-console } function error(e) { console.error(e); // eslint-disable-line no-console } function rlinterface() { return { question: function question(_question, defaultInput) { return new _Promise(function (resolve) { var qName = _question.name || _lodash.uniqueId('question_'); var enhancedQ = _lodash.assign({}, { type: 'input', name: qName, 'default': defaultInput || null }, _question); _inquirer2['default'].prompt([enhancedQ], function (a) { return resolve(a[qName]); }); }); }, yesOrNoQuestion: function yesOrNoQuestion(message, defaultInput) { return new _Promise(function (resolve) { var enhancedQ = { message: message + ' (y/n)', name: _lodash.uniqueId('yes_or_no_question_'), type: 'input', 'default': defaultInput || 'n' }; _inquirer2['default'].prompt([enhancedQ], function (a) { return resolve(a[enhancedQ.name]); }); }); } }; } var rl = rlinterface(); var exec = function exec(cmd) { return new _Promise(function (resolve) { return _child_process2['default'].exec(cmd, function (err, o, i) { if (!!err) throw err; resolve({ stdout: o, stderr: i }); }); }); }; var execF = function execF(cmd) { return new _Promise(function (resolve) { return _child_process2['default'].exec(cmd, function (err, o, i) { resolve({ err: err, stdout: o, stderr: i }); }); }); }; var enterpriseRepos = { 'buildo/labonline': { apiEndpoint: 'github.omnilab.our.buildo.io/api/v3', githubURL: 'github.omnilab.our.buildo.io', accountName: 'omnilab' } }; function origin() { var _origin; return _regeneratorRuntime.async(function origin$(context$1$0) { while (1) switch (context$1$0.prev = context$1$0.next) { case 0: context$1$0.next = 2; return _regeneratorRuntime.awrap(exec('git remote -v | grep origin | grep fetch')); case 2: _origin = context$1$0.sent.stdout.replace('\t', ' ').replace('\n', '').split(' '); return context$1$0.abrupt('return', _origin[1].replace('.git', '').split(':')[1]); case 4: case 'end': return context$1$0.stop(); } }, null, this); } function currBranch() { var o; return _regeneratorRuntime.async(function currBranch$(context$1$0) { while (1) switch (context$1$0.prev = context$1$0.next) { case 0: context$1$0.next = 2; return _regeneratorRuntime.awrap(exec('git rev-parse --abbrev-ref HEAD')); case 2: o = context$1$0.sent.stdout; return context$1$0.abrupt('return', o.split('\n')[0]); case 4: case 'end': return context$1$0.stop(); } }, null, this); } var issuesLabelMapper = function issuesLabelMapper(issues) { return issues.map(function (i) { return { name: issuec(i.number) + '\t' + i.title, value: i.number }; }); }; function slugify(s) { var fullSlug = s.toLowerCase().replace(/[^\w ]+/g, '').replace(/ +/g, '_'); var shortSlugify = _ramda2['default'].compose(_ramda2['default'].join('_'), _ramda2['default'].take(4), _ramda2['default'].split('_')); return shortSlugify(fullSlug); } function gh_token_file_name(gheAccountName) { var prefix = '.hophop_gh_token'; return gheAccountName ? prefix + '_' + gheAccountName : prefix; } function gh_token(gheAccountName) { var fileName = gh_token_file_name(gheAccountName); return _fs2['default'].readFileSync(process.env.HOME + '/' + fileName, 'utf8'); } function gh_helper() { var repo_name, config, _enterpriseRepos$repo_name, apiEndpoint, accountName, client, repo; return _regeneratorRuntime.async(function gh_helper$(context$1$0) { while (1) switch (context$1$0.prev = context$1$0.next) { case 0: context$1$0.next = 2; return _regeneratorRuntime.awrap(origin()); case 2: repo_name = context$1$0.sent; config = {}; _enterpriseRepos$repo_name = enterpriseRepos[repo_name]; _enterpriseRepos$repo_name = _enterpriseRepos$repo_name === undefined ? {} : _enterpriseRepos$repo_name; apiEndpoint = _enterpriseRepos$repo_name.apiEndpoint; accountName = _enterpriseRepos$repo_name.accountName; if (apiEndpoint) { config.hostname = apiEndpoint; } client = _octonode2['default'].client(gh_token(accountName), config); // FIXME(gabro): this is here because omnilab's github SSL cert is currently self-signed if (apiEndpoint) { client.requestDefaults.rejectUnhauthorized = false; client.requestDefaults.strictSSL = false; } repo = client.repo(repo_name); return context$1$0.abrupt('return', { repo_name: repo_name, client: client, repo: repo }); case 13: case 'end': return context$1$0.stop(); } }, null, this); } function gh_me(client) { var clientMe, me; return _regeneratorRuntime.async(function gh_me$(context$1$0) { while (1) switch (context$1$0.prev = context$1$0.next) { case 0: clientMe = client.me(); context$1$0.prev = 1; context$1$0.next = 4; return _regeneratorRuntime.awrap(_es6Promisify2['default'](clientMe.info.bind(clientMe))()); case 4: me = context$1$0.sent; return context$1$0.abrupt('return', me); case 8: context$1$0.prev = 8; context$1$0.t0 = context$1$0['catch'](1); error(context$1$0.t0); case 11: case 'end': return context$1$0.stop(); } }, null, this, [[1, 8]]); } function checkForUpdates() { var latestVersion, installedVersion; return _regeneratorRuntime.async(function checkForUpdates$(context$1$0) { while (1) switch (context$1$0.prev = context$1$0.next) { case 0: context$1$0.next = 2; return _regeneratorRuntime.awrap(exec('npm view @buildo/hophop version')); case 2: latestVersion = context$1$0.sent.stdout.replace(/\n/g, ''); context$1$0.next = 5; return _regeneratorRuntime.awrap(exec('npm list -g --depth=0 @buildo/hophop | grep hophop | cut -d@ -f3')); case 5: installedVersion = context$1$0.sent.stdout.replace(/\n/g, ''); if (_semver2['default'].gt(latestVersion, installedVersion)) { log('\n -------------------------------------------------------\n | A new version of hophop is available! Update with |\n | |\n | npm install -g @buildo/hophop |\n | |\n -------------------------------------------------------\n '); } case 7: case 'end': return context$1$0.stop(); } }, null, this); } function parseArgs() { var parser = new _argparse.ArgumentParser({ version: '0.0.1', addHelp: true, description: 'Argparse example' }); var subparsers = parser.addSubparsers({ title: 'subcommand', dest: 'cmd' }); var gh = subparsers.addParser('gh', { addHelp: true }); var toggl = subparsers.addParser('toggl', { addHelp: true }); var gh_sp = gh.addSubparsers({ title: 'gh', dest: 'cmd_gh' }); var toggl_sp = toggl.addSubparsers({ title: 'toggl', dest: 'cmd_toggl' }); gh_sp.addParser('pr', { addHelp: true }); var gh_feature_sp = gh_sp.addParser('feature', { addHelp: true }); gh_feature_sp.addArgument(['issueNumber'], { nargs: '?' }); gh_sp.addParser('setup', { addHelp: true }); var gh_setup_sp = gh_sp.addParser('setup', { addHelp: true }); gh_setup_sp.addArgument(['gheAccountName'], { nargs: '?' }); gh_sp.addParser('commit', { addHelp: true }); toggl_sp.addParser('setup', { addHelp: true }); toggl_sp.addParser('start', { addHelp: true }); toggl_sp.addParser('stop', { addHelp: true }); toggl_sp.addParser('install-hooks', { addHelp: true }); return parser.parseArgs(); } exports['default'] = { rl: rl, exec: exec, execF: execF, currBranch: currBranch, issuesLabelMapper: issuesLabelMapper, slugify: slugify, gh_helper: gh_helper, gh_me: gh_me, checkForUpdates: checkForUpdates, parseArgs: parseArgs, cmdoutc: cmdoutc, issuec: issuec, warning: warning, log: log, error: error, origin: origin, enterpriseRepos: enterpriseRepos, gh_token_file_name: gh_token_file_name }; module.exports = exports['default'];