fetch-pack: support negotiation tip whitelist
During negotiation, fetch-pack eventually reports as "have" lines all commits reachable from all refs. Allow the user to restrict the commits sent in this way by providing a whitelist of tips; only the tips themselves and their ancestors will be sent. Both globs and single objects are supported. This feature is only supported for protocols that support connect or stateless-connect (such as HTTP with protocol v2). This will speed up negotiation when the repository has multiple relatively independent branches (for example, when a repository interacts with multiple repositories, such as with linux-next [1] and torvalds/linux [2]), and the user knows which local branch is likely to have commits in common with the upstream branch they are fetching. [1] https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next/ [2] https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux/ Signed-off-by: Jonathan Tan <jonathantanmy@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
ec06283844
commit
3390e42adb
20
fetch-pack.c
20
fetch-pack.c
@ -213,6 +213,22 @@ static int next_flush(int stateless_rpc, int count)
|
||||
return count;
|
||||
}
|
||||
|
||||
static void mark_tips(struct fetch_negotiator *negotiator,
|
||||
const struct oid_array *negotiation_tips)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!negotiation_tips) {
|
||||
for_each_ref(rev_list_insert_ref_oid, negotiator);
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < negotiation_tips->nr; i++)
|
||||
rev_list_insert_ref(negotiator, NULL,
|
||||
&negotiation_tips->oid[i]);
|
||||
return;
|
||||
}
|
||||
|
||||
static int find_common(struct fetch_negotiator *negotiator,
|
||||
struct fetch_pack_args *args,
|
||||
int fd[2], struct object_id *result_oid,
|
||||
@ -230,7 +246,7 @@ static int find_common(struct fetch_negotiator *negotiator,
|
||||
if (args->stateless_rpc && multi_ack == 1)
|
||||
die(_("--stateless-rpc requires multi_ack_detailed"));
|
||||
|
||||
for_each_ref(rev_list_insert_ref_oid, negotiator);
|
||||
mark_tips(negotiator, args->negotiation_tips);
|
||||
for_each_cached_alternate(negotiator, insert_one_alternate_object);
|
||||
|
||||
fetching = 0;
|
||||
@ -1295,7 +1311,7 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
|
||||
else
|
||||
state = FETCH_SEND_REQUEST;
|
||||
|
||||
for_each_ref(rev_list_insert_ref_oid, &negotiator);
|
||||
mark_tips(&negotiator, args->negotiation_tips);
|
||||
for_each_cached_alternate(&negotiator,
|
||||
insert_one_alternate_object);
|
||||
break;
|
||||
|
Reference in New Issue
Block a user