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

Reply via email to