mirror of
https://github.com/git/git
synced 2024-08-25 10:45:59 +00:00
![Junio C Hamano](/assets/img/avatar_default.png)
A request to clone the repository does not give any "have" but asks for all the refs we offer with "want". When a request does not ask to clone the repository fully, but asks to fetch some refs into an empty repository, it will not give any "have" but its "want" won't ask for all the refs we offer. If we suppose (and I would say this is a rather big if) that it makes sense to distinguish these two cases, a hook cannot reliably do this alone. The hook can detect lack of "have" and bunch of "want", but there is no direct way to tell if the other end asked for all refs we offered, or merely most of them. Between the time we talked with the other end and the time the hook got called, we may have acquired more refs or lost some refs in the repository by concurrent operations. Given that we plan to introduce selective advertisement of refs with a protocol extension, it would become even more difficult for hooks to guess between these two cases. This adds "kind [clone|fetch]" to hook's input, as a stable interface to allow the hooks to tell these cases apart. Signed-off-by: Junio C Hamano <gitster@pobox.com>
70 lines
1.4 KiB
Bash
Executable file
70 lines
1.4 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
test_description='post upload-hook'
|
|
|
|
. ./test-lib.sh
|
|
|
|
LOGFILE=".git/post-upload-pack-log"
|
|
|
|
test_expect_success setup '
|
|
test_commit A &&
|
|
test_commit B &&
|
|
git reset --hard A &&
|
|
test_commit C &&
|
|
git branch prev B &&
|
|
mkdir -p .git/hooks &&
|
|
{
|
|
echo "#!$SHELL_PATH" &&
|
|
echo "cat >post-upload-pack-log"
|
|
} >".git/hooks/post-upload-pack" &&
|
|
chmod +x .git/hooks/post-upload-pack
|
|
'
|
|
|
|
test_expect_success initial '
|
|
rm -fr sub &&
|
|
git init sub &&
|
|
(
|
|
cd sub &&
|
|
git fetch --no-tags .. prev
|
|
) &&
|
|
want=$(sed -n "s/^want //p" "$LOGFILE") &&
|
|
test "$want" = "$(git rev-parse --verify B)" &&
|
|
! grep "^have " "$LOGFILE" &&
|
|
kind=$(sed -n "s/^kind //p" "$LOGFILE") &&
|
|
test "$kind" = fetch
|
|
'
|
|
|
|
test_expect_success second '
|
|
rm -fr sub &&
|
|
git init sub &&
|
|
(
|
|
cd sub &&
|
|
git fetch --no-tags .. prev:refs/remotes/prev &&
|
|
git fetch --no-tags .. master
|
|
) &&
|
|
want=$(sed -n "s/^want //p" "$LOGFILE") &&
|
|
test "$want" = "$(git rev-parse --verify C)" &&
|
|
have=$(sed -n "s/^have //p" "$LOGFILE") &&
|
|
test "$have" = "$(git rev-parse --verify B)" &&
|
|
kind=$(sed -n "s/^kind //p" "$LOGFILE") &&
|
|
test "$kind" = fetch
|
|
'
|
|
|
|
test_expect_success all '
|
|
rm -fr sub &&
|
|
HERE=$(pwd) &&
|
|
git init sub &&
|
|
(
|
|
cd sub &&
|
|
git clone "file://$HERE/.git" new
|
|
) &&
|
|
sed -n "s/^want //p" "$LOGFILE" | sort >actual &&
|
|
git rev-parse A B C | sort >expect &&
|
|
test_cmp expect actual &&
|
|
! grep "^have " "$LOGFILE" &&
|
|
kind=$(sed -n "s/^kind //p" "$LOGFILE") &&
|
|
test "$kind" = clone
|
|
'
|
|
|
|
test_done
|