mirror of
				https://github.com/mermaid-js/mermaid.git
				synced 2025-10-31 10:54:15 +01:00 
			
		
		
		
	Merge branch 'develop' into issue1981
This commit is contained in:
		| @@ -6,6 +6,6 @@ export default { | ||||
|     // https://prettier.io/docs/en/cli.html#--cache | ||||
|     'prettier --write', | ||||
|   ], | ||||
|   'cSpell.json': ['ts-node-esm scripts/fixCSpell.ts'], | ||||
|   'cSpell.json': ['tsx scripts/fixCSpell.ts'], | ||||
|   '**/*.jison': ['pnpm -w run lint:jison'], | ||||
| }; | ||||
|   | ||||
							
								
								
									
										3
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
								
							| @@ -18,7 +18,8 @@ | ||||
|       "type": "node", | ||||
|       "request": "launch", | ||||
|       "args": ["scripts/docs.cli.mts"], | ||||
|       "runtimeArgs": ["--loader", "ts-node/esm"], | ||||
|       // we'll need to change this to --import in Node.JS v20.6.0 and up | ||||
|       "runtimeArgs": ["--loader", "tsx/esm"], | ||||
|       "cwd": "${workspaceRoot}/packages/mermaid", | ||||
|       "skipFiles": ["<node_internals>/**", "**/node_modules/**"], | ||||
|       "smartStep": true, | ||||
|   | ||||
| @@ -811,4 +811,19 @@ gitGraph TB: | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
|   it('40: should render a simple gitgraph with cherry pick merge commit', () => { | ||||
|     imgSnapshotTest( | ||||
|       `gitGraph | ||||
|       commit id: "ZERO" | ||||
|       branch feature | ||||
|       branch release | ||||
|       checkout feature | ||||
|       commit id: "A" | ||||
|       commit id: "B" | ||||
|       checkout main | ||||
|       merge feature id: "M" | ||||
|       checkout release | ||||
|       cherry-pick id: "M" parent:"B"` | ||||
|     ); | ||||
|   }); | ||||
| }); | ||||
|   | ||||
| @@ -366,41 +366,49 @@ A few important rules to note here are: | ||||
| 1.  You need to provide the `id` for an existing commit to be cherry-picked. If given commit id does not exist it will result in an error. For this, make use of the `commit id:$value` format of declaring commits. See the examples from above. | ||||
| 2.  The given commit must not exist on the current branch. The cherry-picked commit must always be a different branch than the current branch. | ||||
| 3.  Current branch must have at least one commit, before you can cherry-pick, otherwise it will cause an error is throw. | ||||
| 4.  When cherry-picking a merge commit, providing a parent commit ID is mandatory. If the parent attribute is omitted or an invalid parent commit ID is provided, an error will be thrown. | ||||
| 5.  The specified parent commit must be an immediate parent of the merge commit being cherry-picked. | ||||
|  | ||||
| Let see an example: | ||||
|  | ||||
| ```mermaid-example | ||||
|     gitGraph | ||||
|        commit id: "ZERO" | ||||
|        branch develop | ||||
|        commit id:"A" | ||||
|        checkout main | ||||
|        commit id:"ONE" | ||||
|        checkout develop | ||||
|        commit id:"B" | ||||
|        checkout main | ||||
|        commit id:"TWO" | ||||
|        cherry-pick id:"A" | ||||
|        commit id:"THREE" | ||||
|        checkout develop | ||||
|        commit id:"C" | ||||
|         commit id: "ZERO" | ||||
|         branch develop | ||||
|         branch release | ||||
|         commit id:"A" | ||||
|         checkout main | ||||
|         commit id:"ONE" | ||||
|         checkout develop | ||||
|         commit id:"B" | ||||
|         checkout main | ||||
|         merge develop id:"MERGE" | ||||
|         commit id:"TWO" | ||||
|         checkout release | ||||
|         cherry-pick id:"MERGE" parent:"B" | ||||
|         commit id:"THREE" | ||||
|         checkout develop | ||||
|         commit id:"C" | ||||
| ``` | ||||
|  | ||||
| ```mermaid | ||||
|     gitGraph | ||||
|        commit id: "ZERO" | ||||
|        branch develop | ||||
|        commit id:"A" | ||||
|        checkout main | ||||
|        commit id:"ONE" | ||||
|        checkout develop | ||||
|        commit id:"B" | ||||
|        checkout main | ||||
|        commit id:"TWO" | ||||
|        cherry-pick id:"A" | ||||
|        commit id:"THREE" | ||||
|        checkout develop | ||||
|        commit id:"C" | ||||
|         commit id: "ZERO" | ||||
|         branch develop | ||||
|         branch release | ||||
|         commit id:"A" | ||||
|         checkout main | ||||
|         commit id:"ONE" | ||||
|         checkout develop | ||||
|         commit id:"B" | ||||
|         checkout main | ||||
|         merge develop id:"MERGE" | ||||
|         commit id:"TWO" | ||||
|         checkout release | ||||
|         cherry-pick id:"MERGE" parent:"B" | ||||
|         commit id:"THREE" | ||||
|         checkout develop | ||||
|         commit id:"C" | ||||
| ``` | ||||
|  | ||||
| ## Gitgraph specific configuration options | ||||
|   | ||||
							
								
								
									
										14
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								package.json
									
									
									
									
									
								
							| @@ -15,26 +15,26 @@ | ||||
