зеркало из https://github.com/microsoft/git.git
Merge branch 'nd/http-fetch-shallow-fix' into maint
Attempting to deepen a shallow repository by fetching over smart HTTP transport failed in the protocol exchange, when no-done extension was used. The fetching side waited for the list of shallow boundary commits after the sending end stopped talking to it. * nd/http-fetch-shallow-fix: t5537: move http tests out to t5539 fetch-pack: fix deepen shallow over smart http with no-done cap protocol-capabilities.txt: document no-done protocol-capabilities.txt: refer multi_ack_detailed back to pack-protocol.txt pack-protocol.txt: clarify 'obj-id' in the last ACK after 'done' test: rename http fetch and push test files tests: auto-set LIB_HTTPD_PORT from test name
This commit is contained in:
Коммит
1030d4c8f0
|
@ -338,7 +338,8 @@ during a prior round. This helps to ensure that at least one common
|
|||
ancestor is found before we give up entirely.
|
||||
|
||||
Once the 'done' line is read from the client, the server will either
|
||||
send a final 'ACK obj-id' or it will send a 'NAK'. The server only sends
|
||||
send a final 'ACK obj-id' or it will send a 'NAK'. 'obj-id' is the object
|
||||
name of the last commit determined to be common. The server only sends
|
||||
ACK after 'done' if there is at least one common base and multi_ack or
|
||||
multi_ack_detailed is enabled. The server always sends NAK after 'done'
|
||||
if there is no common base found.
|
||||
|
|
|
@ -69,6 +69,24 @@ ends.
|
|||
Without multi_ack the client would have sent that c-b-a chain anyway,
|
||||
interleaved with S-R-Q.
|
||||
|
||||
multi_ack_detailed
|
||||
------------------
|
||||
This is an extension of multi_ack that permits client to better
|
||||
understand the server's in-memory state. See pack-protocol.txt,
|
||||
section "Packfile Negotiation" for more information.
|
||||
|
||||
no-done
|
||||
-------
|
||||
This capability should only be used with the smart HTTP protocol. If
|
||||
multi_ack_detailed and no-done are both present, then the sender is
|
||||
free to immediately send a pack following its first "ACK obj-id ready"
|
||||
message.
|
||||
|
||||
Without no-done in the smart HTTP protocol, the server session would
|
||||
end and the client has to make another trip to send "done" before
|
||||
the server can send the pack. no-done removes the last round and
|
||||
thus slightly reduces latency.
|
||||
|
||||
thin-pack
|
||||
---------
|
||||
|
||||
|
|
|
@ -439,6 +439,7 @@ done:
|
|||
}
|
||||
strbuf_release(&req_buf);
|
||||
|
||||
if (!got_ready || !no_done)
|
||||
consume_shallow_list(args, fd[0]);
|
||||
while (flushes || multi_ack) {
|
||||
int ack = get_ack(fd[0], result_sha1);
|
||||
|
|
|
@ -64,7 +64,7 @@ case $(uname) in
|
|||
esac
|
||||
|
||||
LIB_HTTPD_PATH=${LIB_HTTPD_PATH-"$DEFAULT_HTTPD_PATH"}
|
||||
LIB_HTTPD_PORT=${LIB_HTTPD_PORT-'8111'}
|
||||
LIB_HTTPD_PORT=${LIB_HTTPD_PORT-${this_test#t}}
|
||||
|
||||
TEST_PATH="$TEST_DIRECTORY"/lib-httpd
|
||||
HTTPD_ROOT_PATH="$PWD"/httpd
|
||||
|
|
|
@ -173,32 +173,4 @@ EOF
|
|||
)
|
||||
'
|
||||
|
||||
if test -n "$NO_CURL" -o -z "$GIT_TEST_HTTPD"; then
|
||||
say 'skipping remaining tests, git built without http support'
|
||||
test_done
|
||||
fi
|
||||
|
||||
LIB_HTTPD_PORT=${LIB_HTTPD_PORT-'5537'}
|
||||
. "$TEST_DIRECTORY"/lib-httpd.sh
|
||||
start_httpd
|
||||
|
||||
test_expect_success 'clone http repository' '
|
||||
git clone --bare --no-local shallow "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
|
||||
git clone $HTTPD_URL/smart/repo.git clone &&
|
||||
(
|
||||
cd clone &&
|
||||
git fsck &&
|
||||
git log --format=%s origin/master >actual &&
|
||||
cat <<EOF >expect &&
|
||||
7
|
||||
6
|
||||
5
|
||||
4
|
||||
3
|
||||
EOF
|
||||
test_cmp expect actual
|
||||
)
|
||||
'
|
||||
|
||||
stop_httpd
|
||||
test_done
|
||||
|
|
|
@ -126,7 +126,6 @@ if test -n "$NO_CURL" -o -z "$GIT_TEST_HTTPD"; then
|
|||
test_done
|
||||
fi
|
||||
|
||||
LIB_HTTPD_PORT=${LIB_HTTPD_PORT-'5537'}
|
||||
. "$TEST_DIRECTORY"/lib-httpd.sh
|
||||
start_httpd
|
||||
|
||||
|
|
|
@ -0,0 +1,82 @@
|
|||
#!/bin/sh
|
||||
|
||||
test_description='fetch/clone from a shallow clone over http'
|
||||
|
||||
. ./test-lib.sh
|
||||
|
||||
if test -n "$NO_CURL"; then
|
||||
skip_all='skipping test, git built without http support'
|
||||
test_done
|
||||
fi
|
||||
|
||||
. "$TEST_DIRECTORY"/lib-httpd.sh
|
||||
start_httpd
|
||||
|
||||
commit() {
|
||||
echo "$1" >tracked &&
|
||||
git add tracked &&
|
||||
git commit -m "$1"
|
||||
}
|
||||
|
||||
test_expect_success 'setup shallow clone' '
|
||||
commit 1 &&
|
||||
commit 2 &&
|
||||
commit 3 &&
|
||||
commit 4 &&
|
||||
commit 5 &&
|
||||
commit 6 &&
|
||||
commit 7 &&
|
||||
git clone --no-local --depth=5 .git shallow &&
|
||||
git config --global transfer.fsckObjects true
|
||||
'
|
||||
|
||||
test_expect_success 'clone http repository' '
|
||||
git clone --bare --no-local shallow "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
|
||||
git clone $HTTPD_URL/smart/repo.git clone &&
|
||||
(
|
||||
cd clone &&
|
||||
git fsck &&
|
||||
git log --format=%s origin/master >actual &&
|
||||
cat <<EOF >expect &&
|
||||
7
|
||||
6
|
||||
5
|
||||
4
|
||||
3
|
||||
EOF
|
||||
test_cmp expect actual
|
||||
)
|
||||
'
|
||||
|
||||
# This test is tricky. We need large enough "have"s that fetch-pack
|
||||
# will put pkt-flush in between. Then we need a "have" the server
|
||||
# does not have, it'll send "ACK %s ready"
|
||||
test_expect_success 'no shallow lines after receiving ACK ready' '
|
||||
(
|
||||
cd shallow &&
|
||||
for i in $(test_seq 15)
|
||||
do
|
||||
git checkout --orphan unrelated$i &&
|
||||
test_commit unrelated$i &&
|
||||
git push -q "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" \
|
||||
refs/heads/unrelated$i:refs/heads/unrelated$i &&
|
||||
git push -q ../clone/.git \
|
||||
refs/heads/unrelated$i:refs/heads/unrelated$i ||
|
||||
exit 1
|
||||
done &&
|
||||
git checkout master &&
|
||||
test_commit new &&
|
||||
git push "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" master
|
||||
) &&
|
||||
(
|
||||
cd clone &&
|
||||
git checkout --orphan newnew &&
|
||||
test_commit new-too &&
|
||||
GIT_TRACE_PACKET="$TRASH_DIRECTORY/trace" git fetch --depth=2 &&
|
||||
grep "fetch-pack< ACK .* ready" ../trace &&
|
||||
! grep "fetch-pack> done" ../trace
|
||||
)
|
||||
'
|
||||
|
||||
stop_httpd
|
||||
test_done
|
|
@ -16,7 +16,6 @@ then
|
|||
fi
|
||||
|
||||
LIB_HTTPD_DAV=t
|
||||
LIB_HTTPD_PORT=${LIB_HTTPD_PORT-'5540'}
|
||||
. "$TEST_DIRECTORY"/lib-httpd.sh
|
||||
ROOT_PATH="$PWD"
|
||||
start_httpd
|
|
@ -12,7 +12,6 @@ if test -n "$NO_CURL"; then
|
|||
fi
|
||||
|
||||
ROOT_PATH="$PWD"
|
||||
LIB_HTTPD_PORT=${LIB_HTTPD_PORT-'5541'}
|
||||
. "$TEST_DIRECTORY"/lib-httpd.sh
|
||||
. "$TEST_DIRECTORY"/lib-terminal.sh
|
||||
start_httpd
|
|
@ -8,7 +8,6 @@ if test -n "$NO_CURL"; then
|
|||
test_done
|
||||
fi
|
||||
|
||||
LIB_HTTPD_PORT=${LIB_HTTPD_PORT-'5550'}
|
||||
. "$TEST_DIRECTORY"/lib-httpd.sh
|
||||
start_httpd
|
||||
|
|
@ -8,7 +8,6 @@ if test -n "$NO_CURL"; then
|
|||
test_done
|
||||
fi
|
||||
|
||||
LIB_HTTPD_PORT=${LIB_HTTPD_PORT-'5551'}
|
||||
. "$TEST_DIRECTORY"/lib-httpd.sh
|
||||
start_httpd
|
||||
|
|
@ -8,7 +8,6 @@ if test -n "$NO_CURL"; then
|
|||
test_done
|
||||
fi
|
||||
|
||||
LIB_HTTPD_PORT=${LIB_HTTPD_PORT-'5561'}
|
||||
. "$TEST_DIRECTORY"/lib-httpd.sh
|
||||
start_httpd
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче