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
This commit is contained in:
Shawn Pearce
2014-08-15 17:25:08 -07:00
parent 12968f26df
commit 60bca74a78
2 changed files with 12 additions and 6 deletions

View File

@@ -16,6 +16,7 @@ package com.google.gerrit.server.project;
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 @@ public class ProjectControl {
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 @@ public class ProjectControl {
}
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());
}

View File

@@ -324,9 +324,9 @@ public class RefControl {
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 {