Skip to content

Commit

Permalink
upload-pack: feed "kind [clone|fetch]" to post-upload-pack hook
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Junio C Hamano committed Aug 29, 2009
1 parent a8563ec commit 11cae06
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 2 deletions.
4 changes: 4 additions & 0 deletions Documentation/githooks.txt
Original file line number Diff line number Diff line change
Expand Up @@ -332,6 +332,10 @@ time float::
size decimal::
Size of the resulting packfile in bytes.

kind string:
Either "clone" (when the client did not give us any "have", and asked
for all our refs with "want"), or "fetch" (otherwise).

pre-auto-gc
-----------

Expand Down
24 changes: 22 additions & 2 deletions t/t5501-post-upload-pack.sh
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@ test_expect_success initial '
) &&
want=$(sed -n "s/^want //p" "$LOGFILE") &&
test "$want" = "$(git rev-parse --verify B)" &&
! grep "^have " "$LOGFILE"
! grep "^have " "$LOGFILE" &&
kind=$(sed -n "s/^kind //p" "$LOGFILE") &&
test "$kind" = fetch
'

test_expect_success second '
Expand All @@ -43,7 +45,25 @@ test_expect_success second '
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)"
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
4 changes: 4 additions & 0 deletions upload-pack.c
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,10 @@ static int run_post_upload_pack_hook(size_t total, struct timeval *tv)
(long)tv->tv_sec, (long)tv->tv_usec);
if (!err)
err |= feed_msg_to_hook(proc.in, "size %ld\n", (long)total);
if (!err)
err |= feed_msg_to_hook(proc.in, "kind %s\n",
(nr_our_refs == want_obj.nr && !have_obj.nr)
? "clone" : "fetch");
if (close(proc.in))
err = 1;
if (finish_command(&proc))
Expand Down

0 comments on commit 11cae06

Please sign in to comment.