a48a88019b
Unlike other test helper functions, 'test_oid' doesn't terminate its
output with a LF, but, alas, the reason for this, if any, is not
mentioned in 2c02b110da
(t: add test functions to translate
hash-related values, 2018-09-13)).
Now, in the vast majority of cases 'test_oid' is invoked in a command
substitution that is part of a heredoc or supplies an argument to a
command or the value to a variable, and the command substitution would
chop off any trailing LFs, so in these cases the lack or presence of a
trailing LF in its output doesn't matter. However:
- There appear to be only three cases where 'test_oid' is not
invoked in a command substitution:
$ git grep '\stest_oid ' -- ':/t/*.sh'
t0000-basic.sh: test_oid zero >actual &&
t0000-basic.sh: test_oid zero >actual &&
t0000-basic.sh: test_oid zero >actual &&
These are all in test cases checking that 'test_oid' actually
works, and that the size of its output matches the size of the
corresponding hash function with conditions like
test $(wc -c <actual) -eq 40
In these cases the lack of trailing LF does actually matter,
though they could be trivially updated to account for the presence
of a trailing LF.
- There are also a few cases where the lack of trailing LF in
'test_oid's output actually hurts, because tests need to compare
its output with LF terminated file contents, forcing developers to
invoke it as 'echo $(test_oid ...)' to append the missing LF:
$ git grep 'echo "\?$(test_oid ' -- ':/t/*.sh'
t1302-repo-version.sh: echo $(test_oid version) >expect &&
t1500-rev-parse.sh: echo "$(test_oid algo)" >expect &&
t4044-diff-index-unique-abbrev.sh: echo "$(test_oid val1)" > foo &&
t4044-diff-index-unique-abbrev.sh: echo "$(test_oid val2)" > foo &&
t5313-pack-bounds-checks.sh: echo $(test_oid oidfff) >file &&
And there is yet another similar case in an in-flight topic at:
https://public-inbox.org/git/813e81a058227bd373cec802e443fcd677042fb4.1670862677.git.gitgitgadget@gmail.com/
Arguably we would be better off if 'test_oid' terminated its output
with a LF. So let's update 'test_oid' accordingly, update its tests
in t0000 to account for the extra character in those size tests, and
remove the now unnecessary 'echo $(...)' command substitutions around
'test_oid' invocations as well.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
118 lines
2.5 KiB
Bash
Executable File
118 lines
2.5 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# Copyright (c) 2007 Nguyễn Thái Ngọc Duy
|
|
#
|
|
|
|
test_description='Test repository version check'
|
|
|
|
. ./test-lib.sh
|
|
|
|
test_expect_success 'setup' '
|
|
test_oid_cache <<-\EOF &&
|
|
version sha1:0
|
|
version sha256:1
|
|
EOF
|
|
cat >test.patch <<-\EOF &&
|
|
diff --git a/test.txt b/test.txt
|
|
new file mode 100644
|
|
--- /dev/null
|
|
+++ b/test.txt
|
|
@@ -0,0 +1 @@
|
|
+123
|
|
EOF
|
|
|
|
test_create_repo "test" &&
|
|
test_create_repo "test2" &&
|
|
git config --file=test2/.git/config core.repositoryformatversion 99
|
|
'
|
|
|
|
test_expect_success 'gitdir selection on normal repos' '
|
|
test_oid version >expect &&
|
|
git config core.repositoryformatversion >actual &&
|
|
git -C test config core.repositoryformatversion >actual2 &&
|
|
test_cmp expect actual &&
|
|
test_cmp expect actual2
|
|
'
|
|
|
|
test_expect_success 'gitdir selection on unsupported repo' '
|
|
# Make sure it would stop at test2, not trash
|
|
test_expect_code 1 git -C test2 config core.repositoryformatversion >actual
|
|
'
|
|
|
|
test_expect_success 'gitdir not required mode' '
|
|
git apply --stat test.patch &&
|
|
git -C test apply --stat ../test.patch &&
|
|
git -C test2 apply --stat ../test.patch
|
|
'
|
|
|
|
test_expect_success 'gitdir required mode' '
|
|
git apply --check --index test.patch &&
|
|
git -C test apply --check --index ../test.patch &&
|
|
test_must_fail git -C test2 apply --check --index ../test.patch
|
|
'
|
|
|
|
check_allow () {
|
|
git rev-parse --git-dir >actual &&
|
|
echo .git >expect &&
|
|
test_cmp expect actual
|
|
}
|
|
|
|
check_abort () {
|
|
test_must_fail git rev-parse --git-dir
|
|
}
|
|
|
|
# avoid git-config, since it cannot be trusted to run
|
|
# in a repository with a broken version
|
|
mkconfig () {
|
|
echo '[core]' &&
|
|
echo "repositoryformatversion = $1" &&
|
|
shift &&
|
|
|
|
if test $# -gt 0; then
|
|
echo '[extensions]' &&
|
|
for i in "$@"; do
|
|
echo "$i"
|
|
done
|
|
fi
|
|
}
|
|
|
|
while read outcome version extensions; do
|
|
test_expect_success "$outcome version=$version $extensions" "
|
|
mkconfig $version $extensions >.git/config &&
|
|
check_${outcome}
|
|
"
|
|
done <<\EOF
|
|
allow 0
|
|
allow 1
|
|
allow 1 noop
|
|
abort 1 no-such-extension
|
|
allow 0 no-such-extension
|
|
allow 0 noop
|
|
abort 0 noop-v1
|
|
allow 1 noop-v1
|
|
EOF
|
|
|
|
test_expect_success 'precious-objects allowed' '
|
|
mkconfig 1 preciousObjects >.git/config &&
|
|
check_allow
|
|
'
|
|
|
|
test_expect_success 'precious-objects blocks destructive repack' '
|
|
test_must_fail git repack -ad
|
|
'
|
|
|
|
test_expect_success 'other repacks are OK' '
|
|
test_commit foo &&
|
|
git repack
|
|
'
|
|
|
|
test_expect_success 'precious-objects blocks prune' '
|
|
test_must_fail git prune
|
|
'
|
|
|
|
test_expect_success 'gc runs without complaint' '
|
|
git gc
|
|
'
|
|
|
|
test_done
|