* It didn't check the first character in the pattern due to a off-by-one error. Spotted by James Roper. * It returned true even when pattern was longer than current path, e.g. it returned that ".txt" is suffix of "txt". Bug: 411999 Change-Id: I9fbcd68a11fb57cc49956b70c387a47271a0424f Signed-off-by: Robin Stocker <robin@nibor.org>tags/v3.1.0.201309270735-rc1
@@ -82,6 +82,16 @@ public class PathSuffixFilterTest extends RepositoryTestCase { | |||
assertEquals(expected, paths); | |||
} | |||
@Test | |||
public void testEdgeCases() throws IOException { | |||
ObjectId treeId = createTree("abc", "abcd", "bcd", "c"); | |||
assertEquals(new ArrayList<String>(), getMatchingPaths("xbcd", treeId)); | |||
assertEquals(new ArrayList<String>(), getMatchingPaths("abcx", treeId)); | |||
assertEquals(Arrays.asList("abcd"), getMatchingPaths("abcd", treeId)); | |||
assertEquals(Arrays.asList("abcd", "bcd"), getMatchingPaths("bcd", treeId)); | |||
assertEquals(Arrays.asList("abc", "c"), getMatchingPaths("c", treeId)); | |||
} | |||
private ObjectId createTree(String... paths) throws IOException { | |||
final ObjectInserter odi = db.newObjectInserter(); | |||
final DirCache dc = db.readDirCache(); |
@@ -835,13 +835,17 @@ public class TreeWalk { | |||
final AbstractTreeIterator t = currentHead; | |||
final byte[] c = t.path; | |||
final int cLen = t.pathLen; | |||
int ci; | |||
for (ci = 1; ci < cLen && ci < pLen; ci++) { | |||
if (c[cLen-ci] != p[pLen-ci]) | |||
for (int i = 1; i <= pLen; i++) { | |||
// Pattern longer than current path | |||
if (i > cLen) | |||
return false; | |||
// Current path doesn't match pattern | |||
if (c[cLen - i] != p[pLen - i]) | |||
return false; | |||
} | |||
// Whole pattern tested -> matches | |||
return true; | |||
} | |||