Parser and Logic For Parent Commit Added

This commit is contained in:
RounakJoshi09
2023-10-12 02:35:43 +05:30
parent 12a47076cf
commit 13d85b6ee5
2 changed files with 40 additions and 16 deletions

View File

@@ -256,7 +256,7 @@ export const merge = function (otherBranch, custom_id, override_type, custom_tag
log.debug('in mergeBranch'); log.debug('in mergeBranch');
}; };
export const cherryPick = function (sourceId, targetId, tag) { export const cherryPick = function (sourceId, targetId, tag, parentCommit) {
log.debug('Entering cherryPick:', sourceId, targetId, tag); log.debug('Entering cherryPick:', sourceId, targetId, tag);
sourceId = common.sanitizeText(sourceId, configApi.getConfig()); sourceId = common.sanitizeText(sourceId, configApi.getConfig());
targetId = common.sanitizeText(targetId, configApi.getConfig()); targetId = common.sanitizeText(targetId, configApi.getConfig());
@@ -275,21 +275,35 @@ export const cherryPick = function (sourceId, targetId, tag) {
}; };
throw error; throw error;
} }
let sourceCommit = commits[sourceId]; let sourceCommit = commits[sourceId];
let sourceCommitBranch = sourceCommit.branch; let sourceCommitBranch = sourceCommit.branch;
if (sourceCommit.type === commitType.MERGE) { if (sourceCommit.type === commitType.MERGE) {
let error = new Error( if (!parentCommit) {
'Incorrect usage of "cherryPick". Source commit should not be a merge commit' let error = new Error(
); 'Incorrect usage of cherryPick: If the source commit is a merge commit, an immediate parent commit must be specified.'
error.hash = { );
text: 'cherryPick ' + sourceId + ' ' + targetId, error.hash = {
token: 'cherryPick ' + sourceId + ' ' + targetId, text: 'cherryPick ' + sourceId + ' ' + targetId,
line: '1', token: 'cherryPick ' + sourceId + ' ' + targetId,
loc: { first_line: 1, last_line: 1, first_column: 1, last_column: 1 }, line: '1',
expected: ['cherry-pick abc'], loc: { first_line: 1, last_line: 1, first_column: 1, last_column: 1 },
}; expected: ['cherry-pick abc'],
throw error; };
throw error;
}
if (!(Array.isArray(sourceCommit.parents) && sourceCommit.parents.includes(parentCommit))) {
let error = new Error(
'Invalid operation: The specified parent commit is not an immediate parent of the cherry-picked commit.'
);
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) { if (!targetId || commits[targetId] === undefined) {
// cherry-pick source commit to current branch // cherry-pick source commit to current branch
@@ -328,7 +342,11 @@ export const cherryPick = function (sourceId, targetId, tag) {
parents: [head == null ? null : head.id, sourceCommit.id], parents: [head == null ? null : head.id, sourceCommit.id],
branch: curBranch, branch: curBranch,
type: commitType.CHERRY_PICK, type: commitType.CHERRY_PICK,
tag: tag ?? 'cherry-pick:' + sourceCommit.id, tag: tag
? `${tag}${sourceCommit.type === commitType.MERGE ? ` | parent: ${parentCommit}` : ''}`
: `cherry-pick: ${sourceCommit.id}${
sourceCommit.type === commitType.MERGE ? ` | parent: ${parentCommit}` : ''
}`,
}; };
head = commit; head = commit;
commits[commit.id] = commit; commits[commit.id] = commit;

View File

@@ -39,6 +39,7 @@ branch(?=\s|$) return 'BRANCH';
"order:" return 'ORDER'; "order:" return 'ORDER';
merge(?=\s|$) return 'MERGE'; merge(?=\s|$) return 'MERGE';
cherry\-pick(?=\s|$) return 'CHERRY_PICK'; cherry\-pick(?=\s|$) return 'CHERRY_PICK';
"parent:" return 'PARENT_COMMIT'
// "reset" return 'RESET'; // "reset" return 'RESET';
checkout(?=\s|$) return 'CHECKOUT'; checkout(?=\s|$) return 'CHECKOUT';
"LR" return 'DIR'; "LR" return 'DIR';
@@ -109,10 +110,15 @@ branchStatement
cherryPickStatement cherryPickStatement
: CHERRY_PICK COMMIT_ID STR {yy.cherryPick($3, '', undefined)} : 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 STR {yy.cherryPick($3, '', $5)}
| 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_ID STR COMMIT_TAG EMPTYSTR {yy.cherryPick($3, '', '')} | CHERRY_PICK COMMIT_ID STR COMMIT_TAG EMPTYSTR {yy.cherryPick($3, '', '')}
| CHERRY_PICK COMMIT_TAG STR COMMIT_ID STR {yy.cherryPick($5, '', $3)} | CHERRY_PICK COMMIT_ID STR PARENT_COMMIT STR COMMIT_TAG EMPTYSTR {yy.cherryPick($3, '', '',$5)}
| CHERRY_PICK COMMIT_TAG EMPTYSTR COMMIT_ID STR {yy.cherryPick($3, '', '')} | 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 mergeStatement