This commit is contained in:
rkiel
2019-07-18 15:40:37 -04:00
parent 48d64da20b
commit 308d62fc86
7 changed files with 90 additions and 86 deletions

View File

@@ -7,109 +7,49 @@ const immutable = path("js/immutable");
const git = path("js/git"); const git = path("js/git");
const shell = path("js/shell"); const shell = path("js/shell");
const commander = path("js/commander"); const commander = path("js/commander");
const branch = path("js/branch");
function setStandardBranches(dp) {
return immutable.set(dp, "standardBranches", ["master", "release"]);
}
function validateCurrentBranch(dp) { function validateCurrentBranch(dp) {
if (!dp.standardBranches.includes(dp.currentBranch)) { if (branch.isNonStandard(dp.branch.current)) {
throw `invalid base branch: ${dp.currentBranch}`; throw `invalid base branch: ${dp.branch.current}`;
} else { } else {
return dp; return dp;
} }
} }
function validateFeatureName(dp) { function validateFeatureName(dp) {
if (dp.standardBranches.includes(dp.featureName)) { if (branch.isStandard(commander.featureName())) {
throw `invalid feature branch: ${dp.featureName}`; throw `invalid feature branch: ${commander.featureName()}`;
} else { } else {
return dp; return dp;
} }
} }
function setFeatureName(dp) {
const fn = commander.args().join("-");
return Object.assign({}, dp, { featureName: fn });
}
function setPrefix(dp) {
const p = process.env.FEATURE_USER || process.env.USER;
return Object.assign({}, dp, { prefix: p });
}
function setFeatureBranch(dp) { function setFeatureBranch(dp) {
const fb = `${dp.prefix}-${dp.currentBranch}-${dp.featureName}`; const fb = [
return Object.assign({}, dp, { featureBranch: fb }); commander.prefix(),
} dp.branch.current,
commander.featureName()
function gitFetch(dp) { ].join("-");
const cmd = "git fetch origin -p && git fetch origin --tags"; return immutable.set(dp, "branch.feature", fb);
console.log(cmd);
return shell.something(cmd, dp);
}
function setMergeBranch(dp) {
return immutable.set(
dp,
"mergeBranch",
["origin", dp.currentBranch].join("/")
);
}
function gitMerge(dp) {
const cmd = `git merge ${dp.mergeBranch}`;
console.log(cmd);
return shell.something(cmd, dp);
}
function gitBranch(dp) {
const cmd = `git branch ${dp.featureBranch}`;
console.log(cmd);
return shell.something(cmd, dp);
}
function gitCheckout(dp) {
const cmd = `git checkout ${dp.featureBranch}`;
console.log(cmd);
return shell.something(cmd, dp);
}
function gitPush(dp) {
const cmd = `git push -u origin ${dp.featureBranch}`;
console.log(cmd);
return shell.something(cmd, dp);
} }
function createFeatureBranch(dp) { function createFeatureBranch(dp) {
const cmds = [ return shell.pipeline([
"git fetch origin -p", "git fetch --prune --prune-tags --tags origin",
"git fetch origin --tags", `git merge origin/${dp.branch.current}`,
`git merge origin/${dp.currentBranch}`, "git push",
`git checkout -b ${dp.featureBranch}`, `git checkout -b ${dp.branch.feature}`,
`git push -u origin ${dp.featureBranch}` `git push -u origin ${dp.branch.feature}`
]; ]);
return _.reduce(
cmds,
(accum, elem) => {
return accum
.then(() => console.log(elem))
.then(() => console.log())
.then(() => shell.run(elem));
},
Promise.resolve({})
);
} }
function toPromise(dp) { function toPromise(dp) {
return Promise.resolve(dp); return Promise.resolve(dp);
} }
const x = toPromise({ program: commander.parse() }) const x = toPromise(commander.parse())
.then(setStandardBranches)
.then(setFeatureName)
.then(validateFeatureName) .then(validateFeatureName)
.then(setPrefix)
.then(git.setCurrentBranch) .then(git.setCurrentBranch)
.then(validateCurrentBranch) .then(validateCurrentBranch)
.then(setFeatureBranch) .then(setFeatureBranch)

17
js/branch.js Normal file
View File

@@ -0,0 +1,17 @@
let lib;
function standard() {
return ["master", "release"];
}
function isStandard(b) {
return lib.standard().includes(b);
}
function isNonStandard(b) {
return !lib.isStandard(b);
}
lib = { standard, isStandard, isNonStandard };
module.exports = lib;

View File

@@ -4,17 +4,27 @@ const something = program.parse(process.argv);
let lib; let lib;
function parse() {
return something;
}
function args() { function args() {
return something.args; return something.args;
} }
function featureName() {
return args().join("-");
}
function parse() {
return { program: something };
}
function prefix() {
return process.env.FEATURE_USER || process.env.USER;
}
lib = { lib = {
args, args,
parse parse,
featureName,
prefix
}; };
module.exports = lib; module.exports = lib;

View File

@@ -9,7 +9,7 @@ let lib;
function setCurrentBranch(dp) { function setCurrentBranch(dp) {
const cmd = "git rev-parse --abbrev-ref HEAD"; const cmd = "git rev-parse --abbrev-ref HEAD";
return shell.capture(cmd).then(x => immutable.set(dp, "currentBranch", x)); return shell.capture(cmd).then(x => immutable.set(dp, "branch.current", x));
} }
lib = { lib = {

View File

@@ -3,7 +3,7 @@ const _ = require("lodash");
let lib; let lib;
function set(dp, path, value) { function set(dp, path, value) {
return _.assign({}, dp, _.set({}, path, value)); return _.set(_.assign({}, dp), path, value);
} }
lib = { lib = {

View File

@@ -23,10 +23,24 @@ function something(cmd, dp) {
return lib.run(cmd).then(lib._something(dp)); return lib.run(cmd).then(lib._something(dp));
} }
function pipeline(cmds) {
return _.reduce(
cmds,
(accum, elem) => {
return accum
.then(() => console.log())
.then(() => console.log(elem))
.then(() => exec(elem));
},
Promise.resolve({})
).then(() => console.log());
}
lib = { lib = {
_something, _something,
run, run,
capture, capture,
pipeline,
something: _.curry(something) something: _.curry(something)
}; };

23
js/validate.js Normal file
View File

@@ -0,0 +1,23 @@
const branch = path("js/branch");
let lib;
function validateCurrentBranch(dp) {
if (branch.isNonStandard(dp.branch.current)) {
throw `invalid base branch: ${dp.branch.current}`;
} else {
return dp;
}
}
function validateFeatureName(dp) {
if (branch.isStandard(commander.featureName())) {
throw `invalid feature branch: ${commander.featureName()}`;
} else {
return dp;
}
}
lib = { validateCurrentBranch, validateFeatureName };
module.exports = lib;