git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/3] tag: use skip_prefix instead of magic numbers
@ 2014-07-11 17:24 Jacob Keller
  2014-07-11 17:50 ` Jeff King
  0 siblings, 1 reply; 17+ messages in thread
From: Jacob Keller @ 2014-07-11 17:24 UTC (permalink / raw)
  To: git; +Cc: Jacob Keller

Make the parsing of the --sort parameter more readable by having
skip_prefix keep our pointer up to date.

Authored-by: Jeff King <peff@peff.net>
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
---
 builtin/tag.c | 14 ++++----------
 1 file changed, 4 insertions(+), 10 deletions(-)

diff --git a/builtin/tag.c b/builtin/tag.c
index ef765563388c..7ccb6f3c581b 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c
@@ -524,18 +524,12 @@ static int parse_opt_sort(const struct option *opt, const char *arg, int unset)
 	int *sort = opt->value;
 	int flags = 0;
 
-	if (*arg == '-') {
+	if (skip_prefix(arg, "-", &arg))
 		flags |= REVERSE_SORT;
-		arg++;
-	}
-	if (starts_with(arg, "version:")) {
+
+	if (skip_prefix(arg, "version:", &arg) || skip_prefix(arg, "v:", &arg))
 		*sort = VERCMP_SORT;
-		arg += 8;
-	} else if (starts_with(arg, "v:")) {
-		*sort = VERCMP_SORT;
-		arg += 2;
-	} else
-		*sort = STRCMP_SORT;
+
 	if (strcmp(arg, "refname"))
 		die(_("unsupported sort specification %s"), arg);
 	*sort |= flags;
-- 
2.0.1.475.g9b8d714

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* Re: [PATCH 1/3] tag: use skip_prefix instead of magic numbers
  2014-07-11 17:24 Jacob Keller
@ 2014-07-11 17:50 ` Jeff King
  2014-07-11 18:04   ` Keller, Jacob E
  2014-07-11 18:42   ` Junio C Hamano
  0 siblings, 2 replies; 17+ messages in thread
From: Jeff King @ 2014-07-11 17:50 UTC (permalink / raw)
  To: Jacob Keller; +Cc: git

On Fri, Jul 11, 2014 at 10:24:05AM -0700, Jacob Keller wrote:

> Make the parsing of the --sort parameter more readable by having
> skip_prefix keep our pointer up to date.
> 
> Authored-by: Jeff King <peff@peff.net>

I suspect Junio may just apply this on the version of the commit he has
upstream, so you may not need this as part of your series.

However, for reference, the right way to handle authorship is with a

  From: Jeff King <peff@peff.net>

at the top of your message body. Git-am will pick that up and turn it
into the author field of the commit.

-Peff

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 1/3] tag: use skip_prefix instead of magic numbers
  2014-07-11 17:50 ` Jeff King
@ 2014-07-11 18:04   ` Keller, Jacob E
  2014-07-11 18:42   ` Junio C Hamano
  1 sibling, 0 replies; 17+ messages in thread
From: Keller, Jacob E @ 2014-07-11 18:04 UTC (permalink / raw)
  To: peff@peff.net; +Cc: git@vger.kernel.org

On Fri, 2014-07-11 at 13:50 -0400, Jeff King wrote:
> On Fri, Jul 11, 2014 at 10:24:05AM -0700, Jacob Keller wrote:
> 
> > Make the parsing of the --sort parameter more readable by having
> > skip_prefix keep our pointer up to date.
> > 
> > Authored-by: Jeff King <peff@peff.net>
> 
> I suspect Junio may just apply this on the version of the commit he has
> upstream, so you may not need this as part of your series.
> 
> However, for reference, the right way to handle authorship is with a
> 
>   From: Jeff King <peff@peff.net>
> 
> at the top of your message body. Git-am will pick that up and turn it
> into the author field of the commit.
> 

Alright, thanks.

Regards,
Jake

> -Peff
> --
> 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



^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 1/3] tag: use skip_prefix instead of magic numbers
  2014-07-11 17:50 ` Jeff King
  2014-07-11 18:04   ` Keller, Jacob E
@ 2014-07-11 18:42   ` Junio C Hamano
  1 sibling, 0 replies; 17+ messages in thread
From: Junio C Hamano @ 2014-07-11 18:42 UTC (permalink / raw)
  To: Jeff King; +Cc: Jacob Keller, git

Jeff King <peff@peff.net> writes:

> On Fri, Jul 11, 2014 at 10:24:05AM -0700, Jacob Keller wrote:
>
>> Make the parsing of the --sort parameter more readable by having
>> skip_prefix keep our pointer up to date.
>> 
>> Authored-by: Jeff King <peff@peff.net>
>
> I suspect Junio may just apply this on the version of the commit he has
> upstream, so you may not need this as part of your series.

You read me correctly ;-)  That is what I was planning to do, to
fork jk/tag-sort topic on top of the updated jk/skip-prefix topic.

> However, for reference, the right way to handle authorship is with a
>
>   From: Jeff King <peff@peff.net>
>
> at the top of your message body. Git-am will pick that up and turn it
> into the author field of the commit.

Thanks.

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH 1/3] tag: use skip_prefix instead of magic numbers
@ 2014-07-11 20:51 Jacob Keller
  2014-07-11 20:51 ` [PATCH 2/3] tag: fix --sort tests to use cat<<-\EOF format Jacob Keller
  2014-07-11 20:51 ` [PATCH 3/3] tag: support configuring --sort via .gitconfig Jacob Keller
  0 siblings, 2 replies; 17+ messages in thread
