cat-file tests: test bad usage

Stress test the usage emitted when options are combined in ways that
isn't supported. Let's test various option combinations, some of these
we buggily allow right now.

E.g. this reveals a bug in 321459439e (cat-file: support
--textconv/--filters in batch mode, 2016-09-09) that we'll fix in a
subsequent commit. We're supposed to be emitting a relevant message
when --batch-all-objects is combined with --textconv or --filters, but
we don't.

The cases of needing to assign to opt=2 in the "opt" loop are because
on those we do the right thing already, in subsequent commits the
"test_expect_failure" cases will be fixed, and the for-loops unified.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Ævar Arnfjörð Bjarmason 2021-12-28 14:28:41 +01:00 committed by Junio C Hamano
parent abe6bb3905
commit ddf8420b59

View file

@ -4,6 +4,100 @@ test_description='git cat-file'
. ./test-lib.sh
test_cmdmode_usage () {
test_expect_code 129 "$@" 2>err &&
grep "^error:.*is incompatible with" err
}
for switches in \
'-e -p' \
'-p -t' \
'-t -s' \
'-s --textconv' \
'--textconv --filters'
do
test_expect_success "usage: cmdmode $switches" '
test_cmdmode_usage git cat-file $switches
'
done
test_incompatible_usage () {
test_expect_code 129 "$@" 2>err &&
grep -E "^error:.**needs" err
}
for opt in --batch --batch-check
do
test_expect_success "usage: incompatible options: --path with $opt" '
test_incompatible_usage git cat-file --path=foo $opt
'
done
short_modes="-e -p -t -s"
cw_modes="--textconv --filters"
for opt in $cw_modes
do
test_expect_success "usage: $opt requires another option" '
test_expect_code 129 git cat-file $opt
'
test_expect_failure "usage: incompatible options: --batch-all-objects with $opt" '
test_incompatible_usage git cat-file --batch-all-objects $opt
'
done
for opt in $short_modes
do
test_expect_success "usage: $opt requires another option" '
test_expect_code 129 git cat-file $opt
'
for opt2 in --batch \
--batch-check \
--follow-symlinks
do
test_expect_failure "usage: incompatible options: $opt and $opt2" '
test_incompatible_usage git cat-file $opt $opt2
'
done
opt2="--path=foo HEAD:some-path.txt"
test_expect_success "usage: incompatible options: $opt and $opt2" '
test_incompatible_usage git cat-file $opt $opt2
'
done
for opt in $short_modes $cw_modes
do
args="one two three"
test_expect_success "usage: too many arguments: $opt $args" '
test_expect_code 129 git cat-file $opt $args
'
for opt2 in --buffer --follow-symlinks
do
test_expect_success "usage: incompatible arguments: $opt with batch option $opt2" '
test_expect_code 129 git cat-file $opt $opt2
'
done
done
for opt in --buffer \
--follow-symlinks \
--batch-all-objects
do
status=success
if test $opt = "--buffer"
then
status=failure
fi
test_expect_$status "usage: bad option combination: $opt without batch mode" '
test_expect_code 129 git cat-file $opt &&
test_expect_code 129 git cat-file $opt commit HEAD
'
done
echo_without_newline () {
printf '%s' "$*"
}