diff options
author | Junio C Hamano <gitster@pobox.com> | 2009-08-28 22:19:45 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2009-08-28 22:39:24 -0700 |
commit | 11cae066b2433fcec807810b45f317f8203df358 (patch) | |
tree | 562555f95cfa2532a04123be4ca4971e1ac27bdc /upload-pack.c | |
parent | a8563ec8515d87259590a7aad182922def8e2cf2 (diff) | |
download | git-11cae066b2433fcec807810b45f317f8203df358.tar.gz git-11cae066b2433fcec807810b45f317f8203df358.tar.xz |
upload-pack: feed "kind [clone|fetch]" to post-upload-pack hook
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>
Diffstat (limited to 'upload-pack.c')
-rw-r--r-- | upload-pack.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/upload-pack.c b/upload-pack.c index 857440d57..8e82179c9 100644 --- a/upload-pack.c +++ b/upload-pack.c @@ -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)) |