From: Jacob Keller @ 2014-07-11 20:51 UTC (permalink / raw)
  To: git; +Cc: Jeff King, Jacob Keller

From: Jeff King <peff@peff.net>

Make the parsing of the --sort parameter more readable by having
skip_prefix keep our pointer up to date.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
---
Fixed authorship. I don't expect this version to be taken, but it helps me in
review, and I figured it is good to send the whole series.

 builtin/tag.c | 14 ++++----------
 1 file changed, 4 insertions(+), 10 deletions(-)

diff --git a/builtin/tag.c b/builtin/tag.c
index ef765563388c..7ccb6f3c581b 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c
@@ -524,18 +524,12 @@ static int parse_opt_sort(const struct option *opt, const char *arg, int unset)
 	int *sort = opt->value;
 	int flags = 0;
 
-	if (*arg == '-') {
+	if (skip_prefix(arg, "-", &arg))
 		flags |= REVERSE_SORT;
-		arg++;
-	}
-	if (starts_with(arg, "version:")) {
+
+	if (skip_prefix(arg, "version:", &arg) || skip_prefix(arg, "v:", &arg))
 		*sort = VERCMP_SORT;
-		arg += 8;
-	} else if (starts_with(arg, "v:")) {
-		*sort = VERCMP_SORT;
-		arg += 2;
-	} else
-		*sort = STRCMP_SORT;
+
 	if (strcmp(arg, "refname"))
 		die(_("unsupported sort specification %s"), arg);
 	*sort |= flags;
-- 
2.0.1.475.g9b8d714

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 2/3] tag: fix --sort tests to use cat<<-\EOF format
  2014-07-11 20:51 [PATCH 1/3] tag: use skip_prefix instead of magic numbers Jacob Keller
@ 2014-07-11 20:51 ` Jacob Keller
  2014-07-11 20:51 ` [PATCH 3/3] tag: support configuring --sort via .gitconfig Jacob Keller
  1 sibling, 0 replies; 17+ messages in thread
From: Jacob Keller @ 2014-07-11 20:51 UTC (permalink / raw)
  To: git; +Cc: Jacob Keller

The --sort tests should use the better format for >expect to maintain
indenting and ensure that no substitution is occurring. This makes
parsing and understanding the tests a bit easier.

Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
---
 t/t7004-tag.sh | 40 ++++++++++++++++++++--------------------
 1 file changed, 20 insertions(+), 20 deletions(-)

diff --git a/t/t7004-tag.sh b/t/t7004-tag.sh
index e4ab0f5b6419..66010b0e7066 100755
--- a/t/t7004-tag.sh
+++ b/t/t7004-tag.sh
@@ -1385,41 +1385,41 @@ test_expect_success 'lexical sort' '
 	git tag foo1.6 &&
 	git tag foo1.10 &&
 	git tag -l --sort=refname "foo*" >actual &&
-	cat >expect <<EOF &&
-foo1.10
-foo1.3
-foo1.6
-EOF
+	cat >expect <<-\EOF &&
+	foo1.10
+	foo1.3
+	foo1.6
+	EOF
 	test_cmp expect actual
 '
 
 test_expect_success 'version sort' '
 	git tag -l --sort=version:refname "foo*" >actual &&
-	cat >expect <<EOF &&
-foo1.3
-foo1.6
-foo1.10
-EOF
+	cat >expect <<-\EOF &&
+	foo1.3
+	foo1.6
+	foo1.10
+	EOF
 	test_cmp expect actual
 '
 
 test_expect_success 'reverse version sort' '
 	git tag -l --sort=-version:refname "foo*" >actual &&
-	cat >expect <<EOF &&
-foo1.10
-foo1.6
-foo1.3
-EOF
+	cat >expect <<-\EOF &&
+	foo1.10
+	foo1.6
+	foo1.3
+	EOF
 	test_cmp expect actual
 '
 
 test_expect_success 'reverse lexical sort' '
 	git tag -l --sort=-refname "foo*" >actual &&
-	cat >expect <<EOF &&
-foo1.6
-foo1.3
-foo1.10
-EOF
+	cat >expect <<-\EOF &&
+	foo1.6
+	foo1.3
+	foo1.10
+	EOF
 	test_cmp expect actual
 '
 
-- 
2.0.1.475.g9b8d714

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 3/3] tag: support configuring --sort via .gitconfig
  2014-07-11 20:51 [PATCH 1/3] tag: use skip_prefix instead of magic numbers Jacob Keller
  2014-07-11 20:51 ` [PATCH 2/3] tag: fix --sort tests to use cat<<-\EOF format Jacob Keller
@ 2014-07-11 20:51 ` Jacob Keller
  2014-07-11 20:54   ` Keller, Jacob E
  2014-07-11 21:06   ` Jeff King
  1 sibling, 2 replies; 17+ messages in thread
From: Jacob Keller @ 2014-07-11 20:51 UTC (permalink / raw)
  To: git; +Cc: Jacob Keller, Jeff King

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>
---
Updated based on Junio's suggestions, as well as making sure that we don't bail
if we can't understand config's option. We still print error message followed
by a warning about using default order. In addition, added a few more tests to
ensure that these work as expected.

 Documentation/config.txt  |  5 ++++
 Documentation/git-tag.txt |  5 +++-
 builtin/tag.c             | 61 ++++++++++++++++++++++++++++++++++-------------
 t/t7004-tag.sh            | 36 ++++++++++++++++++++++++++++
 4 files changed, 90 insertions(+), 17 deletions(-)

