Fix ArrayIndexOutOfBounds on non-square exact rename matrix
If the exact rename matrix for a particular ObjectId isn't square we crashed with an ArrayIndexOutOfBoundsException because the matrix entries were encoded backwards. The encode function accepts the source (aka deleted) index first, not second. Add a unit test to cover this non-square case to ensure we don't have this regression in the future. Change-Id: I5b005e5093e1f00de2e3ec104e27ab6820203566 Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
parent
e64cb03065
commit
e2f5716c94
|
@ -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 {
|
||||
|
|
|
@ -390,14 +390,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).newName;
|
||||
|
||||
for (int delIdx = 0; delIdx < dels.size(); delIdx++) {
|
||||
String deletedName = dels.get(delIdx).oldName;
|
||||
|
||||
for (int addIdx = 0; addIdx < adds.size(); addIdx++) {
|
||||
String addedName = adds.get(addIdx).newName;
|
||||
|
||||
int score = SimilarityRenameDetector.nameScore(addedName, deletedName);
|
||||
matrix[mNext] = SimilarityRenameDetector.encode(score, addIdx, delIdx);
|
||||
matrix[mNext] = SimilarityRenameDetector.encode(score, delIdx, addIdx);
|
||||
mNext++;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue