From 4ea8c655d62e02544c06b4a8ea61929a84fb1c79 Mon Sep 17 00:00:00 2001 From: Andrey Loskutov Date: Mon, 29 Sep 2014 16:28:06 +0200 Subject: [PATCH] Initialize 'pathLen' field also for empty directories Bug: 445363 Change-Id: Ia8428af84fb61ba0d572374a19e8e8c55b138a63 Signed-off-by: Andrey Loskutov --- .../jgit/treewalk/FileTreeIteratorTest.java | 37 +++++++++++++++++++ .../jgit/treewalk/WorkingTreeIterator.java | 2 + 2 files changed, 39 insertions(+) diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/FileTreeIteratorTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/FileTreeIteratorTest.java index 51110b1d8..ab4579009 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/FileTreeIteratorTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/FileTreeIteratorTest.java @@ -144,6 +144,43 @@ public void testEmptyIfRootIsEmpty() throws Exception { assertTrue(fti.eof()); } + @Test + public void testEmptyIteratorOnEmptyDirectory() throws Exception { + String nonExistingFileName = "not-existing-file"; + final File r = new File(trash, nonExistingFileName); + assertFalse(r.exists()); + FileUtils.mkdir(r); + + final FileTreeIterator parent = new FileTreeIterator(db); + + while (!parent.getEntryPathString().equals(nonExistingFileName)) + parent.next(1); + + final FileTreeIterator childIter = new FileTreeIterator(parent, r, + db.getFS()); + assertTrue(childIter.first()); + assertTrue(childIter.eof()); + + String parentPath = parent.getEntryPathString(); + assertEquals(nonExistingFileName, parentPath); + + // must be "not-existing-file/", but getEntryPathString() was broken by + // 445363 too + String childPath = childIter.getEntryPathString(); + + // in bug 445363 the iterator wrote garbage to the parent "path" field + EmptyTreeIterator e = childIter.createEmptyTreeIterator(); + assertNotNull(e); + + // check if parent path is not overridden by empty iterator (bug 445363) + // due bug 445363 this was "/ot-existing-file" instead of + // "not-existing-file" + assertEquals(parentPath, parent.getEntryPathString()); + assertEquals(parentPath + "/", childPath); + assertEquals(parentPath + "/", childIter.getEntryPathString()); + assertEquals(childPath + "/", e.getEntryPathString()); + } + @Test public void testSimpleIterate() throws Exception { final FileTreeIterator top = new FileTreeIterator(trash, db.getFS(), 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 9eb428555..3d63d9254 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java @@ -668,6 +668,8 @@ protected void init(final Entry[] list) { ptr = 0; if (!eof()) parseEntry(); + else if (pathLen == 0) // see bug 445363 + pathLen = pathOffset; } /**