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 {