dfs: Fix default DfsStreamKey to include DfsRepositoryDescription

Not all DFS implementations use globally unique pack names in the
DfsPackDescription.  Most require the DfsRepositoryDescription to
qualify the pack.  Include DfsRepositoryDescription in the default
DfsStreamKey implementation, to prevent cache collisions.

Change-Id: I9ebf0c76bf2b414a702ae050b32e42588067bc44
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackDescription.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackDescription.java
index 86a0489..0e2ed3b 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackDescription.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackDescription.java
@@ -133,7 +133,7 @@
 	 * @return cache key for use by the block cache.
 	 */
 	public DfsStreamKey getStreamKey(PackExt ext) {
-		return DfsStreamKey.of(getFileName(ext));
+		return DfsStreamKey.of(getRepositoryDescription(), getFileName(ext));
 	}
 
 	/** @return the source of the pack. */
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsStreamKey.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsStreamKey.java
index f0a5da0..54a7489 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsStreamKey.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsStreamKey.java
@@ -50,22 +50,14 @@
 /** Key used by {@link DfsBlockCache} to disambiguate streams. */
 public abstract class DfsStreamKey {
 	/**
+	 * @param repo
+	 *            description of the containing repository.
 	 * @param name
 	 *            compute the key from a string name.
 	 * @return key for {@code name}
 	 */
-	public static DfsStreamKey of(String name) {
-		return of(name.getBytes(UTF_8));
-	}
-
-	/**
-	 * @param name
-	 *            compute the key from a byte array. The key takes ownership of
-	 *            the passed {@code byte[] name}.
-	 * @return key for {@code name}
-	 */
-	public static DfsStreamKey of(byte[] name) {
-		return new ByteArrayDfsStreamKey(name);
+	public static DfsStreamKey of(DfsRepositoryDescription repo, String name) {
+		return new ByteArrayDfsStreamKey(repo, name.getBytes(UTF_8));
 	}
 
 	final int hash;
@@ -95,10 +87,12 @@
 	}
 
 	private static final class ByteArrayDfsStreamKey extends DfsStreamKey {
+		private final DfsRepositoryDescription repo;
 		private final byte[] name;
 
-		ByteArrayDfsStreamKey(byte[] name) {
-			super(Arrays.hashCode(name));
+		ByteArrayDfsStreamKey(DfsRepositoryDescription repo, byte[] name) {
+			super(repo.hashCode() * 31 + Arrays.hashCode(name));
+			this.repo = repo;
 			this.name = name;
 		}
 
@@ -106,7 +100,9 @@
 		public boolean equals(Object o) {
 			if (o instanceof ByteArrayDfsStreamKey) {
 				ByteArrayDfsStreamKey k = (ByteArrayDfsStreamKey) o;
-				return hash == k.hash && Arrays.equals(name, k.name);
+				return hash == k.hash
+						&& repo.equals(k.repo)
+						&& Arrays.equals(name, k.name);
 			}
 			return false;
 		}