diff --git a/Documentation/config.txt b/Documentation/config.txt
index 1d718bdb9662..c55c22ab7be9 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -2354,6 +2354,11 @@ submodule.<name>.ignore::
 	"--ignore-submodules" option. The 'git submodule' commands are not
 	affected by this setting.
 
+tag.sort::
+	This variable controls the sort ordering of tags when displayed by
+	linkgit:git-tag[1]. Without the "--sort=<value>" option provided, the
+	value of this variable will be used as the default.
+
 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..320908369f06 100644
--- a/Documentation/git-tag.txt
+++ b/Documentation/git-tag.txt
@@ -99,7 +99,9 @@ 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. When this option is not given, the sort order defaults to the
+	value configured for the 'tag.sort' variable if it exists, or
+	lexicographic order otherwise. See linkgit:git-config[1].
 
 --column[=<options>]::
 --no-column::
@@ -317,6 +319,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 7ccb6f3c581b..cb37b26159a6 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c
@@ -32,6 +32,8 @@ static const char * const git_tag_usage[] = {
 #define SORT_MASK       0x7fff
 #define REVERSE_SORT    0x8000
 
+static int tag_sort;
+
 struct tag_filter {
 	const char **patterns;
 	int lines;
@@ -346,9 +348,46 @@ static const char tag_template_nocleanup[] =
 	"Lines starting with '%c' will be kept; you may remove them"
 	" yourself if you want to.\n");
 
+/*
+ * Parse a sort string, and return 0 if parsed successfully. Will return
+ * non-zero when the sort string does not parse into a known type.
+ */
+static int parse_sort_string(const char *arg, int *sort)
+{
+	int type = 0, flags = 0;
+
+	if (skip_prefix(arg, "-", &arg))
+		flags |= REVERSE_SORT;
+
+	if (skip_prefix(arg, "version:", &arg) || skip_prefix(arg, "v:", &arg))
+		type = VERCMP_SORT;
+	else
+		type = STRCMP_SORT;
+
+	if (strcmp(arg, "refname"))
+		return error(_("unsupported sort specification %s"), arg);
+
+	*sort = (type | flags);
+
+	return 0;
+}
+
 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")) {
+		if (!value)
+			return config_error_nonbool(var);
+		status = parse_sort_string(value, &tag_sort);
+		if (status) {
+			warning("using default lexicographic sort order");
+			tag_sort = STRCMP_SORT;
+		}
+		return 0;
+	}
+
+	status = git_gpg_config(var, value, cb);
 	if (status)
 		return status;
 	if (starts_with(var, "column."))
@@ -522,18 +561,8 @@ static int parse_opt_points_at(const struct option *opt __attribute__((unused)),
 static int parse_opt_sort(const struct option *opt, const char *arg, int unset)
 {
 	int *sort = opt->value;
-	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);
-	*sort |= flags;
-	return 0;
+	return parse_sort_string(arg, sort);
 }
 
 int cmd_tag(int argc, const char **argv, const char *prefix)
@@ -546,7 +575,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
 	struct create_tag_options opt;
 	char *cleanup_arg = NULL;
 	int annotate = 0, force = 0, lines = -1;
-	int cmdmode = 0, sort = 0;
+	int cmdmode = 0;
 	const char *msgfile = NULL, *keyid = NULL;
 	struct msg_arg msg = { 0, STRBUF_INIT };
 	struct commit_list *with_commit = NULL;
@@ -572,7 +601,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
 		OPT__FORCE(&force, N_("replace the tag if exists")),
 		OPT_COLUMN(0, "column", &colopts, N_("show tag list in columns")),
 		{
-			OPTION_CALLBACK, 0, "sort", &sort, N_("type"), N_("sort tags"),
+			OPTION_CALLBACK, 0, "sort", &tag_sort, N_("type"), N_("sort tags"),
 			PARSE_OPT_NONEG, parse_opt_sort
 		},
 
@@ -628,9 +657,9 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
 			copts.padding = 2;
 			run_column_filter(colopts, &copts);
 		}
-		if (lines != -1 && sort)
+		if (lines != -1 && tag_sort)
 			die(_("--sort and -n are incompatible"));
-		ret = list_tags(argv, lines == -1 ? 0 : lines, with_commit, sort);
+		ret = list_tags(argv, lines == -1 ? 0 : lines, with_commit, tag_sort);
 		if (column_active(colopts))
 			stop_column_filter();
 		return ret;
diff --git a/t/t7004-tag.sh b/t/t7004-tag.sh
index 66010b0e7066..036665308841 100755
--- a/t/t7004-tag.sh
+++ b/t/t7004-tag.sh
@@ -1423,6 +1423,42 @@ test_expect_success 'reverse lexical sort' '
 	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
+'
+
+test_expect_success 'invalid sort parameter on command line' '
+	test_must_fail git tag -l --sort=notvalid "foo*" >actual
+'
+
+test_expect_success 'invalid sort parameter in configuratoin' '
+	git config tag.sort "v:notvalid" &&
+	git tag -l "foo*" >actual &&
+	cat >expect <<-\EOF &&
+	foo1.10
+	foo1.3
+	foo1.6
+	EOF
+	test_cmp expect actual
+'
+
 run_with_limited_stack () {
 	(ulimit -s 64 && "$@")
 }
