ref-filter: simplify lstrip_ref_components() memory handling

We're walking forward in the string, skipping path components from left-to-right. So when we've stripped as much as we want, the pointer we have is a complete NUL-terminated string and we can just return it (after duplicating it, of course). So there is no need for a temporary allocated string. But we do make an extra temporary copy due to f0062d3b74 (ref-filter: free item->value and item->value->s, 2018-10-18). This is probably from cargo-culting the technique used in rstrip_ref_components(), which _does_ need a separate string (since it is stripping from the end and ties off the temporary string with a NUL). Let's drop the extra allocation. This is slightly more efficient, but more importantly makes the code much simpler. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff King committed Feb 15, 2026 at 04:02 UTC 87cb6dc9b0832683a31d0c3126ecad4ad444489c
1 file changed +2 -7
ref-filter.c
+2 -7
@@ -2196,13 +2196,10 @@ static int normalize_component_count(const char *refname, int len)
2196 static const char *lstrip_ref_components(const char *refname, int len)
2197 {
2198 int remaining = normalize_component_count(refname, len);
2199 - const char *start = xstrdup(refname);
2200 - const char *to_free = start;
2199
2200 while (remaining > 0) {
2203 - switch (*start++) {
2201 + switch (*refname++) {
2202 case '\0':
2205 - free((char *)to_free);
2203 return xstrdup("");
2204 case '/':
2205 remaining--;
@@ -2210,9 +2207,7 @@ static const char *lstrip_ref_components(const char *refname, int len)
2207 }
2208 }
2209
2213 - start = xstrdup(start);
2214 - free((char *)to_free);
2215 - return start;
2210 + return xstrdup(refname);
2211 }
2212
2213 static const char *rstrip_ref_components(const char *refname, int len)