blob: 0fbf1321f760489687b64010b6ceb7f315fd54dd [file] [log] [blame]
#!/bin/sh
test_description='check that diff --max-depth will limit recursion'
. ./test-lib.sh
make_dir() {
mkdir -p "$1" &&
echo "$2" >"$1/file"
}
make_files() {
echo "$1" >file &&
make_dir one "$1" &&
make_dir one/two "$1" &&
make_dir one/two/three "$1"
}
test_expect_success 'setup' '
git commit --allow-empty -m empty &&
git tag empty &&
make_files added &&
git add . &&
git commit -m added &&
make_files modified &&
git add . &&
git commit -m modified &&
make_files index &&
git add . &&
make_files worktree
'
test_expect_success '--max-depth is disallowed with wildcard pathspecs' '
test_must_fail git diff-tree --max-depth=0 HEAD^ HEAD -- "f*"
'
check_one() {
type=$1; shift
args=$1; shift
path=$1; shift
depth=$1; shift
test_expect_${expect:-success} "diff-$type $args, path=$path, depth=$depth" "
for i in $*; do echo \$i; done >expect &&
git diff-$type --max-depth=$depth --name-only $args -- $path >actual &&
test_cmp expect actual
"
}
# For tree comparisons, we expect to see subtrees at the boundary
# get their own entry.
check_trees() {
check_one tree "$*" '' 0 file one
check_one tree "$*" '' 1 file one/file one/two
check_one tree "$*" '' 2 file one/file one/two/file one/two/three
check_one tree "$*" '' 3 file one/file one/two/file one/two/three/file
check_one tree "$*" '' -1 file one/file one/two/file one/two/three/file
check_one tree "$*" one 0 one
check_one tree "$*" one 1 one/file one/two
check_one tree "$*" one 2 one/file one/two/file one/two/three
check_one tree "$*" one 3 one/file one/two/file one/two/three/file
check_one tree "$*" one/two 0 one/two
check_one tree "$*" one/two 1 one/two/file one/two/three
check_one tree "$*" one/two 2 one/two/file one/two/three/file
check_one tree "$*" one/two 2 one/two/file one/two/three/file
check_one tree "$*" one/two/three 0 one/two/three
check_one tree "$*" one/two/three 1 one/two/three/file
}
# But for index comparisons, we do not store subtrees at all, so we do not
# expect them.
check_index() {
check_one "$@" '' 0 file
check_one "$@" '' 1 file one/file
check_one "$@" '' 2 file one/file one/two/file
check_one "$@" '' 3 file one/file one/two/file one/two/three/file
check_one "$@" one 0
check_one "$@" one 1 one/file
check_one "$@" one 2 one/file one/two/file
check_one "$@" one 3 one/file one/two/file one/two/three/file
check_one "$@" one/two 0
check_one "$@" one/two 1 one/two/file
check_one "$@" one/two 2 one/two/file one/two/three/file
check_one "$@" one/two/three 0
check_one "$@" one/two/three 1 one/two/three/file
# Value '-1' for '--max-depth is the same as recursion without limit,
# and thus should always succeed.
local expect=
check_one "$@" '' -1 file one/file one/two/file one/two/three/file
}
# Check as a modification...
check_trees HEAD^ HEAD
# ...and as an addition...
check_trees empty HEAD
# ...and as a deletion.
check_trees HEAD empty
# We currently only implement max-depth for trees.
expect=failure
# Check index against a tree
check_index index "--cached HEAD"
# and index against the worktree
check_index files ""
expect=
test_expect_success 'find shortest path within embedded pathspecs' '
cat >expect <<-\EOF &&
one/file
one/two/file
one/two/three/file
EOF
git diff-tree --max-depth=2 --name-only HEAD^ HEAD -- one one/two >actual &&
test_cmp expect actual
'
test_done