diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/IgnoreNodeTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/IgnoreNodeTest.java index 9c23f3ca3..9722ac675 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/IgnoreNodeTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/IgnoreNodeTest.java @@ -354,6 +354,56 @@ public void testSlashOnlyMatchesDirectory() throws IOException { endWalk(); } + @Test + public void testSlashMatchesDirectory() throws IOException { + writeIgnoreFile(".gitignore", "out2/"); + + writeTrashFile("out1/out1", ""); + writeTrashFile("out1/out2", ""); + writeTrashFile("out2/out1", ""); + writeTrashFile("out2/out2", ""); + + beginWalk(); + assertEntry(F, tracked, ".gitignore"); + assertEntry(D, tracked, "out1"); + assertEntry(F, tracked, "out1/out1"); + assertEntry(F, tracked, "out1/out2"); + assertEntry(D, ignored, "out2"); + assertEntry(F, ignored, "out2/out1"); + assertEntry(F, ignored, "out2/out2"); + endWalk(); + } + + @Test + public void testWildcardWithSlashMatchesDirectory() throws IOException { + writeIgnoreFile(".gitignore", "out2*/"); + + writeTrashFile("out1/out1.txt", ""); + writeTrashFile("out1/out2", ""); + writeTrashFile("out1/out2.txt", ""); + writeTrashFile("out1/out2x/a", ""); + writeTrashFile("out2/out1.txt", ""); + writeTrashFile("out2/out2.txt", ""); + writeTrashFile("out2x/out1.txt", ""); + writeTrashFile("out2x/out2.txt", ""); + + beginWalk(); + assertEntry(F, tracked, ".gitignore"); + assertEntry(D, tracked, "out1"); + assertEntry(F, tracked, "out1/out1.txt"); + assertEntry(F, tracked, "out1/out2"); + assertEntry(F, tracked, "out1/out2.txt"); + assertEntry(D, ignored, "out1/out2x"); + assertEntry(F, ignored, "out1/out2x/a"); + assertEntry(D, ignored, "out2"); + assertEntry(F, ignored, "out2/out1.txt"); + assertEntry(F, ignored, "out2/out2.txt"); + assertEntry(D, ignored, "out2x"); + assertEntry(F, ignored, "out2x/out1.txt"); + assertEntry(F, ignored, "out2x/out2.txt"); + endWalk(); + } + @Test public void testWithSlashDoesNotMatchInSubDirectory() throws IOException { writeIgnoreFile(".gitignore", "a/b"); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java index d7c93d1a1..73ab04f9c 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java @@ -596,7 +596,7 @@ public boolean isEntryIgnored() throws IOException { * a relevant ignore rule file exists but cannot be read. */ protected boolean isEntryIgnored(final int pLen) throws IOException { - return isEntryIgnored(pLen, false); + return isEntryIgnored(pLen, mode, false); } /** @@ -605,13 +605,16 @@ protected boolean isEntryIgnored(final int pLen) throws IOException { * * @param pLen * the length of the path in the path buffer. + * @param fileMode + * the original iterator file mode * @param negatePrevious * true if the previous matching iterator rule was negation * @return true if the entry is ignored by an ignore rule. * @throws IOException * a relevant ignore rule file exists but cannot be read. */ - private boolean isEntryIgnored(final int pLen, boolean negatePrevious) + private boolean isEntryIgnored(final int pLen, int fileMode, + boolean negatePrevious) throws IOException { IgnoreNode rules = getIgnoreNode(); if (rules != null) { @@ -623,7 +626,7 @@ private boolean isEntryIgnored(final int pLen, boolean negatePrevious) if (0 < pOff) pOff--; String p = TreeWalk.pathOf(path, pOff, pLen); - switch (rules.isIgnored(p, FileMode.TREE.equals(mode), + switch (rules.isIgnored(p, FileMode.TREE.equals(fileMode), negatePrevious)) { case IGNORED: return true; @@ -638,7 +641,7 @@ private boolean isEntryIgnored(final int pLen, boolean negatePrevious) } } if (parent instanceof WorkingTreeIterator) - return ((WorkingTreeIterator) parent).isEntryIgnored(pLen, + return ((WorkingTreeIterator) parent).isEntryIgnored(pLen, fileMode, negatePrevious); return false; }