Felipe Contreras <felipe.contreras@xxxxxxxxx> writes: > 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@xxxxxxxxx> > --- > builtin/fetch.c | 5 +++-- > t/t5801-remote-helpers.sh | 2 +- > 2 files changed, 4 insertions(+), 3 deletions(-) > > diff --git a/builtin/fetch.c b/builtin/fetch.c > index 9dc551551e..f2be50a4a3 100644 > --- a/builtin/fetch.c > +++ b/builtin/fetch.c > @@ -239,6 +239,7 @@ static int will_fetch(struct ref **head, const unsigned char *sha1) > struct refname_hash_entry { > struct hashmap_entry ent; /* must be the first member */ > struct object_id oid; > + int ignore; > char refname[FLEX_ARRAY]; > }; > > @@ -289,7 +290,7 @@ static int refname_hash_exists(struct hashmap *map, const char *refname) > > static void clear_item(struct refname_hash_entry *item) > { > - oidclr(&item->oid); > + item->ignore = 1; > } > > static void find_non_local_tags(const struct ref *refs, > @@ -374,7 +375,7 @@ static void find_non_local_tags(const struct ref *refs, > BUG("unseen remote ref?"); > > /* Unless we have already decided to ignore this item... */ > - if (is_null_oid(&item->oid)) > + if (item->ignore) > continue; Yeah, we should have added a bit like this to preserve the distinction between a NULL pointer for "struct object_id" and oid that has 0{40} in the old code, which was lost in the conversion. Thanks for spotting and fixing.