-- 
2.0.1.475.g9b8d714

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* Re: [PATCH 3/3] tag: support configuring --sort via .gitconfig
  2014-07-11 20:51 ` [PATCH 3/3] tag: support configuring --sort via .gitconfig Jacob Keller
@ 2014-07-11 20:54   ` Keller, Jacob E
  2014-07-11 21:06   ` Jeff King
  1 sibling, 0 replies; 17+ messages in thread
From: Keller, Jacob E @ 2014-07-11 20:54 UTC (permalink / raw)
  To: git@vger.kernel.org; +Cc: peff@peff.net

On Fri, 2014-07-11 at 13:51 -0700, Jacob Keller wrote:
> 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>
> ---
> Updated based on Junio's suggestions, as well as making sure that we don't bail
> if we can't understand config's option. We still print error message followed
> by a warning about using default order. In addition, added a few more tests to
> ensure that these work as expected.
> 
>  Documentation/config.txt  |  5 ++++
>  Documentation/git-tag.txt |  5 +++-
>  builtin/tag.c             | 61 ++++++++++++++++++++++++++++++++++-------------
>  t/t7004-tag.sh            | 36 ++++++++++++++++++++++++++++
>  4 files changed, 90 insertions(+), 17 deletions(-)
> 
> diff --git a/Documentation/config.txt b/Documentation/config.txt
> index 1d718bdb9662..c55c22ab7be9 100644
> --- a/Documentation/config.txt
> +++ b/Documentation/config.txt
> @@ -2354,6 +2354,11 @@ submodule.<name>.ignore::
>  	"--ignore-submodules" option. The 'git submodule' commands are not
>  	affected by this setting.
>  
> +tag.sort::
> +	This variable controls the sort ordering of tags when displayed by
> +	linkgit:git-tag[1]. Without the "--sort=<value>" option provided, the
> +	value of this variable will be used as the default.
> +
>  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..320908369f06 100644
> --- a/Documentation/git-tag.txt
> +++ b/Documentation/git-tag.txt
> @@ -99,7 +99,9 @@ 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. When this option is not given, the sort order defaults to the
> +	value configured for the 'tag.sort' variable if it exists, or
> +	lexicographic order otherwise. See linkgit:git-config[1].
>  
>  --column[=<options>]::
>  --no-column::
> @@ -317,6 +319,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 7ccb6f3c581b..cb37b26159a6 100644
> --- a/builtin/tag.c
> +++ b/builtin/tag.c
> @@ -32,6 +32,8 @@ static const char * const git_tag_usage[] = {
>  #define SORT_MASK       0x7fff
>  #define REVERSE_SORT    0x8000
>  
> +static int tag_sort;
> +
>  struct tag_filter {
>  	const char **patterns;
>  	int lines;
> @@ -346,9 +348,46 @@ static const char tag_template_nocleanup[] =
>  	"Lines starting with '%c' will be kept; you may remove them"
>  	" yourself if you want to.\n");
>  
> +/*
> + * Parse a sort string, and return 0 if parsed successfully. Will return
> + * non-zero when the sort string does not parse into a known type.
> + */
> +static int parse_sort_string(const char *arg, int *sort)
> +{
> +	int type = 0, flags = 0;
> +
> +	if (skip_prefix(arg, "-", &arg))
> +		flags |= REVERSE_SORT;
> +
> +	if (skip_prefix(arg, "version:", &arg) || skip_prefix(arg, "v:", &arg))
> +		type = VERCMP_SORT;
> +	else
> +		type = STRCMP_SORT;
> +
> +	if (strcmp(arg, "refname"))
> +		return error(_("unsupported sort specification %s"), arg);
> +
> +	*sort = (type | flags);
> +
> +	return 0;
> +}
> +
>  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")) {
> +		if (!value)
> +			return config_error_nonbool(var);
> +		status = parse_sort_string(value, &tag_sort);
> +		if (status) {
> +			warning("using default lexicographic sort order");

Oops, I should also use warning(_("")) here as well I believe...

Sorry for thrash.

Thanks,
Jake

> +			tag_sort = STRCMP_SORT;
> +		}
> +		return 0;
> +	}
> +
> +	status = git_gpg_config(var, value, cb);
>  	if (status)
>  		return status;
>  	if (starts_with(var, "column."))
> @@ -522,18 +561,8 @@ static int parse_opt_points_at(const struct option *opt __attribute__((unused)),
>  static int parse_opt_sort(const struct option *opt, const char *arg, int unset)
>  {
>  	int *sort = opt->value;
> -	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);
> -	*sort |= flags;
> -	return 0;
> +	return parse_sort_string(arg, sort);
>  }
>  
>  int cmd_tag(int argc, const char **argv, const char *prefix)
> @@ -546,7 +575,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
>  	struct create_tag_options opt;
>  	char *cleanup_arg = NULL;
>  	int annotate = 0, force = 0, lines = -1;
> -	int cmdmode = 0, sort = 0;
> +	int cmdmode = 0;
>  	const char *msgfile = NULL, *keyid = NULL;
>  	struct msg_arg msg = { 0, STRBUF_INIT };
>  	struct commit_list *with_commit = NULL;
> @@ -572,7 +601,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
>  		OPT__FORCE(&force, N_("replace the tag if exists")),
>  		OPT_COLUMN(0, "column", &colopts, N_("show tag list in columns")),
>  		{
> -			OPTION_CALLBACK, 0, "sort", &sort, N_("type"), N_("sort tags"),
> +			OPTION_CALLBACK, 0, "sort", &tag_sort, N_("type"), N_("sort tags"),
>  			PARSE_OPT_NONEG, parse_opt_sort
>  		},
>  
> @@ -628,9 +657,9 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
>  			copts.padding = 2;
>  			run_column_filter(colopts, &copts);
>  		}
> -		if (lines != -1 && sort)
> +		if (lines != -1 && tag_sort)
>  			die(_("--sort and -n are incompatible"));
> -		ret = list_tags(argv, lines == -1 ? 0 : lines, with_commit, sort);
> +		ret = list_tags(argv, lines == -1 ? 0 : lines, with_commit, tag_sort);
>  		if (column_active(colopts))
>  			stop_column_filter();
>  		return ret;
> diff --git a/t/t7004-tag.sh b/t/t7004-tag.sh
> index 66010b0e7066..036665308841 100755
> --- a/t/t7004-tag.sh
> +++ b/t/t7004-tag.sh
> @@ -1423,6 +1423,42 @@ test_expect_success 'reverse lexical sort' '
>  	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
> +'
> +
> +test_expect_success 'invalid sort parameter on command line' '
> +	test_must_fail git tag -l --sort=notvalid "foo*" >actual
> +'
> +
> +test_expect_success 'invalid sort parameter in configuratoin' '
> +	git config tag.sort "v:notvalid" &&
> +	git tag -l "foo*" >actual &&
> +	cat >expect <<-\EOF &&
> +	foo1.10
> +	foo1.3
> +	foo1.6
> +	EOF
> +	test_cmp expect actual
> +'
> +
>  run_with_limited_stack () {
>  	(ulimit -s 64 && "$@")
>  }



^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 3/3] tag: support configuring --sort via .gitconfig
  2014-07-11 20:51 ` [PATCH 3/3] tag: support configuring --sort via .gitconfig Jacob Keller
  2014-07-11 20:54   ` Keller, Jacob E
@ 2014-07-11 21:06   ` Jeff King
  2014-07-11 21:08     ` Keller, Jacob E
  2014-07-11 22:17     ` Junio C Hamano
  1 sibling, 2 replies; 17+ messages in thread
