Add support for configuring default sort ordering for git tags. Command line option will override this configured value, using the exact same syntax. Cc: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> Cc: Junio C Hamano <gitster@xxxxxxxxx> Signed-off-by: Jacob Keller <jacob.e.keller@xxxxxxxxx> --- Documentation/config.txt | 7 +++++++ Documentation/git-tag.txt | 3 ++- builtin/tag.c | 47 ++++++++++++++++++++++++++++++++++++++++------- t/t7004-tag.sh | 21 +++++++++++++++++++++ 4 files changed, 70 insertions(+), 8 deletions(-) diff --git a/Documentation/config.txt b/Documentation/config.txt index 1d718bdb9662..0152582445b0 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -2354,6 +2354,13 @@ 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 when + displayed via linkgit:git-tag[5]. The current supported types are + "refname" for lexicographic order (default) or "version:refname" or + "v:refname" for tag names treated as versions. You may prepend a "-" to + reverse the sort ordering. + tar.umask:: This variable can be used to restrict the permission bits of tar archive entries. The default is 0002, which turns off the diff --git a/Documentation/git-tag.txt b/Documentation/git-tag.txt index b424a1bc48bb..b338260f9f63 100644 --- a/Documentation/git-tag.txt +++ b/Documentation/git-tag.txt @@ -99,7 +99,7 @@ OPTIONS Sort in a specific order. Supported type is "refname" (lexicographic order), "version:refname" or "v:refname" (tag names are treated as versions). Prepend "-" to reverse sort - order. + order. See configuration variable tag.sort for more details. --column[=<options>]:: --no-column:: @@ -317,6 +317,7 @@ include::date-formats.txt[] SEE ALSO -------- linkgit:git-check-ref-format[1]. +linkgit:git-config[1]. GIT --- diff --git a/builtin/tag.c b/builtin/tag.c index ef765563388c..e8ada8b716ee 100644 --- a/builtin/tag.c +++ b/builtin/tag.c @@ -18,6 +18,8 @@ #include "sha1-array.h" #include "column.h" +static char *configured_tag_sort; + static const char * const git_tag_usage[] = { N_("git tag [-a|-s|-u <key-id>] [-f] [-m <msg>|-F <file>] <tagname> [<head>]"), N_("git tag -d <tagname>..."), @@ -346,9 +348,28 @@ static const char tag_template_nocleanup[] = "Lines starting with '%c' will be kept; you may remove them" " yourself if you want to.\n"); +static void set_configured_tag_sort(const char *key) +{ + free(configured_tag_sort); + configured_tag_sort = xstrdup(key); +} + +static const char *get_configured_tag_sort(void) +{ + if (configured_tag_sort) + return configured_tag_sort; + return "refname"; +} + 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")) { + set_configured_tag_sort(value); + } + + status = git_gpg_config(var, value, cb); if (status) return status; if (starts_with(var, "column.")) @@ -519,9 +540,9 @@ static int parse_opt_points_at(const struct option *opt __attribute__((unused)), return 0; } -static int parse_opt_sort(const struct option *opt, const char *arg, int unset) +static int parse_sort_string(const char *arg) { - int *sort = opt->value; + int sort = 0; int flags = 0; if (*arg == '-') { @@ -529,16 +550,26 @@ static int parse_opt_sort(const struct option *opt, const char *arg, int unset) arg++; } if (starts_with(arg, "version:")) { - *sort = VERCMP_SORT; + sort = VERCMP_SORT; arg += 8; } else if (starts_with(arg, "v:")) { - *sort = VERCMP_SORT; + sort = VERCMP_SORT; arg += 2; } else - *sort = STRCMP_SORT; + sort = STRCMP_SORT; if (strcmp(arg, "refname")) die(_("unsupported sort specification %s"), arg); - *sort |= flags; + sort |= flags; + + return sort; +} + +static int parse_opt_sort(const struct option *opt, const char *arg, int unset) +{ + int *sort = opt->value; + + *sort = parse_sort_string(arg); + return 0; } @@ -606,6 +637,8 @@ int cmd_tag(int argc, const char **argv, const char *prefix) memset(&opt, 0, sizeof(opt)); + sort = parse_sort_string(get_configured_tag_sort()); + argc = parse_options(argc, argv, prefix, options, git_tag_usage, 0); if (keyid) { 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 +' + +test_expect_success 'option override configured sort' ' + git tag -l --sort=-refname "foo*" >actual && + cat >expect <<EOF && +foo1.6 +foo1.3 +foo1.10 +EOF + test_cmp expect actual +' + run_with_limited_stack () { (ulimit -s 64 && "$@") } -- 2.0.0 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html