Merge changes from topic "get-refs"
* changes:
ChangeUtil: Avoid RefDatabase#getRefs
HackPushNegotiateHook: Avoid RefDatabase#getRefs
ListTags: Avoid RefDatabase#getRefs
HooksUtil: Avoid RefDatabase#getRefs
LsUserRefs: Avoid RefDatabase#getRefs
diff --git a/java/com/google/gerrit/server/ChangeUtil.java b/java/com/google/gerrit/server/ChangeUtil.java
index a13f105..7a6d3e6 100644
--- a/java/com/google/gerrit/server/ChangeUtil.java
+++ b/java/com/google/gerrit/server/ChangeUtil.java
@@ -15,8 +15,8 @@
package com.google.gerrit.server;
import static java.util.Comparator.comparingInt;
+import static java.util.stream.Collectors.toSet;
-import com.google.common.collect.Maps;
import com.google.common.collect.Ordering;
import com.google.common.io.BaseEncoding;
import com.google.gerrit.reviewdb.client.Change;
@@ -24,9 +24,11 @@
import com.google.inject.Singleton;
import java.io.IOException;
import java.security.SecureRandom;
+import java.util.Collection;
import java.util.Map;
import java.util.Random;
-import org.eclipse.jgit.lib.ObjectId;
+import java.util.Set;
+import java.util.stream.Stream;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
@@ -66,18 +68,25 @@
/**
* Get the next patch set ID from a previously-read map of refs below the change prefix.
*
- * @param changeRefs map of ref suffix to SHA-1, where the keys are ref names with the {@code
- * refs/changes/CD/ABCD/} prefix stripped. All refs should be under {@code id}'s change ref
- * prefix.
+ * @param changeRefNames existing full change ref names with the same change ID as {@code id}.
* @param id previous patch set ID.
* @return next unused patch set ID for the same change, skipping any IDs whose corresponding ref
* names appear in the {@code changeRefs} map.
*/
- public static PatchSet.Id nextPatchSetIdFromChangeRefsMap(
- Map<String, ObjectId> changeRefs, PatchSet.Id id) {
- int prefixLen = id.getParentKey().toRefPrefix().length();
+ public static PatchSet.Id nextPatchSetIdFromChangeRefs(
+ Collection<String> changeRefNames, PatchSet.Id id) {
+ return nextPatchSetIdFromChangeRefs(changeRefNames.stream(), id);
+ }
+
+ private static PatchSet.Id nextPatchSetIdFromChangeRefs(
+ Stream<String> changeRefNames, PatchSet.Id id) {
+ Set<PatchSet.Id> existing =
+ changeRefNames
+ .map(PatchSet.Id::fromRef)
+ .filter(psId -> psId != null && psId.getParentKey().equals(id.getParentKey()))
+ .collect(toSet());
PatchSet.Id next = nextPatchSetId(id);
- while (changeRefs.containsKey(next.toRefName().substring(prefixLen))) {
+ while (existing.contains(next)) {
next = nextPatchSetId(next);
}
return next;
@@ -88,7 +97,7 @@
*
* <p>This patch set ID may or may not be available in the database; callers that want a
* previously-unused ID should use {@link #nextPatchSetIdFromAllRefsMap} or {@link
- * #nextPatchSetIdFromChangeRefsMap}.
+ * #nextPatchSetIdFromChangeRefs}.
*
* @param id previous patch set ID.
* @return next patch set ID for the same change, incrementing by 1.
@@ -106,9 +115,11 @@
* names appear in the repository.
*/
public static PatchSet.Id nextPatchSetId(Repository git, PatchSet.Id id) throws IOException {
- return nextPatchSetIdFromChangeRefsMap(
- Maps.transformValues(
- git.getRefDatabase().getRefs(id.getParentKey().toRefPrefix()), Ref::getObjectId),
+ return nextPatchSetIdFromChangeRefs(
+ git.getRefDatabase()
+ .getRefsByPrefix(id.getParentKey().toRefPrefix())
+ .stream()
+ .map(Ref::getName),
id);
}
diff --git a/java/com/google/gerrit/server/change/RebaseChangeOp.java b/java/com/google/gerrit/server/change/RebaseChangeOp.java
index ea266a0..a64900b 100644
--- a/java/com/google/gerrit/server/change/RebaseChangeOp.java
+++ b/java/com/google/gerrit/server/change/RebaseChangeOp.java
@@ -174,8 +174,10 @@
baseCommitId.name());
rebasedPatchSetId =
- ChangeUtil.nextPatchSetIdFromChangeRefsMap(
- ctx.getRepoView().getRefs(originalPatchSet.getId().getParentKey().toRefPrefix()),
+ ChangeUtil.nextPatchSetIdFromChangeRefs(
+ ctx.getRepoView()
+ .getRefs(originalPatchSet.getId().getParentKey().toRefPrefix())
+ .keySet(),
notes.getChange().currentPatchSetId());
patchSetInserter =
patchSetInserterFactory
diff --git a/java/com/google/gerrit/server/git/HookUtil.java b/java/com/google/gerrit/server/git/HookUtil.java
index 42d3f69..27c6e1e 100644
--- a/java/com/google/gerrit/server/git/HookUtil.java
+++ b/java/com/google/gerrit/server/git/HookUtil.java
@@ -14,10 +14,11 @@
package com.google.gerrit.server.git;
+import static java.util.stream.Collectors.toMap;
+
import java.io.IOException;
import java.util.Map;
import org.eclipse.jgit.lib.Ref;
-import org.eclipse.jgit.lib.RefDatabase;
import org.eclipse.jgit.transport.BaseReceivePack;
import org.eclipse.jgit.transport.ServiceMayNotContinueException;
@@ -38,7 +39,12 @@
return refs;
}
try {
- refs = rp.getRepository().getRefDatabase().getRefs(RefDatabase.ALL);
+ refs =
+ rp.getRepository()
+ .getRefDatabase()
+ .getRefs()
+ .stream()
+ .collect(toMap(Ref::getName, r -> r));
} catch (ServiceMayNotContinueException e) {
throw e;
} catch (IOException e) {
diff --git a/java/com/google/gerrit/server/git/receive/HackPushNegotiateHook.java b/java/com/google/gerrit/server/git/receive/HackPushNegotiateHook.java
index bf3d270..c6c4819 100644
--- a/java/com/google/gerrit/server/git/receive/HackPushNegotiateHook.java
+++ b/java/com/google/gerrit/server/git/receive/HackPushNegotiateHook.java
@@ -14,7 +14,7 @@
package com.google.gerrit.server.git.receive;
-import static org.eclipse.jgit.lib.RefDatabase.ALL;
+import static java.util.stream.Collectors.toMap;
import com.google.common.collect.Sets;
import com.google.common.flogger.FluentLogger;
@@ -78,7 +78,12 @@
Map<String, Ref> r = rp.getAdvertisedRefs();
if (r == null) {
try {
- r = rp.getRepository().getRefDatabase().getRefs(ALL);
+ r =
+ rp.getRepository()
+ .getRefDatabase()
+ .getRefs()
+ .stream()
+ .collect(toMap(Ref::getName, x -> x));
} catch (ServiceMayNotContinueException e) {
throw e;
} catch (IOException e) {
diff --git a/java/com/google/gerrit/server/restapi/project/ListTags.java b/java/com/google/gerrit/server/restapi/project/ListTags.java
index f59e984..7a46b9c 100644
--- a/java/com/google/gerrit/server/restapi/project/ListTags.java
+++ b/java/com/google/gerrit/server/restapi/project/ListTags.java
@@ -17,7 +17,7 @@
import static com.google.gerrit.reviewdb.client.RefNames.isConfigRef;
import static java.util.Comparator.comparing;
-import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableList;
import com.google.gerrit.extensions.api.projects.ProjectApi.ListRefsRequest;
import com.google.gerrit.extensions.api.projects.TagInfo;
import com.google.gerrit.extensions.common.WebLinkInfo;
@@ -127,7 +127,8 @@
try (Repository repo = getRepository(resource.getNameKey());
RevWalk rw = new RevWalk(repo)) {
Map<String, Ref> all =
- visibleTags(resource.getNameKey(), repo, repo.getRefDatabase().getRefs(Constants.R_TAGS));
+ visibleTags(
+ resource.getNameKey(), repo, repo.getRefDatabase().getRefsByPrefix(Constants.R_TAGS));
for (Ref ref : all.values()) {
tags.add(
createTagInfo(perm.ref(ref.getName()), ref, rw, resource.getProjectState(), links));
@@ -154,8 +155,7 @@
}
Ref ref = repo.getRefDatabase().exactRef(tagName);
if (ref != null
- && !visibleTags(resource.getNameKey(), repo, ImmutableMap.of(ref.getName(), ref))
- .isEmpty()) {
+ && !visibleTags(resource.getNameKey(), repo, ImmutableList.of(ref)).isEmpty()) {
return createTagInfo(
permissionBackend
.user(resource.getUser())
@@ -221,8 +221,7 @@
}
}
- private Map<String, Ref> visibleTags(
- Project.NameKey project, Repository repo, Map<String, Ref> tags)
+ private Map<String, Ref> visibleTags(Project.NameKey project, Repository repo, List<Ref> tags)
throws PermissionBackendException {
return permissionBackend
.currentUser()
diff --git a/java/com/google/gerrit/server/submit/CherryPick.java b/java/com/google/gerrit/server/submit/CherryPick.java
index afc9e7d..f50525c 100644
--- a/java/com/google/gerrit/server/submit/CherryPick.java
+++ b/java/com/google/gerrit/server/submit/CherryPick.java
@@ -97,8 +97,8 @@
// tip.
args.rw.parseBody(toMerge);
psId =
- ChangeUtil.nextPatchSetIdFromChangeRefsMap(
- ctx.getRepoView().getRefs(getId().toRefPrefix()),
+ ChangeUtil.nextPatchSetIdFromChangeRefs(
+ ctx.getRepoView().getRefs(getId().toRefPrefix()).keySet(),
toMerge.change().currentPatchSetId());
RevCommit mergeTip = args.mergeTip.getCurrentTip();
args.rw.parseBody(mergeTip);
diff --git a/java/com/google/gerrit/server/submit/RebaseSubmitStrategy.java b/java/com/google/gerrit/server/submit/RebaseSubmitStrategy.java
index f24ee9c..ad53c53 100644
--- a/java/com/google/gerrit/server/submit/RebaseSubmitStrategy.java
+++ b/java/com/google/gerrit/server/submit/RebaseSubmitStrategy.java
@@ -137,8 +137,8 @@
// RebaseAlways means we modify commit message.
args.rw.parseBody(toMerge);
newPatchSetId =
- ChangeUtil.nextPatchSetIdFromChangeRefsMap(
- ctx.getRepoView().getRefs(getId().toRefPrefix()),
+ ChangeUtil.nextPatchSetIdFromChangeRefs(
+ ctx.getRepoView().getRefs(getId().toRefPrefix()).keySet(),
toMerge.change().currentPatchSetId());
RevCommit mergeTip = args.mergeTip.getCurrentTip();
args.rw.parseBody(mergeTip);
diff --git a/java/com/google/gerrit/sshd/commands/LsUserRefs.java b/java/com/google/gerrit/sshd/commands/LsUserRefs.java
index 3b2257c..969ce50 100644
--- a/java/com/google/gerrit/sshd/commands/LsUserRefs.java
+++ b/java/com/google/gerrit/sshd/commands/LsUserRefs.java
@@ -15,7 +15,6 @@
package com.google.gerrit.sshd.commands;
import static com.google.gerrit.sshd.CommandMetaData.Mode.MASTER_OR_SLAVE;
-import static org.eclipse.jgit.lib.RefDatabase.ALL;
import com.google.gerrit.common.data.GlobalCapability;
import com.google.gerrit.extensions.annotations.RequiresCapability;
@@ -94,7 +93,7 @@
permissionBackend
.user(user)
.project(projectName)
- .filter(repo.getRefDatabase().getRefs(ALL), repo, RefFilterOptions.defaults());
+ .filter(repo.getRefDatabase().getRefs(), repo, RefFilterOptions.defaults());
for (String ref : refsMap.keySet()) {
if (!onlyRefsHeads || ref.startsWith(RefNames.REFS_HEADS)) {