Subject: Re: [PATCH 07/17] refs: speed up `refs_for_each_glob_ref_in()`

From: Patrick Steinhardt <[email-masked]>
Date: Mon, 23 Feb 2026 11:48:03 +0100

On Mon, Feb 23, 2026 at 12:27:15AM -0800, Karthik Nayak wrote:
> Patrick Steinhardt <[email-masked]> 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