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