[PATCH 14/15] remote: restructure apply_push_cas() loops
- From
Jon Simons <jon@jonsimons.org>
- Date
- Oct 9, 2026, 19:29 UTC
- Message-ID
- <20261009192953.81794-15-jon@jonsimons.org>
- In-Reply-To
- <20261009192953.81794-1-jon@jonsimons.org>
Restructure the apply_push_cas() loops to prepare for replacing a linear remote_refs traversal with a strmap lookup.
Before this change, apply_push_cas() loops:
for each advertised remote ref,
apply_cas(ref):
for each explicit lease entry until first match,
refname_match(entry, ref)
else if use_tracking_for_rest,
stamp from trackingAfter this change the loops are inverted and apply_cas() is split into apply_one_cas() (one explicit entry, stamp every matching still-free ref) and apply_cas_tracking() (shared by the explicit use_tracking path and use_tracking_for_rest):
for each explicit lease entry,
apply_one_cas(entry):
for each advertised remote ref not yet stamped,
refname_match(entry, ref) if use_tracking_for_rest,
apply_cas_tracking() on remaining refsIn the next commit, apply_one_cas() is updated to use a strmap.
Signed-off-by: Jon Simons <jon@jonsimons.org> --- remote.c | 66 ++++++++++++++++++++++++++++++++------------------------ 1 file changed, 38 insertions(+), 28 deletions(-)
diff --git a/remote.c b/remote.c index 8074750601..8dd163038d 100644 --- a/remote.c +++ b/remote.c @@ -2978,33 +2978,10 @@ static void check_if_includes_upstream(struct ref *remote) free_one_ref(local); } -static void apply_cas(struct push_cas_option *cas, - struct remote *remote, - struct ref *ref) +static void apply_cas_tracking(struct push_cas_option *cas, + struct remote *remote, + struct ref *ref) { - int i; - - /* Find an explicit --<option>=<name>[:<value>] entry */ - for (i = 0; i < cas->nr; i++) { - struct push_cas *entry = &cas->entry[i]; - if (!refname_match(entry->refname, ref->name)) - continue; - ref->expect_old_sha1 = 1; - if (!entry->use_tracking) - oidcpy(&ref->old_oid_expect, &entry->expect); - else if (remote_tracking(remote, ref->name, - &ref->old_oid_expect, - &ref->tracking_ref)) - oidclr(&ref->old_oid_expect, the_repository->hash_algo); - else - ref->check_reachable = cas->use_force_if_includes; - return; - } - - /* Are we using "--<option>" to cover all? */ - if (!cas->use_tracking_for_rest) - return; - ref->expect_old_sha1 = 1; if (remote_tracking(remote, ref->name, &ref->old_oid_expect, @@ -3014,14 +2991,47 @@ static void apply_cas(struct push_cas_option *cas, ref->check_reachable = cas->use_force_if_includes; } +static void apply_one_cas(struct ref *remote_refs, + struct remote *remote, + struct push_cas_option *cas, + struct push_cas *entry) +{ + struct ref *ref; + + for (ref = remote_refs; ref; ref = ref->next) { + if (ref->expect_old_sha1) + continue; + if (!refname_match(entry->refname, ref->name)) + continue; + if (entry->use_tracking) { + apply_cas_tracking(cas, remote, ref); + } else { + ref->expect_old_sha1 = 1; + oidcpy(&ref->old_oid_expect, &entry->expect); + } + } +} + void apply_push_cas(struct push_cas_option *cas, struct remote *remote, struct ref *remote_refs) { struct ref *ref; - for (ref = remote_refs; ref; ref = ref->next) { - apply_cas(cas, remote, ref); + /* Apply each explicit --<option>=<name>[:<value>] entry */ + for (size_t i = 0; i < cas->nr; i++) + apply_one_cas(remote_refs, remote, cas, &cas->entry[i]); + + /* Are we using "--<option>" to cover all? */ + if (cas->use_tracking_for_rest) { + for (ref = remote_refs; ref; ref = ref->next) { + if (ref->expect_old_sha1) + continue; + apply_cas_tracking(cas, remote, ref); + } + } + + for (ref = remote_refs; ref; ref = ref->next) { /* * If "compare-and-swap" is in "use_tracking[_for_rest]" * mode, and if "--force-if-includes" was specified, run
-- 2.55.0