git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] tag: support configuring --sort via .gitconfig

From
Jacob Keller <jacob.e.keller@intel.com>
Date
Jul 9, 2014, 21:21 UTC
Message-ID
<1404940860-4004-1-git-send-email-jacob.e.keller@intel.com>

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@gmail.com>
Cc: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
---
 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
Next: Jeff King
Message 1 of 4 in “tag: support configuring --sort via .gitconfig”
  1. tag: support configuring --sort via .gitconfigJacob Keller, Jul 9, 2014
  2. Jeff KingJul 9, 2014
  3. Keller, Jacob EJul 9, 2014
  4. Jeff KingJul 9, 2014

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.