Browse Source
The receiving end of "git push" advertises the objects that the repository itself does not use, but are at the tips of refs in other repositories whose object databases are used as alternates for it. This helps it avoid having to receive (and the pusher having to send) objects that are already available to the receiving repository via the alternates mechanism. Tweak the helper function that implements this feature, and move it to transport.[ch] for future reuse by other programs. The additional test demonstrates how this optimization is helping "git push", and "git fetch" is ignorant about it. Signed-off-by: Junio C Hamano <gitster@pobox.com> Acked-by: Shawn O. Pearce <spearce@spearce.org>maint
Junio C Hamano
14 years ago
4 changed files with 106 additions and 32 deletions
@ -0,0 +1,66 @@
@@ -0,0 +1,66 @@
|
||||
#!/bin/sh |
||||
|
||||
test_description='fetch/push involving alternates' |
||||
. ./test-lib.sh |
||||
|
||||
count_objects () { |
||||
loose=0 inpack=0 |
||||
eval "$( |
||||
git count-objects -v | |
||||
sed -n -e 's/^count: \(.*\)/loose=\1/p' \ |
||||
-e 's/^in-pack: \(.*\)/inpack=\1/p' |
||||
)" && |
||||
echo $(( $loose + $inpack )) |
||||
} |
||||
|
||||
|
||||
test_expect_success setup ' |
||||
( |
||||
git init original && |
||||
cd original && |
||||
i=0 && |
||||
while test $i -le 100 |
||||
do |
||||
echo "$i" >count && |
||||
git add count && |
||||
git commit -m "$i" || exit |
||||
i=$(($i + 1)) |
||||
done |
||||
) && |
||||
( |
||||
git clone --reference=original "file:///$(pwd)/original" one && |
||||
cd one && |
||||
echo Z >count && |
||||
git add count && |
||||
git commit -m Z && |
||||
count_objects >../one.count |
||||
) && |
||||
A=$(pwd)/original/.git/objects && |
||||
git init receiver && |
||||
echo "$A" >receiver/.git/objects/info/alternates && |
||||
git init fetcher && |
||||
echo "$A" >fetcher/.git/objects/info/alternates |
||||
' |
||||
|
||||
test_expect_success 'pushing into a repository with the same alternate' ' |
||||
( |
||||
cd one && |
||||
git push ../receiver master:refs/heads/it |
||||
) && |
||||
( |
||||
cd receiver && |
||||
count_objects >../receiver.count |
||||
) && |
||||
test_cmp one.count receiver.count |
||||
' |
||||
|
||||
test_expect_failure 'fetching from a repository with the same alternate' ' |
||||
( |
||||
cd fetcher && |
||||
git fetch ../one master:refs/heads/it && |
||||
count_objects >../fetcher.count |
||||
) && |
||||
test_cmp one.count fetcher.count |
||||
' |
||||
|
||||
test_done |
Loading…
Reference in new issue