Merge changes I20b46401,I43ed0054 into stable-3.5
* changes:
Update JGit to 5166ded098
Update JGit to 0687c73a12
diff --git a/Documentation/pgm-init.txt b/Documentation/pgm-init.txt
index 3c9e3fc..4b346fe 100644
--- a/Documentation/pgm-init.txt
+++ b/Documentation/pgm-init.txt
@@ -38,11 +38,6 @@
install, reasonable configuration defaults are chosen based
on the whims of the Gerrit developers. On upgrades, the existing
settings in `gerrit.config` are respected.
-+
-If during a schema migration unused objects (e.g. tables, columns)
-are detected, they are *not* automatically dropped; a list of SQL
-statements to drop these objects is provided. To drop the unused
-objects these SQL statements must be executed manually.
--delete-caches::
Force deletion of all persistent cache files. Note that
diff --git a/java/com/google/gerrit/server/submit/RebaseSorter.java b/java/com/google/gerrit/server/submit/RebaseSorter.java
index 4775768..e960284 100644
--- a/java/com/google/gerrit/server/submit/RebaseSorter.java
+++ b/java/com/google/gerrit/server/submit/RebaseSorter.java
@@ -40,7 +40,7 @@
private final CurrentUser caller;
private final CodeReviewRevWalk rw;
private final RevFlag canMergeFlag;
- private final RevCommit initialTip;
+ private final Set<RevCommit> uninterestingBranchTips;
private final Set<RevCommit> alreadyAccepted;
private final Provider<InternalChangeQuery> queryProvider;
private final Set<CodeReviewCommit> incoming;
@@ -48,7 +48,7 @@
public RebaseSorter(
CurrentUser caller,
CodeReviewRevWalk rw,
- RevCommit initialTip,
+ Set<RevCommit> uninterestingBranchTips,
Set<RevCommit> alreadyAccepted,
RevFlag canMergeFlag,
Provider<InternalChangeQuery> queryProvider,
@@ -56,7 +56,7 @@
this.caller = caller;
this.rw = rw;
this.canMergeFlag = canMergeFlag;
- this.initialTip = initialTip;
+ this.uninterestingBranchTips = uninterestingBranchTips;
this.alreadyAccepted = alreadyAccepted;
this.queryProvider = queryProvider;
this.incoming = incoming;
@@ -70,15 +70,16 @@
rw.resetRetain(canMergeFlag);
rw.markStart(n);
- if (initialTip != null) {
- rw.markUninteresting(initialTip);
+ for (RevCommit uninterestingBranchTip : uninterestingBranchTips) {
+ rw.markUninteresting(uninterestingBranchTip);
}
CodeReviewCommit c;
final List<CodeReviewCommit> contents = new ArrayList<>();
while ((c = rw.next()) != null) {
if (!c.has(canMergeFlag) || !incoming.contains(c)) {
- if (isAlreadyMerged(c, n.change().getDest())) {
+ if (isMergedInBranchAsSubmittedChange(c, n.change().getDest())
+ || isAlreadyMergedInAnyBranch(c)) {
rw.markUninteresting(c);
} else {
// We cannot merge n as it would bring something we
@@ -108,7 +109,7 @@
return sorted;
}
- private boolean isAlreadyMerged(CodeReviewCommit commit, BranchNameKey dest) throws IOException {
+ private boolean isAlreadyMergedInAnyBranch(CodeReviewCommit commit) throws IOException {
try (CodeReviewRevWalk mirw = CodeReviewCommit.newRevWalk(rw.getObjectReader())) {
mirw.reset();
mirw.markStart(commit);
@@ -120,22 +121,24 @@
return true;
}
}
-
- // check if the commit associated change is merged in the same branch
- List<ChangeData> changes = queryProvider.get().byCommit(commit);
- for (ChangeData change : changes) {
- if (change.change().isMerged() && change.change().getDest().equals(dest)) {
- logger.atFine().log(
- "Dependency %s associated with merged change %s.", commit.getName(), change.getId());
- return true;
- }
- }
return false;
} catch (StorageException e) {
throw new IOException(e);
}
}
+ private boolean isMergedInBranchAsSubmittedChange(CodeReviewCommit commit, BranchNameKey dest) {
+ List<ChangeData> changes = queryProvider.get().byBranchCommit(dest, commit.getId().getName());
+ for (ChangeData change : changes) {
+ if (change.change().isMerged()) {
+ logger.atFine().log(
+ "Dependency %s associated with merged change %s.", commit.getName(), change.getId());
+ return true;
+ }
+ }
+ return false;
+ }
+
private static <T> T removeOne(Collection<T> c) {
final Iterator<T> i = c.iterator();
final T r = i.next();
diff --git a/java/com/google/gerrit/server/submit/SubmitStrategy.java b/java/com/google/gerrit/server/submit/SubmitStrategy.java
index 6291e6c..3b0ad00 100644
--- a/java/com/google/gerrit/server/submit/SubmitStrategy.java
+++ b/java/com/google/gerrit/server/submit/SubmitStrategy.java
@@ -20,6 +20,7 @@
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Sets;
+import com.google.gerrit.entities.BooleanProjectConfig;
import com.google.gerrit.entities.BranchNameKey;
import com.google.gerrit.entities.Change;
import com.google.gerrit.entities.SubmissionId;
@@ -212,11 +213,18 @@
projectCache.get(destBranch.project()).orElseThrow(illegalState(destBranch.project()));
this.mergeSorter =
new MergeSorter(caller, rw, alreadyAccepted, canMergeFlag, queryProvider, incoming);
+ Set<RevCommit> uninterestingBranchTips;
+ if (project.is(BooleanProjectConfig.CREATE_NEW_CHANGE_FOR_ALL_NOT_IN_TARGET)) {
+ RevCommit initialTip = mergeTip.getInitialTip();
+ uninterestingBranchTips = initialTip == null ? Set.of() : Set.of(initialTip);
+ } else {
+ uninterestingBranchTips = alreadyAccepted;
+ }
this.rebaseSorter =
new RebaseSorter(
caller,
rw,
- mergeTip.getInitialTip(),
+ uninterestingBranchTips,
alreadyAccepted,
canMergeFlag,
queryProvider,
diff --git a/javatests/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsWholeTopicMergeIT.java b/javatests/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsWholeTopicMergeIT.java
index 8367f60..428d4f1 100644
--- a/javatests/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsWholeTopicMergeIT.java
+++ b/javatests/com/google/gerrit/acceptance/git/SubmoduleSubscriptionsWholeTopicMergeIT.java
@@ -483,17 +483,19 @@
allowMatchingSubmoduleSubscription(subKey, "refs/heads/master", superKey, "refs/heads/master");
allowMatchingSubmoduleSubscription(subKey, "refs/heads/dev", superKey, "refs/heads/master");
- ObjectId devHead = pushChangeTo(subRepo, "dev");
+ ObjectId revMasterBranch = pushChangeTo(subRepo, "master");
+ ObjectId revDevBranch = pushChangeTo(subRepo, "dev");
Config config = new Config();
prepareSubmoduleConfigEntry(config, subKey, nameKey("sub-master"), "master");
prepareSubmoduleConfigEntry(config, subKey, nameKey("sub-dev"), "dev");
pushSubmoduleConfig(superRepo, "master", config);
+ subRepo.reset(revMasterBranch);
ObjectId subMasterId =
pushChangeTo(
subRepo, "refs/for/master", "some message", "b.txt", "content b", "same-topic");
- subRepo.reset(devHead);
+ subRepo.reset(revDevBranch);
ObjectId subDevId =
pushChangeTo(
subRepo, "refs/for/dev", "some message in dev", "b.txt", "content b", "same-topic");
@@ -701,14 +703,16 @@
TestRepository<?> repoA = cloneProject(keyA);
TestRepository<?> repoB = cloneProject(keyB);
- // bootstrap the dev branch
- ObjectId a0 = pushChangeTo(repoA, "dev");
- // bootstrap the dev branch
- ObjectId b0 = pushChangeTo(repoB, "dev");
+ // Create master- and dev branches in both repositories
+ ObjectId revMasterBranchA = pushChangeTo(repoA, "master");
+ ObjectId revMasterBranchB = pushChangeTo(repoB, "master");
+ ObjectId revDevBranchA = pushChangeTo(repoA, "dev");
+ ObjectId revDevBranchB = pushChangeTo(repoB, "dev");
// create a change for master branch in repo a
- ObjectId aHead =
+ repoA.reset(revMasterBranchA);
+ ObjectId revMasterChangeA =
pushChangeTo(
repoA,
"refs/for/master",
@@ -718,7 +722,8 @@
"same-topic");
// create a change for master branch in repo b
- ObjectId bHead =
+ repoB.reset(revMasterBranchB);
+ ObjectId revMasterChangeB =
pushChangeTo(
repoB,
"refs/for/master",
@@ -728,8 +733,8 @@
"same-topic");
// create a change for dev branch in repo a
- repoA.reset(a0);
- ObjectId aDevHead =
+ repoA.reset(revDevBranchA);
+ ObjectId revDevChangeA =
pushChangeTo(
repoA,
"refs/for/dev",
@@ -739,8 +744,8 @@
"same-topic");
// create a change for dev branch in repo b
- repoB.reset(b0);
- ObjectId bDevHead =
+ repoB.reset(revDevBranchB);
+ ObjectId revDevChangeB =
pushChangeTo(
repoB,
"refs/for/dev",
@@ -749,12 +754,12 @@
"some message in b dev.txt",
"same-topic");
- approve(getChangeId(repoA, aHead).get());
- approve(getChangeId(repoB, bHead).get());
- approve(getChangeId(repoA, aDevHead).get());
- approve(getChangeId(repoB, bDevHead).get());
+ approve(getChangeId(repoA, revMasterChangeA).get());
+ approve(getChangeId(repoB, revMasterChangeB).get());
+ approve(getChangeId(repoA, revDevChangeA).get());
+ approve(getChangeId(repoB, revDevChangeB).get());
- gApi.changes().id(getChangeId(repoA, aDevHead).get()).current().submit();
+ gApi.changes().id(getChangeId(repoA, revDevChangeA).get()).current().submit();
assertThat(projectOperations.project(keyA).getHead("refs/heads/master").getShortMessage())
.contains("some message in a master.txt");
assertThat(projectOperations.project(keyA).getHead("refs/heads/dev").getShortMessage())
@@ -774,8 +779,9 @@
// bootstrap the dev branch
pushChangeTo(repoA, "dev");
- // bootstrap the dev branch
- ObjectId b0 = pushChangeTo(repoB, "dev");
+ // Create master- and dev branches in repo b
+ ObjectId revMasterBranch = pushChangeTo(repoB, "master");
+ ObjectId revDevBranch = pushChangeTo(repoB, "dev");
allowMatchingSubmoduleSubscription(keyB, "refs/heads/master", keyA, "refs/heads/master");
allowMatchingSubmoduleSubscription(keyB, "refs/heads/dev", keyA, "refs/heads/dev");
@@ -784,7 +790,8 @@
createSubmoduleSubscription(repoA, "dev", keyB, "dev");
// create a change for master branch in repo b
- ObjectId bHead =
+ repoB.reset(revMasterBranch);
+ ObjectId revMasterChange =
pushChangeTo(
repoB,
"refs/for/master",
@@ -794,8 +801,8 @@
"same-topic");
// create a change for dev branch in repo b
- repoB.reset(b0);
- ObjectId bDevHead =
+ repoB.reset(revDevBranch);
+ ObjectId revDevChange =
pushChangeTo(
repoB,
"refs/for/dev",
@@ -804,9 +811,9 @@
"some message in b dev.txt",
"same-topic");
- approve(getChangeId(repoB, bHead).get());
- approve(getChangeId(repoB, bDevHead).get());
- gApi.changes().id(getChangeId(repoB, bHead).get()).current().submit();
+ approve(getChangeId(repoB, revMasterChange).get());
+ approve(getChangeId(repoB, revDevChange).get());
+ gApi.changes().id(getChangeId(repoB, revMasterChange).get()).current().submit();
expectToHaveSubmoduleState(repoA, "master", keyB, repoB, "master");
expectToHaveSubmoduleState(repoA, "dev", keyB, repoB, "dev");
diff --git a/javatests/com/google/gerrit/server/cache/mem/DefaultMemoryCacheFactoryTest.java b/javatests/com/google/gerrit/server/cache/mem/DefaultMemoryCacheFactoryTest.java
index da48341..7beb2ce 100644
--- a/javatests/com/google/gerrit/server/cache/mem/DefaultMemoryCacheFactoryTest.java
+++ b/javatests/com/google/gerrit/server/cache/mem/DefaultMemoryCacheFactoryTest.java
@@ -146,12 +146,11 @@
cacheFactory.build(newCacheDef(1), newCacheLoader(identity()), CacheBackend.CAFFEINE);
cache.put(TEST_CACHE_KEY, TEST_CACHE_VALUE);
- cache.invalidate(TEST_CACHE_KEY);
assertThat(forwardingRemovalListener.contains(TEST_CACHE_KEY, TEST_CACHE_VALUE)).isFalse();
+ cache.invalidate(TEST_CACHE_KEY);
evictionReceived.await(TEST_TIMEOUT_SEC, TimeUnit.SECONDS);
-
assertThat(forwardingRemovalListener.contains(TEST_CACHE_KEY, TEST_CACHE_VALUE)).isTrue();
assertThat(forwardingRemovalListener.removalThreadName(TEST_CACHE_KEY))
.startsWith(threadPoolPrefix);
diff --git a/resources/com/google/gerrit/httpd/auth/ldap/LoginForm.html b/resources/com/google/gerrit/httpd/auth/ldap/LoginForm.html
index 593ea45..08c890d 100644
--- a/resources/com/google/gerrit/httpd/auth/ldap/LoginForm.html
+++ b/resources/com/google/gerrit/httpd/auth/ldap/LoginForm.html
@@ -43,6 +43,7 @@
<input name="rememberme" id="f_remember"
type="checkbox"
value="1"
+ checked="checked"
tabindex="3" />
<label for="f_remember">Remember me</label>
</td>