Files
react/scripts/release-manager/commands/utils/git.js
2017-01-06 06:00:09 -08:00

94 lines
1.9 KiB
JavaScript

'use strict';
function isClean(app) {
return getStatus(app) === '';
}
function getStatus(app) {
return app.execInRepo(`git status --untracked-files=no --porcelain`);
}
function getBranch(app) {
return app.execInRepo(`git symbolic-ref HEAD`);
}
function fetch(app, remote) {
return app.execInRepo(`git fetch ${remote}`);
}
function checkout(app, ref) {
return app.execInRepo(`git checkout ${ref}`);
}
function pull(app, ref) {
ref = ref || '';
return app.execInRepo(`git pull ${ref}`);
}
function merge(app, ref, ff, msg) {
let opts = [
ff ? '--ff-only' : '--no-ff',
];
if (!msg) {
opts.push('--no-edit');
} else {
opts.push(`-m '${msg}''`);
}
return app.execInRepo(`git merge ${opts.join(' ')} ${ref}`);
}
function tag(app, tag, ref) {
ref = ref || '';
return app.execInRepo(`git tag ${tag} ${ref}`);
}
function commit(app, msg, all) {
return app.execInRepo(`git commit -m '${msg}' ${all ? '-a' : ''}`);
}
function push(app, remote, refspec, tags) {
let opts = [
remote,
refspec,
tags ? '--tags' : '',
];
return app.execInRepo(`git push ${opts.join(' ')}`);
}
/**
* Cherry picks a single sha to the given branch. Very crude, but establishes
* some API. We don't know if the sha is a merge or a squashed commit so just
* try both.
*
* Assume we're already on the right branch.
*/
function cherryPickMerge(app, ref) {
// console.log(`cherry picking ${sha}`)
// git cherry-pick -x sha || git cherry-pick -x -m1 sha
try {
app.execInRepo(`git cherry-pick -x ${ref}`);
} catch (e) {
// Assume for now this just means it was actually a merge.
// TODO: gracefully handle other cases, like possibility the commit was
// already cherry-picked and should be skipped.
app.execInRepo(`git cherry-pick -x -m1 ${ref}`);
}
}
module.exports = {
getBranch,
getStatus,
isClean,
commit,
checkout,
fetch,
pull,
push,
merge,
tag,
cherryPickMerge,
};