On Fri, May 12, 2017 at 12:59 AM, Jeff King <peff@xxxxxxxx> wrote: > On Fri, May 12, 2017 at 03:01:35PM +0900, Junio C Hamano wrote: >> Also, tip_oids_contain() uses unmatched and newlist only on the >> first call, but the internal API this patch establishes gives an >> illusion (confusion) that updating unmatched and newlist while >> making repeated to calls to this function may affect the outcome of >> tip_oids_contain() function. In fact, doesn't the loop that calls >> this function extend "newlist" by extending the list at its tail? > > It does, but only with elements whose oids were already in the set. So I > don't think it's wrong, but I agree the interface makes it a bit muddy. To make the interface less muddy, would you agree with this (untested): @@ -648,7 +669,9 @@ static void filter_refs(struct fetch_pack_args *args, continue; if ((allow_unadvertised_object_request & - (ALLOW_TIP_SHA1 | ALLOW_REACHABLE_SHA1))) { + (ALLOW_TIP_SHA1 | ALLOW_REACHABLE_SHA1)) || + (check_tip_oids_initialized(&tip_oids, unmatched, newlist) && oidset_contains(&tip_oids, + &ref->old_oid))) { ref->match_status = REF_MATCHED; *newtail = copy_ref(ref); newtail = &(*newtail)->next; (making the function-to-abstract be merely an initialization one, instead of one that does 2 things). That decreases the scope of the function that Jonathan Nieder and Peff wanted, but it might be a warranted reduction in scope.