mirror of
https://github.com/git/git.git
synced 2025-12-12 20:36:24 +01:00
The "seq" tool has a "-f" option to produce printf-style formatted
lines. Let's teach our test_seq helper the same trick. This lets us get
rid of some shell loops in test snippets (which are particularly verbose
in our test suite because we have to "|| return 1" to keep the &&-chain
going).
This converts a few call-sites I found by grepping around the test
suite. A few notes on these:
- In "seq", the format specifier is a "%g" float. Since test_seq only
supports integers, I've kept the more natural "%d" (which is what
these call sites were using already).
- Like "seq", test_seq automatically adds a newline to the specified
format. This is what all callers are doing already except for t0021,
but there we do not care about the exact format. We are just trying
to printf a large number of bytes to a file. It's not worth
complicating other callers or adding an option to avoid the newline
in that caller.
- Most conversions are just replacing a shell loop (which does get rid
of an extra fork, since $() requires a subshell). In t0612 we can
replace an awk invocation, which I think makes the end result more
readable, as there's less quoting.
- In t7422 we can replace one loop, but sadly we have to leave the
loop directly above it. This is because that earlier loop wants to
include the seq value twice in the output, which test_seq does not
support (nor does regular seq). If you run:
test_seq -f "foo-%d %d" 10
the second "%d" will always be the empty string. You might naively
think that test_seq could add some extra arguments, like:
# 3 ought to be enough for anyone...
printf "$fmt\n" "$i "$i" $i"
but that just triggers printf to format multiple lines, one per
extra set of arguments.
So we'd have to actually parse the format string, figure out how
many "%" placeholders are there, and then feed it that many
instances of the sequence number. The complexity isn't worth it.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
209 lines
4.5 KiB
Bash
Executable File
209 lines
4.5 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
test_description='submodule --cached, --quiet etc. output'
|
|
|
|
. ./test-lib.sh
|
|
. "$TEST_DIRECTORY"/lib-t3100.sh
|
|
|
|
setup_sub () {
|
|
local d="$1" &&
|
|
shift &&
|
|
git $@ clone . "$d" &&
|
|
git $@ submodule add ./"$d"
|
|
}
|
|
|
|
normalize_status () {
|
|
sed -e 's/-g[0-9a-f]*/-gHASH/'
|
|
}
|
|
|
|
test_expect_success 'setup' '
|
|
test_commit A &&
|
|
test_commit B &&
|
|
setup_sub S &&
|
|
setup_sub S.D &&
|
|
setup_sub S.C &&
|
|
setup_sub S.C.D &&
|
|
setup_sub X &&
|
|
git add S* &&
|
|
test_commit C &&
|
|
|
|
# recursive in X/
|
|
git -C X pull &&
|
|
GIT_ALLOW_PROTOCOL=file git -C X submodule update --init &&
|
|
|
|
# dirty
|
|
for d in S.D X/S.D
|
|
do
|
|
echo dirty >"$d"/A.t || return 1
|
|
done &&
|
|
|
|
# commit (for --cached)
|
|
for d in S.C* X/S.C*
|
|
do
|
|
git -C "$d" reset --hard A || return 1
|
|
done &&
|
|
|
|
# dirty
|
|
for d in S*.D X/S*.D
|
|
do
|
|
echo dirty >"$d/C2.t" || return 1
|
|
done &&
|
|
|
|
for ref in A B C
|
|
do
|
|
# Not different with SHA-1 and SHA-256, just (ab)using
|
|
# test_oid_cache as a variable bag to avoid using
|
|
# $(git rev-parse ...).
|
|
oid=$(git rev-parse $ref) &&
|
|
test_oid_cache <<-EOF || return 1
|
|
$ref sha1:$oid
|
|
$ref sha256:$oid
|
|
EOF
|
|
done
|
|
'
|
|
|
|
for opts in "" "status"
|
|
do
|
|
test_expect_success "git submodule $opts" '
|
|
sed -e "s/^>//" >expect <<-EOF &&
|
|
> $(test_oid B) S (B)
|
|
>+$(test_oid A) S.C (A)
|
|
>+$(test_oid A) S.C.D (A)
|
|
> $(test_oid B) S.D (B)
|
|
>+$(test_oid C) X (C)
|
|
EOF
|
|
git submodule $opts >actual.raw &&
|
|
normalize_status <actual.raw >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
done
|
|
|
|
for opts in \
|
|
"status --recursive"
|
|
do
|
|
test_expect_success "git submodule $opts" '
|
|
sed -e "s/^>//" >expect <<-EOF &&
|
|
> $(test_oid B) S (B)
|
|
>+$(test_oid A) S.C (A)
|
|
>+$(test_oid A) S.C.D (A)
|
|
> $(test_oid B) S.D (B)
|
|
>+$(test_oid C) X (C)
|
|
> $(test_oid B) X/S (B)
|
|
>+$(test_oid A) X/S.C (A)
|
|
>+$(test_oid A) X/S.C.D (A)
|
|
> $(test_oid B) X/S.D (B)
|
|
> $(test_oid B) X/X (B)
|
|
EOF
|
|
git submodule $opts >actual.raw &&
|
|
normalize_status <actual.raw >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
done
|
|
|
|
for opts in \
|
|
"--quiet" \
|
|
"--quiet status" \
|
|
"status --quiet"
|
|
do
|
|
test_expect_success "git submodule $opts" '
|
|
git submodule $opts >out &&
|
|
test_must_be_empty out
|
|
'
|
|
done
|
|
|
|
for opts in \
|
|
"--cached" \
|
|
"--cached status" \
|
|
"status --cached"
|
|
do
|
|
test_expect_success "git submodule $opts" '
|
|
sed -e "s/^>//" >expect <<-EOF &&
|
|
> $(test_oid B) S (B)
|
|
>+$(test_oid B) S.C (B)
|
|
>+$(test_oid B) S.C.D (B)
|
|
> $(test_oid B) S.D (B)
|
|
>+$(test_oid B) X (B)
|
|
EOF
|
|
git submodule $opts >actual.raw &&
|
|
normalize_status <actual.raw >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
done
|
|
|
|
for opts in \
|
|
"--cached --quiet" \
|
|
"--cached --quiet status" \
|
|
"--cached status --quiet" \
|
|
"--quiet status --cached" \
|
|
"status --cached --quiet"
|
|
do
|
|
test_expect_success "git submodule $opts" '
|
|
git submodule $opts >out &&
|
|
test_must_be_empty out
|
|
'
|
|
done
|
|
|
|
for opts in \
|
|
"status --cached --recursive" \
|
|
"--cached status --recursive"
|
|
do
|
|
test_expect_success "git submodule $opts" '
|
|
sed -e "s/^>//" >expect <<-EOF &&
|
|
> $(test_oid B) S (B)
|
|
>+$(test_oid B) S.C (B)
|
|
>+$(test_oid B) S.C.D (B)
|
|
> $(test_oid B) S.D (B)
|
|
>+$(test_oid B) X (B)
|
|
> $(test_oid B) X/S (B)
|
|
>+$(test_oid B) X/S.C (B)
|
|
>+$(test_oid B) X/S.C.D (B)
|
|
> $(test_oid B) X/S.D (B)
|
|
> $(test_oid B) X/X (B)
|
|
EOF
|
|
git submodule $opts >actual.raw &&
|
|
normalize_status <actual.raw >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
done
|
|
|
|
test_expect_success !MINGW 'git submodule status --recursive propagates SIGPIPE' '
|
|
# The test setup is somewhat involved because triggering a SIGPIPE is
|
|
# racy with buffered pipes. To avoid the raciness we thus need to make
|
|
# sure that the subprocess in question fills the buffers completely,
|
|
# which requires a couple thousand submodules in total.
|
|
test_when_finished "rm -rf submodule repo" &&
|
|
git init submodule &&
|
|
(
|
|
cd submodule &&
|
|
test_commit initial &&
|
|
|
|
COMMIT=$(git rev-parse HEAD) &&
|
|
for i in $(test_seq 2000)
|
|
do
|
|
echo "[submodule \"sm-$i\"]" &&
|
|
echo "path = recursive-submodule-path-$i" ||
|
|
return 1
|
|
done >gitmodules &&
|
|
BLOB=$(git hash-object -w --stdin <gitmodules) &&
|
|
|
|
printf "100644 blob $BLOB\t.gitmodules\n" >tree &&
|
|
test_seq -f "160000 commit $COMMIT\trecursive-submodule-path-%d" 2000 >>tree &&
|
|
TREE=$(git mktree <tree) &&
|
|
|
|
COMMIT=$(git commit-tree "$TREE") &&
|
|
git reset --hard "$COMMIT"
|
|
) &&
|
|
|
|
git init repo &&
|
|
(
|
|
cd repo &&
|
|
GIT_ALLOW_PROTOCOL=file git submodule add "$(pwd)"/../submodule &&
|
|
{ git submodule status --recursive 2>err; echo $?>status; } |
|
|
grep -q recursive-submodule-path-1 &&
|
|
test_must_be_empty err &&
|
|
test_match_signal 13 "$(cat status)"
|
|
)
|
|
'
|
|
|
|
test_done
|