From: Junio C Hamano <gitster@pobox.com>
To: Deveshi Dwivedi <deveshigurgaon@gmail.com>
Cc: git@vger.kernel.org, peff@peff.net
Subject: Re: [PATCH v1 2/2] list-objects-filter-options: avoid strbuf_split_str()
Date: Mon, 09 Mar 2026 08:38:16 -0700 [thread overview]
Message-ID: <xmqqjyvl57yv.fsf@gitster.g> (raw)
In-Reply-To: <20260308180359.31188-3-deveshigurgaon@gmail.com> (Deveshi Dwivedi's message of "Sun, 8 Mar 2026 18:03:59 +0000")
Deveshi Dwivedi <deveshigurgaon@gmail.com> writes:
> parse_combine_filter() splits a combine: filter spec at '+' using
> strbuf_split_str(), which yields an array of strbufs with the
> delimiter left at the end of each non-final piece. The code then
> mutates each non-final piece to strip the trailing '+' before parsing.
>
> Allocating an array of strbufs is unnecessary. The function processes
> one sub-spec at a time and does not use strbuf editing on the pieces.
> The two helpers it calls, has_reserved_character() and
> parse_combine_subfilter(), only read the string content of the strbuf
> they receive.
>
> Walk the input string directly with strchr() to find each '+'. Copy
> each sub-spec into a temporary buffer and strip the '+' only when
> another sub-spec follows. Change the helpers to take const char *
> instead of struct strbuf *.
Makes sense. Instead of finding '+' and making many small copies
piecemeal, you could make a single copy of "const char *arg" once,
walk that string using strchr() looking for the next '+', and
replace '+' with '\0' before processing the current piece and
iterate, which may reduce the need for many small allocations and
deallocations, but I do not know if it is worth it. Benchmarking
it would not yield measurable difference, I suspect.
> + while (*p && !result) {
> + const char *sep = strchr(p, '+');
> + size_t len = sep ? (size_t)(sep - p + 1) : strlen(p);
> + char *sub = xmemdupz(p, len);
> +
> + /* strip '+' separator, but only when more sub-specs follow */
> + if (sep && *(sep + 1))
> + sub[len - 1] = '\0';
> +
> + result = parse_combine_subfilter(filter_options, sub, errbuf);
> + free(sub);
> + if (!sep)
> + break;
> + p = sep + 1;
> }
Hmph, would this loop handle a trailing '+' the same way as before,
e.g., "combine:tree:2+"? The original would have split the string
into ["tree:2+", ""] and the last call to parse_combine_subfilter()
would have been made with an empty string. The new code does not
make that last call with an empty string. Perhaps the differences
do not matter? I dunno.
Other than that, nice to see one fewer use of "splitting into an
array of strbuf" pattern.
Thanks.
next prev parent reply other threads:[~2026-03-09 15:38 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-08 18:03 [PATCH v1 0/2] avoid unnecessary strbuf_split*() and strbuf-by-value usage Deveshi Dwivedi
2026-03-08 18:03 ` [PATCH v1 1/2] worktree: do not pass strbuf by value Deveshi Dwivedi
2026-03-09 14:48 ` Junio C Hamano
2026-03-09 19:26 ` coccinelle to catch pass-by-value?, was: " Jeff King
2026-03-08 18:03 ` [PATCH v1 2/2] list-objects-filter-options: avoid strbuf_split_str() Deveshi Dwivedi
2026-03-09 15:38 ` Junio C Hamano [this message]
2026-03-09 19:01 ` Jeff King
2026-03-09 19:08 ` Jeff King
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqqjyvl57yv.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=deveshigurgaon@gmail.com \
--cc=git@vger.kernel.org \
--cc=peff@peff.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.