From 5b9d2b071159d4c96c6004b7cc4b37c5e225b04b Mon Sep 17 00:00:00 2001 From: rkiel Date: Sat, 20 Jul 2019 09:21:10 -0400 Subject: [PATCH] refactor: new direction --- bin/creature-end | 14 ++++---- js/file.js | 17 ++++++++++ js/git.js | 86 ++++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 105 insertions(+), 12 deletions(-) create mode 100644 js/file.js diff --git a/bin/creature-end b/bin/creature-end index e05d755..8997f86 100755 --- a/bin/creature-end +++ b/bin/creature-end @@ -22,10 +22,12 @@ function endFeatureBranch(dp) { commander .start() - .then(git.setCurrentBranch) - .then(git.parseCurrentBranch) - .then(validate.mustBeFeatureBranch) - .then(git.setStandardBranch) - .then(git.isBranchRemote) - .then(endFeatureBranch) + .then(git.gather) + .then(commander.echo) + // .then(git.setCurrentBranch) + // .then(git.parseCurrentBranch) + // .then(validate.mustBeFeatureBranch) + // .then(git.setStandardBranch) + // .then(git.isBranchRemote) + // .then(endFeatureBranch) .catch(err => console.error(err)); diff --git a/js/file.js b/js/file.js new file mode 100644 index 0000000..62784f5 --- /dev/null +++ b/js/file.js @@ -0,0 +1,17 @@ +const fs = require("fs"); +const util = require("util"); + +let lib; + +function exists(path) { + const stat = util.promisify(fs.stat); + return stat(path); +} + +function read(path) { + const readFile = util.promisify(fs.readFile); + return readFile(path).then(buffer => buffer.toString("utf-8")); +} + +lib = { exists, read }; +module.exports = lib; diff --git a/js/git.js b/js/git.js index 75f5b84..b2b1f7e 100644 --- a/js/git.js +++ b/js/git.js @@ -4,15 +4,84 @@ const path = x => require("../" + x); const commander = path("js/commander"); const immutable = path("js/immutable"); const shell = path("js/shell"); +const file = path("js/file"); +const branch = path("js/branch"); let lib; -function setCurrentBranch(dp) { - const cmd = "git rev-parse --abbrev-ref HEAD"; - - return shell.capture(cmd).then(x => immutable.set(dp, "branch.current", x)); +function setBranch(dp, field, branch) { + return immutable.set(dp, `branch.${field}`, branch); } +function setCurrentBranch(dp) { + return file + .read(".git/HEAD") + .then(contents => contents.split("/")) + .then(parts => _.last(parts)) + .then(last => last.trim()) + .then(branch => immutable.set(dp, "branch.current", branch)); +} + +function setStandardAndFeature(dp) { + const current = _.get(dp, "branch.current"); + if (branch.isStandard(current)) { + return immutable.set( + immutable.set(dp, "branch.standard", current), + "branch.feature", + false + ); + } else { + const parts = current.split("-"); + if ( + parts.length > 2 && + commander.prefix() === parts[0] && + branch.isStandard(parts[1]) + ) { + return immutable.set( + immutable.set(dp, "branch.standard", parts[1]), + "branch.feature", + current + ); + } else { + return immutable.set( + immutable.set(dp, "branch.standard", false), + "branch.feature", + false + ); + } + } +} + +function setRemote(dp) { + const current = _.get(dp, "branch.current"); + if (branch.isStandard(current)) { + return immutable.set(dp, "branch.remote", false); + } else { + return file + .exists(`.git/refs/remotes/origin/${current}`) + .then(() => immutable.set(dp, "branch.remote", current)) + .catch(() => immutable.set(dp, "branch.remote", false)); + } +} + +function gather(dp) { + return file + .exists(".git") + .then(() => ({})) + .then(lib.setCurrentBranch) + .then(lib.setStandardAndFeature) + .then(lib.setRemote) + .catch(() => { + throw "not in GIT_ROOT"; + }); +} + +// function setCurrentBranch(dp) { +// const cmd = "git rev-parse --abbrev-ref HEAD"; +// +// return shell.capture(cmd).then(x => immutable.set(dp, "branch.current", x)); +// } + function setFeatureBranch(dp) { const fb = [ commander.prefix(), @@ -46,11 +115,16 @@ function isBranchRemote(dp) { } lib = { - setCurrentBranch, + //setCurrentBranch, setFeatureBranch, setStandardBranch, parseCurrentBranch, - isBranchRemote + isBranchRemote, + gather, + setStandardAndFeature, + setCurrentBranch, + setRemote, + setBranch: _.curry(setBranch) }; module.exports = lib;