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);