From: Jeff King @ 2014-07-11 21:06 UTC (permalink / raw)
  To: Jacob Keller; +Cc: git

On Fri, Jul 11, 2014 at 01:51:35PM -0700, Jacob Keller wrote:

> +	if (!strcmp(var, "tag.sort")) {
> +		if (!value)
> +			return config_error_nonbool(var);
> +		status = parse_sort_string(value, &tag_sort);
> +		if (status) {
> +			warning("using default lexicographic sort order");
> +			tag_sort = STRCMP_SORT;
> +		}

I think this is a good compromise of the issues we discussed earlier. As
you noted, it should probably be marked for translation. I'm also not
sure the message content is clear in all situations. If I have a broken
tag.sort, I get:

  $ git config tag.sort bogus
  $ git tag >/dev/null
  error: unsupported sort specification bogus
  warning: using default lexicographic sort order

Not too bad, though reminding me that the value "bogus" came from
tag.sort would be nice. But what if I override it:

  $ git tag --sort=v:refname >/dev/null
  error: unsupported sort specification bogus
  warning: using default lexicographic sort order

That's actively wrong, because we are using v:refname from the
command-line. Perhaps we could phrase it like:

  warning: ignoring invalid config option tag.sort

or similar, which helps both cases.

As an aside, I also think the error line could more clearly mark the
literal contents of the variable. E.g., one of:

  error: unsupported sort specification: bogus

or

  error: unsupported sort specification 'bogus'

-Peff

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 3/3] tag: support configuring --sort via .gitconfig
  2014-07-11 21:06   ` Jeff King
@ 2014-07-11 21:08     ` Keller, Jacob E
  2014-07-11 22:17     ` Junio C Hamano
  1 sibling, 0 replies; 17+ messages in thread
From: Keller, Jacob E @ 2014-07-11 21:08 UTC (permalink / raw)
  To: peff@peff.net; +Cc: git@vger.kernel.org

On Fri, 2014-07-11 at 17:06 -0400, Jeff King wrote:
> On Fri, Jul 11, 2014 at 01:51:35PM -0700, Jacob Keller wrote:
> 
> > +	if (!strcmp(var, "tag.sort")) {
> > +		if (!value)
> > +			return config_error_nonbool(var);
> > +		status = parse_sort_string(value, &tag_sort);
> > +		if (status) {
> > +			warning("using default lexicographic sort order");
> > +			tag_sort = STRCMP_SORT;
> > +		}
> 
> I think this is a good compromise of the issues we discussed earlier. As
> you noted, it should probably be marked for translation. I'm also not
> sure the message content is clear in all situations. If I have a broken
> tag.sort, I get:
> 
>   $ git config tag.sort bogus
>   $ git tag >/dev/null
>   error: unsupported sort specification bogus
>   warning: using default lexicographic sort order
> 
> Not too bad, though reminding me that the value "bogus" came from
> tag.sort would be nice. But what if I override it:
> 
>   $ git tag --sort=v:refname >/dev/null
>   error: unsupported sort specification bogus
>   warning: using default lexicographic sort order
> 
> That's actively wrong, because we are using v:refname from the
> command-line. Perhaps we could phrase it like:
> 
>   warning: ignoring invalid config option tag.sort
> 

ok that makes more sense. I can't really avoid printing the warning at
all since config parsing happens before the option parsing.

I like this wording. I will respin again :D

Thanks,
Jake

> or similar, which helps both cases.
> 
> As an aside, I also think the error line could more clearly mark the
> literal contents of the variable. E.g., one of:
> 
>   error: unsupported sort specification: bogus
> 
> or
> 
>   error: unsupported sort specification 'bogus'
> 
> -Peff



^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH 1/3] tag: use skip_prefix instead of magic numbers
@ 2014-07-11 21:38 Jacob Keller
  2014-07-11 22:44 ` Junio C Hamano
  0 siblings, 1 reply; 17+ messages in thread
