t5548: add porcelain push test cases for dry-run mode

New dry-run test cases:

 - git push --porcelain --dry-run
 - git push --porcelain --dry-run --force
 - git push --porcelain --dry-run --atomic
 - git push --porcelain --dry-run --atomic --force

Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Jiang Xin 2025-02-03 07:29:35 +01:00 committed by Junio C Hamano
parent 2329b6b461
commit dd69a12e6a
1 changed files with 153 additions and 0 deletions

View File

@ -336,10 +336,159 @@ run_git_push_porcelain_output_test() {
'
}

run_git_push_dry_run_porcelain_output_test() {
case $1 in
http)
PROTOCOL="HTTP protocol"
URL_PREFIX="http://.*"
;;
file)
PROTOCOL="builtin protocol"
URL_PREFIX=".*"
;;
esac

# Refs of upstream : main(B) foo(A) bar(A) baz(A)
# Refs of workbench: main(A) baz(A) next(A)
# git-push : main(A) NULL (B) baz(A) next(A)
test_expect_success ".. git-push --porcelain --dry-run ($PROTOCOL)" '
test_must_fail git -C workbench push --porcelain --dry-run origin \
main \
:refs/heads/foo \
$B:bar \
baz \
next >out &&
make_user_friendly_and_stable_output <out >actual &&
format_and_save_expect <<-EOF &&
> To <URL/of/upstream.git>
> = refs/heads/baz:refs/heads/baz [up to date]
> <COMMIT-B>:refs/heads/bar <COMMIT-A>..<COMMIT-B>
> - :refs/heads/foo [deleted]
> * refs/heads/next:refs/heads/next [new branch]
> ! refs/heads/main:refs/heads/main [rejected] (non-fast-forward)
> Done
EOF
test_cmp expect actual &&

git -C "$upstream" show-ref >out &&
make_user_friendly_and_stable_output <out >actual &&
cat >expect <<-EOF &&
<COMMIT-A> refs/heads/bar
<COMMIT-A> refs/heads/baz
<COMMIT-A> refs/heads/foo
<COMMIT-B> refs/heads/main
EOF
test_cmp expect actual
'

# Refs of upstream : main(B) foo(A) bar(A) baz(A)
# Refs of workbench: main(A) baz(A) next(A)
# push : main(A) NULL (B) baz(A) next(A)
test_expect_success ".. git-push --porcelain --dry-run --force ($PROTOCOL)" '
git -C workbench push --porcelain --dry-run --force origin \
main \
:refs/heads/foo \
$B:bar \
baz \
next >out &&
make_user_friendly_and_stable_output <out >actual &&
format_and_save_expect <<-EOF &&
> To <URL/of/upstream.git>
> = refs/heads/baz:refs/heads/baz [up to date]
> <COMMIT-B>:refs/heads/bar <COMMIT-A>..<COMMIT-B>
> - :refs/heads/foo [deleted]
> + refs/heads/main:refs/heads/main <COMMIT-B>...<COMMIT-A> (forced update)
> * refs/heads/next:refs/heads/next [new branch]
> Done
EOF
test_cmp expect actual &&

git -C "$upstream" show-ref >out &&
make_user_friendly_and_stable_output <out >actual &&
cat >expect <<-EOF &&
<COMMIT-A> refs/heads/bar
<COMMIT-A> refs/heads/baz
<COMMIT-A> refs/heads/foo
<COMMIT-B> refs/heads/main
EOF
test_cmp expect actual
'

# Refs of upstream : main(B) foo(A) bar(A) baz(A)
# Refs of workbench: main(A) baz(A) next(A)
# git-push : main(A) NULL (B) baz(A) next(A)
test_expect_success ".. git-push --porcelain --dry-run --atomic ($PROTOCOL)" '
test_must_fail git -C workbench push --porcelain --dry-run --atomic origin \
main \
:refs/heads/foo \
$B:bar \
baz \
next >out &&
make_user_friendly_and_stable_output <out >actual &&
format_and_save_expect <<-EOF &&
> To <URL/of/upstream.git>
> = refs/heads/baz:refs/heads/baz [up to date]
> ! <COMMIT-B>:refs/heads/bar [rejected] (atomic push failed)
> ! (delete):refs/heads/foo [rejected] (atomic push failed)
> ! refs/heads/main:refs/heads/main [rejected] (non-fast-forward)
> ! refs/heads/next:refs/heads/next [rejected] (atomic push failed)
> Done
EOF
test_cmp expect actual &&

git -C "$upstream" show-ref >out &&
make_user_friendly_and_stable_output <out >actual &&
cat >expect <<-EOF &&
<COMMIT-A> refs/heads/bar
<COMMIT-A> refs/heads/baz
<COMMIT-A> refs/heads/foo
<COMMIT-B> refs/heads/main
EOF
test_cmp expect actual
'

# Refs of upstream : main(B) foo(A) bar(A) baz(A)
# Refs of workbench: main(A) baz(A) next(A)
# push : main(A) NULL (B) baz(A) next(A)
test_expect_success ".. git-push --porcelain --dry-run --atomic --force ($PROTOCOL)" '
git -C workbench push --porcelain --dry-run --atomic --force origin \
main \
:refs/heads/foo \
$B:bar \
baz \
next >out &&
make_user_friendly_and_stable_output <out >actual &&
format_and_save_expect <<-EOF &&
> To <URL/of/upstream.git>
> = refs/heads/baz:refs/heads/baz [up to date]
> <COMMIT-B>:refs/heads/bar <COMMIT-A>..<COMMIT-B>
> - :refs/heads/foo [deleted]
> + refs/heads/main:refs/heads/main <COMMIT-B>...<COMMIT-A> (forced update)
> * refs/heads/next:refs/heads/next [new branch]
> Done
EOF
test_cmp expect actual &&

git -C "$upstream" show-ref >out &&
make_user_friendly_and_stable_output <out >actual &&
cat >expect <<-EOF &&
<COMMIT-A> refs/heads/bar
<COMMIT-A> refs/heads/baz
<COMMIT-A> refs/heads/foo
<COMMIT-B> refs/heads/main
EOF
test_cmp expect actual
'
}

setup_upstream_and_workbench upstream.git

run_git_push_porcelain_output_test file

setup_upstream_and_workbench upstream.git

run_git_push_dry_run_porcelain_output_test file

ROOT_PATH="$PWD"
. "$TEST_DIRECTORY"/lib-gpg.sh
. "$TEST_DIRECTORY"/lib-httpd.sh
@ -351,4 +500,8 @@ setup_upstream_and_workbench "$HTTPD_DOCUMENT_ROOT_PATH/upstream.git"

run_git_push_porcelain_output_test http

setup_upstream_and_workbench "$HTTPD_DOCUMENT_ROOT_PATH/upstream.git"

run_git_push_dry_run_porcelain_output_test http

test_done