]> git.ipfire.org Git - thirdparty/git.git/commitdiff
cat-file tests: test bad usage
authorÆvar Arnfjörð Bjarmason <avarab@gmail.com>
Tue, 28 Dec 2021 13:28:41 +0000 (14:28 +0100)
committerJunio C Hamano <gitster@pobox.com>
Thu, 30 Dec 2021 21:05:28 +0000 (13:05 -0800)
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 321459439e1 (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>
t/t1006-cat-file.sh

index 658628375c85b17e44aa501c7624daddff4053f6..fc9191c1b9414d78bda0149356a2b0e81901931d 100755 (executable)
@@ -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' "$*"
 }