Hi, Jonathan Tan wrote: > fetch-pack, when fetching a literal SHA-1 from a server that is not > configured with uploadpack.allowtipsha1inwant (or similar), always > returns an error message of the form "Server does not allow request for > unadvertised object %s". However, it is sometimes the case that such > object is advertised. This situation would occur, for example, if a user > or a script was provided a SHA-1 instead of a branch or tag name for > fetching, and wanted to invoke "git fetch" or "git fetch-pack" using > that SHA-1. Yay, thanks again. [...] > --- a/fetch-pack.c > +++ b/fetch-pack.c > @@ -598,6 +598,7 @@ static void filter_refs(struct fetch_pack_args *args, > { > struct ref *newlist = NULL; > struct ref **newtail = &newlist; > + struct ref *unmatched = NULL; > struct ref *ref, *next; > int i; > > @@ -631,13 +632,15 @@ static void filter_refs(struct fetch_pack_args *args, > ref->next = NULL; > newtail = &ref->next; > } else { > - free(ref); > + ref->next = unmatched; > + unmatched = ref; Interesting. Makes sense. [...] > /* Append unmatched requests to the list */ > for (i = 0; i < nr_sought; i++) { > unsigned char sha1[20]; > + int can_append = 0; Can this be simplified by factoring out a function? I.e. something like if ((... ALLOW_TIP_SHA1 | ALLOW_REACHABLE_SHA1) || find_oid_among_refs(unmatched, oid) || find_oid_among_refs(newlist, oid)) { ref->match_status = REF_MATCHED; ... } else { ref->match_status = REF_UNADVERTISED_NOT_ALLOWED; } [...] > @@ -657,6 +679,11 @@ static void filter_refs(struct fetch_pack_args *args, > } > } > *refs = newlist; > + > + for (ref = unmatched; ref; ref = next) { > + next = ref->next; > + free(ref); > + } > } optional nit: keeping the "*refs =" line as the last line of the function would make it easier to see the contract at a glance. (That said, a doc comment at the top would make it even clearer.) > --- a/t/t5500-fetch-pack.sh > +++ b/t/t5500-fetch-pack.sh > @@ -547,6 +547,41 @@ test_expect_success 'fetch-pack can fetch a raw sha1' ' Yay, thanks much for these. [...] > +test_expect_success 'fetch-pack can fetch a raw sha1 overlapping a named ref' ' Ha, you read my mind. :) Except for the search-ref-list-for-oid function needing to be factored out, Reviewed-by: Jonathan Nieder <jrnieder@xxxxxxxxx> Thanks.