Am 05.10.2018 um 00:11 schrieb René Scharfe: > Am 04.10.2018 um 23:38 schrieb Jonathan Tan: >> I don't think the concerns are truly separated - the first loop quoted >> needs to know that in the second loop, tip_oids is accessed only if >> there is at least one unmatched ref. > > Right, the two loops are still closely related, but only the first one > is concerned with loading refs. > > For a true separation we could first build a list of unmatched refs and > then loop through that instead of `sought`. Not sure if that's better, > but maybe the overhead I imagine it would introduce isn't all that big. Here's what I mean, on top of the other two patches: --- fetch-pack.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/fetch-pack.c b/fetch-pack.c index 53914563b5..7f28584bce 100644 --- a/fetch-pack.c +++ b/fetch-pack.c @@ -543,6 +543,8 @@ static void filter_refs(struct fetch_pack_args *args, struct ref *newlist = NULL; struct ref **newtail = &newlist; struct ref *unmatched = NULL; + struct ref **unfound; + int nr_unfound = 0; struct ref *ref, *next; struct oidset tip_oids = OIDSET_INIT; int i; @@ -584,23 +586,19 @@ static void filter_refs(struct fetch_pack_args *args, } } - if (strict) { - for (i = 0; i < nr_sought; i++) { - ref = sought[i]; - if (!is_unmatched_ref(ref)) - continue; - - add_refs_to_oidset(&tip_oids, unmatched); - add_refs_to_oidset(&tip_oids, newlist); - break; - } + ALLOC_ARRAY(unfound, nr_sought); + for (i = 0; i < nr_sought; i++) { + if (is_unmatched_ref(sought[i])) + unfound[nr_unfound++] = sought[i]; + } + if (strict && nr_unfound) { + add_refs_to_oidset(&tip_oids, unmatched); + add_refs_to_oidset(&tip_oids, newlist); } /* Append unmatched requests to the list */ - for (i = 0; i < nr_sought; i++) { - ref = sought[i]; - if (!is_unmatched_ref(ref)) - continue; + for (i = 0; i < nr_unfound; i++) { + ref = unfound[i]; if (!strict || oidset_contains(&tip_oids, &ref->old_oid)) { ref->match_status = REF_MATCHED; @@ -611,6 +609,7 @@ static void filter_refs(struct fetch_pack_args *args, } } + free(unfound); oidset_clear(&tip_oids); for (ref = unmatched; ref; ref = next) { next = ref->next; -- 2.19.0