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@xxxxxxxxx> --- Junio C Hamano <gitster@xxxxxxxxx> writes: > Matthieu Moy <Matthieu.Moy@xxxxxxxxxxxxxxx> 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 path0/a/b path0/a/b/c && + mkdir path0 path0/a path0/a/b path0/a/b/c path30 && echo 111 >path0/a/b/c/1.txt && mkdir path1 path1/b path1/b/c && echo 111 >path1/b/c/1.txt && @@ -33,6 +34,7 @@ test_expect_success 'setup' ' mkdir path3 && echo 111 >path3/1.txt && echo 222 >path3/2.txt && + echo 333 >path30/3.txt && find *.txt path* \( -type f -o -type l \) -print | xargs git update-index --add && tree=`git write-tree` && @@ -53,6 +55,7 @@ test_expect_success 'ls-tree plain' ' 040000 tree X path1 040000 tree X path2 040000 tree X path3 +040000 tree X path30 EOF test_output ' @@ -68,6 +71,7 @@ test_expect_success 'ls-tree recursive' ' 100644 blob X path2/1.txt 100644 blob X path3/1.txt 100644 blob X path3/2.txt +100644 blob X path30/3.txt EOF test_output ' @@ -164,6 +168,7 @@ test_expect_success 'ls-tree --full-tree' ' 040000 tree X path1 040000 tree X path2 040000 tree X path3 +040000 tree X path30 EOF test_output ' @@ -181,6 +186,7 @@ test_expect_success 'ls-tree --full-tree -r' ' 100644 blob X path2/1.txt 100644 blob X path3/1.txt 100644 blob X path3/2.txt +100644 blob X path30/3.txt EOF test_output ' @@ -195,6 +201,7 @@ test_expect_success 'ls-tree --abbrev=5' ' 040000 tree X path1 040000 tree X path2 040000 tree X path3 +040000 tree X path30 EOF test_cmp expected check ' @@ -208,6 +215,7 @@ path0 path1 path2 path3 +path30 EOF test_output ' @@ -222,6 +230,16 @@ path1/b/c/1.txt path2/1.txt path3/1.txt path3/2.txt +path30/3.txt +EOF + test_output +' + +test_expect_success 'ls-tree with two dirnames' ' + git ls-tree --name-only $tree path3 path30 >current && + cat >expected <<\EOF && +path3 +path30 EOF test_output ' -- 1.7.3.rc1.215.g6997c -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html