@buildo/hophop
Version:
A minimal tool to accelerate the GitHub workflow from the command line.
353 lines (276 loc) • 11.6 kB
JavaScript
;
var _regeneratorRuntime = require('babel-runtime/regenerator')['default'];
var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default'];
exports.__esModule = true;
var _ramda = require('ramda');
var _ramda2 = _interopRequireDefault(_ramda);
var _fs = require('fs');
var _fs2 = _interopRequireDefault(_fs);
var _es6Promisify = require('es6-promisify');
var _es6Promisify2 = _interopRequireDefault(_es6Promisify);
var _togglApi = require('toggl-api');
var _togglApi2 = _interopRequireDefault(_togglApi);
var _utils = require('../utils');
function toggl_token() {
return _fs2['default'].readFileSync(process.env.HOME + '/.hophop_toggl_token', 'utf8');
}
function toggl_helper() {
var togglClient;
return _regeneratorRuntime.async(function toggl_helper$(context$1$0) {
while (1) switch (context$1$0.prev = context$1$0.next) {
case 0:
togglClient = new _togglApi2['default']({ apiToken: toggl_token() });
return context$1$0.abrupt('return', { togglClient: togglClient });
case 2:
case 'end':
return context$1$0.stop();
}
}, null, this);
}
function toggl_getProjects(togglClient) {
var togglUser, wid, togglProjects;
return _regeneratorRuntime.async(function toggl_getProjects$(context$1$0) {
while (1) switch (context$1$0.prev = context$1$0.next) {
case 0:
context$1$0.next = 2;
return _regeneratorRuntime.awrap(_es6Promisify2['default'](togglClient.getUserData.bind(togglClient))({}));
case 2:
togglUser = context$1$0.sent;
wid = togglUser.default_wid;
context$1$0.next = 6;
return _regeneratorRuntime.awrap(_es6Promisify2['default'](togglClient.getWorkspaceProjects.bind(togglClient))(wid, {}));
case 6:
togglProjects = context$1$0.sent;
return context$1$0.abrupt('return', { togglProjects: togglProjects });
case 8:
case 'end':
return context$1$0.stop();
}
}, null, this);
}
function toggl_setup() {
var token;
return _regeneratorRuntime.async(function toggl_setup$(context$1$0) {
while (1) switch (context$1$0.prev = context$1$0.next) {
case 0:
context$1$0.next = 2;
return _regeneratorRuntime.awrap(_utils.rl.question({ message: 'Personal access token: (from https://toggl.com/app/profile):' }));
case 2:
token = context$1$0.sent;
if (!token) {
_utils.error('No token inserted.');
process.exit(0);
}
_fs2['default'].writeFileSync(process.env.HOME + '/.hophop_toggl_token', token);
case 5:
case 'end':
return context$1$0.stop();
}
}, null, this);
}
function toggl_start() {
var _ref,
genericTask,
args$1$0 = arguments;
return _regeneratorRuntime.async(function toggl_start$(context$1$0) {
var _this = this;
while (1) switch (context$1$0.prev = context$1$0.next) {
case 0:
_ref = args$1$0.length <= 0 || args$1$0[0] === undefined ? {} : args$1$0[0];
genericTask = _ref.genericTask;
context$1$0.prev = 2;
context$1$0.next = 5;
return _regeneratorRuntime.awrap((function callee$1$0() {
var _ref2, togglClient, _ref3, repo_name, client, repo, branch, issueno, issue, issues, issuesChoices, issueRef, _ref4, togglProjects, projectName, startTimeEntry, getProject, togglProject, projectLog, issueLog;
return _regeneratorRuntime.async(function callee$1$0$(context$2$0) {
while (1) switch (context$2$0.prev = context$2$0.next) {
case 0:
context$2$0.next = 2;
return _regeneratorRuntime.awrap(toggl_helper());
case 2:
_ref2 = context$2$0.sent;
togglClient = _ref2.togglClient;
context$2$0.next = 6;
return _regeneratorRuntime.awrap(_utils.gh_helper());
case 6:
_ref3 = context$2$0.sent;
repo_name = _ref3.repo_name;
client = _ref3.client;
repo = _ref3.repo;
context$2$0.next = 12;
return _regeneratorRuntime.awrap(_utils.currBranch());
case 12:
branch = context$2$0.sent;
if (branch === 'master') {
_utils.log('You\'re not working on any PR, switch to a branch tracking a PR and retry.');
process.exit(0);
}
issueno = undefined;
issue = undefined;
if (genericTask) {
context$2$0.next = 33;
break;
}
issueno = _ramda2['default'].take(2, branch.split('-').map(function (i) {
return parseInt(i, 10);
})).filter(function (x) {
return !!x;
})[0];
_utils.log('Inferred issue number ' + issueno + ' from branch name \'' + branch + '\'');
if (issueno) {
context$2$0.next = 28;
break;
}
_utils.log('Cannot infer the issue number from the branch name');
context$2$0.next = 23;
return _regeneratorRuntime.awrap(_es6Promisify2['default'](repo.issues.bind(repo))());
case 23:
issues = context$2$0.sent;
issuesChoices = _utils.issuesLabelMapper(issues.filter(function (i) {
return !i.pull_request;
}));
context$2$0.next = 27;
return _regeneratorRuntime.awrap(_utils.rl.question({ type: 'list', message: 'Which issue?', choices: issuesChoices }));
case 27:
issueno = context$2$0.sent;
case 28:
issueRef = client.issue(repo_name, issueno);
context$2$0.next = 31;
return _regeneratorRuntime.awrap(_es6Promisify2['default'](issueRef.info.bind(issueRef))());
case 31:
issue = context$2$0.sent;
if (!issue) {
_utils.log('Invalid issue');
}
case 33:
context$2$0.next = 35;
return _regeneratorRuntime.awrap(toggl_getProjects(togglClient));
case 35:
_ref4 = context$2$0.sent;
togglProjects = _ref4.togglProjects;
projectName = _ramda2['default'].compose(_ramda2['default'].drop(1), _ramda2['default'].split('/'))(repo_name)[0];
startTimeEntry = _es6Promisify2['default'](togglClient.startTimeEntry.bind(togglClient));
getProject = function getProject(_projectName) {
return _ramda2['default'].find(_ramda2['default'].propEq('name', _projectName))(togglProjects);
};
togglProject = getProject(projectName);
if (!togglProject) {
_utils.log(_utils.warning('\n🚨 \'' + projectName + '\' does not exist on Toggl\n'));
}
context$2$0.next = 44;
return _regeneratorRuntime.awrap(startTimeEntry({
description: genericTask ? 'miscellaneous' : '#' + issueno + ': ' + issue.title,
billable: togglProject ? togglProject.billable : undefined,
pid: togglProject ? togglProject.id : undefined
}));
case 44:
projectLog = togglProject ? ' on project \'' + togglProject.name + '\'' : '';
issueLog = !genericTask ? 'issue ' + issueno : '';
_utils.log('⏰ Started tracking time for ' + issueLog + projectLog);
case 47:
case 'end':
return context$2$0.stop();
}
}, null, _this);
})());
case 5:
context$1$0.next = 10;
break;
case 7:
context$1$0.prev = 7;
context$1$0.t0 = context$1$0['catch'](2);
_utils.log(context$1$0.t0);
case 10:
case 'end':
return context$1$0.stop();
}
}, null, this, [[2, 7]]);
}
function toggl_stop() {
var _ref5, togglClient, currentTimeEntry, startGenericTask;
return _regeneratorRuntime.async(function toggl_stop$(context$1$0) {
while (1) switch (context$1$0.prev = context$1$0.next) {
case 0:
context$1$0.prev = 0;
context$1$0.next = 3;
return _regeneratorRuntime.awrap(toggl_helper());
case 3:
_ref5 = context$1$0.sent;
togglClient = _ref5.togglClient;
context$1$0.next = 7;
return _regeneratorRuntime.awrap(_es6Promisify2['default'](togglClient.getCurrentTimeEntry.bind(togglClient))());
case 7:
currentTimeEntry = context$1$0.sent;
if (!currentTimeEntry) {
context$1$0.next = 20;
break;
}
context$1$0.next = 11;
return _regeneratorRuntime.awrap(_es6Promisify2['default'](togglClient.stopTimeEntry.bind(togglClient))(currentTimeEntry.id));
case 11:
_utils.log('⏰ Stopped tracking time for \'' + currentTimeEntry.description + '\'');
context$1$0.next = 14;
return _regeneratorRuntime.awrap(_utils.rl.question({ message: 'Start generic task? (y/n)', 'default': 'n' }));
case 14:
startGenericTask = context$1$0.sent;
if (!(startGenericTask === 'y')) {
context$1$0.next = 18;
break;
}
context$1$0.next = 18;
return _regeneratorRuntime.awrap(toggl_start({ genericTask: true }));
case 18:
context$1$0.next = 21;
break;
case 20:
_utils.log('Mmh, it seems like your Toggl isn\'t running');
case 21:
context$1$0.next = 26;
break;
case 23:
context$1$0.prev = 23;
context$1$0.t0 = context$1$0['catch'](0);
_utils.log(context$1$0.t0);
case 26:
case 'end':
return context$1$0.stop();
}
}, null, this, [[0, 23]]);
}
function toggl_install_hooks() {
var exec, prefix, repoDir;
return _regeneratorRuntime.async(function toggl_install_hooks$(context$1$0) {
while (1) switch (context$1$0.prev = context$1$0.next) {
case 0:
exec = _es6Promisify2['default'](require('child_process').exec);
context$1$0.prev = 1;
context$1$0.next = 4;
return _regeneratorRuntime.awrap(exec('npm prefix -g'));
case 4:
prefix = context$1$0.sent.replace(/\r?\n|\r/g, '');
context$1$0.next = 7;
return _regeneratorRuntime.awrap(exec('git rev-parse --show-toplevel'));
case 7:
repoDir = context$1$0.sent.replace(/\r?\n|\r/g, '');
_fs2['default'].symlinkSync(prefix + '/lib/node_modules/@buildo/hophop/hooks/post-checkout', repoDir + '/.git/hooks/post-checkout');
_utils.log('🔧 Toggl git hooks correctly installed!');
context$1$0.next = 15;
break;
case 12:
context$1$0.prev = 12;
context$1$0.t0 = context$1$0['catch'](1);
_utils.log(context$1$0.t0);
case 15:
case 'end':
return context$1$0.stop();
}
}, null, this, [[1, 12]]);
}
exports['default'] = {
toggl_setup: toggl_setup,
toggl_start: toggl_start,
toggl_stop: toggl_stop,
toggl_install_hooks: toggl_install_hooks
};
module.exports = exports['default'];
// TODO; gh_helper gets also me -> this slows down the process