diff --git a/src/diagrams/gitGraph/gitGraphAst.js b/src/diagrams/gitGraph/gitGraphAst.js index 4aef1e79c..51eb4c8a5 100644 --- a/src/diagrams/gitGraph/gitGraphAst.js +++ b/src/diagrams/gitGraph/gitGraphAst.js @@ -8,17 +8,35 @@ var head = null; var branches = { "master" : head }; var curBranch = "master"; var direction = "LR"; +var seq = 0; function getId() { return crypto.randomBytes(20).toString('hex').substring(0, 7); } + +function isfastforwardable(current, other) { + var currentCommit = commits[branches[current]]; + var currentSeq = currentCommit.seq; + var otherCommit = commits[branches[other]]; + var otherSeq = otherCommit.seq; + + log.debug(commits); + log.debug(currentCommit, otherCommit); + while (currentSeq <= otherSeq && currentCommit != otherCommit) { + // only if source has more commits + otherCommit = commits[otherCommit.parent]; + } + log.debug(currentCommit.id, otherCommit.id); + return currentCommit.id == otherCommit.id; +} exports.setDirection = function(dir) { direction = dir; } exports.commit = function(msg) { var commit = { id: getId(), message: msg, + seq: seq++, parent: head == null ? null : head.id}; head = commit; commits[commit.id] = commit; @@ -31,7 +49,12 @@ exports.branch = function(name) { log.debug("in createBranch"); } -exports.merge = function() { +exports.merge = function(sourceBranch) { + if (isfastforwardable(curBranch, sourceBranch)){ + branches[curBranch] = branches[sourceBranch]; + head = commits[branches[curBranch]]; + } + log.debug(branches); log.debug("in mergeBranch"); } @@ -54,6 +77,7 @@ exports.clear = function () { head = null; branches = { "master" : head }; curBranch = "master"; + seq =0; } exports.getBranches = function() { return branches; } diff --git a/src/diagrams/gitGraph/gitGraphParser.spec.js b/src/diagrams/gitGraph/gitGraphParser.spec.js index 40219b68e..964661887 100644 --- a/src/diagrams/gitGraph/gitGraphParser.spec.js +++ b/src/diagrams/gitGraph/gitGraphParser.spec.js @@ -85,14 +85,33 @@ describe('when parsing a gitGraph',function() { 'commit\n' + 'reset master\n'; - console.log(parser.parse(str)); - var commits = parser.yy.getCommits(); - console.log(commits); + parser.parse(str); + var commits = parser.yy.getCommits(); expect(Object.keys(commits).length).toBe(3); expect(parser.yy.getCurrentBranch()).toBe("newbranch"); expect(parser.yy.getBranches()["newbranch"]).toEqual(parser.yy.getBranches()["master"]); expect(parser.yy.getHead().id).toEqual(parser.yy.getBranches()["newbranch"]); }); + it('it should handle fast forwardable merges', function () { + var str = 'gitGraph:\n' + + 'commit\n' + + 'branch newbranch\n' + + 'checkout newbranch\n' + + 'commit\n' + + 'commit\n' + + 'checkout master\n'+ + 'merge newbranch\n'; + + parser.parse(str); + + var commits = parser.yy.getCommits(); + console.log(commits); + expect(Object.keys(commits).length).toBe(3); + expect(parser.yy.getCurrentBranch()).toBe("master"); + expect(parser.yy.getBranches()["newbranch"]).toEqual(parser.yy.getBranches()["master"]); + expect(parser.yy.getHead().id).toEqual(parser.yy.getBranches()["newbranch"]); + }); + });