|     "git graph" | ||||
|   ], | ||||
|   "scripts": { | ||||
|     "build:vite": "ts-node-esm --transpileOnly .vite/build.ts", | ||||
|     "build:vite": "tsx .vite/build.ts", | ||||
|     "build:mermaid": "pnpm build:vite --mermaid", | ||||
|     "build:viz": "pnpm build:mermaid --visualize", | ||||
|     "build:types": "tsc -p ./packages/mermaid/tsconfig.json --emitDeclarationOnly && tsc -p ./packages/mermaid-zenuml/tsconfig.json --emitDeclarationOnly && tsc -p ./packages/mermaid-example-diagram/tsconfig.json --emitDeclarationOnly", | ||||
|     "build:types:watch": "tsc -p ./packages/mermaid/tsconfig.json --emitDeclarationOnly --watch", | ||||
|     "build:watch": "pnpm build:vite --watch", | ||||
|     "build": "pnpm run -r clean && pnpm build:types && pnpm build:vite", | ||||
|     "dev": "concurrently \"pnpm build:vite --watch\" \"ts-node-esm .vite/server.ts\"", | ||||
|     "dev": "concurrently \"pnpm build:vite --watch\" \"tsx .vite/server.ts\"", | ||||
|     "dev:coverage": "pnpm coverage:cypress:clean && VITE_COVERAGE=true pnpm dev", | ||||
|     "release": "pnpm build", | ||||
|     "lint": "eslint --cache --cache-strategy content --ignore-path .gitignore . && pnpm lint:jison && prettier --cache --check .", | ||||
|     "lint:fix": "eslint --cache --cache-strategy content --fix --ignore-path .gitignore . && prettier --write . && ts-node-esm scripts/fixCSpell.ts", | ||||
|     "lint:jison": "ts-node-esm ./scripts/jison/lint.mts", | ||||
|     "contributors": "ts-node-esm scripts/updateContributors.ts", | ||||
|     "lint:fix": "eslint --cache --cache-strategy content --fix --ignore-path .gitignore . && prettier --write . && tsx scripts/fixCSpell.ts", | ||||
|     "lint:jison": "tsx ./scripts/jison/lint.mts", | ||||
|     "contributors": "tsx scripts/updateContributors.ts", | ||||
|     "cypress": "cypress run", | ||||
|     "cypress:open": "cypress open", | ||||
|     "e2e": "start-server-and-test dev http://localhost:9000/ cypress", | ||||
|     "coverage:cypress:clean": "rimraf .nyc_output coverage/cypress", | ||||
|     "e2e:coverage": "pnpm coverage:cypress:clean && VITE_COVERAGE=true pnpm e2e", | ||||
|     "coverage:merge": "ts-node-esm scripts/coverage.ts", | ||||
|     "coverage:merge": "tsx scripts/coverage.ts", | ||||
|     "coverage": "pnpm test:coverage --run && pnpm e2e:coverage && pnpm coverage:merge", | ||||
|     "ci": "vitest run", | ||||
|     "test": "pnpm lint && vitest run", | ||||
| @@ -116,7 +116,7 @@ | ||||
|     "rimraf": "^5.0.0", | ||||
|     "rollup-plugin-visualizer": "^5.9.2", | ||||
|     "start-server-and-test": "^2.0.0", | ||||
|     "ts-node": "^10.9.1", | ||||
|     "tsx": "^4.6.2", | ||||
|     "typescript": "^5.1.3", | ||||
|     "vite": "^4.3.9", | ||||
|     "vite-plugin-istanbul": "^4.1.0", | ||||
|   | ||||
| @@ -26,18 +26,18 @@ | ||||
|     "clean": "rimraf dist", | ||||
|     "dev": "pnpm -w dev", | ||||
|     "docs:code": "typedoc src/defaultConfig.ts src/config.ts src/mermaidAPI.ts && prettier --write ./src/docs/config/setup", | ||||
|     "docs:build": "rimraf ../../docs && pnpm docs:spellcheck && pnpm docs:code && ts-node-esm scripts/docs.cli.mts", | ||||
|     "docs:verify": "pnpm docs:spellcheck && pnpm docs:code && ts-node-esm scripts/docs.cli.mts --verify", | ||||
|     "docs:pre:vitepress": "pnpm --filter ./src/docs prefetch && rimraf src/vitepress && pnpm docs:code && ts-node-esm scripts/docs.cli.mts --vitepress && pnpm --filter ./src/vitepress install --no-frozen-lockfile --ignore-scripts", | ||||
|     "docs:build": "rimraf ../../docs && pnpm docs:spellcheck && pnpm docs:code && tsx scripts/docs.cli.mts", | ||||
|     "docs:verify": "pnpm docs:spellcheck && pnpm docs:code && tsx scripts/docs.cli.mts --verify", | ||||
|     "docs:pre:vitepress": "pnpm --filter ./src/docs prefetch && rimraf src/vitepress && pnpm docs:code && tsx scripts/docs.cli.mts --vitepress && pnpm --filter ./src/vitepress install --no-frozen-lockfile --ignore-scripts", | ||||
|     "docs:build:vitepress": "pnpm docs:pre:vitepress && (cd src/vitepress && pnpm run build) && cpy --flat src/docs/landing/ ./src/vitepress/.vitepress/dist/landing", | ||||
|     "docs:dev": "pnpm docs:pre:vitepress && concurrently \"pnpm --filter ./src/vitepress dev\" \"ts-node-esm scripts/docs.cli.mts --watch --vitepress\"", | ||||
|     "docs:dev:docker": "pnpm docs:pre:vitepress && concurrently \"pnpm --filter ./src/vitepress dev:docker\" \"ts-node-esm scripts/docs.cli.mts --watch --vitepress\"", | ||||
|     "docs:dev": "pnpm docs:pre:vitepress && concurrently \"pnpm --filter ./src/vitepress dev\" \"tsx scripts/docs.cli.mts --watch --vitepress\"", | ||||
|     "docs:dev:docker": "pnpm docs:pre:vitepress && concurrently \"pnpm --filter ./src/vitepress dev:docker\" \"tsx scripts/docs.cli.mts --watch --vitepress\"", | ||||
|     "docs:serve": "pnpm docs:build:vitepress && vitepress serve src/vitepress", | ||||
|     "docs:spellcheck": "cspell --config ../../cSpell.json \"src/docs/**/*.md\"", | ||||
|     "docs:release-version": "ts-node-esm scripts/update-release-version.mts", | ||||
|     "docs:verify-version": "ts-node-esm scripts/update-release-version.mts --verify", | ||||
|     "types:build-config": "ts-node-esm --transpileOnly scripts/create-types-from-json-schema.mts", | ||||
|     "types:verify-config": "ts-node-esm scripts/create-types-from-json-schema.mts --verify", | ||||
|     "docs:release-version": "tsx scripts/update-release-version.mts", | ||||
|     "docs:verify-version": "tsx scripts/update-release-version.mts --verify", | ||||
|     "types:build-config": "tsx scripts/create-types-from-json-schema.mts", | ||||
|     "types:verify-config": "tsx scripts/create-types-from-json-schema.mts --verify", | ||||
|     "checkCircle": "npx madge --circular ./src", | ||||
|     "release": "pnpm build", | ||||
|     "prepublishOnly": "cpy '../../README.*' ./ --cwd=. && pnpm docs:release-version && pnpm -w run build" | ||||
|   | ||||
| @@ -446,11 +446,13 @@ const getNamespaces = function (): NamespaceMap { | ||||
|  * @public | ||||
|  */ | ||||
| export const addClassesToNamespace = function (id: string, classNames: string[]) { | ||||
|   if (namespaces[id] !== undefined) { | ||||
|     classNames.map((className) => { | ||||
|       classes[className].parent = id; | ||||
|       namespaces[id].classes[className] = classes[className]; | ||||
|     }); | ||||
|   if (namespaces[id] === undefined) { | ||||
|     return; | ||||
|   } | ||||
|   for (const name of classNames) { | ||||
|     const { className } = splitClassNameAndType(name); | ||||
|     classes[className].parent = id; | ||||
|     namespaces[id].classes[className] = classes[className]; | ||||
|   } | ||||
| }; | ||||
|  | ||||
|   | ||||
| @@ -1043,6 +1043,19 @@ foo() | ||||
| `; | ||||
|       parser.parse(str); | ||||
|     }); | ||||
|  | ||||
|     it('should handle namespace with generic types', () => { | ||||
|       parser.parse(`classDiagram | ||||
|  | ||||
| namespace space { | ||||
|     class Square~Shape~{ | ||||
|         int id | ||||
|         List~int~ position | ||||
|         setPoints(List~int~ points) | ||||
|         getPoints() List~int~ | ||||
|     } | ||||
| }`); | ||||
|     }); | ||||
|   }); | ||||
| }); | ||||
|  | ||||
|   | ||||
| @@ -255,11 +255,12 @@ export const merge = function (otherBranch, custom_id, override_type, custom_tag | ||||
|   log.debug('in mergeBranch'); | ||||
| }; | ||||
|  | ||||
| export const cherryPick = function (sourceId, targetId, tag) { | ||||
| export const cherryPick = function (sourceId, targetId, tag, parentCommitId) { | ||||
|   log.debug('Entering cherryPick:', sourceId, targetId, tag); | ||||
|   sourceId = common.sanitizeText(sourceId, getConfig()); | ||||
|   targetId = common.sanitizeText(targetId, getConfig()); | ||||
|   tag = common.sanitizeText(tag, getConfig()); | ||||
|   parentCommitId = common.sanitizeText(parentCommitId, getConfig()); | ||||
|  | ||||
|   if (!sourceId || commits[sourceId] === undefined) { | ||||
|     let error = new Error( | ||||
| @@ -274,20 +275,21 @@ export const cherryPick = function (sourceId, targetId, tag) { | ||||
|     }; | ||||
|     throw error; | ||||
|   } | ||||
|  | ||||
|   let sourceCommit = commits[sourceId]; | ||||
|   let sourceCommitBranch = sourceCommit.branch; | ||||
|   if (sourceCommit.type === commitType.MERGE) { | ||||
|   if ( | ||||
|     parentCommitId && | ||||
|     !(Array.isArray(sourceCommit.parents) && sourceCommit.parents.includes(parentCommitId)) | ||||
|   ) { | ||||
|     let error = new Error( | ||||
|       'Incorrect usage of "cherryPick". Source commit should not be a merge commit' | ||||
|       'Invalid operation: The specified parent commit is not an immediate parent of the cherry-picked commit.' | ||||
|     ); | ||||
|     throw error; | ||||
|   } | ||||
|   if (sourceCommit.type === commitType.MERGE && !parentCommitId) { | ||||
|     let error = new Error( | ||||
|       'Incorrect usage of cherry-pick: If the source commit is a merge commit, an immediate parent commit must be specified.' | ||||
|     ); | ||||
|     error.hash = { | ||||
|       text: 'cherryPick ' + sourceId + ' ' + targetId, | ||||
|       token: 'cherryPick ' + sourceId + ' ' + targetId, | ||||
|       line: '1', | ||||
|       loc: { first_line: 1, last_line: 1, first_column: 1, last_column: 1 }, | ||||
|       expected: ['cherry-pick abc'], | ||||
|     }; | ||||
|     throw error; | ||||
|   } | ||||
|   if (!targetId || commits[targetId] === undefined) { | ||||
| @@ -327,7 +329,11 @@ export const cherryPick = function (sourceId, targetId, tag) { | ||||
|       parents: [head == null ? null : head.id, sourceCommit.id], | ||||
|       branch: curBranch, | ||||
|       type: commitType.CHERRY_PICK, | ||||
|       tag: tag ?? 'cherry-pick:' + sourceCommit.id, | ||||
|       tag: | ||||
|         tag ?? | ||||
|         `cherry-pick:${sourceCommit.id}${ | ||||
|           sourceCommit.type === commitType.MERGE ? `|parent:${parentCommitId}` : '' | ||||
|         }`, | ||||
|     }; | ||||
|     head = commit; | ||||
|     commits[commit.id] = commit; | ||||
|   | ||||
| @@ -673,6 +673,145 @@ describe('when parsing a gitGraph', function () { | ||||
|     expect(commits[cherryPickCommitID].branch).toBe('main'); | ||||
|   }); | ||||
|  | ||||
|   it('should support cherry-picking of merge commits', function () { | ||||
|     const str = `gitGraph | ||||
|     commit id: "ZERO" | ||||
|     branch feature | ||||
|     branch release | ||||
|     checkout feature | ||||
|     commit id: "A" | ||||
|     commit id: "B" | ||||
|     checkout main | ||||
|     merge feature id: "M" | ||||
|     checkout release | ||||
|     cherry-pick id: "M" parent:"B" | ||||
|     `; | ||||
|  | ||||
|     parser.parse(str); | ||||
|     const commits = parser.yy.getCommits(); | ||||
|     const cherryPickCommitID = Object.keys(commits)[4]; | ||||
|     expect(commits[cherryPickCommitID].tag).toBe('cherry-pick:M|parent:B'); | ||||
|     expect(commits[cherryPickCommitID].branch).toBe('release'); | ||||
|   }); | ||||
|  | ||||
|   it('should support cherry-picking of merge commits with tag', function () { | ||||
|     const str = `gitGraph | ||||
|     commit id: "ZERO" | ||||
|     branch feature | ||||
|     branch release | ||||
|     checkout feature | ||||
|     commit id: "A" | ||||
|     commit id: "B" | ||||
|     checkout main | ||||
|     merge feature id: "M" | ||||
|     checkout release | ||||
|     cherry-pick id: "M" parent:"ZERO" tag: "v1.0" | ||||
|     `; | ||||
|  | ||||
|     parser.parse(str); | ||||
|     const commits = parser.yy.getCommits(); | ||||
|     const cherryPickCommitID = Object.keys(commits)[4]; | ||||
|     expect(commits[cherryPickCommitID].tag).toBe('v1.0'); | ||||
|     expect(commits[cherryPickCommitID].branch).toBe('release'); | ||||
|   }); | ||||
|  | ||||
|   it('should support cherry-picking of merge commits with additional commit', function () { | ||||
|     const str = `gitGraph | ||||
|     commit id: "ZERO" | ||||
|     branch feature | ||||
|     branch release | ||||
|     checkout feature | ||||
|     commit id: "A" | ||||
|     commit id: "B" | ||||
|     checkout main | ||||
|     merge feature id: "M" | ||||
|     checkout release | ||||
|     commit id: "C" | ||||
|     cherry-pick id: "M" tag: "v2.1:ZERO" parent:"ZERO" | ||||
|     commit id: "D" | ||||
|     `; | ||||
|  | ||||
|     parser.parse(str); | ||||
|     const commits = parser.yy.getCommits(); | ||||
|     const cherryPickCommitID = Object.keys(commits)[5]; | ||||
|     expect(commits[cherryPickCommitID].tag).toBe('v2.1:ZERO'); | ||||
|     expect(commits[cherryPickCommitID].branch).toBe('release'); | ||||
|   }); | ||||
|  | ||||
|   it('should support cherry-picking of merge commits with empty tag', function () { | ||||
|     const str = `gitGraph | ||||
|     commit id: "ZERO" | ||||
|     branch feature | ||||
|     branch release | ||||
|     checkout feature | ||||
|     commit id: "A" | ||||
|     commit id: "B" | ||||
|     checkout main | ||||
|     merge feature id: "M" | ||||
|     checkout release | ||||
|     commit id: "C" | ||||
|     cherry-pick id:"M" parent: "ZERO" tag:"" | ||||
|     commit id: "D" | ||||
|     cherry-pick id:"M" tag:"" parent: "B" | ||||
|     `; | ||||
|  | ||||
|     parser.parse(str); | ||||
|     const commits = parser.yy.getCommits(); | ||||
|     const cherryPickCommitID = Object.keys(commits)[5]; | ||||
|     const cherryPickCommitID2 = Object.keys(commits)[7]; | ||||
|     expect(commits[cherryPickCommitID].tag).toBe(''); | ||||
|     expect(commits[cherryPickCommitID2].tag).toBe(''); | ||||
|     expect(commits[cherryPickCommitID].branch).toBe('release'); | ||||
|   }); | ||||
|  | ||||
|   it('should fail cherry-picking of merge commits if the parent of merge commits is not specified', function () { | ||||
|     expect(() => | ||||
|       parser | ||||
|         .parse( | ||||
|           `gitGraph | ||||
|     commit id: "ZERO" | ||||
|     branch feature | ||||
|     branch release | ||||
|     checkout feature | ||||
|     commit id: "A" | ||||
|     commit id: "B" | ||||
|     checkout main | ||||
|     merge feature id: "M" | ||||
|     checkout release | ||||
|     commit id: "C" | ||||
|     cherry-pick id:"M" | ||||
|     ` | ||||
|         ) | ||||
|         .toThrow( | ||||
|           'Incorrect usage of cherry-pick: If the source commit is a merge commit, an immediate parent commit must be specified.' | ||||
|         ) | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('should fail cherry-picking of merge commits when the parent provided is not an immediate parent of cherry picked commit', function () { | ||||
|     expect(() => | ||||
|       parser | ||||
|         .parse( | ||||
|           `gitGraph | ||||
|     commit id: "ZERO" | ||||
|     branch feature | ||||
|     branch release | ||||
|     checkout feature | ||||
|     commit id: "A" | ||||
|     commit id: "B" | ||||
|     checkout main | ||||
|     merge feature id: "M" | ||||
|     checkout release | ||||
|     commit id: "C" | ||||
|     cherry-pick id:"M" parent: "A" | ||||
|     ` | ||||
|         ) | ||||
|         .toThrow( | ||||
|           'Invalid operation: The specified parent commit is not an immediate parent of the cherry-picked commit.' | ||||
|         ) | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('should throw error when try to branch existing branch: main', function () { | ||||
|     const str = `gitGraph | ||||
|     commit | ||||
|   | ||||
| @@ -39,6 +39,7 @@ branch(?=\s|$)                          return 'BRANCH'; | ||||
| "order:"                                return 'ORDER'; | ||||
| merge(?=\s|$)                           return 'MERGE'; | ||||
| cherry\-pick(?=\s|$)                    return 'CHERRY_PICK'; | ||||
| "parent:"                               return 'PARENT_COMMIT' | ||||
| // "reset"                                 return 'RESET'; | ||||
| checkout(?=\s|$)                        return 'CHECKOUT'; | ||||
| "LR"                                    return 'DIR'; | ||||
| @@ -109,10 +110,17 @@ branchStatement | ||||
|  | ||||
| cherryPickStatement | ||||
|     : CHERRY_PICK COMMIT_ID STR {yy.cherryPick($3, '', undefined)} | ||||
|     | CHERRY_PICK COMMIT_ID STR PARENT_COMMIT STR {yy.cherryPick($3, '', undefined,$5)} | ||||
|     | CHERRY_PICK COMMIT_ID STR COMMIT_TAG STR {yy.cherryPick($3, '', $5)} | ||||
|     | CHERRY_PICK COMMIT_ID STR COMMIT_TAG EMPTYSTR {yy.cherryPick($3, '', '')} | ||||
|     | CHERRY_PICK COMMIT_ID STR PARENT_COMMIT STR COMMIT_TAG STR {yy.cherryPick($3, '', $7,$5)} | ||||
|     | CHERRY_PICK COMMIT_ID STR COMMIT_TAG STR PARENT_COMMIT STR {yy.cherryPick($3, '', $5,$7)} | ||||
|     | CHERRY_PICK COMMIT_TAG STR COMMIT_ID STR {yy.cherryPick($5, '', $3)} | ||||
|     | CHERRY_PICK COMMIT_TAG EMPTYSTR COMMIT_ID STR {yy.cherryPick($3, '', '')} | ||||
|     | CHERRY_PICK COMMIT_TAG EMPTYSTR COMMIT_ID STR {yy.cherryPick($5, '', '')} | ||||
|     | CHERRY_PICK COMMIT_ID STR COMMIT_TAG EMPTYSTR {yy.cherryPick($3, '', '')} | ||||
|     | CHERRY_PICK COMMIT_ID STR PARENT_COMMIT STR COMMIT_TAG EMPTYSTR {yy.cherryPick($3, '', '',$5)} | ||||
|     | CHERRY_PICK COMMIT_ID STR COMMIT_TAG EMPTYSTR PARENT_COMMIT STR {yy.cherryPick($3, '', '',$7)} | ||||
|     | CHERRY_PICK COMMIT_TAG STR COMMIT_ID STR PARENT_COMMIT STR {yy.cherryPick($5, '', $3,$7)} | ||||
|     | CHERRY_PICK COMMIT_TAG EMPTYSTR COMMIT_ID STR PARENT_COMMIT STR{yy.cherryPick($5, '', '',$7)} | ||||
|     ; | ||||
|  | ||||
| mergeStatement | ||||
|   | ||||
| @@ -11,8 +11,8 @@ | ||||
|     "preview-https": "pnpm build && serve .vitepress/dist", | ||||
|     "preview-https-no-prefetch": "pnpm build-no-prefetch && serve .vitepress/dist", | ||||
|     "prefetch": "pnpm fetch-contributors && pnpm fetch-avatars", | ||||
|     "fetch-avatars": "ts-node-esm .vitepress/scripts/fetch-avatars.ts", | ||||
|     "fetch-contributors": "ts-node-esm .vitepress/scripts/fetch-contributors.ts" | ||||
|     "fetch-avatars": "tsx .vitepress/scripts/fetch-avatars.ts", | ||||
|     "fetch-contributors": "tsx .vitepress/scripts/fetch-contributors.ts" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@vueuse/core": "^10.1.0", | ||||
| @@ -22,14 +22,14 @@ | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@iconify-json/carbon": "^1.1.16", | ||||
|     "@unocss/reset": "^0.57.0", | ||||
|     "@unocss/reset": "^0.58.0", | ||||
|     "@vite-pwa/vitepress": "^0.3.0", | ||||
|     "@vitejs/plugin-vue": "^4.2.1", | ||||
|     "fast-glob": "^3.2.12", | ||||
|     "https-localhost": "^4.7.1", | ||||
|     "pathe": "^1.1.0", | ||||
|     "unocss": "^0.57.0", | ||||
|     "unplugin-vue-components": "^0.25.0", | ||||
|     "unocss": "^0.58.0", | ||||
|     "unplugin-vue-components": "^0.26.0", | ||||
|     "vite": "^4.3.9", | ||||
|     "vite-plugin-pwa": "^0.17.0", | ||||
|     "vitepress": "1.0.0-rc.31", | ||||
|   | ||||
| @@ -244,24 +244,29 @@ A few important rules to note here are: | ||||
| 1. You need to provide the `id` for an existing commit to be cherry-picked. If given commit id does not exist it will result in an error. For this, make use of the `commit id:$value` format of declaring commits. See the examples from above. | ||||
| 2. The given commit must not exist on the current branch. The cherry-picked commit must always be a different branch than the current branch. | ||||
| 3. Current branch must have at least one commit, before you can cherry-pick, otherwise it will cause an error is throw. | ||||
| 4. When cherry-picking a merge commit, providing a parent commit ID is mandatory. If the parent attribute is omitted or an invalid parent commit ID is provided, an error will be thrown. | ||||
| 5. The specified parent commit must be an immediate parent of the merge commit being cherry-picked. | ||||
|  | ||||
| Let see an example: | ||||
|  | ||||
| ```mermaid-example | ||||
|     gitGraph | ||||
|        commit id: "ZERO" | ||||
|        branch develop | ||||
|        commit id:"A" | ||||
|        checkout main | ||||
|        commit id:"ONE" | ||||
|        checkout develop | ||||
|        commit id:"B" | ||||
|        checkout main | ||||
|        commit id:"TWO" | ||||
|        cherry-pick id:"A" | ||||
|        commit id:"THREE" | ||||
|        checkout develop | ||||
|        commit id:"C" | ||||
|         commit id: "ZERO" | ||||
|         branch develop | ||||
|         branch release | ||||
|         commit id:"A" | ||||
|         checkout main | ||||
|         commit id:"ONE" | ||||
|         checkout develop | ||||
|         commit id:"B" | ||||
|         checkout main | ||||
|         merge develop id:"MERGE" | ||||
|         commit id:"TWO" | ||||
|         checkout release | ||||
|         cherry-pick id:"MERGE" parent:"B" | ||||
|         commit id:"THREE" | ||||
|         checkout develop | ||||
|         commit id:"C" | ||||
| ``` | ||||
|  | ||||
| ## Gitgraph specific configuration options | ||||
|   | ||||
							
								
								
									
										1236
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1236
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user
	 futzmonitor
					futzmonitor