fetch-pack: put shallow info in output parameter
Expand the transport fetch method signature, by adding an output parameter, to allow transports to return information about the refs they have fetched. Then communicate shallow status information through this mechanism instead of by modifying the input list of refs. This does require clients to sometimes generate the ref map twice: once from the list of refs provided by the remote (as is currently done) and potentially once from the new list of refs that the fetch mechanism provides. Signed-off-by: Brandon Williams <bmwill@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
6d1700d564
commit
989b8c4452
@ -946,11 +946,13 @@ static int quickfetch(struct ref *ref_map)
|
||||
return check_connected(iterate_ref_map, &rm, &opt);
|
||||
}
|
||||
|
||||
static int fetch_refs(struct transport *transport, struct ref *ref_map)
|
||||
static int fetch_refs(struct transport *transport, struct ref *ref_map,
|
||||
struct ref **updated_remote_refs)
|
||||
{
|
||||
int ret = quickfetch(ref_map);
|
||||
if (ret)
|
||||
ret = transport_fetch_refs(transport, ref_map);
|
||||
ret = transport_fetch_refs(transport, ref_map,
|
||||
updated_remote_refs);
|
||||
if (!ret)
|
||||
/*
|
||||
* Keep the new pack's ".keep" file around to allow the caller
|
||||
@ -1112,7 +1114,7 @@ static void backfill_tags(struct transport *transport, struct ref *ref_map)
|
||||
transport_set_option(transport, TRANS_OPT_FOLLOWTAGS, NULL);
|
||||
transport_set_option(transport, TRANS_OPT_DEPTH, "0");
|
||||
transport_set_option(transport, TRANS_OPT_DEEPEN_RELATIVE, NULL);
|
||||
if (!fetch_refs(transport, ref_map))
|
||||
if (!fetch_refs(transport, ref_map, NULL))
|
||||
consume_refs(transport, ref_map);
|
||||
|
||||
if (gsecondary) {
|
||||
@ -1128,6 +1130,7 @@ static int do_fetch(struct transport *transport,
|
||||
int autotags = (transport->remote->fetch_tags == 1);
|
||||
int retcode = 0;
|
||||
const struct ref *remote_refs;
|
||||
struct ref *updated_remote_refs = NULL;
|
||||
struct argv_array ref_prefixes = ARGV_ARRAY_INIT;
|
||||
|
||||
if (tags == TAGS_DEFAULT) {
|
||||
@ -1178,7 +1181,24 @@ static int do_fetch(struct transport *transport,
|
||||
transport->url);
|
||||
}
|
||||
}
|
||||
if (fetch_refs(transport, ref_map) || consume_refs(transport, ref_map)) {
|
||||
|
||||
if (fetch_refs(transport, ref_map, &updated_remote_refs)) {
|
||||
free_refs(ref_map);
|
||||
retcode = 1;
|
||||
goto cleanup;
|
||||
}
|
||||
if (updated_remote_refs) {
|
||||
/*
|
||||
* Regenerate ref_map using the updated remote refs. This is
|
||||
* to account for additional information which may be provided
|
||||
* by the transport (e.g. shallow info).
|
||||
*/
|
||||
free_refs(ref_map);
|
||||
ref_map = get_ref_map(transport->remote, updated_remote_refs, rs,
|
||||
tags, &autotags);
|
||||
free_refs(updated_remote_refs);
|
||||
}
|
||||
if (consume_refs(transport, ref_map)) {
|
||||
free_refs(ref_map);
|
||||
retcode = 1;
|
||||
goto cleanup;
|
||||
|
||||
Reference in New Issue
Block a user