Re: [PATCH 2/2 v4] tag: support configuring --sort via .gitconfig
- From
Keller, Jacob E <jacob.e.keller@intel.com>
- Date
- Jul 11, 2014, 16:20 UTC
- Message-ID
- <1405095622.22963.6.camel@jekeller-desk1.amr.corp.intel.com>
- In-Reply-To
- <xmqqion4543l.fsf@gitster.dls.corp.google.com>
On Fri, 2014-07-11 at 08:04 -0700, Junio C Hamano wrote:
Show 48 quoted lines
> Jacob Keller <jacob.e.keller@intel.com> writes: > > > Add support for configuring default sort ordering for git tags. Command > > line option will override this configured value, using the exact same > > syntax. > > > > Cc: Jeff King <peff@peff.net> > > Signed-off-by: Jacob Keller <jacob.e.keller@intel.com> > > --- > > - v4 > > * base on top of suggested change by Jeff King to use skip_prefix instead > > > > Documentation/config.txt | 6 ++++++ > > Documentation/git-tag.txt | 1 + > > builtin/tag.c | 46 ++++++++++++++++++++++++++++++++-------------- > > t/t7004-tag.sh | 21 +++++++++++++++++++++ > > 4 files changed, 60 insertions(+), 14 deletions(-) > > > > diff --git a/Documentation/config.txt b/Documentation/config.txt > > index 1d718bdb9662..ad8e75fed988 100644 > > --- a/Documentation/config.txt > > +++ b/Documentation/config.txt > > @@ -2354,6 +2354,12 @@ submodule.<name>.ignore:: > > "--ignore-submodules" option. The 'git submodule' commands are not > > affected by this setting. > > > > +tag.sort:: > > + This variable is used to control the sort ordering of tags. It is > > + interpreted precisely the same way as "--sort=<value>". If --sort is > > + given on the command line it will override the selection chosen in the > > + configuration. See linkgit:git-tag[1] for more details. > > + > > This is not technically incorrect per-se, but the third sentence > talks about "--sort" on "the command line" while this applies only > to "the command line of the 'git tag' command" and nobody else's > "--sort" option. > > Perhaps rephrasing it like this may be easier to understand? > > When "git tag" command is used to list existing tags, > without "--sort=<value>" option on the command line, > the value of this variable is used as the default. > > This way, it would be clear, without explicitly saying anything, > that the value will be spelled exactly the same way as you would > spell the value for the --sort option on the command line. >
Makes sense.
Show 24 quoted lines
> > diff --git a/Documentation/git-tag.txt b/Documentation/git-tag.txt > > index b424a1bc48bb..2d246725aeb5 100644 > > --- a/Documentation/git-tag.txt > > +++ b/Documentation/git-tag.txt > > @@ -317,6 +317,7 @@ include::date-formats.txt[] > > SEE ALSO > > -------- > > linkgit:git-check-ref-format[1]. > > +linkgit:git-config[1]. > > It is not particularly friendly to readers to refer to > "git-config[1]" from any other page, if done without spelling out > which variable the reader is expected to look up. Some addition > to the description of the "--sort" option is needed if this SEE ALSO > were to be any useful, I guess? > > --sort=<type>:: > ... (existing description) ... > When this option is not given, the sort order > defaults to the value configured for the `tag.sort` > variable, if exists, or lexicographic otherwise. > > or something like that, perhaps? >
Alright, this sounds good too.
Show 17 quoted lines
> > diff --git a/builtin/tag.c b/builtin/tag.c > > index 7ccb6f3c581b..a53e27d4e7e4 100644 > > --- a/builtin/tag.c > > +++ b/builtin/tag.c > > @@ -18,6 +18,8 @@ > > #include "sha1-array.h" > > #include "column.h" > > > > +static int tag_sort = 0; > > Please do not initialize variables in bss segment to 0 by hand. > > If this variable is meant to take one of these *CMP_SORT values > defined as macro later in this file, it is better to define this > variable somewhere after and close to the definitions of the macros. > Perhaps immediately after the "struct tag_filter" is declared? >
I put it just above the struct tag_filter now, as this puts it right below the #defines regarding it's value.
Show 29 quoted lines
> > @@ -346,9 +348,33 @@ static const char tag_template_nocleanup[] =
> > "Lines starting with '%c' will be kept; you may remove them"
> > " yourself if you want to.\n");
> >
> > +static int parse_sort_string(const char *arg)
> > +{
> > + int sort = 0;
> > + int flags = 0;
> > +
> > + if (skip_prefix(arg, "-", &arg))
> > + flags |= REVERSE_SORT;
> > +
> > + if (skip_prefix(arg, "version:", &arg) || skip_prefix(arg, "v:", &arg))
> > + sort = VERCMP_SORT;
> > +
> > + if (strcmp(arg, "refname"))
> > + die(_("unsupported sort specification %s"), arg);
>
> Hmm. I _thought_ we try to catch unsupported option value coming
> from the command line and die but at the same time we try *not* to
> die but warn and whatever is sensible when the value comes from the
> configuration, so that .git/config or $HOME/.gitconfig can be shared
> by those who use different versions of Git.
>
> Do we already have many precedences where we see configuration value
> that our version of Git do not yet understand?
>
> Not a very strong objection; just something that worries me.
> I like this change, and I think I have a way to handle it. I will re-work this so that the die is handled by the normal block.
Show 18 quoted lines
> > + sort |= flags;
> > +
> > + return sort;
> > +}
> > +
> > static int git_tag_config(const char *var, const char *value, void *cb)
> > {
> > - int status = git_gpg_config(var, value, cb);
> > + int status;
> > +
> > + if (!strcmp(var, "tag.sort")) {
> > + tag_sort = parse_sort_string(value);
> > + }
> > +
>
> Why doesn't this return success after noticing that the variable is
> to be interpreted by this block and nobody else?
> I was copying the git_gpg_config. But yes I agree, returning here would make sense, and actually maybe fix git_gpg_config as well in a future patch.
Show 7 quoted lines
> When there is no reason to have things in a particular order, it is > customary to add new things at the end, not in the front, unless the > new thing is so much more important than everything else---but then > we are no longer talking about the case where there is no reason to > have things in a particular order ;-). > > Remainder of the changes to builtin/tag.c looks good.
Thanks.
Show 37 quoted lines
> > > diff --git a/t/t7004-tag.sh b/t/t7004-tag.sh > > index e4ab0f5b6419..1e8300f6ed7c 100755 > > --- a/t/t7004-tag.sh > > +++ b/t/t7004-tag.sh > > @@ -1423,6 +1423,27 @@ EOF > > test_cmp expect actual > > ' > > > > +test_expect_success 'configured lexical sort' ' > > + git config tag.sort "v:refname" && > > + git tag -l "foo*" >actual && > > + cat >expect <<EOF && > > +foo1.3 > > +foo1.6 > > +foo1.10 > > +EOF > > + test_cmp expect actual > > +' > > Please write the above like so: > > ... > cat >expect <<-\EOF && > foo1.3 > ... > EOF > test_cmp expect actual > > The dash immediately after the here-doc redirection lets us indent > the data with HT to allow the test boundaries easier to spot, and by > quoting the token to end here-doc, we relieve the readers from > having to wonder if there are variable substitutions going on that > they need to be careful about. > > Overall, I think this is done well. Thanks for working on it. > --
Yep. I'll try to have a new version soon.
Regards, Jake
> To unsubscribe from this list: send the line "unsubscribe git" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html