-
Notifications
You must be signed in to change notification settings - Fork 8
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
diff: batch fetching of missing blobs
When running a command like "git show" or "git diff" in a partial clone, batch all missing blobs to be fetched as one request. This is similar to c0c578b ("unpack-trees: batch fetching of missing blobs", 2017-12-08), but for another command. Signed-off-by: Jonathan Tan <jonathantanmy@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
- Loading branch information
1 parent
0f4a4fb
commit 7fbbcb2
Showing
2 changed files
with
137 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
#!/bin/sh | ||
|
||
test_description='behavior of diff when reading objects in a partial clone' | ||
|
||
. ./test-lib.sh | ||
|
||
test_expect_success 'git show batches blobs' ' | ||
test_when_finished "rm -rf server client trace" && | ||
test_create_repo server && | ||
echo a >server/a && | ||
echo b >server/b && | ||
git -C server add a b && | ||
git -C server commit -m x && | ||
test_config -C server uploadpack.allowfilter 1 && | ||
test_config -C server uploadpack.allowanysha1inwant 1 && | ||
git clone --bare --filter=blob:limit=0 "file://$(pwd)/server" client && | ||
# Ensure that there is exactly 1 negotiation by checking that there is | ||
# only 1 "done" line sent. ("done" marks the end of negotiation.) | ||
GIT_TRACE_PACKET="$(pwd)/trace" git -C client show HEAD && | ||
grep "git> done" trace >done_lines && | ||
test_line_count = 1 done_lines | ||
' | ||
|
||
test_expect_success 'diff batches blobs' ' | ||
test_when_finished "rm -rf server client trace" && | ||
test_create_repo server && | ||
echo a >server/a && | ||
echo b >server/b && | ||
git -C server add a b && | ||
git -C server commit -m x && | ||
echo c >server/c && | ||
echo d >server/d && | ||
git -C server add c d && | ||
git -C server commit -m x && | ||
test_config -C server uploadpack.allowfilter 1 && | ||
test_config -C server uploadpack.allowanysha1inwant 1 && | ||
git clone --bare --filter=blob:limit=0 "file://$(pwd)/server" client && | ||
# Ensure that there is exactly 1 negotiation by checking that there is | ||
# only 1 "done" line sent. ("done" marks the end of negotiation.) | ||
GIT_TRACE_PACKET="$(pwd)/trace" git -C client diff HEAD^ HEAD && | ||
grep "git> done" trace >done_lines && | ||
test_line_count = 1 done_lines | ||
' | ||
|
||
test_expect_success 'diff skips same-OID blobs' ' | ||
test_when_finished "rm -rf server client trace" && | ||
test_create_repo server && | ||
echo a >server/a && | ||
echo b >server/b && | ||
git -C server add a b && | ||
git -C server commit -m x && | ||
echo another-a >server/a && | ||
git -C server add a && | ||
git -C server commit -m x && | ||
test_config -C server uploadpack.allowfilter 1 && | ||
test_config -C server uploadpack.allowanysha1inwant 1 && | ||
git clone --bare --filter=blob:limit=0 "file://$(pwd)/server" client && | ||
echo a | git hash-object --stdin >hash-old-a && | ||
echo another-a | git hash-object --stdin >hash-new-a && | ||
echo b | git hash-object --stdin >hash-b && | ||
# Ensure that only a and another-a are fetched. | ||
GIT_TRACE_PACKET="$(pwd)/trace" git -C client diff HEAD^ HEAD && | ||
grep "want $(cat hash-old-a)" trace && | ||
grep "want $(cat hash-new-a)" trace && | ||
! grep "want $(cat hash-b)" trace | ||
' | ||
|
||
test_expect_success 'diff with rename detection batches blobs' ' | ||
test_when_finished "rm -rf server client trace" && | ||
test_create_repo server && | ||
echo a >server/a && | ||
printf "b\nb\nb\nb\nb\n" >server/b && | ||
git -C server add a b && | ||
git -C server commit -m x && | ||
rm server/b && | ||
printf "b\nb\nb\nb\nbX\n" >server/c && | ||
git -C server add c && | ||
git -C server commit -a -m x && | ||
test_config -C server uploadpack.allowfilter 1 && | ||
test_config -C server uploadpack.allowanysha1inwant 1 && | ||
git clone --bare --filter=blob:limit=0 "file://$(pwd)/server" client && | ||
# Ensure that there is exactly 1 negotiation by checking that there is | ||
# only 1 "done" line sent. ("done" marks the end of negotiation.) | ||
GIT_TRACE_PACKET="$(pwd)/trace" git -C client diff -M HEAD^ HEAD >out && | ||
grep "similarity index" out && | ||
grep "git> done" trace >done_lines && | ||
test_line_count = 1 done_lines | ||
' | ||
|
||
test_done |