Here is how to reproduce the bug: git init mkdir prefix && touch prefix/a && git add prefix/a mkdir prefixdir && touch prefixdir/b && git add prefixdir/b git commit -a -m "If -r is not given, ls-tree should not show files in subdirs." git ls-tree --name-only HEAD prefix # works as expected git ls-tree --name-only HEAD prefixdir # works as expected git ls-tree --name-only HEAD prefix prefixdir # shows file, not dir The output of the last command is prefix/a prefixdir But it should be prefix prefixdir The patch fixes the problem. --
From: Davi Reis <davi@davi-macbookpro.local> --- builtin/ls-tree.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/builtin/ls-tree.c b/builtin/ls-tree.c index dc86b0d..fa427e2 100644 --- a/builtin/ls-tree.c +++ b/builtin/ls-tree.c @@ -52,6 +52,8 @@ static int show_recursive(const char *base, int baselen, const char *pathname) speclen = strlen(spec); if (speclen <= len) continue; + if (spec[len] != 0 && spec[len] != '/') + continue; if (memcmp(pathname, spec, len)) continue; return 1; -- 1.7.2.2 --
That's so close to a real test-case... You should incorporate this in your patch (e.g. in t/t3101-ls-tree-dirname.sh), to make sure such bug never happens again. -- Matthieu Moy http://www-verimag.imag.fr/~moy/ --
I added the test and used git-sendemail again, but I guess it ended up in a different thread. Is this good enough or is there some formal path that I should take? Any help appreciated. On Wed, Sep 8, 2010 at 11:04 PM, Matthieu Moy -- []s Davi de Castro Reis --
I'll comment in the other thread. Thanks, -- Matthieu Moy http://www-verimag.imag.fr/~moy/ --
Let's do this.
* t3101 seems somewhat stale; fix the style and add a few missing " &&"
cascades as a preparatory patch.
* Add the "mistaken prefix computation causes unwarranted recursion" fix
with a test.
Here is the first one in such a series.
-- >8 --
From: Junio C Hamano <gitster@pobox.com>
Date: Sat, 11 Sep 2010 10:53:29 -0700
Subject: [PATCH] t3101: modernise style
Also add a few " &&" cascade that were missing.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
t/t3101-ls-tree-dirname.sh | 126 ++++++++++++++++++++++---------------------
1 files changed, 64 insertions(+), 62 deletions(-)
diff --git a/t/t3101-ls-tree-dirname.sh b/t/t3101-ls-tree-dirname.sh
index 06654c6..026f9f8 100755
--- a/t/t3101-ls-tree-dirname.sh
+++ b/t/t3101-ls-tree-dirname.sh
@@ -21,33 +21,32 @@ entries. Also test odd filename and missing entries handling.
'
. ./test-lib.sh
-test_expect_success \
- 'setup' \
- 'echo 111 >1.txt &&
- echo 222 >2.txt &&
- mkdir path0 path0/a path0/a/b path0/a/b/c &&
- echo 111 >path0/a/b/c/1.txt &&
- mkdir path1 path1/b path1/b/c &&
- echo 111 >path1/b/c/1.txt &&
- mkdir path2 &&
- echo 111 >path2/1.txt &&
- mkdir path3 &&
- echo 111 >path3/1.txt &&
- echo 222 >path3/2.txt &&
- find *.txt path* \( -type f -o -type l \) -print |
- xargs git update-index --add &&
- tree=`git write-tree` &&
- echo $tree'
+test_expect_success 'setup' '
+ echo 111 >1.txt &&
+ echo 222 >2.txt &&
+ mkdir path0 path0/a path0/a/b path0/a/b/c &&
+ echo 111 >path0/a/b/c/1.txt &&
+ mkdir path1 path1/b path1/b/c &&
+ echo 111 >path1/b/c/1.txt &&
+ mkdir path2 &&
+ echo 111 >path2/1.txt &&
+ mkdir path3 &&
+ echo 111 >path3/1.txt &&
+ echo 222 >path3/2.txt &&
+ find *.txt path* \( -type f -o -type l \) -print |
+ xargs git update-index --add &&
+ tree=`git write-tree` &&
+ echo $tree
+'
test_output () {
- sed -e "s/ $_x40 / X /" <current >check
- test_cmp expected ...When applying two pathspecs, one of which is named as a prefix to the
other, we mistakenly recursed into the shorter one.
Noticed and fixed by David Reis.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
Junio C Hamano <gitster@pobox.com> writes:
> Matthieu Moy <Matthieu.Moy@grenoble-inp.fr> writes:
>
>> That's so close to a real test-case...
>
> Let's do this.
>
> * t3101 seems somewhat stale; fix the style and add a few missing " &&"
> cascades as a preparatory patch.
>
> * Add the "mistaken prefix computation causes unwarranted recursion" fix
> with a test.
>
> Here is the first one in such a series.
and here is the second one.
builtin/ls-tree.c | 2 ++
t/t3101-ls-tree-dirname.sh | 20 +++++++++++++++++++-
2 files changed, 21 insertions(+), 1 deletions(-)
diff --git a/builtin/ls-tree.c b/builtin/ls-tree.c
index dc86b0d..a818756 100644
--- a/builtin/ls-tree.c
+++ b/builtin/ls-tree.c
@@ -52,6 +52,8 @@ static int show_recursive(const char *base, int baselen, const char *pathname)
speclen = strlen(spec);
if (speclen <= len)
continue;
+ if (spec[len] && spec[len] != '/')
+ continue;
if (memcmp(pathname, spec, len))
continue;
return 1;
diff --git a/t/t3101-ls-tree-dirname.sh b/t/t3101-ls-tree-dirname.sh
index 026f9f8..ed8160c 100755
--- a/t/t3101-ls-tree-dirname.sh
+++ b/t/t3101-ls-tree-dirname.sh
@@ -15,6 +15,7 @@ This test runs git ls-tree with the following in a tree.
path2/1.txt - a file in a directory
path3/1.txt - a file in a directory
path3/2.txt - a file in a directory
+ path30/3.txt - a file in a directory
Test the handling of mulitple directories which have matching file
entries. Also test odd filename and missing entries handling.
@@ -24,7 +25,7 @@ entries. Also test odd filename and missing entries handling.
test_expect_success 'setup' '
echo 111 >1.txt &&
echo 222 >2.txt &&
- mkdir path0 path0/a ...Sounds good, yes. -- Matthieu Moy http://www-verimag.imag.fr/~moy/ --