From: Jacob Keller @ 2014-07-11 21:38 UTC (permalink / raw)
  To: git; +Cc: Jeff King, Jacob Keller

From: Jeff King <peff@peff.net>

Make the parsing of the --sort parameter more readable by having
skip_prefix keep our pointer up to date.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
---
 builtin/tag.c | 14 ++++----------
 1 file changed, 4 insertions(+), 10 deletions(-)

diff --git a/builtin/tag.c b/builtin/tag.c
index ef765563388c..7ccb6f3c581b 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c
@@ -524,18 +524,12 @@ static int parse_opt_sort(const struct option *opt, const char *arg, int unset)
 	int *sort = opt->value;
 	int flags = 0;
 
-	if (*arg == '-') {
+	if (skip_prefix(arg, "-", &arg))
 		flags |= REVERSE_SORT;
-		arg++;
-	}
-	if (starts_with(arg, "version:")) {
+
+	if (skip_prefix(arg, "version:", &arg) || skip_prefix(arg, "v:", &arg))
 		*sort = VERCMP_SORT;
-		arg += 8;
-	} else if (starts_with(arg, "v:")) {
-		*sort = VERCMP_SORT;
-		arg += 2;
-	} else
-		*sort = STRCMP_SORT;
+
 	if (strcmp(arg, "refname"))
 		die(_("unsupported sort specification %s"), arg);
 	*sort |= flags;
-- 
2.0.1.475.g9b8d714

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* Re: [PATCH 3/3] tag: support configuring --sort via .gitconfig
  2014-07-11 21:06   ` Jeff King
  2014-07-11 21:08     ` Keller, Jacob E
@ 2014-07-11 22:17     ` Junio C Hamano
  2014-07-11 22:30       ` Keller, Jacob E
  1 sibling, 1 reply; 17+ messages in thread
From: Junio C Hamano @ 2014-07-11 22:17 UTC (permalink / raw)
  To: Jeff King; +Cc: Jacob Keller, git

Jeff King <peff@peff.net> writes:

> On Fri, Jul 11, 2014 at 01:51:35PM -0700, Jacob Keller wrote:
>
>> +	if (!strcmp(var, "tag.sort")) {
>> +		if (!value)
>> +			return config_error_nonbool(var);
>> +		status = parse_sort_string(value, &tag_sort);
>> +		if (status) {
>> +			warning("using default lexicographic sort order");
>> +			tag_sort = STRCMP_SORT;
>> +		}
>
> I think this is a good compromise of the issues we discussed earlier. As
> you noted, it should probably be marked for translation. I'm also not
> sure the message content is clear in all situations. If I have a broken
> tag.sort, I get:
>
>   $ git config tag.sort bogus
>   $ git tag >/dev/null
>   error: unsupported sort specification bogus
>   warning: using default lexicographic sort order
>
> Not too bad, though reminding me that the value "bogus" came from
> tag.sort would be nice. But what if I override it:
>
>   $ git tag --sort=v:refname >/dev/null
>   error: unsupported sort specification bogus
>   warning: using default lexicographic sort order
>
> That's actively wrong, because we are using v:refname from the
> command-line.  Perhaps we could phrase it like:
>
>   warning: ignoring invalid config option tag.sort
>
> or similar, which helps both cases.

Hmph.  Looks like a mild-enough middle ground, I guess.  As
parse_sort_string() is private for "git tag" implementation, I
actually would not mind if we taught a bit more context to it and
phrase its messages differently.  Perhaps something like this, where
the config parser will tell what variable it came from with "var"
and the command line parser will pass NULL there.

static int parse_sort_string(const char *var, const char *value, int *sort)
{
	...
	if (strcmp(value, "refname")) {
		if (!var)
                	return error(_("unsupported sort specification '%s'"), value);
		else {
                	warning(_("unsupported sort specification '%s' in variable '%s'"),
                        	var, value);
			return -1;
		}
	}

	*sort = (type | flags);

	return 0;
}

> As an aside, I also think the error line could more clearly mark the
> literal contents of the variable. E.g., one of:
>
>   error: unsupported sort specification: bogus
>
> or
>
>   error: unsupported sort specification 'bogus'

Yup.

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 3/3] tag: support configuring --sort via .gitconfig
  2014-07-11 22:17     ` Junio C Hamano
@ 2014-07-11 22:30       ` Keller, Jacob E
  0 siblings, 0 replies; 17+ messages in thread
From: Keller, Jacob E @ 2014-07-11 22:30 UTC (permalink / raw)
  To: gitster@pobox.com; +Cc: git@vger.kernel.org, peff@peff.net

