diff --git a/cypress/platform/gitgraph.html b/cypress/platform/gitgraph.html
new file mode 100644
index 000000000..68c2932c9
--- /dev/null
+++ b/cypress/platform/gitgraph.html
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+ info below
+
+ gitGraph:
+ commit "Ashish"
+ branch newbranch
+ checkout newbranch
+ commit id:"1111"
+ commit tag:"test"
+ checkout master
+ commit type: HIGHLIGHT
+ commit
+ merge newbranch
+ commit
+ branch b2
+ commit
+
+
+
+ gitGraph:
+ commit
+ commit
+ branch newbranch
+ checkout newbranch
+ commit
+ reset master
+
+
+
+
+
diff --git a/src/diagrams/git/gitGraphAst.js b/src/diagrams/git/gitGraphAst.js
index e8645eceb..244deede1 100644
--- a/src/diagrams/git/gitGraphAst.js
+++ b/src/diagrams/git/gitGraphAst.js
@@ -68,11 +68,13 @@ export const getOptions = function() {
return options;
};
-export const commit = function(msg) {
+export const commit = function(msg, id, type, tag) {
const commit = {
- id: getId(),
+ id: id ? id : getId(),
message: msg,
seq: seq++,
+ type: type ? type : commitType.NORMAL,
+ tag: tag ? tag : '',
parent: head == null ? null : head.id
};
head = commit;
@@ -227,6 +229,12 @@ export const getHead = function() {
return head;
};
+export const commitType = {
+ NORMAL: 0,
+ REVERSE: 1,
+ HIGHLIGHT: 2
+};
+
export default {
setDirection,
setOptions,
@@ -244,5 +252,6 @@ export default {
getCommitsArray,
getCurrentBranch,
getDirection,
- getHead
+ getHead,
+ commitType
};
diff --git a/src/diagrams/git/gitGraphParserV2.spec.js b/src/diagrams/git/gitGraphParserV2.spec.js
new file mode 100644
index 000000000..ee5ae02dd
--- /dev/null
+++ b/src/diagrams/git/gitGraphParserV2.spec.js
@@ -0,0 +1,222 @@
+/* eslint-env jasmine */
+// Todo reintroduce without cryptoRandomString
+import gitGraphAst from './gitGraphAst';
+import { parser } from './parser/gitGraph';
+//import randomString from 'crypto-random-string';
+//import cryptoRandomString from 'crypto-random-string';
+import { logger } from '../../logger';
+
+//jest.mock('crypto-random-string');
+
+describe('when parsing a gitGraph', function() {
+ let randomNumber;
+ beforeEach(function() {
+ parser.yy = gitGraphAst;
+ parser.yy.clear();
+ randomNumber = 0;
+
+ });
+ // afterEach(function() {
+ // cryptoRandomString.mockReset();
+ // });
+ it('should handle a gitGraph commit with NO pararms, get auto-genrated reandom ID', function() {
+ const str = `gitGraph:
+ commit
+ `;
+ parser.parse(str);
+ const commits = parser.yy.getCommits();
+ //console.info(commits);
+ expect(Object.keys(commits).length).toBe(1);
+ expect(parser.yy.getCurrentBranch()).toBe('master');
+ expect(parser.yy.getDirection()).toBe('LR');
+ expect(Object.keys(parser.yy.getBranches()).length).toBe(1);
+ const key = Object.keys(commits)[0];
+ expect(commits[key].message).toBe('');
+ expect(commits[key].id).not.toBeNull();
+ expect(commits[key].tag).toBe('');
+ expect(commits[key].type).toBe(0);
+ });
+
+ it('should handle a gitGraph commit with custom commit id only', function() {
+ const str = `gitGraph:
+ commit id:"1111"
+ `;
+ //console.log(str);
+ parser.parse(str);
+ const commits = parser.yy.getCommits();
+ expect(Object.keys(commits).length).toBe(1);
+ expect(parser.yy.getCurrentBranch()).toBe('master');
+ expect(parser.yy.getDirection()).toBe('LR');
+ expect(Object.keys(parser.yy.getBranches()).length).toBe(1);
+ const key = Object.keys(commits)[0];
+ expect(commits[key].message).toBe('');
+ expect(commits[key].id).toBe('1111');
+ expect(commits[key].tag).toBe('');
+ expect(commits[key].type).toBe(0);
+ });
+
+ it('should handle a gitGraph commit with custom commit tag only', function() {
+ const str = `gitGraph:
+ commit tag:"test"
+ `;
+
+ parser.parse(str);
+ const commits = parser.yy.getCommits();
+ expect(Object.keys(commits).length).toBe(1);
+ expect(parser.yy.getCurrentBranch()).toBe('master');
+ expect(parser.yy.getDirection()).toBe('LR');
+ expect(Object.keys(parser.yy.getBranches()).length).toBe(1);
+ const key = Object.keys(commits)[0];
+ expect(commits[key].message).toBe('');
+ expect(commits[key].id).not.toBeNull();
+ expect(commits[key].tag).toBe('test');
+ expect(commits[key].type).toBe(0);
+ });
+
+ it('should handle a gitGraph commit with custom commit type HIGHLIGHT only', function() {
+ const str = `gitGraph:
+ commit type: HIGHLIGHT
+ `;
+
+ parser.parse(str);
+ const commits = parser.yy.getCommits();
+ expect(Object.keys(commits).length).toBe(1);
+ expect(parser.yy.getCurrentBranch()).toBe('master');
+ expect(parser.yy.getDirection()).toBe('LR');
+ expect(Object.keys(parser.yy.getBranches()).length).toBe(1);
+ const key = Object.keys(commits)[0];
+ expect(commits[key].message).toBe('');
+ expect(commits[key].id).not.toBeNull();
+ expect(commits[key].tag).toBe('');
+ expect(commits[key].type).toBe(2);
+ });
+
+ it('should handle a gitGraph commit with custom commit type REVERSE only', function() {
+ const str = `gitGraph:
+ commit type: REVERSE
+ `;
+
+ parser.parse(str);
+ const commits = parser.yy.getCommits();
+ expect(Object.keys(commits).length).toBe(1);
+ expect(parser.yy.getCurrentBranch()).toBe('master');
+ expect(parser.yy.getDirection()).toBe('LR');
+ expect(Object.keys(parser.yy.getBranches()).length).toBe(1);
+ const key = Object.keys(commits)[0];
+ expect(commits[key].message).toBe('');
+ expect(commits[key].id).not.toBeNull();
+ expect(commits[key].tag).toBe('');
+ expect(commits[key].type).toBe(1);
+ });
+
+ it('should handle a gitGraph commit with custom commit type NORMAL only', function() {
+ const str = `gitGraph:
+ commit type: NORMAL
+ `;
+
+ parser.parse(str);
+ const commits = parser.yy.getCommits();
+ expect(Object.keys(commits).length).toBe(1);
+ expect(parser.yy.getCurrentBranch()).toBe('master');
+ expect(parser.yy.getDirection()).toBe('LR');
+ expect(Object.keys(parser.yy.getBranches()).length).toBe(1);
+ const key = Object.keys(commits)[0];
+ expect(commits[key].message).toBe('');
+ expect(commits[key].id).not.toBeNull();
+ expect(commits[key].tag).toBe('');
+ expect(commits[key].type).toBe(0);
+ });
+
+ it('should handle a gitGraph commit with custom commit msg only', function() {
+ const str = `gitGraph:
+ commit "test commit"
+ `;
+
+ parser.parse(str);
+ const commits = parser.yy.getCommits();
+ expect(Object.keys(commits).length).toBe(1);
+ expect(parser.yy.getCurrentBranch()).toBe('master');
+ expect(parser.yy.getDirection()).toBe('LR');
+ expect(Object.keys(parser.yy.getBranches()).length).toBe(1);
+ const key = Object.keys(commits)[0];
+ expect(commits[key].message).toBe('test commit');
+ expect(commits[key].id).not.toBeNull();
+ expect(commits[key].tag).toBe('');
+ expect(commits[key].type).toBe(0);
+ });
+
+ it('should handle a gitGraph commit with custom commit id, tag only', function() {
+ const str = `gitGraph:
+ commit id:"1111" tag: "test tag"
+ `;
+
+ parser.parse(str);
+ const commits = parser.yy.getCommits();
+ expect(Object.keys(commits).length).toBe(1);
+ expect(parser.yy.getCurrentBranch()).toBe('master');
+ expect(parser.yy.getDirection()).toBe('LR');
+ expect(Object.keys(parser.yy.getBranches()).length).toBe(1);
+ const key = Object.keys(commits)[0];
+ expect(commits[key].message).toBe('');
+ expect(commits[key].id).toBe('1111');
+ expect(commits[key].tag).toBe('test tag');
+ expect(commits[key].type).toBe(0);
+ });
+
+ it('should handle a gitGraph commit with custom commit type, tag only', function() {
+ const str = `gitGraph:
+ commit type:HIGHLIGHT tag: "test tag"
+ `;
+
+ parser.parse(str);
+ const commits = parser.yy.getCommits();
+ expect(Object.keys(commits).length).toBe(1);
+ expect(parser.yy.getCurrentBranch()).toBe('master');
+ expect(parser.yy.getDirection()).toBe('LR');
+ expect(Object.keys(parser.yy.getBranches()).length).toBe(1);
+ const key = Object.keys(commits)[0];
+ expect(commits[key].message).toBe('');
+ expect(commits[key].id).not.toBeNull();
+ expect(commits[key].tag).toBe('test tag');
+ expect(commits[key].type).toBe(2);
+ });
+
+ it('should handle a gitGraph commit with custom commit tag and type only', function() {
+ const str = `gitGraph:
+ commit tag: "test tag" type:HIGHLIGHT
+ `;
+
+ parser.parse(str);
+ const commits = parser.yy.getCommits();
+ expect(Object.keys(commits).length).toBe(1);
+ expect(parser.yy.getCurrentBranch()).toBe('master');
+ expect(parser.yy.getDirection()).toBe('LR');
+ expect(Object.keys(parser.yy.getBranches()).length).toBe(1);
+ const key = Object.keys(commits)[0];
+ expect(commits[key].message).toBe('');
+ expect(commits[key].id).not.toBeNull();
+ expect(commits[key].tag).toBe('test tag');
+ expect(commits[key].type).toBe(2);
+ });
+
+ it('should handle a gitGraph commit with custom commit id, type and tag only', function() {
+ const str = `gitGraph:
+ commit id:"1111" type:REVERSE tag: "test tag"
+ `;
+
+ parser.parse(str);
+ const commits = parser.yy.getCommits();
+ expect(Object.keys(commits).length).toBe(1);
+ expect(parser.yy.getCurrentBranch()).toBe('master');
+ expect(parser.yy.getDirection()).toBe('LR');
+ expect(Object.keys(parser.yy.getBranches()).length).toBe(1);
+ const key = Object.keys(commits)[0];
+ expect(commits[key].message).toBe('');
+ expect(commits[key].id).toBe('1111');
+ expect(commits[key].tag).toBe('test tag');
+ expect(commits[key].type).toBe(1);
+ });
+
+
+
+});
diff --git a/src/diagrams/git/parser/gitGraph.jison b/src/diagrams/git/parser/gitGraph.jison
index d14069b6c..323c55b34 100644
--- a/src/diagrams/git/parser/gitGraph.jison
+++ b/src/diagrams/git/parser/gitGraph.jison
@@ -13,12 +13,18 @@
%%
-(\r?\n)+ return 'NL';
+(\r?\n)+ /*{console.log('New line');return 'NL';}*/ return 'NL';
\s+ /* skip all whitespace */
\#[^\n]* /* skip comments */
\%%[^\n]* /* skip comments */
"gitGraph" return 'GG';
"commit" return 'COMMIT';
+"id:" return 'COMMIT_ID';
+"type:" return 'COMMIT_TYPE';
+"NORMAL" return 'NORMAL';
+"REVERSE" return 'REVERSE';
+"HIGHLIGHT" return 'HIGHLIGHT';
+"tag:" return 'COMMIT_TAG';
"branch" return 'BRANCH';
"merge" return 'MERGE';
"reset" return 'RESET';
@@ -69,18 +75,33 @@ line
;
statement
- : COMMIT commit_arg {yy.commit($2)}
+ : commitStatement
| BRANCH ID {yy.branch($2)}
| CHECKOUT ID {yy.checkout($2)}
| MERGE ID {yy.merge($2)}
| RESET reset_arg {yy.reset($2)}
;
-
+commitStatement
+ : COMMIT commit_arg {yy.commit($2)}
+ | COMMIT COMMIT_ID STR {yy.commit('',$3,yy.commitType.NORMAL,'')}
+ | COMMIT COMMIT_TYPE commitType {yy.commit('','',$3,'')}
+ | COMMIT COMMIT_TAG STR {yy.commit('','',yy.commitType.NORMAL,$3)}
+ | COMMIT COMMIT_TAG STR COMMIT_TYPE commitType {yy.commit('','',$5,$3)}
+ | COMMIT COMMIT_TYPE commitType COMMIT_TAG STR {yy.commit('','',$3,$5)}
+ | COMMIT COMMIT_ID STR COMMIT_TYPE commitType {yy.commit('',$3,$5,'')}
+ | COMMIT COMMIT_ID STR COMMIT_TAG STR {yy.commit('',$3,yy.commitType.NORMAL,$5)}
+ | COMMIT COMMIT_ID STR COMMIT_TYPE commitType COMMIT_TAG STR {yy.commit('',$3,$5,$7)}
+ | COMMIT COMMIT_ID STR COMMIT_TAG STR COMMIT_TYPE commitType {yy.commit('',$3,$7,$5)}
+ ;
commit_arg
: /* empty */ {$$ = ""}
| STR {$$=$1}
;
-
+commitType
+ : NORMAL { $$=yy.commitType.NORMAL;}
+ | REVERSE { $$=yy.commitType.REVERSE;}
+ | HIGHLIGHT { $$=yy.commitType.HIGHLIGHT;}
+ ;
reset_arg
: 'HEAD' reset_parents{$$ = $1+ ":" + $2 }
| ID reset_parents{$$ = $1+ ":" + yy.count; yy.count = 0}