fetch: fix regression with transport helpers

Commit e198b3a740 changed the behavior of fetch with regards to tags. Before, null oids where not ignored, now they are, regardless of whether the refs have been explicitly cleared or not. e198b3a740 (fetch: replace string-list used as a look-up table with a hashmap) When using a transport helper the oids can certainly be null. So now tags are ignored and fetching them is impossible. This patch fixes that by having a specific flag that is set only when we explicitly want to ignore the refs, restoring the original behavior. Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Felipe Contreras committed Jun 3, 2019 at 21:13 UTC f80d922355302abf07bf0cf9a2135c2eaa61f502
2 files changed +4 -3
builtin/fetch.c
+3 -2
@@ -237,6 +237,7 @@ static int will_fetch(struct ref **head, const unsigned char *sha1)
237 struct refname_hash_entry {
238 struct hashmap_entry ent; /* must be the first member */
239 struct object_id oid;
240 + int ignore;
241 char refname[FLEX_ARRAY];
242 };
243
@@ -287,7 +288,7 @@ static int refname_hash_exists(struct hashmap *map, const char *refname)
288
289 static void clear_item(struct refname_hash_entry *item)
290 {
290 - oidclr(&item->oid);
291 + item->ignore = 1;
292 }
293
294 static void find_non_local_tags(const struct ref *refs,
@@ -373,7 +374,7 @@ static void find_non_local_tags(const struct ref *refs,
374 BUG("unseen remote ref?");
375
376 /* Unless we have already decided to ignore this item... */
376 - if (is_null_oid(&item->oid))
377 + if (item->ignore)
378 continue;
379
380 rm = alloc_ref(item->refname);
t/t5801-remote-helpers.sh
+1 -1
@@ -301,7 +301,7 @@ test_expect_success 'fetch url' '
301 compare_refs server HEAD local FETCH_HEAD
302 '
303
304 -test_expect_failure 'fetch tag' '
304 +test_expect_success 'fetch tag' '
305 (cd server &&
306 git tag v1.0
307 ) &&