Fix isMergedIntoVisibleRef check to handle prefix in RefMap
RefMap does not accept mixed prefixes, as this could cause a
key collision. Adding R_HEADS and R_TAGS to the same RefMap
will always fail.
Instead pull the refs into a List<Ref> and work from that.
Change-Id: I57a463cc462b97e3ed6ac76bc8d8129c88819b03
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java
index 3c6fd71..2ae09f2 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java
@@ -16,6 +16,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
import com.google.gerrit.common.Nullable;
import com.google.gerrit.common.PageLinks;
import com.google.gerrit.common.data.AccessSection;
@@ -525,7 +526,8 @@
try {
Repository repo = openRepository();
try {
- return isMergedIntoVisibleRef(repo, db, rw, commit, repo.getAllRefs());
+ return isMergedIntoVisibleRef(repo, db, rw, commit,
+ repo.getAllRefs().values());
} finally {
repo.close();
}
@@ -539,10 +541,14 @@
}
boolean isMergedIntoVisibleRef(Repository repo, ReviewDb db, RevWalk rw,
- RevCommit commit, Map<String, Ref> unfilteredRefs) throws IOException {
+ RevCommit commit, Collection<Ref> unfilteredRefs) throws IOException {
VisibleRefFilter filter =
new VisibleRefFilter(tagCache, changeCache, repo, this, db, true);
- Map<String, Ref> refs = filter.filter(unfilteredRefs, true);
+ Map<String, Ref> m = Maps.newHashMapWithExpectedSize(unfilteredRefs.size());
+ for (Ref r : unfilteredRefs) {
+ m.put(r.getName(), r);
+ }
+ Map<String, Ref> refs = filter.filter(m, true);
return !refs.isEmpty()
&& IncludedInResolver.includedInOne(repo, rw, commit, refs.values());
}
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefControl.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/RefControl.java
index f13b411..9848faa 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/RefControl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/RefControl.java
@@ -324,9 +324,9 @@
try {
Repository repo = projectControl.openRepository();
try {
- Map<String, Ref> refs =
- repo.getRefDatabase().getRefs(Constants.R_HEADS);
- refs.putAll(repo.getRefDatabase().getRefs(Constants.R_TAGS));
+ List<Ref> refs = new ArrayList<>(
+ repo.getRefDatabase().getRefs(Constants.R_HEADS).values());
+ refs.addAll(repo.getRefDatabase().getRefs(Constants.R_TAGS).values());
return projectControl.isMergedIntoVisibleRef(
repo, db, rw, commit, refs);
} finally {