diff options
Diffstat (limited to 'org.eclipse.jgit.test')
12 files changed, 185 insertions, 409 deletions
diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/excludeTest/.gitignore b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/excludeTest/.gitignore deleted file mode 100644 index b3f6bc97fb..0000000000 --- a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/excludeTest/.gitignore +++ /dev/null @@ -1 +0,0 @@ -!/notignored diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/excludeTest/new/.gitignore b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/excludeTest/new/.gitignore deleted file mode 100644 index 09b8574b00..0000000000 --- a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/excludeTest/new/.gitignore +++ /dev/null @@ -1 +0,0 @@ -notarealfile diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/excludeTest/new/a/.gitignore b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/excludeTest/new/a/.gitignore deleted file mode 100644 index e69de29bb2..0000000000 --- a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/excludeTest/new/a/.gitignore +++ /dev/null diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/excludeTest/new/a/b1/.gitignore b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/excludeTest/new/a/b1/.gitignore deleted file mode 100644 index 82b0f5d464..0000000000 --- a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/excludeTest/new/a/b1/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/c diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/excludeTest/new/a/b1/test.stp b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/excludeTest/new/a/b1/test.stp deleted file mode 100644 index e69de29bb2..0000000000 --- a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/excludeTest/new/a/b1/test.stp +++ /dev/null diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/excludeTest/new/a/b2/c/.gitignore b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/excludeTest/new/a/b2/c/.gitignore deleted file mode 100644 index 3c6cf10b1d..0000000000 --- a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/excludeTest/new/a/b2/c/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/notarealfile2 diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/excludeTest/new/a/b2/c/test.stp b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/excludeTest/new/a/b2/c/test.stp deleted file mode 100644 index e69de29bb2..0000000000 --- a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/excludeTest/new/a/b2/c/test.stp +++ /dev/null diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/excludeTest/notignored b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/excludeTest/notignored deleted file mode 100644 index e69de29bb2..0000000000 --- a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/excludeTest/notignored +++ /dev/null diff --git a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/excludeTest/test.stp b/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/excludeTest/test.stp deleted file mode 100644 index e69de29bb2..0000000000 --- a/org.eclipse.jgit.test/tst-rsrc/org/eclipse/jgit/test/resources/excludeTest/test.stp +++ /dev/null diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/IgnoreCacheTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/IgnoreCacheTest.java deleted file mode 100644 index a9c1c31e4d..0000000000 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/IgnoreCacheTest.java +++ /dev/null @@ -1,403 +0,0 @@ -/* - * Copyright (C) 2010, Red Hat Inc. - * and other copyright owners as documented in the project's IP log. - * - * This program and the accompanying materials are made available - * under the terms of the Eclipse Distribution License v1.0 which - * accompanies this distribution, is reproduced below, and is - * available at http://www.eclipse.org/org/documents/edl-v10.php - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * - * - Neither the name of the Eclipse Foundation, Inc. nor the - * names of its contributors may be used to endorse or promote - * products derived from this software without specific prior - * written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.eclipse.jgit.ignore; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.util.ArrayList; - -import org.eclipse.jgit.lib.RepositoryTestCase; -import org.eclipse.jgit.util.JGitTestUtil; - -/** - * Tests for the ignore cache - */ -public class IgnoreCacheTest extends RepositoryTestCase { - - private File ignoreTestDir = JGitTestUtil.getTestResourceFile("excludeTest"); - private SimpleIgnoreCache cache; - private final ArrayList<File> toDelete = new ArrayList<File>(); - - //TODO: Do not use OS dependent strings to encode file paths - - public void tearDown() throws Exception { - super.tearDown(); - deleteIgnoreFiles(); - cache.clear(); - toDelete.clear(); - } - - public void setUp() throws Exception { - super.setUp(); - ignoreTestDir = JGitTestUtil.getTestResourceFile("excludeTest"); - assertTrue("Test resource directory is not a directory",ignoreTestDir.isDirectory()); - - db = createWorkRepository(); - recursiveCopy(ignoreTestDir, db.getDirectory().getParentFile()); - cache = new SimpleIgnoreCache(db); - initCache(); - } - - protected void recursiveCopy(File src, File parent) throws IOException { - for (File file : src.listFiles()) { - String rel = file.getName(); - File dst = new File(parent.toURI().resolve(rel)); - copyFileOrDirectory(file, dst); - if (file.isDirectory()) - recursiveCopy(file, dst); - } - } - - protected static void copyFileOrDirectory(File src, File dst) throws IOException { - if (src.isDirectory()) - dst.mkdir(); - else - copyFile(src, dst); - } - - public void testInitialization() { - File test = new File(db.getDirectory().getParentFile() + "/new/a/b1/test.stp"); - assertTrue("Missing file " + test.getAbsolutePath(), test.exists()); - - /* - * Every folder along the path has a .gitignore file. Therefore every - * folder should have been added and initialized - */ - boolean result = isIgnored(getRelativePath(test)); - assertFalse("Unexpected match for " + test.toString(), result); - - /* - * Check that every .gitignore along the path has been initialized - */ - File folder = test.getParentFile(); - IgnoreNode rules = null; - String fp = folder.getAbsolutePath(); - while (!folder.equals(db.getDirectory().getParentFile()) && fp.length() > 0) { - rules = cache.getRules(getRelativePath(folder)); - assertNotNull("Ignore file not initialized for " + fp, rules); - if (getRelativePath(folder).endsWith("new/a")) - //The /new/a directory has an empty ignore file - assertEquals("Ignore file not initialized for " + fp, 0, rules.getRules().size()); - else - assertEquals("Ignore file not initialized for " + fp, 1, rules.getRules().size()); - - folder = folder.getParentFile(); - fp = folder.getAbsolutePath(); - } - if (rules != null) - assertEquals(1, rules.getRules().size()); - else - fail("Base directory not initialized"); - - } - - public void testRules() { - ignoreTestDir = JGitTestUtil.getTestResourceFile("excludeTest"); - assertTrue("Test resource directory is not a directory", ignoreTestDir.isDirectory()); - createExcludeFile(); - initCache(); - - File test = new File(db.getDirectory().getParentFile(), "test.stp"); - String path = test.getAbsolutePath(); - assertTrue("Could not find test file " + path, test.exists()); - - IgnoreNode baseRules = cache.getRules(""); - assertNotNull("Could not find base rules", baseRules); - - /* - * .git/info/excludes: - * /test.stp - * /notignored - * - * new/.gitignore: - * notarealfile - * - * new/a/.gitignore: - * <empty> - * - * new/a/b2/.gitignore: - * <does not exist> - * - * new/a/b1/.gitignore: - * /c - * - * new/a/b1/c/.gitignore: - * !/shouldbeignored.txt - * - * .gitignore: - * !/notignored - * /commentNotIgnored.tx#t - * /commentIgnored.txt#comment - * /commentIgnored.txt #comment - */ - boolean result = isIgnored(getRelativePath(test)); - assertEquals(3, baseRules.getRules().size()); - assertTrue(db.getDirectory().getParentFile().toURI().equals(baseRules.getBaseDir().toURI())); - //Test basic exclude file - assertTrue("Did not match file " + test.toString(), result); - //Test exclude file priority - assertNotIgnored("notignored"); - //Test that /src/test.stp is not matched by /test.stp in exclude file (Do not reinitialize) - assertNotIgnored("/src/test.stp"); - //Test file that is not mentioned -- should just return unmatched - assertNotIgnored("not/mentioned/file.txt"); - - //Test adding nonexistent node - test = new File(db.getDirectory().getParentFile(), "new/a/b2/d/test.stp"); - assertNotIgnored("new/a/b2/d/test.stp"); - assertNotIgnored("new/a/b2/d/"); - assertNotIgnored("new/a/b2/d"); - - //Test folder - test = new File(db.getDirectory().getParentFile(), "new/a/b1/c"); - assertIgnored("new/a/b1/c"); - assertIgnored("new/a/b1/c/anything.c"); - assertIgnored("new/a/b1/c/and.o"); - assertIgnored("new/a/b1/c/everything.d"); - assertIgnored("new/a/b1/c/everything.d"); - //Special case -- the normally higher priority negation in c/.gitignore is cancelled by the folder being ignored - assertIgnored("new/a/b1/c/shouldbeignored.txt"); - - //Test name-only (use non-existent folders) - assertNotIgnored("notarealfile"); - assertNotIgnored("/notarealfile"); - assertIgnored("new/notarealfile"); - assertIgnored("new/notarealfile/fake"); - assertIgnored("new/a/notarealfile"); - assertIgnored("new/a/b1/notarealfile"); - - //Test clearing node -- create empty .gitignore - createIgnoreFile(db.getDirectory().getParentFile() + "/new/a/b2/.gitignore", new String[0]); - test = new File(db.getDirectory().getParentFile(), "new/a/b2/c"); - initCache(); - baseRules = cache.getRules("new/a/b2"); - assertNotNull(baseRules); - baseRules.clear(); - assertEquals(baseRules.getRules().size(), 0); - try { - assertFalse("Node not properly cleared", baseRules.isIgnored(getRelativePath(test))); - } catch (IOException e) { - e.printStackTrace(); - fail("IO exception when testing base rules"); - } - - //Test clearing entire cache, and isEmpty - assertNotNull(cache.getRules("")); - assertFalse(cache.isEmpty()); - cache.clear(); - assertNull(cache.getRules("")); - assertTrue(cache.isEmpty()); - assertNotIgnored("/anything"); - assertNotIgnored("/new/anything"); - assertNotIgnored("/src/anything"); - } - - public void testPriorities() { - ignoreTestDir = JGitTestUtil.getTestResourceFile("excludeTest"); - assertTrue("Test resource directory is not a directory",ignoreTestDir.isDirectory()); - createExcludeFile(); - initCache(); - - File test = new File(db.getDirectory().getParentFile(), "/src/test.stp"); - assertTrue("Resource file " + test.getName() + " is missing", test.exists()); - - //Test basic exclude file - IgnoreNode node = cache.getRules("src"); - assertNotNull("Excludes file was not initialized", node); - - /* - * src/.gitignore: - * /*.st? - * !/test.stp - * !/a.c - * /a.c - * - * ./.gitignore: - * !/notignored - * - * .git/info/exclude: - * /test.stp - * /notignored - */ - assertIgnored("src/a.c"); - assertIgnored("test.stp"); - assertIgnored("src/blank.stp"); - assertNotIgnored("notignored"); - assertNotIgnored("src/test.stp"); - - assertEquals(4, node.getRules().size()); - - /* - * new/.gitignore: - * notarealfile - * - * new/a/.gitignore: - * <empty> - * - * new/a/b2/.gitignore: - * <does not exist> - * - * new/a/b2/c/.gitignore: - * /notarealfile2 - */ - assertIgnored("new/a/b2/c/notarealfile2"); - assertIgnored("new/notarealfile"); - assertIgnored("new/a/notarealfile"); - assertNotIgnored("new/a/b2/c/test.stp"); - assertNotIgnored("new/a/b2/c"); - assertNotIgnored("new/a/b2/nonexistent"); - } - - /** - * Check if a file is not matched as ignored - * @param relativePath - * Path to file, relative to db.getDirectory. Use "/" as a separator, - * this method will replace all instances of "/" with File.separator - */ - private void assertNotIgnored(String relativePath) { - File test = new File(db.getDirectory().getParentFile(), relativePath); - assertFalse("Should not match " + test.toString(), isIgnored(getRelativePath(test))); - } - - /** - * Check if a file is matched as ignored - * @param relativePath - * Path to file, relative to db.getDirectory. Use "/" as a separator, - * this method will replace all instances of "/" with File.separator. - */ - private void assertIgnored(String relativePath) { - File test = new File(db.getDirectory().getParentFile(), relativePath); - assertTrue("Failed to match " + test.toString(), isIgnored(getRelativePath(test))); - } - - /** - * Attempt to write an ignore file at the given location - * @param path - * Will create file at this path - * @param contents - * Each entry in contents will be entered on its own line - */ - private void createIgnoreFile(String path, String[] contents) { - File ignoreFile = new File(path); - ignoreFile.delete(); - ignoreFile.deleteOnExit(); //Hope to catch in the event of crash - toDelete.add(ignoreFile); //For teardown purposes - - //Jump through some hoops to create the exclude file - try { - if (!ignoreFile.createNewFile()) - fail("Could not create ignore file" + ignoreFile.getAbsolutePath()); - - BufferedWriter bw = new BufferedWriter(new FileWriter (ignoreFile)); - for (String s : contents) - bw.write(s + System.getProperty("line.separator")); - bw.flush(); - bw.close(); - } catch (IOException e1) { - e1.printStackTrace(); - fail("Could not create exclude file"); - } - } - - private void createExcludeFile() { - String[] content = new String[2]; - content[0] = "/test.stp"; - content[1] = "/notignored"; - - //We can do this because we explicitly delete parent directories later in deleteIgnoreFiles. - File parent= new File(db.getDirectory().getParentFile(), ".git/info"); - if (!parent.exists()) - parent.mkdirs(); - - createIgnoreFile(db.getDirectory().getParentFile() + "/.git/info/exclude", content); - } - - private void deleteIgnoreFiles() { - for (File f : toDelete) - f.delete(); - - //Systematically delete exclude parent dirs - File f = new File(ignoreTestDir.getAbsoluteFile(), ".git/info"); - f.delete(); - f = new File(ignoreTestDir.getAbsoluteFile(), ".git"); - f.delete(); - } - - /** - * @param path - * Filepath relative to the git directory - * @return - * Results of cache.isIgnored(path) -- true if ignored, false if - * a negation is encountered or if no rules apply - */ - private boolean isIgnored(String path) { - try { - return cache.isIgnored(path); - } catch (IOException e) { - fail("IOException when attempting to check ignored status"); - } - return false; - } - - private String getRelativePath(File file) { - String retVal = db.getDirectory().getParentFile().toURI().relativize(file.toURI()).getPath(); - if (retVal.length() == file.getAbsolutePath().length()) - fail("Not a child of the git directory"); - if (retVal.endsWith("/")) - retVal = retVal.substring(0, retVal.length() - 1); - - return retVal; - } - - private void initCache() { - try { - cache.initialize(); - } catch (IOException e) { - e.printStackTrace(); - fail("Could not initialize cache"); - } - } - -} 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 new file mode 100644 index 0000000000..ea7820428f --- /dev/null +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/ignore/IgnoreNodeTest.java @@ -0,0 +1,184 @@ +/* + * Copyright (C) 2010, Red Hat Inc. + * and other copyright owners as documented in the project's IP log. + * + * This program and the accompanying materials are made available + * under the terms of the Eclipse Distribution License v1.0 which + * accompanies this distribution, is reproduced below, and is + * available at http://www.eclipse.org/org/documents/edl-v10.php + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * - Neither the name of the Eclipse Foundation, Inc. nor the + * names of its contributors may be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.eclipse.jgit.ignore; + +import java.io.File; +import java.io.IOException; + +import org.eclipse.jgit.errors.CorruptObjectException; +import org.eclipse.jgit.lib.FileMode; +import org.eclipse.jgit.lib.RepositoryTestCase; +import org.eclipse.jgit.treewalk.FileTreeIterator; +import org.eclipse.jgit.treewalk.TreeWalk; +import org.eclipse.jgit.treewalk.WorkingTreeIterator; + +/** + * Tests ignore node behavior on the local filesystem. + */ +public class IgnoreNodeTest extends RepositoryTestCase { + private static final FileMode D = FileMode.TREE; + + private static final FileMode F = FileMode.REGULAR_FILE; + + private static final boolean ignored = true; + + private static final boolean tracked = false; + + private TreeWalk walk; + + public void testRules() throws IOException { + writeIgnoreFile(".git/info/exclude", "*~", "/out"); + + writeIgnoreFile(".gitignore", "*.o", "/config"); + writeTrashFile("config/secret", ""); + writeTrashFile("mylib.c", ""); + writeTrashFile("mylib.c~", ""); + writeTrashFile("mylib.o", ""); + + writeTrashFile("out/object/foo.exe", ""); + writeIgnoreFile("src/config/.gitignore", "lex.out"); + writeTrashFile("src/config/lex.out", ""); + writeTrashFile("src/config/config.c", ""); + writeTrashFile("src/config/config.c~", ""); + writeTrashFile("src/config/old/lex.out", ""); + + beginWalk(); + assertEntry(F, tracked, ".gitignore"); + assertEntry(D, ignored, "config"); + assertEntry(F, ignored, "config/secret"); + assertEntry(F, tracked, "mylib.c"); + assertEntry(F, ignored, "mylib.c~"); + assertEntry(F, ignored, "mylib.o"); + + assertEntry(D, ignored, "out"); + assertEntry(D, ignored, "out/object"); + assertEntry(F, ignored, "out/object/foo.exe"); + + assertEntry(D, tracked, "src"); + assertEntry(D, tracked, "src/config"); + assertEntry(F, tracked, "src/config/.gitignore"); + assertEntry(F, tracked, "src/config/config.c"); + assertEntry(F, ignored, "src/config/config.c~"); + assertEntry(F, ignored, "src/config/lex.out"); + assertEntry(D, tracked, "src/config/old"); + assertEntry(F, ignored, "src/config/old/lex.out"); + } + + public void testNegation() throws IOException { + writeIgnoreFile(".gitignore", "*.o"); + writeIgnoreFile("src/a/b/.gitignore", "!keep.o"); + writeTrashFile("src/a/b/keep.o", ""); + writeTrashFile("src/a/b/nothere.o", ""); + + beginWalk(); + assertEntry(F, tracked, ".gitignore"); + assertEntry(D, tracked, "src"); + assertEntry(D, tracked, "src/a"); + assertEntry(D, tracked, "src/a/b"); + assertEntry(F, tracked, "src/a/b/.gitignore"); + assertEntry(F, tracked, "src/a/b/keep.o"); + assertEntry(F, ignored, "src/a/b/nothere.o"); + } + + public void testSlashOnlyMatchesDirectory() throws IOException { + writeIgnoreFile(".gitignore", "out/"); + writeTrashFile("out", ""); + + beginWalk(); + assertEntry(F, tracked, ".gitignore"); + assertEntry(F, tracked, "out"); + + new File(trash, "out").delete(); + writeTrashFile("out/foo", ""); + + beginWalk(); + assertEntry(F, tracked, ".gitignore"); + assertEntry(D, ignored, "out"); + assertEntry(F, ignored, "out/foo"); + } + + public void testWithSlashDoesNotMatchInSubDirectory() throws IOException { + writeIgnoreFile(".gitignore", "a/b"); + writeTrashFile("a/a", ""); + writeTrashFile("a/b", ""); + writeTrashFile("src/a/a", ""); + writeTrashFile("src/a/b", ""); + + beginWalk(); + assertEntry(F, tracked, ".gitignore"); + assertEntry(D, tracked, "a"); + assertEntry(F, tracked, "a/a"); + assertEntry(F, ignored, "a/b"); + assertEntry(D, tracked, "src"); + assertEntry(D, tracked, "src/a"); + assertEntry(F, tracked, "src/a/a"); + assertEntry(F, tracked, "src/a/b"); + } + + private void beginWalk() throws CorruptObjectException { + walk = new TreeWalk(db); + walk.reset(); + walk.addTree(new FileTreeIterator(db)); + } + + private void assertEntry(FileMode type, boolean entryIgnored, + String pathName) throws IOException { + assertTrue("walk has entry", walk.next()); + assertEquals(pathName, walk.getPathString()); + assertEquals(type, walk.getFileMode(0)); + + WorkingTreeIterator itr = walk.getTree(0, WorkingTreeIterator.class); + assertNotNull("has tree", itr); + assertEquals("is ignored", entryIgnored, itr.isEntryIgnored()); + if (D.equals(type)) + walk.enterSubtree(); + } + + private void writeIgnoreFile(String name, String... rules) + throws IOException { + StringBuilder data = new StringBuilder(); + for (String line : rules) + data.append(line + "\n"); + writeTrashFile(name, data.toString()); + } +} diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ReadTreeTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ReadTreeTest.java index 5b4be4379e..02bfdc1df5 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ReadTreeTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ReadTreeTest.java @@ -58,7 +58,6 @@ import org.eclipse.jgit.errors.CheckoutConflictException; import org.eclipse.jgit.errors.CorruptObjectException; import org.eclipse.jgit.treewalk.FileTreeIterator; import org.eclipse.jgit.treewalk.TreeWalk; -import org.eclipse.jgit.util.FS; public abstract class ReadTreeTest extends RepositoryTestCase { protected Tree theHead; @@ -613,7 +612,7 @@ public abstract class ReadTreeTest extends RepositoryTestCase { TreeWalk walk = new TreeWalk(db); walk.reset(); walk.setRecursive(true); - walk.addTree(new FileTreeIterator(db.getWorkDir(), FS.DETECTED)); + walk.addTree(new FileTreeIterator(db)); String expectedValue; String path; int nrFiles = 0; |