Git fork

t5410: test receive-pack connectivity check

As part of git-recieve-pack(1), the connectivity of objects is checked.
Add a test validating that git-receive-pack(1) fails due to an incoming
packfile that would leave the repository with missing objects. Instead
of creating a new test file, "t5410" is generalized for receive-pack
testing.

Signed-off-by: Justin Tobler <jltobler@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

authored by

Justin Tobler and committed by
Junio C Hamano
95262afe 8613c2bb

+66 -45
+1 -1
t/meson.build
··· 629 629 't5407-post-rewrite-hook.sh', 630 630 't5408-send-pack-stdin.sh', 631 631 't5409-colorize-remote-messages.sh', 632 - 't5410-receive-pack-alternates.sh', 632 + 't5410-receive-pack.sh', 633 633 't5411-proc-receive-hook.sh', 634 634 't5500-fetch-pack.sh', 635 635 't5501-fetch-push-alternates.sh',
-44
t/t5410-receive-pack-alternates.sh
··· 1 - #!/bin/sh 2 - 3 - test_description='git receive-pack with alternate ref filtering' 4 - 5 - GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main 6 - export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME 7 - 8 - . ./test-lib.sh 9 - 10 - test_expect_success 'setup' ' 11 - test_commit base && 12 - git clone -s --bare . fork && 13 - git checkout -b public/branch main && 14 - test_commit public && 15 - git checkout -b private/branch main && 16 - test_commit private 17 - ' 18 - 19 - extract_haves () { 20 - depacketize | sed -n 's/^\([^ ][^ ]*\) \.have/\1/p' 21 - } 22 - 23 - test_expect_success 'with core.alternateRefsCommand' ' 24 - write_script fork/alternate-refs <<-\EOF && 25 - git --git-dir="$1" for-each-ref \ 26 - --format="%(objectname)" \ 27 - refs/heads/public/ 28 - EOF 29 - test_config -C fork core.alternateRefsCommand ./alternate-refs && 30 - git rev-parse public/branch >expect && 31 - printf "0000" | git receive-pack fork >actual && 32 - extract_haves <actual >actual.haves && 33 - test_cmp expect actual.haves 34 - ' 35 - 36 - test_expect_success 'with core.alternateRefsPrefixes' ' 37 - test_config -C fork core.alternateRefsPrefixes "refs/heads/private" && 38 - git rev-parse private/branch >expect && 39 - printf "0000" | git receive-pack fork >actual && 40 - extract_haves <actual >actual.haves && 41 - test_cmp expect actual.haves 42 - ' 43 - 44 - test_done
+65
t/t5410-receive-pack.sh
··· 1 + #!/bin/sh 2 + 3 + test_description='git receive-pack' 4 + 5 + GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main 6 + export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME 7 + 8 + . ./test-lib.sh 9 + 10 + test_expect_success 'setup' ' 11 + test_commit base && 12 + git clone -s --bare . fork && 13 + git checkout -b public/branch main && 14 + test_commit public && 15 + git checkout -b private/branch main && 16 + test_commit private 17 + ' 18 + 19 + extract_haves () { 20 + depacketize | sed -n 's/^\([^ ][^ ]*\) \.have/\1/p' 21 + } 22 + 23 + test_expect_success 'with core.alternateRefsCommand' ' 24 + write_script fork/alternate-refs <<-\EOF && 25 + git --git-dir="$1" for-each-ref \ 26 + --format="%(objectname)" \ 27 + refs/heads/public/ 28 + EOF 29 + test_config -C fork core.alternateRefsCommand ./alternate-refs && 30 + git rev-parse public/branch >expect && 31 + printf "0000" | git receive-pack fork >actual && 32 + extract_haves <actual >actual.haves && 33 + test_cmp expect actual.haves 34 + ' 35 + 36 + test_expect_success 'with core.alternateRefsPrefixes' ' 37 + test_config -C fork core.alternateRefsPrefixes "refs/heads/private" && 38 + git rev-parse private/branch >expect && 39 + printf "0000" | git receive-pack fork >actual && 40 + extract_haves <actual >actual.haves && 41 + test_cmp expect actual.haves 42 + ' 43 + 44 + test_expect_success 'receive-pack missing objects fails connectivity check' ' 45 + test_when_finished rm -rf repo remote.git setup.git && 46 + 47 + git init repo && 48 + git -C repo commit --allow-empty -m 1 && 49 + git clone --bare repo setup.git && 50 + git -C repo commit --allow-empty -m 2 && 51 + 52 + # Capture git-send-pack(1) output sent to git-receive-pack(1). 53 + git -C repo send-pack ../setup.git --all \ 54 + --receive-pack="tee ${SQ}$(pwd)/out${SQ} | git-receive-pack" && 55 + 56 + # Replay captured git-send-pack(1) output on new empty repository. 57 + git init --bare remote.git && 58 + git receive-pack remote.git <out >actual 2>err && 59 + 60 + test_grep "missing necessary objects" actual && 61 + test_grep "fatal: Failed to traverse parents" err && 62 + test_must_fail git -C remote.git cat-file -e $(git -C repo rev-parse HEAD) 63 + ' 64 + 65 + test_done