Re: [PATCH 06/15] builtin/for-each-ref.c: add `--exclude` option
- From
Taylor Blau <me@ttaylorr.com>
- Date
- May 9, 2023, 20:22 UTC
- Message-ID
- <ZFqrj/gdzkZBYF1V@nand.local>
- In-Reply-To
- <xmqqcz3a4den.fsf@gitster.g>
On Mon, May 08, 2023 at 04:22:08PM -0700, Junio C Hamano wrote:
Show 37 quoted lines
> Taylor Blau <me@ttaylorr.com> writes:
>
> > diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c
> > index c01fa6fefe..449da61e11 100644
> > --- a/builtin/for-each-ref.c
> > +++ b/builtin/for-each-ref.c
> > @@ -14,6 +14,7 @@ static char const * const for_each_ref_usage[] = {
> > N_("git for-each-ref [--points-at <object>]"),
> > N_("git for-each-ref [--merged [<commit>]] [--no-merged [<commit>]]"),
> > N_("git for-each-ref [--contains [<commit>]] [--no-contains [<commit>]]"),
> > + N_("git for-each-ref [--exclude=<pattern> ...]"),
> > NULL
> > };
>
> I think the original is already wrong, but the easiest thing we can
> do in order to avoid making it worse is to drop this hunk, as the
> existing usage is this:
>
> static char const * const for_each_ref_usage[] = {
> N_("git for-each-ref [<options>] [<pattern>]"),
> N_("git for-each-ref [--points-at <object>]"),
> N_("git for-each-ref [--merged [<commit>]] [--no-merged [<commit>]]"),
> N_("git for-each-ref [--contains [<commit>]] [--no-contains [<commit>]]"),
> NULL
> };
>
> and this series merely adds a new "--exclude=<pattern>" as one of
> the "<options>".
>
> As we can see from the fact that for example
>
> $ git for-each-ref --no-merged next refs/heads/\?\?/\*
>
> works just fine, exactly the same thing can be said about the other
> --points-at/--merged/--no-merged/--contains/--no-contains options.
>
> The SYNOPSIS section of the manual page is fine.Good point, will tweak; thanks.
Show 17 quoted lines
> > @@ -2169,6 +2169,15 @@ static int filter_pattern_match(struct ref_filter *filter, const char *refname)
> > return match_pattern(filter, filter->name_patterns, refname);
> > }
> >
> > +static int filter_exclude_match(struct ref_filter *filter, const char *refname)
> > +{
> > + if (!filter->exclude.nr)
> > + return 0;
> > + if (filter->match_as_path)
> > + return match_name_as_path(filter, filter->exclude.v, refname);
> > + return match_pattern(filter, filter->exclude.v, refname);
> > +}
>
> Earlier I made a comment about .name_patterns member becoming
> unnecessary, but I think what should need to happen is instead
> match_pattern() and match_name_as_path() to lose the "filter"
> parameter, and take a boolean "ignore_case" instead.Agreed.
Show 21 quoted lines
> > +cat >expected <<\EOF > > +refs/tags/bar > > +refs/tags/baz > > +refs/tags/foo/one > > +refs/tags/testtag > > +EOF > > + > > +test_expect_success 'exercise patterns with pattern exclusions' ' > > + for tag in foo/one foo/two foo/three bar baz > > + do > > + git tag "$tag" || return 1 > > + done && > > + test_when_finished "git tag -d foo/one foo/two foo/three bar baz" && > > + git for-each-ref --format="%(refname)" \ > > + refs/tags/ --exclude="refs/tags/foo/t*" >actual && > > + test_cmp expected actual > > +' > > These are doing as Romans do, so I won't comment on the outdated > pattern of preparing the expectation outside the test script. After > the dust settles, somebody needs to go in and clean it up.
Yeah, I figured that this series was already getting pretty long, but that it would be expedient to propagate forward this pattern. But it should be cleaned up. Let's tag it with #leftoverbits accordingly.
Thanks, Taylor