Re: [PATCH 07/17] refs: speed up `refs_for_each_glob_ref_in()`
- From
Patrick Steinhardt <ps@pks.im>
- Date
- Feb 23, 2026, 10:48 UTC
- Message-ID
- <aZwwYynerY8Yauqc@pks.im>
- In-Reply-To
- <CAOLa=ZRogQCpsD5eXOQrgt_DvgsXNfagbaxQm2eL+NwfUpw9OQ@mail.gmail.com>
On Mon, Feb 23, 2026 at 12:27:15AM -0800, Karthik Nayak wrote:
Show 36 quoted lines
> Patrick Steinhardt <ps@pks.im> writes:
> > diff --git a/refs.c b/refs.c
> > index ec9e466381..ac34bbe6c1 100644
> > --- a/refs.c
> > +++ b/refs.c
> > @@ -1862,16 +1845,44 @@ int refs_for_each_ref_ext(struct ref_store *refs,
> > refs_for_each_cb cb, void *cb_data,
> > const struct refs_for_each_ref_options *opts)
> > {
> > + struct strbuf real_pattern = STRBUF_INIT;
> > + struct for_each_ref_filter filter;
> > struct ref_iterator *iter;
> > + int ret;
> >
> > if (!refs)
> > return 0;
> >
> > + if (opts->pattern) {
> > + if (!opts->prefix && !starts_with(opts->pattern, "refs/"))
> > + strbuf_addstr(&real_pattern, "refs/");
> > + else if (opts->prefix)
> > + strbuf_addstr(&real_pattern, opts->prefix);
> > + strbuf_addstr(&real_pattern, opts->pattern);
> > +
> > + if (!has_glob_specials(opts->pattern)) {
> > + /* Append implied '/' '*' if not present. */
> > + strbuf_complete(&real_pattern, '/');
> > + /* No need to check for '*', there is none. */
> > + strbuf_addch(&real_pattern, '*');
> > + }
> > +
> > + filter.pattern = real_pattern.buf;
> > + filter.prefix = opts->prefix;
>
> Can't we now remove this option and cleanup `for_each_filter_refs()` to
> remove prefix trimming?No, unfortunately not. This is because the glob pattern is expected to match on the full refname, so if we were to strip the refname before we pass it to the `filter` callback then we wouldn't be able to do the call to wildmatch anymore.
But the stripping part is still a bit funky after my refactoring, as we unconditionall strip the prefix right now. This is the expected behaviour, but it is somewhat surprising I guess. I'll rework this part a bit, thanks!
Patrick