|
|
|
#!/bin/sh
|
|
|
|
#
|
|
|
|
# Copyright (c) 2005 Junio C Hamano
|
|
|
|
#
|
|
|
|
|
|
|
|
test_description='git-ls-tree test.
|
|
|
|
|
|
|
|
This test runs git-ls-tree with the following in a tree.
|
|
|
|
|
|
|
|
path0 - a file
|
|
|
|
path1 - a symlink
|
|
|
|
path2/foo - a file in a directory
|
|
|
|
path2/bazbo - a symlink in a directory
|
|
|
|
path2/baz/b - a file in a directory in a directory
|
|
|
|
|
|
|
|
The new path restriction code should do the right thing for path2 and
|
|
|
|
path2/baz. Also path0/ should snow nothing.
|
|
|
|
'
|
|
|
|
. ./test-lib.sh
|
|
|
|
|
|
|
|
test_expect_success \
|
|
|
|
'setup' \
|
|
|
|
'mkdir path2 path2/baz &&
|
|
|
|
echo Hi >path0 &&
|
|
|
|
ln -s path0 path1 &&
|
|
|
|
echo Lo >path2/foo &&
|
|
|
|
ln -s ../path1 path2/bazbo &&
|
|
|
|
echo Mi >path2/baz/b &&
|
|
|
|
find path? \( -type f -o -type l \) -print |
|
|
|
|
xargs git-update-index --add &&
|
|
|
|
tree=`git-write-tree` &&
|
|
|
|
echo $tree'
|
|
|
|
|
|
|
|
_x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
|
|
|
|
_x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
|
|
|
|
test_output () {
|
|
|
|
sed -e "s/ $_x40 / X /" <current >check
|
|
|
|
diff -u expected check
|
|
|
|
}
|
|
|
|
|
|
|
|
test_expect_success \
|
|
|
|
'ls-tree plain' \
|
|
|
|
'git-ls-tree $tree >current &&
|
|
|
|
cat >expected <<\EOF &&
|
|
|
|
100644 blob X path0
|
|
|
|
120000 blob X path1
|
|
|
|
040000 tree X path2
|
|
|
|
EOF
|
|
|
|
test_output'
|
|
|
|
|
|
|
|
test_expect_success \
|
|
|
|
'ls-tree recursive' \
|
|
|
|
'git-ls-tree -r $tree >current &&
|
|
|
|
cat >expected <<\EOF &&
|
|
|
|
100644 blob X path0
|
|
|
|
120000 blob X path1
|
|
|
|
100644 blob X path2/baz/b
|
|
|
|
120000 blob X path2/bazbo
|
|
|
|
100644 blob X path2/foo
|
|
|
|
EOF
|
|
|
|
test_output'
|
|
|
|
|
|
|
|
test_expect_success \
|
|
|
|
'ls-tree recursive with -t' \
|
|
|
|
'git-ls-tree -r -t $tree >current &&
|
|
|
|
cat >expected <<\EOF &&
|
|
|
|
100644 blob X path0
|
|
|
|
120000 blob X path1
|
|
|
|
040000 tree X path2
|
|
|
|
040000 tree X path2/baz
|
|
|
|
100644 blob X path2/baz/b
|
|
|
|
120000 blob X path2/bazbo
|
|
|
|
100644 blob X path2/foo
|
|
|
|
EOF
|
|
|
|
test_output'
|
|
|
|
|
|
|
|
test_expect_success \
|
|
|
|
'ls-tree recursive with -d' \
|
|
|
|
'git-ls-tree -r -d $tree >current &&
|
|
|
|
cat >expected <<\EOF &&
|
|
|
|
040000 tree X path2
|
|
|
|
040000 tree X path2/baz
|
|
|
|
EOF
|
|
|
|
test_output'
|
|
|
|
|
|
|
|
test_expect_success \
|
|
|
|
'ls-tree filtered with path' \
|
|
|
|
'git-ls-tree $tree path >current &&
|
|
|
|
cat >expected <<\EOF &&
|
|
|
|
EOF
|
|
|
|
test_output'
|
|
|
|
|
|
|
|
|
|
|
|
# it used to be path1 and then path0, but with pathspec semantics
|
|
|
|
# they are shown in canonical order.
|
|
|
|
test_expect_success \
|
|
|
|
'ls-tree filtered with path1 path0' \
|
|
|
|
'git-ls-tree $tree path1 path0 >current &&
|
|
|
|
cat >expected <<\EOF &&
|
[PATCH] Rewrite ls-tree to behave more like "/bin/ls -a"
This is a complete rewrite of ls-tree to make it behave more
like what "/bin/ls -a" does in the current working directory.
Namely, the changes are:
- Unlike the old ls-tree behaviour that used paths arguments to
restrict output (not that it worked as intended---as pointed
out in the mailing list discussion, it was quite incoherent),
this rewrite uses paths arguments to specify what to show.
- Without arguments, it implicitly uses the root level as its
sole argument ("/bin/ls -a" behaves as if "." is given
without argument).
- Without -r (recursive) flag, it shows the named blob (either
file or symlink), or the named tree and its immediate
children.
- With -r flag, it shows the named path, and recursively
descends into it if it is a tree.
- With -d flag, it shows the named path and does not show its
children even if the path is a tree, nor descends into it
recursively.
This is still request-for-comments patch. There is no mailing
list consensus that this proposed new behaviour is a good one.
The patch to t/t3100-ls-tree-restrict.sh illustrates
user-visible behaviour changes. Namely:
* "git-ls-tree $tree path1 path0" lists path1 first and then
path0. It used to use paths as an output restrictor and
showed output in cache entry order (i.e. path0 first and then
path1) regardless of the order of paths arguments.
* "git-ls-tree $tree path2" lists path2 and its immediate
children but having explicit paths argument does not imply
recursive behaviour anymore, hence paths/baz is shown but not
paths/baz/b.
Signed-off-by: Junio C Hamano <junkio@cox.net>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
20 years ago
|
|
|
100644 blob X path0
|
|
|
|
120000 blob X path1
|
|
|
|
EOF
|
|
|
|
test_output'
|
|
|
|
|
|
|
|
test_expect_success \
|
|
|
|
'ls-tree filtered with path0/' \
|
|
|
|
'git-ls-tree $tree path0/ >current &&
|
|
|
|
cat >expected <<\EOF &&
|
|
|
|
EOF
|
|
|
|
test_output'
|
|
|
|
|
|
|
|
# It used to show path2 and its immediate children but
|
|
|
|
# with pathspec semantics it shows only path2
|
|
|
|
test_expect_success \
|
|
|
|
'ls-tree filtered with path2' \
|
|
|
|
'git-ls-tree $tree path2 >current &&
|
|
|
|
cat >expected <<\EOF &&
|
|
|
|
040000 tree X path2
|
|
|
|
EOF
|
|
|
|
test_output'
|
|
|
|
|
|
|
|
# ... and path2/ shows the children.
|
|
|
|
test_expect_success \
|
|
|
|
'ls-tree filtered with path2/' \
|
|
|
|
'git-ls-tree $tree path2/ >current &&
|
|
|
|
cat >expected <<\EOF &&
|
|
|
|
040000 tree X path2/baz
|
|
|
|
120000 blob X path2/bazbo
|
|
|
|
100644 blob X path2/foo
|
|
|
|
EOF
|
|
|
|
test_output'
|
|
|
|
|
|
|
|
# The same change -- exact match does not show children of
|
|
|
|
# path2/baz
|
|
|
|
test_expect_success \
|
|
|
|
'ls-tree filtered with path2/baz' \
|
|
|
|
'git-ls-tree $tree path2/baz >current &&
|
|
|
|
cat >expected <<\EOF &&
|
|
|
|
040000 tree X path2/baz
|
|
|
|
EOF
|
|
|
|
test_output'
|
|
|
|
|
|
|
|
test_expect_success \
|
|
|
|
'ls-tree filtered with path2/bak' \
|
|
|
|
'git-ls-tree $tree path2/bak >current &&
|
|
|
|
cat >expected <<\EOF &&
|
|
|
|
EOF
|
|
|
|
test_output'
|
|
|
|
|
|
|
|
test_expect_success \
|
|
|
|
'ls-tree -t filtered with path2/bak' \
|
|
|
|
'git-ls-tree -t $tree path2/bak >current &&
|
|
|
|
cat >expected <<\EOF &&
|
|
|
|
040000 tree X path2
|
|
|
|
EOF
|
|
|
|
test_output'
|
|
|
|
|
|
|
|
test_done
|