Merge branch 'rename-bug'

* rename-bug:
  Fix ArrayIndexOutOfBounds on non-square exact rename matrix

Conflicts:
	org.eclipse.jgit/src/org/eclipse/jgit/diff/RenameDetector.java

Change-Id: Ie0b8dd3e1ec174f79ba39dc4706bb0694cc8be29
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/RenameDetectorTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/RenameDetectorTest.java
index 26116d2..862fc0a 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/RenameDetectorTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/diff/RenameDetectorTest.java
@@ -173,17 +173,20 @@ public void testExactRename_PathBreaksTie() throws Exception {
 
 		DiffEntry c = DiffEntry.add("c.txt", foo);
 		DiffEntry d = DiffEntry.delete("d.txt", foo);
+		DiffEntry e = DiffEntry.add("the_e_file.txt", foo);
 
 		// Add out of order to avoid first-match succeeding
 		rd.add(a);
 		rd.add(d);
+		rd.add(e);
 		rd.add(b);
 		rd.add(c);
 
 		List<DiffEntry> entries = rd.compute();
-		assertEquals(2, entries.size());
+		assertEquals(3, entries.size());
 		assertRename(d, c, 100, entries.get(0));
 		assertRename(b, a, 100, entries.get(1));
+		assertCopy(d, e, 100, entries.get(2));
 	}
 
 	public void testExactRename_OneDeleteManyAdds() throws Exception {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/RenameDetector.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/RenameDetector.java
index 3ae3dc4..9c1310a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/RenameDetector.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/RenameDetector.java
@@ -508,14 +508,14 @@ private void findExactRenames(ProgressMonitor pm) {
 				List<DiffEntry> dels = (List<DiffEntry>) o;
 				long[] matrix = new long[dels.size() * adds.size()];
 				int mNext = 0;
-				for (int addIdx = 0; addIdx < adds.size(); addIdx++) {
-					String addedName = adds.get(addIdx).newPath;
+				for (int delIdx = 0; delIdx < dels.size(); delIdx++) {
+					String deletedName = dels.get(delIdx).oldPath;
 
-					for (int delIdx = 0; delIdx < dels.size(); delIdx++) {
-						String deletedName = dels.get(delIdx).oldPath;
+					for (int addIdx = 0; addIdx < adds.size(); addIdx++) {
+						String addedName = adds.get(addIdx).newPath;
 
 						int score = SimilarityRenameDetector.nameScore(addedName, deletedName);
-						matrix[mNext] = SimilarityRenameDetector.encode(score, addIdx, delIdx);
+						matrix[mNext] = SimilarityRenameDetector.encode(score, delIdx, addIdx);
 						mNext++;
 					}
 				}