[PATCH 2/2] ls-tree $di $dir: do not mistakenly recurse into directories
From: Junio C Hamano <hidden>
Date: 2016-06-15 22:49:32
Subsystem:
the rest · Maintainer:
Linus Torvalds
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 <redacted> --- Junio C Hamano [off-list ref] writes: > Matthieu Moy [off-list ref] 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