fetch: refactor to make function args narrower

Refactor find_non_local_tags and get_ref_map to only take the information they need instead of the entire transport struct. Besides improving code clarity, this also improves their flexibility, allowing for a different set of refs to be used instead of relying on the ones stored in the transport struct. Signed-off-by: Brandon Williams <bmwill@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Brandon Williams committed Jun 27, 2018 at 15:30 UTC 6d1700d564bbd3ecfe11f9889ed3f35a118b9f6a
1 file changed +26 -26
builtin/fetch.c
+26 -26
@@ -254,9 +254,9 @@ static int will_fetch(struct ref **head, const unsigned char *sha1)
254 return 0;
255 }
256
257 -static void find_non_local_tags(struct transport *transport,
258 - struct ref **head,
259 - struct ref ***tail)
257 +static void find_non_local_tags(const struct ref *refs,
258 + struct ref **head,
259 + struct ref ***tail)
260 {
261 struct string_list existing_refs = STRING_LIST_INIT_DUP;
262 struct string_list remote_refs = STRING_LIST_INIT_NODUP;
@@ -264,7 +264,7 @@ static void find_non_local_tags(struct transport *transport,
264 struct string_list_item *item = NULL;
265
266 for_each_ref(add_existing, &existing_refs);
267 - for (ref = transport_get_remote_refs(transport, NULL); ref; ref = ref->next) {
267 + for (ref = refs; ref; ref = ref->next) {
268 if (!starts_with(ref->name, "refs/tags/"))
269 continue;
270
@@ -338,7 +338,8 @@ static void find_non_local_tags(struct transport *transport,
338 string_list_clear(&remote_refs, 0);
339 }
340
341 -static struct ref *get_ref_map(struct transport *transport,
341 +static struct ref *get_ref_map(struct remote *remote,
342 + const struct ref *remote_refs,
343 struct refspec *rs,
344 int tags, int *autotags)
345 {
@@ -346,27 +347,11 @@ static struct ref *get_ref_map(struct transport *transport,
347 struct ref *rm;
348 struct ref *ref_map = NULL;
349 struct ref **tail = &ref_map;
349 - struct argv_array ref_prefixes = ARGV_ARRAY_INIT;
350
351 /* opportunistically-updated references: */
352 struct ref *orefs = NULL, **oref_tail = &orefs;
353
354 struct string_list existing_refs = STRING_LIST_INIT_DUP;
355 - const struct ref *remote_refs;
356 -
357 - if (rs->nr)
358 - refspec_ref_prefixes(rs, &ref_prefixes);
359 - else if (transport->remote && transport->remote->fetch.nr)
360 - refspec_ref_prefixes(&transport->remote->fetch, &ref_prefixes);
361 -
362 - if (ref_prefixes.argc &&
363 - (tags == TAGS_SET || (tags == TAGS_DEFAULT && !rs->nr))) {
364 - argv_array_push(&ref_prefixes, "refs/tags/");
365 - }
366 -
367 - remote_refs = transport_get_remote_refs(transport, &ref_prefixes);
368 -
369 - argv_array_clear(&ref_prefixes);
355
356 if (rs->nr) {
357 struct refspec *fetch_refspec;
@@ -403,7 +388,7 @@ static struct ref *get_ref_map(struct transport *transport,
388 if (refmap.nr)
389 fetch_refspec = &refmap;
390 else
406 - fetch_refspec = &transport->remote->fetch;
391 + fetch_refspec = &remote->fetch;
392
393 for (i = 0; i < fetch_refspec->nr; i++)
394 get_fetch_map(ref_map, &fetch_refspec->items[i], &oref_tail, 1);
@@ -411,7 +396,6 @@ static struct ref *get_ref_map(struct transport *transport,
396 die("--refmap option is only meaningful with command-line refspec(s).");
397 } else {
398 /* Use the defaults */
414 - struct remote *remote = transport->remote;
399 struct branch *branch = branch_get(NULL);
400 int has_merge = branch_has_merge_config(branch);
401 if (remote &&
@@ -450,7 +434,7 @@ static struct ref *get_ref_map(struct transport *transport,
434 /* also fetch all tags */
435 get_fetch_map(remote_refs, tag_refspec, &tail, 0);
436 else if (tags == TAGS_DEFAULT && *autotags)
453 - find_non_local_tags(transport, &ref_map, &tail);
437 + find_non_local_tags(remote_refs, &ref_map, &tail);
438
439 /* Now append any refs to be updated opportunistically: */
440 *tail = orefs;
@@ -1143,6 +1127,8 @@ static int do_fetch(struct transport *transport,
1127 struct ref *ref_map;
1128 int autotags = (transport->remote->fetch_tags == 1);
1129 int retcode = 0;
1130 + const struct ref *remote_refs;
1131 + struct argv_array ref_prefixes = ARGV_ARRAY_INIT;
1132
1133 if (tags == TAGS_DEFAULT) {
1134 if (transport->remote->fetch_tags == 2)
@@ -1158,7 +1144,21 @@ static int do_fetch(struct transport *transport,
1144 goto cleanup;
1145 }
1146
1161 - ref_map = get_ref_map(transport, rs, tags, &autotags);
1147 + if (rs->nr)
1148 + refspec_ref_prefixes(rs, &ref_prefixes);
1149 + else if (transport->remote && transport->remote->fetch.nr)
1150 + refspec_ref_prefixes(&transport->remote->fetch, &ref_prefixes);
1151 +
1152 + if (ref_prefixes.argc &&
1153 + (tags == TAGS_SET || (tags == TAGS_DEFAULT && !rs->nr))) {
1154 + argv_array_push(&ref_prefixes, "refs/tags/");
1155 + }
1156 +
1157 + remote_refs = transport_get_remote_refs(transport, &ref_prefixes);
1158 + argv_array_clear(&ref_prefixes);
1159 +
1160 + ref_map = get_ref_map(transport->remote, remote_refs, rs,
1161 + tags, &autotags);
1162 if (!update_head_ok)
1163 check_not_current_branch(ref_map);
1164
@@ -1190,7 +1190,7 @@ static int do_fetch(struct transport *transport,
1190 if (tags == TAGS_DEFAULT && autotags) {
1191 struct ref **tail = &ref_map;
1192 ref_map = NULL;
1193 - find_non_local_tags(transport, &ref_map, &tail);
1193 + find_non_local_tags(remote_refs, &ref_map, &tail);
1194 if (ref_map)
1195 backfill_tags(transport, ref_map);
1196 free_refs(ref_map);