diff options
author | Luca Milanesio <luca.milanesio@gmail.com> | 2022-10-21 10:42:15 +0100 |
---|---|---|
committer | Luca Milanesio <luca.milanesio@gmail.com> | 2022-10-21 10:51:45 +0100 |
commit | b20005626546964729e341465f835daa91141916 (patch) | |
tree | 9cf1719c4504b96a93e41c465bdd54c0e18e6ee4 | |
parent | 5f156a8febabca89b220547641f9c7a93ee89bfa (diff) | |
parent | eb9031212cda1f960dbdfa76c913bba6d19c035d (diff) |
Merge branch 'stable-2.16' into stable-3.0
* stable-2.16:
Limit the number of changes that can be submitted together
Release-Notes: skip
Change-Id: I263d636ec38f043ad5f6f8157ea5a57e12e7b145
3 files changed, 58 insertions, 6 deletions
diff --git a/Documentation/config-gerrit.txt b/Documentation/config-gerrit.txt index 6d98877225..b39cd18e32 100644 --- a/Documentation/config-gerrit.txt +++ b/Documentation/config-gerrit.txt @@ -1210,6 +1210,13 @@ in change tables and user dashboards. + By default 500. +[[change.maxSubmittableAtOnce]]change.maxSubmittableAtOnce:: ++ +Maximum number of changes that can be chained together in the same repository +to be submitted at once. ++ +Default is 32767. + [[change.move]]change.move:: + Whether the link:rest-api-changes.html#move-change[Move Change] REST diff --git a/java/com/google/gerrit/server/submit/LocalMergeSuperSetComputation.java b/java/com/google/gerrit/server/submit/LocalMergeSuperSetComputation.java index 1219124fb3..8e2f44f7d4 100644 --- a/java/com/google/gerrit/server/submit/LocalMergeSuperSetComputation.java +++ b/java/com/google/gerrit/server/submit/LocalMergeSuperSetComputation.java @@ -30,6 +30,7 @@ import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.reviewdb.client.Branch; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.CurrentUser; +import com.google.gerrit.server.config.GerritServerConfig; import com.google.gerrit.server.permissions.ChangePermission; import com.google.gerrit.server.permissions.PermissionBackend; import com.google.gerrit.server.permissions.PermissionBackendException; @@ -53,6 +54,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; +import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.revwalk.RevCommit; @@ -65,6 +67,8 @@ import org.eclipse.jgit.revwalk.RevSort; public class LocalMergeSuperSetComputation implements MergeSuperSetComputation { private static final FluentLogger logger = FluentLogger.forEnclosingClass(); + public static final int MAX_SUBMITTABLE_CHANGES_AT_ONCE_DEFAULT = 1024; + public static class Module extends AbstractModule { @Override protected void configure() { @@ -91,19 +95,24 @@ public class LocalMergeSuperSetComputation implements MergeSuperSetComputation { private final Map<Branch.NameKey, Optional<RevCommit>> heads; private final ProjectCache projectCache; private final ChangeIsVisibleToPredicate.Factory changeIsVisibleToPredicateFactory; + private final int maxSubmittableChangesAtOnce; @Inject LocalMergeSuperSetComputation( PermissionBackend permissionBackend, Provider<InternalChangeQuery> queryProvider, ProjectCache projectCache, - ChangeIsVisibleToPredicate.Factory changeIsVisibleToPredicateFactory) { + ChangeIsVisibleToPredicate.Factory changeIsVisibleToPredicateFactory, + @GerritServerConfig Config gerritConfig) { this.projectCache = projectCache; this.permissionBackend = permissionBackend; this.queryProvider = queryProvider; this.queryCache = new HashMap<>(); this.heads = new HashMap<>(); this.changeIsVisibleToPredicateFactory = changeIsVisibleToPredicateFactory; + this.maxSubmittableChangesAtOnce = + gerritConfig.getInt( + "change", "maxSubmittableAtOnce", MAX_SUBMITTABLE_CHANGES_AT_ONCE_DEFAULT); } @Override @@ -149,8 +158,10 @@ public class LocalMergeSuperSetComputation implements MergeSuperSetComputation { } Set<String> visibleHashes = - walkChangesByHashes(visibleCommits, Collections.emptySet(), or, b); - Set<String> nonVisibleHashes = walkChangesByHashes(nonVisibleCommits, visibleHashes, or, b); + walkChangesByHashes( + visibleCommits, Collections.emptySet(), or, b, maxSubmittableChangesAtOnce); + Set<String> nonVisibleHashes = + walkChangesByHashes(nonVisibleCommits, visibleHashes, or, b, maxSubmittableChangesAtOnce); ChangeSet partialSet = byCommitsOnBranchNotMerged(or, b, visibleHashes, nonVisibleHashes, user); @@ -252,7 +263,11 @@ public class LocalMergeSuperSetComputation implements MergeSuperSetComputation { } private Set<String> walkChangesByHashes( - Collection<RevCommit> sourceCommits, Set<String> ignoreHashes, OpenRepo or, Branch.NameKey b) + Collection<RevCommit> sourceCommits, + Set<String> ignoreHashes, + OpenRepo or, + Branch.NameKey b, + int limit) throws IOException { Set<String> destHashes = new HashSet<>(); or.rw.reset(); @@ -262,7 +277,11 @@ public class LocalMergeSuperSetComputation implements MergeSuperSetComputation { if (ignoreHashes.contains(name)) { continue; } - destHashes.add(name); + if (destHashes.size() < limit) { + destHashes.add(name); + } else { + break; + } or.rw.markStart(c); } for (RevCommit c : or.rw) { @@ -270,7 +289,11 @@ public class LocalMergeSuperSetComputation implements MergeSuperSetComputation { if (ignoreHashes.contains(name)) { continue; } - destHashes.add(name); + if (destHashes.size() < limit) { + destHashes.add(name); + } else { + break; + } } return destHashes; diff --git a/javatests/com/google/gerrit/acceptance/server/change/SubmittedTogetherIT.java b/javatests/com/google/gerrit/acceptance/server/change/SubmittedTogetherIT.java index 389859cde2..4224953841 100644 --- a/javatests/com/google/gerrit/acceptance/server/change/SubmittedTogetherIT.java +++ b/javatests/com/google/gerrit/acceptance/server/change/SubmittedTogetherIT.java @@ -19,7 +19,9 @@ import static com.google.gerrit.acceptance.GitUtil.pushHead; import static com.google.gerrit.extensions.api.changes.SubmittedTogetherOption.NON_VISIBLE_CHANGES; import com.google.gerrit.acceptance.AbstractDaemonTest; +import com.google.gerrit.acceptance.GerritConfig; import com.google.gerrit.acceptance.GitUtil; +import com.google.gerrit.acceptance.Sandboxed; import com.google.gerrit.acceptance.TestProjectInput; import com.google.gerrit.acceptance.testsuite.project.ProjectOperations; import com.google.gerrit.acceptance.testsuite.request.RequestScopeOperations; @@ -184,6 +186,26 @@ public class SubmittedTogetherIT extends AbstractDaemonTest { } @Test + @Sandboxed + @GerritConfig(name = "change.maxSubmittableAtOnce", value = "2") + public void submittedTogetherWithMaxChangesLimit() throws Exception { + String targetRef = "refs/for/master"; + + commitBuilder().add("a.txt", "1").message("subject: 1").create(); + pushHead(testRepo, targetRef, false); + + RevCommit c2_1 = commitBuilder().add("b.txt", "2").message("subject: 2").create(); + String id2 = getChangeId(c2_1); + pushHead(testRepo, targetRef, false); + + RevCommit c3_1 = commitBuilder().add("b.txt", "3").message("subject: 3").create(); + String id3 = getChangeId(c3_1); + pushHead(testRepo, targetRef, false); + + assertSubmittedTogether(id3, id3, id2); + } + + @Test public void respectTopicsOnAncestors() throws Exception { RevCommit initialHead = getRemoteHead(); |