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>
maint
Ævar Arnfjörð Bjarmason 2021-12-28 14:28:41 +01:00 committed by Junio C Hamano
parent abe6bb3905
commit ddf8420b59
1 changed files with 94 additions and 0 deletions

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' "$*"
}