mirror of
https://github.com/git/git
synced 2024-08-23 18:00:25 +00:00
![Jeff King](/assets/img/avatar_default.png)
Commitbdb31eada7
(upload-pack: report "not our ref" to client, 2017-02-23) catches the case where a client asks for an object we don't have, and issues a message that the client can show to the user (in addition to dying and writing to stderr). There's a similar case (with the same message) when the client asks for an object which we _do_ have, but which isn't a ref tip (or isn't reachable, when uploadpack.allowReachableSHA1InWant is true). Let's give that one the same treatment, for the same reason (namely that it's more informative to the client than just hanging up, since they won't see our stderr over some protocols). There are two tests here. We cover it most directly in t5530 by invoking upload-pack, which matches the existing "not our ref" test. But a more end-to-end check is that "git fetch" actually shows the message to the client. We're already checking in t5516 that this case fails, so we can just check stderr there, too. Note that even after we started ignoring SIGPIPE in8bf4becf0c
, this could in theory still be racy as described in that commit (because we die() on write failures before pumping the connection for any ERR packets). In practice this should be OK for this case. The server will not actually check reachability until it has received our whole group of "want" lines. And since we have no objects in the repository, we won't send any "have" lines, meaning we're always waiting to read the server response. Note also that this case cannot happen in the v2 protocol, since it allows any available object to be requested. However, we don't have to take any steps to protect against the upcoming GIT_TEST_PROTOCOL_VERSION in our tests: - the tests in t5516 would already need to be skipped under v2, and that is covered byab0c5f5096
(tests: always test fetch of unreachable with v0, 2019-02-25) - the tests in t5530 invoke upload-pack directly, which will continue to default to v0. Eventually we may have a test setting which uses v2 even for bare upload-pack calls, but we can't override it here until we know what the setting looks like. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
105 lines
2.5 KiB
Bash
Executable file
105 lines
2.5 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
test_description='errors in upload-pack'
|
|
|
|
. ./test-lib.sh
|
|
|
|
D=$(pwd)
|
|
|
|
corrupt_repo () {
|
|
object_sha1=$(git rev-parse "$1") &&
|
|
ob=$(expr "$object_sha1" : "\(..\)") &&
|
|
ject=$(expr "$object_sha1" : "..\(..*\)") &&
|
|
rm -f ".git/objects/$ob/$ject"
|
|
}
|
|
|
|
test_expect_success 'setup and corrupt repository' '
|
|
|
|
echo file >file &&
|
|
git add file &&
|
|
git rev-parse :file &&
|
|
git commit -a -m original &&
|
|
test_tick &&
|
|
echo changed >file &&
|
|
git commit -a -m changed &&
|
|
corrupt_repo HEAD:file
|
|
|
|
'
|
|
|
|
test_expect_success 'fsck fails' '
|
|
test_must_fail git fsck
|
|
'
|
|
|
|
test_expect_success 'upload-pack fails due to error in pack-objects packing' '
|
|
|
|
printf "0032want %s\n00000009done\n0000" \
|
|
$(git rev-parse HEAD) >input &&
|
|
test_must_fail git upload-pack . <input >/dev/null 2>output.err &&
|
|
test_i18ngrep "unable to read" output.err &&
|
|
test_i18ngrep "pack-objects died" output.err
|
|
'
|
|
|
|
test_expect_success 'corrupt repo differently' '
|
|
|
|
git hash-object -w file &&
|
|
corrupt_repo HEAD^^{tree}
|
|
|
|
'
|
|
|
|
test_expect_success 'fsck fails' '
|
|
test_must_fail git fsck
|
|
'
|
|
test_expect_success 'upload-pack fails due to error in rev-list' '
|
|
|
|
printf "0032want %s\n0034shallow %s00000009done\n0000" \
|
|
$(git rev-parse HEAD) $(git rev-parse HEAD^) >input &&
|
|
test_must_fail git upload-pack . <input >/dev/null 2>output.err &&
|
|
grep "bad tree object" output.err
|
|
'
|
|
|
|
test_expect_success 'upload-pack fails due to bad want (no object)' '
|
|
|
|
printf "0045want %s multi_ack_detailed\n00000009done\n0000" \
|
|
"deadbeefdeadbeefdeadbeefdeadbeefdeadbeef" >input &&
|
|
test_must_fail git upload-pack . <input >output 2>output.err &&
|
|
grep "not our ref" output.err &&
|
|
grep "ERR" output &&
|
|
! grep multi_ack_detailed output.err
|
|
'
|
|
|
|
test_expect_success 'upload-pack fails due to bad want (not tip)' '
|
|
|
|
oid=$(echo an object we have | git hash-object -w --stdin) &&
|
|
printf "0045want %s multi_ack_detailed\n00000009done\n0000" \
|
|
"$oid" >input &&
|
|
test_must_fail git upload-pack . <input >output 2>output.err &&
|
|
grep "not our ref" output.err &&
|
|
grep "ERR" output &&
|
|
! grep multi_ack_detailed output.err
|
|
'
|
|
|
|
test_expect_success 'upload-pack fails due to error in pack-objects enumeration' '
|
|
|
|
printf "0032want %s\n00000009done\n0000" \
|
|
$(git rev-parse HEAD) >input &&
|
|
test_must_fail git upload-pack . <input >/dev/null 2>output.err &&
|
|
grep "bad tree object" output.err &&
|
|
grep "pack-objects died" output.err
|
|
'
|
|
|
|
test_expect_success 'create empty repository' '
|
|
|
|
mkdir foo &&
|
|
cd foo &&
|
|
git init
|
|
|
|
'
|
|
|
|
test_expect_success 'fetch fails' '
|
|
|
|
test_must_fail git fetch .. master
|
|
|
|
'
|
|
|
|
test_done
|