diff options
author | Luca Milanesio <luca.milanesio@gmail.com> | 2021-01-15 23:05:54 +0000 |
---|---|---|
committer | David Ostrovsky <david@ostrovsky.org> | 2021-01-26 16:19:50 +0100 |
commit | 91b6fce59003544615a07b19bc64ecd589d09000 (patch) | |
tree | e725c481a43c2660fa0cc3f2951cb60740f723fb | |
parent | 19721518c388e1da1f5e0175f8c2e26c7c45243d (diff) |
Move ensureChangeIdIsCorrect from PutMessage to ChangeUtil
The ensureChangeIdIsCorrect method implements the logic for accepting
or reject a commit message based on its Change-Id footer correctness.
This is a preparation work for sharing the validation logic between
commit message changed in context of change edit and commit message
changed directly from change screen.
Moving the method to ChangeUtil allows to avoid circular dependencies
between the 'server' and 'restapi' Bazel build modules.
Change-Id: Iadd8c7020b6cc7add27d040d147b6ccea725f61b
-rw-r--r-- | java/com/google/gerrit/server/ChangeUtil.java | 38 | ||||
-rw-r--r-- | java/com/google/gerrit/server/restapi/change/PutMessage.java | 27 |
2 files changed, 39 insertions, 26 deletions
diff --git a/java/com/google/gerrit/server/ChangeUtil.java b/java/com/google/gerrit/server/ChangeUtil.java index a13f105b0a..393833cc89 100644 --- a/java/com/google/gerrit/server/ChangeUtil.java +++ b/java/com/google/gerrit/server/ChangeUtil.java @@ -19,16 +19,23 @@ import static java.util.Comparator.comparingInt; import com.google.common.collect.Maps; import com.google.common.collect.Ordering; import com.google.common.io.BaseEncoding; +import com.google.gerrit.common.FooterConstants; +import com.google.gerrit.extensions.restapi.BadRequestException; +import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.PatchSet; +import com.google.gerrit.server.util.CommitMessageUtil; import com.google.inject.Singleton; import java.io.IOException; import java.security.SecureRandom; +import java.util.List; import java.util.Map; import java.util.Random; +import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; @Singleton public class ChangeUtil { @@ -112,6 +119,37 @@ public class ChangeUtil { id); } + /** + * Make sure that the change commit message has a correct footer. + * + * @param requireChangeId true if Change-Id is a mandatory footer for the project + * @param currentChangeId current Change-Id value before the commit message is updated + * @param newCommitMessage new commit message for the change + * @throws ResourceConflictException if the new commit message has a missing or invalid Change-Id + * @throws BadRequestException if the new commit message is null or empty + */ + public static void ensureChangeIdIsCorrect( + boolean requireChangeId, String currentChangeId, String newCommitMessage) + throws ResourceConflictException, BadRequestException { + RevCommit revCommit = + RevCommit.parse( + Constants.encode("tree " + ObjectId.zeroId().name() + "\n\n" + newCommitMessage)); + + // Check that the commit message without footers is not empty + CommitMessageUtil.checkAndSanitizeCommitMessage(revCommit.getShortMessage()); + + List<String> changeIdFooters = revCommit.getFooterLines(FooterConstants.CHANGE_ID); + if (requireChangeId && changeIdFooters.isEmpty()) { + throw new ResourceConflictException("missing Change-Id footer"); + } + if (!changeIdFooters.isEmpty() && !changeIdFooters.get(0).equals(currentChangeId)) { + throw new ResourceConflictException("wrong Change-Id footer"); + } + if (changeIdFooters.size() > 1) { + throw new ResourceConflictException("multiple Change-Id footers"); + } + } + public static String status(Change c) { return c != null ? c.getStatus().name().toLowerCase() : "deleted"; } diff --git a/java/com/google/gerrit/server/restapi/change/PutMessage.java b/java/com/google/gerrit/server/restapi/change/PutMessage.java index bcd0e9e455..c0071fbfa5 100644 --- a/java/com/google/gerrit/server/restapi/change/PutMessage.java +++ b/java/com/google/gerrit/server/restapi/change/PutMessage.java @@ -14,7 +14,6 @@ package com.google.gerrit.server.restapi.change; -import com.google.gerrit.common.FooterConstants; import com.google.gerrit.extensions.api.changes.NotifyHandling; import com.google.gerrit.extensions.common.CommitMessageInput; import com.google.gerrit.extensions.restapi.AuthException; @@ -50,11 +49,9 @@ import com.google.inject.Provider; import com.google.inject.Singleton; import java.io.IOException; import java.sql.Timestamp; -import java.util.List; import java.util.TimeZone; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.CommitBuilder; -import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectInserter; import org.eclipse.jgit.lib.PersonIdent; @@ -116,7 +113,7 @@ public class PutMessage String sanitizedCommitMessage = CommitMessageUtil.checkAndSanitizeCommitMessage(input.message); ensureCanEditCommitMessage(resource.getNotes()); - ensureChangeIdIsCorrect( + ChangeUtil.ensureChangeIdIsCorrect( projectCache.checkedGet(resource.getProject()).is(BooleanProjectConfig.REQUIRE_CHANGE_ID), resource.getChange().getKey().get(), sanitizedCommitMessage); @@ -196,26 +193,4 @@ public class PutMessage throw new AuthException("modifying commit message not permitted", denied); } } - - private static void ensureChangeIdIsCorrect( - boolean requireChangeId, String currentChangeId, String newCommitMessage) - throws ResourceConflictException, BadRequestException { - RevCommit revCommit = - RevCommit.parse( - Constants.encode("tree " + ObjectId.zeroId().name() + "\n\n" + newCommitMessage)); - - // Check that the commit message without footers is not empty - CommitMessageUtil.checkAndSanitizeCommitMessage(revCommit.getShortMessage()); - - List<String> changeIdFooters = revCommit.getFooterLines(FooterConstants.CHANGE_ID); - if (requireChangeId && changeIdFooters.isEmpty()) { - throw new ResourceConflictException("missing Change-Id footer"); - } - if (!changeIdFooters.isEmpty() && !changeIdFooters.get(0).equals(currentChangeId)) { - throw new ResourceConflictException("wrong Change-Id footer"); - } - if (changeIdFooters.size() > 1) { - throw new ResourceConflictException("multiple Change-Id footers"); - } - } } |