bin/pivotal-to-github
#!/usr/bin/env node
var _ = require('lodash');
var assert = require('assert');
var child_process = require('child_process');
var path = require('path');
var pivotalToGithub = require('..');
var program = require('commander');
var read = require('read');
var AssertionError = assert.AssertionError;
program
.usage('[options]')
.option('--pivotal-token <token>', 'The Pivotal API token to use')
.option('--pivotal-id <id>', 'The ID of the Pivotal Project to migrate')
.option('--github-token <token>', 'The GitHub API token to use')
.option('--github-user <user>', 'The GitHub User/Org to migrate to')
.option('--github-repo <repo>', 'The GitHub Repository to migrate to')
.parse(process.argv);
function onError(err) {
if(err instanceof AssertionError) {
console.error('ERROR:', err.message || err);
console.error('See `pivotal-to-github --help` for usage');
process.exit(2);
} else if(process.env.NODE_ENV !== 'development') {
console.error('ERROR:', err.message || err);
process.exit(1);
} else {
throw err;
}
}
try {
readMissingProgram(program, function(err, program) {
if(err) return onError(err);
pivotalToGithub(program, onError);
});
} catch(err) {
onError(err)
}
function readMissingProgram(program, cb) {
if(!program.githubToken) {
var fallback =
process.env.GITHUB_TOKEN || process.env.GITHUB_API_TOKEN;
var fallbackText =
fallback ? '(load from ENV):' : '(open github.com):';
return read({
prompt: 'GitHub token ' + fallbackText,
}, function(err, token) {
if(!token) {
if(fallback) {
token = fallback;
console.log('--> Using ' + _.repeat('*', token.length - 4) + token.slice(-4))
} else {
console.error('Not implemented')
return;
}
}
program.githubToken = token;
readMissingProgram(program, cb);
});
}
if(!program.githubRepo) {
var fallback = path.basename(process.cwd());
return read({
prompt: 'GitHub repository (' + fallback + '): '
}, function(err, repo) {
if(!repo) {
repo = fallback;
console.log('--> Using ' + repo);
}
program.githubRepo = repo;
readMissingProgram(program, cb);
});
}
if(!program.githubUser) {
var fallback;
try {
fallback = child_process
.execSync('git config --get user.name')
.toString()
.split('\n')[0];
} catch(err) {
}
var fallbackText = fallback ? ' (' + fallback + ')' : '';
return read({
prompt: 'GitHub user or organization' + fallbackText + ': '
}, function(err, user) {
if(!user) {
if(!fallback) {
return cb(new Error('Can\'t go on without an user'));
}
user = fallback;
console.log('--> Using ' + user);
}
program.githubUser = user;
readMissingProgram(program, cb);
});
}
if(!program.pivotalId) {
return read({
prompt: 'Pivotal Project ID: '
}, function(err, id) {
if(!id) {
return cb(new Error('Can\'t go on without the Pivotal Project ID'));
}
program.pivotalId = id;
readMissingProgram(program, cb);
});
}
if(!program.pivotalToken) {
var fallback =
process.env.PIVOTAL_TOKEN || process.env.PIVOTAL_API_TOKEN;
var fallbackText =
fallback ? '(load from ENV):' : '(open pivotaltracker.com):';
return read({
prompt: 'Pivotal token ' + fallbackText,
}, function(err, token) {
if(!token) {
if(fallback) {
token = fallback;
console.log('--> Using ' + _.repeat('*', token.length - 4) + token.slice(-4))
} else {
console.error('Not implemented')
return;
}
}
program.pivotalToken = token;
readMissingProgram(program, cb);
});
}
cb(null, program);
}