From 8d36f77af5f1a819d9ccda202156b738cfb7f336 Mon Sep 17 00:00:00 2001 From: David Pursehouse Date: Sat, 2 Jun 2018 19:08:28 +0900 Subject: [PATCH] Replace non-trivial uses of RefDatabase.getRefs with getRefsByPrefix getRefs returns Map where the key is the ref name with the given prefix stripped off. However, getRefsByPrefix returns a list of Refs with the full refname. Therefore, when converting to getRefsByPrefix, we have to explicitly remove the ref prefix from each ref name before using it. Change-Id: I9a3ecf942ea47325fffa27596265fde217c2af0c --- .../com/google/gerrit/server/StarredChangesUtil.java | 6 +++++- .../gerrit/server/query/change/ChangeData.java | 10 +++++----- java/com/google/gerrit/server/update/RepoView.java | 12 ++++++------ 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/java/com/google/gerrit/server/StarredChangesUtil.java b/java/com/google/gerrit/server/StarredChangesUtil.java index 0fbf200910..df57c05f9a 100644 --- a/java/com/google/gerrit/server/StarredChangesUtil.java +++ b/java/com/google/gerrit/server/StarredChangesUtil.java @@ -296,7 +296,11 @@ public class StarredChangesUtil { private static Set getRefNames(Repository repo, String prefix) throws IOException { RefDatabase refDb = repo.getRefDatabase(); - return refDb.getRefs(prefix).keySet(); + return refDb + .getRefsByPrefix(prefix) + .stream() + .map(r -> r.getName().substring(prefix.length())) + .collect(toSet()); } public ObjectId getObjectId(Account.Id accountId, Change.Id changeId) { diff --git a/java/com/google/gerrit/server/query/change/ChangeData.java b/java/com/google/gerrit/server/query/change/ChangeData.java index 0a2f21911a..1a336fc1ce 100644 --- a/java/com/google/gerrit/server/query/change/ChangeData.java +++ b/java/com/google/gerrit/server/query/change/ChangeData.java @@ -1042,12 +1042,12 @@ public class ChangeData { editsByUser = new HashMap<>(); Change.Id id = checkNotNull(change.getId()); try (Repository repo = repoManager.openRepository(project())) { - for (Map.Entry e : - repo.getRefDatabase().getRefs(RefNames.REFS_USERS).entrySet()) { - if (id.equals(Change.Id.fromEditRefPart(e.getKey()))) { - Account.Id accountId = Account.Id.fromRefPart(e.getKey()); + for (Ref ref : repo.getRefDatabase().getRefsByPrefix(RefNames.REFS_USERS)) { + String name = ref.getName().substring(RefNames.REFS_USERS.length()); + if (id.equals(Change.Id.fromEditRefPart(name))) { + Account.Id accountId = Account.Id.fromRefPart(name); if (accountId != null) { - editsByUser.put(accountId, e.getValue()); + editsByUser.put(accountId, ref); } } } diff --git a/java/com/google/gerrit/server/update/RepoView.java b/java/com/google/gerrit/server/update/RepoView.java index 8839dbebc7..62cf6b1789 100644 --- a/java/com/google/gerrit/server/update/RepoView.java +++ b/java/com/google/gerrit/server/update/RepoView.java @@ -16,12 +16,11 @@ package com.google.gerrit.server.update; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; +import static java.util.stream.Collectors.toMap; -import com.google.common.collect.Maps; import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.git.GitRepositoryManager; import java.io.IOException; -import java.util.HashMap; import java.util.Map; import java.util.Optional; import org.eclipse.jgit.lib.Config; @@ -133,14 +132,15 @@ public class RepoView { * * @param prefix ref prefix; must end in '/' or else be empty. * @return a map of ref suffixes to SHA-1s. The refs are all under {@code prefix} and have the - * prefix stripped; this matches the behavior of {@link - * org.eclipse.jgit.lib.RefDatabase#getRefs(String)}. + * prefix stripped. * @throws IOException if an error occurred. */ public Map getRefs(String prefix) throws IOException { Map result = - new HashMap<>( - Maps.transformValues(repo.getRefDatabase().getRefs(prefix), Ref::getObjectId)); + repo.getRefDatabase() + .getRefsByPrefix(prefix) + .stream() + .collect(toMap(r -> r.getName().substring(prefix.length()), Ref::getObjectId)); // First, overwrite any cached reads from the underlying RepoRefCache. If any of these differ, // it's because a ref was updated after the RepoRefCache read it. It feels a little odd to