fetch: refactor the population of peer ref OIDs
Populate peer ref OIDs in get_ref_map instead of do_fetch. Besides tightening scopes of variables in the code, this also prepares for get_ref_map being able to be called multiple times within do_fetch. Signed-off-by: Brandon Williams <bmwill@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
3374292e55
commit
14b8ced376
@ -351,6 +351,7 @@ static struct ref *get_ref_map(struct transport *transport,
|
|||||||
/* opportunistically-updated references: */
|
/* opportunistically-updated references: */
|
||||||
struct ref *orefs = NULL, **oref_tail = &orefs;
|
struct ref *orefs = NULL, **oref_tail = &orefs;
|
||||||
|
|
||||||
|
struct string_list existing_refs = STRING_LIST_INIT_DUP;
|
||||||
const struct ref *remote_refs;
|
const struct ref *remote_refs;
|
||||||
|
|
||||||
if (rs->nr)
|
if (rs->nr)
|
||||||
@ -458,7 +459,23 @@ static struct ref *get_ref_map(struct transport *transport,
|
|||||||
tail = &rm->next;
|
tail = &rm->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ref_remove_duplicates(ref_map);
|
ref_map = ref_remove_duplicates(ref_map);
|
||||||
|
|
||||||
|
for_each_ref(add_existing, &existing_refs);
|
||||||
|
for (rm = ref_map; rm; rm = rm->next) {
|
||||||
|
if (rm->peer_ref) {
|
||||||
|
struct string_list_item *peer_item =
|
||||||
|
string_list_lookup(&existing_refs,
|
||||||
|
rm->peer_ref->name);
|
||||||
|
if (peer_item) {
|
||||||
|
struct object_id *old_oid = peer_item->util;
|
||||||
|
oidcpy(&rm->peer_ref->old_oid, old_oid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
string_list_clear(&existing_refs, 1);
|
||||||
|
|
||||||
|
return ref_map;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define STORE_REF_ERROR_OTHER 1
|
#define STORE_REF_ERROR_OTHER 1
|
||||||
@ -1110,14 +1127,10 @@ static void backfill_tags(struct transport *transport, struct ref *ref_map)
|
|||||||
static int do_fetch(struct transport *transport,
|
static int do_fetch(struct transport *transport,
|
||||||
struct refspec *rs)
|
struct refspec *rs)
|
||||||
{
|
{
|
||||||
struct string_list existing_refs = STRING_LIST_INIT_DUP;
|
|
||||||
struct ref *ref_map;
|
struct ref *ref_map;
|
||||||
struct ref *rm;
|
|
||||||
int autotags = (transport->remote->fetch_tags == 1);
|
int autotags = (transport->remote->fetch_tags == 1);
|
||||||
int retcode = 0;
|
int retcode = 0;
|
||||||
|
|
||||||
for_each_ref(add_existing, &existing_refs);
|
|
||||||
|
|
||||||
if (tags == TAGS_DEFAULT) {
|
if (tags == TAGS_DEFAULT) {
|
||||||
if (transport->remote->fetch_tags == 2)
|
if (transport->remote->fetch_tags == 2)
|
||||||
tags = TAGS_SET;
|
tags = TAGS_SET;
|
||||||
@ -1136,18 +1149,6 @@ static int do_fetch(struct transport *transport,
|
|||||||
if (!update_head_ok)
|
if (!update_head_ok)
|
||||||
check_not_current_branch(ref_map);
|
check_not_current_branch(ref_map);
|
||||||
|
|
||||||
for (rm = ref_map; rm; rm = rm->next) {
|
|
||||||
if (rm->peer_ref) {
|
|
||||||
struct string_list_item *peer_item =
|
|
||||||
string_list_lookup(&existing_refs,
|
|
||||||
rm->peer_ref->name);
|
|
||||||
if (peer_item) {
|
|
||||||
struct object_id *old_oid = peer_item->util;
|
|
||||||
oidcpy(&rm->peer_ref->old_oid, old_oid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tags == TAGS_DEFAULT && autotags)
|
if (tags == TAGS_DEFAULT && autotags)
|
||||||
transport_set_option(transport, TRANS_OPT_FOLLOWTAGS, "1");
|
transport_set_option(transport, TRANS_OPT_FOLLOWTAGS, "1");
|
||||||
if (prune) {
|
if (prune) {
|
||||||
@ -1183,7 +1184,6 @@ static int do_fetch(struct transport *transport,
|
|||||||
}
|
}
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
string_list_clear(&existing_refs, 1);
|
|
||||||
return retcode;
|
return retcode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user