On Fri, 2014-07-11 at 15:17 -0700, Junio C Hamano wrote:
> Jeff King <peff@peff.net> writes:
> 
> > On Fri, Jul 11, 2014 at 01:51:35PM -0700, Jacob Keller wrote:
> >
> >> +	if (!strcmp(var, "tag.sort")) {
> >> +		if (!value)
> >> +			return config_error_nonbool(var);
> >> +		status = parse_sort_string(value, &tag_sort);
> >> +		if (status) {
> >> +			warning("using default lexicographic sort order");
> >> +			tag_sort = STRCMP_SORT;
> >> +		}
> >
> > I think this is a good compromise of the issues we discussed earlier. As
> > you noted, it should probably be marked for translation. I'm also not
> > sure the message content is clear in all situations. If I have a broken
> > tag.sort, I get:
> >
> >   $ git config tag.sort bogus
> >   $ git tag >/dev/null
> >   error: unsupported sort specification bogus
> >   warning: using default lexicographic sort order
> >
> > Not too bad, though reminding me that the value "bogus" came from
> > tag.sort would be nice. But what if I override it:
> >
> >   $ git tag --sort=v:refname >/dev/null
> >   error: unsupported sort specification bogus
> >   warning: using default lexicographic sort order
> >
> > That's actively wrong, because we are using v:refname from the
> > command-line.  Perhaps we could phrase it like:
> >
> >   warning: ignoring invalid config option tag.sort
> >
> > or similar, which helps both cases.
> 
> Hmph.  Looks like a mild-enough middle ground, I guess.  As
> parse_sort_string() is private for "git tag" implementation, I
> actually would not mind if we taught a bit more context to it and
> phrase its messages differently.  Perhaps something like this, where
> the config parser will tell what variable it came from with "var"
> and the command line parser will pass NULL there.
> 
> static int parse_sort_string(const char *var, const char *value, int *sort)
> {
> 	...
> 	if (strcmp(value, "refname")) {
> 		if (!var)
>                 	return error(_("unsupported sort specification '%s'"), value);
> 		else {
>                 	warning(_("unsupported sort specification '%s' in variable '%s'"),
>                         	var, value);
> 			return -1;
> 		}
> 	}
> 
> 	*sort = (type | flags);
> 
> 	return 0;
> }
> 

Ok..  I suppose that could be done.

Thanks,
Jake

> > As an aside, I also think the error line could more clearly mark the
> > literal contents of the variable. E.g., one of:
> >
> >   error: unsupported sort specification: bogus
> >
> > or
> >
> >   error: unsupported sort specification 'bogus'
> 
> Yup.



^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 1/3] tag: use skip_prefix instead of magic numbers
  2014-07-11 21:38 Jacob Keller
@ 2014-07-11 22:44 ` Junio C Hamano
  2014-07-11 22:47   ` Keller, Jacob E
  0 siblings, 1 reply; 17+ messages in thread
From: Junio C Hamano @ 2014-07-11 22:44 UTC (permalink / raw)
  To: Jacob Keller; +Cc: git, Jeff King

Jacob Keller <jacob.e.keller@intel.com> writes:

> From: Jeff King <peff@peff.net>
>
> Make the parsing of the --sort parameter more readable by having
> skip_prefix keep our pointer up to date.
>
> Signed-off-by: Jeff King <peff@peff.net>
> Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
> ---
>  builtin/tag.c | 14 ++++----------
>  1 file changed, 4 insertions(+), 10 deletions(-)
>
> diff --git a/builtin/tag.c b/builtin/tag.c
> index ef765563388c..7ccb6f3c581b 100644
> --- a/builtin/tag.c
> +++ b/builtin/tag.c
> @@ -524,18 +524,12 @@ static int parse_opt_sort(const struct option *opt, const char *arg, int unset)
>  	int *sort = opt->value;
>  	int flags = 0;
>  
> -	if (*arg == '-') {
> +	if (skip_prefix(arg, "-", &arg))
>  		flags |= REVERSE_SORT;
> -		arg++;
> -	}
> -	if (starts_with(arg, "version:")) {
> +
> +	if (skip_prefix(arg, "version:", &arg) || skip_prefix(arg, "v:", &arg))
>  		*sort = VERCMP_SORT;
> -		arg += 8;
> -	} else if (starts_with(arg, "v:")) {
> -		*sort = VERCMP_SORT;
> -		arg += 2;
> -	} else
> -		*sort = STRCMP_SORT;
> +

By losing "*sort = STRCMP_SORT", the version after this patch would
stop clearing what is pointed by opt->value, so

	git tag --sort=v:refname --sort=refname

would no longer implement the "last one wins" semantics, no?

Am I misreading the patch?  I somehow thought Peff's original was
clearing the variable...

>  	if (strcmp(arg, "refname"))
>  		die(_("unsupported sort specification %s"), arg);
>  	*sort |= flags;

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 1/3] tag: use skip_prefix instead of magic numbers
  2014-07-11 22:44 ` Junio C Hamano
@ 2014-07-11 22:47   ` Keller, Jacob E
  0 siblings, 0 replies; 17+ messages in thread
From: Keller, Jacob E @ 2014-07-11 22:47 UTC (permalink / raw)
  To: gitster@pobox.com; +Cc: git@vger.kernel.org, peff@peff.net

