From 7e752364a6000259b2ec3fc66e0314ba12e6c0d4 Mon Sep 17 00:00:00 2001 From: Thomas Wolf Date: Thu, 3 Feb 2022 20:24:53 +0100 Subject: [PATCH] [rebase] InteractiveHandler2: handle Gerrit Change-Ids Add a way for the handler to tell whether the commit should generate a Gerrit Change-Id. Augment the ModifyResult interface, and set the flag on the CommitCommand. This enables users to have a Change-ID be generated when squashing or rewording commits. A possibly already existing Change-Id will remain unchanged. Bug: 440211 Change-Id: I66a72e0646876d162a7011235cca969e20acf060 Signed-off-by: Thomas Wolf --- .../org/eclipse/jgit/api/RebaseCommand.java | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java index 037dd3be3..2b0d8ce1c 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseCommand.java @@ -448,10 +448,15 @@ private RebaseResult processStep(RebaseTodoLine step, boolean shouldPick) case REWORD: String oldMessage = commitToPick.getFullMessage(); CleanupMode mode = commitConfig.resolve(CleanupMode.DEFAULT, true); - String newMessage = editCommitMessage(oldMessage, mode); + boolean[] doChangeId = { false }; + String newMessage = editCommitMessage(doChangeId, oldMessage, mode); try (Git git = new Git(repo)) { - newHead = git.commit().setMessage(newMessage).setAmend(true) - .setNoVerify(true).call(); + newHead = git.commit() + .setMessage(newMessage) + .setAmend(true) + .setNoVerify(true) + .setInsertChangeId(doChangeId[0]) + .call(); } return null; case EDIT: @@ -488,7 +493,7 @@ private RebaseResult processStep(RebaseTodoLine step, boolean shouldPick) return null; } - private String editCommitMessage(String message, + private String editCommitMessage(boolean[] doChangeId, String message, @NonNull CleanupMode mode) { String newMessage; CommitConfig.CleanupMode cleanup; @@ -500,9 +505,11 @@ private String editCommitMessage(String message, if (CleanupMode.DEFAULT.equals(cleanup)) { cleanup = mode; } + doChangeId[0] = modification.shouldAddChangeId(); } else { newMessage = interactiveHandler.modifyCommitMessage(message); cleanup = CommitConfig.CleanupMode.STRIP; + doChangeId[0] = false; } return CommitConfig.cleanText(newMessage, cleanup, '#'); } @@ -799,13 +806,17 @@ private RevCommit squashIntoPrevious(boolean sequenceContainsSquash, } try (Git git = new Git(repo)) { if (isLast) { + boolean[] doChangeId = { false }; if (sequenceContainsSquash) { - commitMessage = editCommitMessage(commitMessage, + commitMessage = editCommitMessage(doChangeId, commitMessage, CleanupMode.STRIP); } retNewHead = git.commit() .setMessage(commitMessage) - .setAmend(true).setNoVerify(true).call(); + .setAmend(true) + .setNoVerify(true) + .setInsertChangeId(doChangeId[0]) + .call(); rebaseState.getFile(MESSAGE_SQUASH).delete(); rebaseState.getFile(MESSAGE_FIXUP).delete(); } else { @@ -1730,6 +1741,16 @@ interface ModifyResult { */ @NonNull CleanupMode getCleanupMode(); + + /** + * Tells whether a Gerrit Change-Id should be computed and added to + * the commit message, as with + * {@link CommitCommand#setInsertChangeId(boolean)}. + * + * @return {@code true} if a Change-Id should be handled, + * {@code false} otherwise + */ + boolean shouldAddChangeId(); } }