Browse Source

Fix bugs in TreeWalk#isPathSuffix used by PathSuffixFilter

* 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.0.2.201309041250-rc2
Robin Stocker 10 years ago
parent
commit
c128100800

+ 10
- 0
org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/filter/PathSuffixFilterTest.java View File

@@ -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();

+ 7
- 3
org.eclipse.jgit/src/org/eclipse/jgit/treewalk/TreeWalk.java View File

@@ -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;
}


Loading…
Cancel
Save