On Fri, 2014-07-11 at 15:44 -0700, Junio C Hamano wrote:
> Jacob Keller <jacob.e.keller@intel.com> writes:
> 
> > From: Jeff King <peff@peff.net>
> >
> > Make the parsing of the --sort parameter more readable by having
> > skip_prefix keep our pointer up to date.
> >
> > Signed-off-by: Jeff King <peff@peff.net>
> > Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
> > ---
> >  builtin/tag.c | 14 ++++----------
> >  1 file changed, 4 insertions(+), 10 deletions(-)
> >
> > diff --git a/builtin/tag.c b/builtin/tag.c
> > index ef765563388c..7ccb6f3c581b 100644
> > --- a/builtin/tag.c
> > +++ b/builtin/tag.c
> > @@ -524,18 +524,12 @@ static int parse_opt_sort(const struct option *opt, const char *arg, int unset)
> >  	int *sort = opt->value;
> >  	int flags = 0;
> >  
> > -	if (*arg == '-') {
> > +	if (skip_prefix(arg, "-", &arg))
> >  		flags |= REVERSE_SORT;
> > -		arg++;
> > -	}
> > -	if (starts_with(arg, "version:")) {
> > +
> > +	if (skip_prefix(arg, "version:", &arg) || skip_prefix(arg, "v:", &arg))
> >  		*sort = VERCMP_SORT;
> > -		arg += 8;
> > -	} else if (starts_with(arg, "v:")) {
> > -		*sort = VERCMP_SORT;
> > -		arg += 2;
> > -	} else
> > -		*sort = STRCMP_SORT;
> > +
> 
> By losing "*sort = STRCMP_SORT", the version after this patch would
> stop clearing what is pointed by opt->value, so
> 
> 	git tag --sort=v:refname --sort=refname
> 
> would no longer implement the "last one wins" semantics, no?
> 
> Am I misreading the patch?  I somehow thought Peff's original was
> clearing the variable...
> 
> >  	if (strcmp(arg, "refname"))
> >  		die(_("unsupported sort specification %s"), arg);
> >  	*sort |= flags;

Indeed. My patch fixes this up but I will re-work this so we don't
introduce an inbetween bug :)

Thanks,
Jake

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH 1/3] tag: use skip_prefix instead of magic numbers
@ 2014-07-11 22:55 Jacob Keller
  2014-07-12  1:02 ` Jeff King
  0 siblings, 1 reply; 17+ messages in thread
From: Jacob Keller @ 2014-07-11 22:55 UTC (permalink / raw)
  To: git; +Cc: Jeff King, Jacob Keller

From: Jeff King <peff@peff.net>

Make the parsing of the --sort parameter more readable by having
skip_prefix keep our pointer up to date.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
---
Fixed issue with patch in that we dropped the reset to STRCMP_SORT, discovered
by Junio.

 builtin/tag.c | 14 +++++---------
 1 file changed, 5 insertions(+), 9 deletions(-)

diff --git a/builtin/tag.c b/builtin/tag.c
index ef765563388c..9d7643f127e7 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c
@@ -524,18 +524,14 @@ static int parse_opt_sort(const struct option *opt, const char *arg, int unset)
 	int *sort = opt->value;
 	int flags = 0;
 
-	if (*arg == '-') {
+	if (skip_prefix(arg, "-", &arg))
 		flags |= REVERSE_SORT;
-		arg++;
-	}
-	if (starts_with(arg, "version:")) {
+
+	if (skip_prefix(arg, "version:", &arg) || skip_prefix(arg, "v:", &arg))
 		*sort = VERCMP_SORT;
-		arg += 8;
-	} else if (starts_with(arg, "v:")) {
-		*sort = VERCMP_SORT;
-		arg += 2;
-	} else
+	else
 		*sort = STRCMP_SORT;
+
 	if (strcmp(arg, "refname"))
 		die(_("unsupported sort specification %s"), arg);
 	*sort |= flags;
-- 
2.0.1.475.g9b8d714

^ permalink raw reply related	[flat|nested] 17+ messages in thread

* Re: [PATCH 1/3] tag: use skip_prefix instead of magic numbers
  2014-07-11 22:55 [PATCH 1/3] tag: use skip_prefix instead of magic numbers Jacob Keller
@ 2014-07-12  1:02 ` Jeff King
  0 siblings, 0 replies; 17+ messages in thread
From: Jeff King @ 2014-07-12  1:02 UTC (permalink / raw)
  To: Jacob Keller; +Cc: git

On Fri, Jul 11, 2014 at 03:55:45PM -0700, Jacob Keller wrote:

> From: Jeff King <peff@peff.net>
> 
> Make the parsing of the --sort parameter more readable by having
> skip_prefix keep our pointer up to date.
> 
> Signed-off-by: Jeff King <peff@peff.net>
> Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
> ---
> Fixed issue with patch in that we dropped the reset to STRCMP_SORT, discovered
> by Junio.

I think what Junio queued in ce85604468 is already correct, so we are
fine as long we build on that.

-Peff

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2014-07-12  1:02 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-07-11 20:51 [PATCH 1/3] tag: use skip_prefix instead of magic numbers Jacob Keller
2014-07-11 20:51 ` [PATCH 2/3] tag: fix --sort tests to use cat<<-\EOF format Jacob Keller
2014-07-11 20:51 ` [PATCH 3/3] tag: support configuring --sort via .gitconfig Jacob Keller
2014-07-11 20:54   ` Keller, Jacob E
2014-07-11 21:06   ` Jeff King
2014-07-11 21:08     ` Keller, Jacob E
2014-07-11 22:17     ` Junio C Hamano
2014-07-11 22:30       ` Keller, Jacob E
  -- strict thread matches above, loose matches on Subject: below --
2014-07-11 22:55 [PATCH 1/3] tag: use skip_prefix instead of magic numbers Jacob Keller
2014-07-12  1:02 ` Jeff King
2014-07-11 21:38 Jacob Keller
2014-07-11 22:44 ` Junio C Hamano
2014-07-11 22:47   ` Keller, Jacob E
2014-07-11 17:24 Jacob Keller
2014-07-11 17:50 ` Jeff King
2014-07-11 18:04   ` Keller, Jacob E
2014-07-11 18:42   ` Junio C Hamano

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).