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

Re: [PATCH] pretty: Add %(trailer:X) to display single trailer

From
Junio C Hamano <gitster@pobox.com>
Date
Oct 29, 2018, 04:49 UTC
Message-ID
<xmqqo9bd5pcx.fsf@gitster-ct.c.googlers.com>
In-Reply-To
<20181028125025.30952-1-anders@0x63.nu>
Anders Waldenborg <anders@0x63.nu> writes:
Show 19 quoted lines
> This new format placeholder allows displaying only a single
> trailer. The formatting done is similar to what is done for
> --decorate/%d using parentheses and comma separation.
>
> It's intended use is for things like ticket references in trailers.
>
> So with a commit with a message like:
>
>  > Some good commit
>  >
>  > Ticket: XYZ-123
>
> running:
>
>  $ git log --pretty="%H %s% (trailer:Ticket)"
>
> will give:
>
>  > 123456789a Some good commit (Ticket: XYZ-123)
Sounds useful, but a few questions off the top of my head are:
 - How would this work together with existing %(trailers:...)?
 - Can't this be made to a new option, in addition to existing
   'only' and 'unfold', to existing %(trailer:...)?  If not, what
   are the missing pieces that we need to add in order to make that
   possible?

The latter is especially true as from the surface, it smell like that the whole reason why this patch introduces a new placeholder with confusingly simliar name is because the patch did not bother to think of a way to make it fit there as an enhancement of it.

Show 12 quoted lines
> diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt
> index 6109ef09aa..a46d0c0717 100644
> --- a/Documentation/pretty-formats.txt
> +++ b/Documentation/pretty-formats.txt
> @@ -211,6 +211,10 @@ endif::git-rev-list[]
>    If the `unfold` option is given, behave as if interpret-trailer's
>    `--unfold` option was given.  E.g., `%(trailers:only,unfold)` to do
>    both.
> +- %(trailer:<t>): display the specified trailer in parentheses (like
> +  %d does for refnames). If there are multiple entries of that trailer
> +  they are shown comma separated. If there are no matching trailers
> +  nothing is displayed.

As this list is sorted roughly alphabetically for short ones, I think it is better to keep that order for the longer ones that begin with "%(". This should be instead inserted before the description for the existing "%(trailers[:options])".

Assuming that we want this %(trailer) separate from %(trailers), that is, of course.

Show 13 quoted lines
> diff --git a/pretty.c b/pretty.c
> index 8ca29e9281..61ae34ced4 100644
> --- a/pretty.c
> +++ b/pretty.c
> @@ -1324,6 +1324,22 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
>  		}
>  	}
>  
> +	if (skip_prefix(placeholder, "(trailer:", &arg)) {
> +		struct process_trailer_options opts = PROCESS_TRAILER_OPTIONS_INIT;
> +		opts.no_divider = 1;
> +		opts.only_trailers = 1;
> +		opts.unfold = 1;

This makes me suspect that it would be very nice if this is implemented as a new "option" to the existing "%(trailers[:option])" thing. It does mostly identical thing as the existing code.

> +		const char *end = strchr(arg, ')');
Avoid decl-after-statement.
Show 51 quoted lines
> +		if (!end)
> +			return 0;
> +
> +		opts.filter_trailer = xstrndup(arg, end - arg);
> +		format_trailers_from_commit(sb, msg + c->subject_off, &opts);
> +		free(opts.filter_trailer);
> +		return end - placeholder + 1;
> +	}
> +
>  	return 0;	/* unknown placeholder */
>  }
>  
> diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh
> index 978a8a66ff..e929f820e7 100755
> --- a/t/t4205-log-pretty-formats.sh
> +++ b/t/t4205-log-pretty-formats.sh
> @@ -598,6 +598,46 @@ test_expect_success ':only and :unfold work together' '
>  	test_cmp expect actual
>  '
>  
> +test_expect_success 'pretty format %(trailer:foo) shows that trailer' '
> +	git log --no-walk --pretty="%(trailer:Acked-By)" >actual &&
> +	{
> +		echo "(Acked-By: A U Thor <author@example.com>)"
> +	} >expect &&
> +	test_cmp expect actual
> +'
> +
> +test_expect_success '%(trailer:nonexistant) becomes empty' '
> +	git log --no-walk --pretty="x%(trailer:Nacked-By)x" >actual &&
> +	{
> +		echo "xx"
> +	} >expect &&
> +	test_cmp expect actual
> +'
> +
> +test_expect_success '% (trailer:nonexistant) with space becomes empty' '
> +	git log --no-walk --pretty="x% (trailer:Nacked-By)x" >actual &&
> +	{
> +		echo "xx"
> +	} >expect &&
> +	test_cmp expect actual
> +'
> +
> +test_expect_success '% (trailer:foo) with space adds space before' '
> +	git log --no-walk --pretty="x% (trailer:Acked-By)x" >actual &&
> +	{
> +		echo "x (Acked-By: A U Thor <author@example.com>)x"
> +	} >expect &&
> +	test_cmp expect actual
> +'
These are both good positive-negative pairs of tests.
Show 7 quoted lines
> +test_expect_success '%(trailer:foo) with multiple lines becomes comma separated and unwrapped' '
> +	git log --no-walk --pretty="%(trailer:Signed-Off-By)" >actual &&
> +	{
> +		echo "(Signed-Off-By: A U Thor <author@example.com>, A U Thor <author@example.com>)"
> +	} >expect &&
> +	test_cmp expect actual
> +'

This also tells me that it is a bad design to add this as a separate new feature that takes the trailer key as an end-user suppied value. There is no way to extend this to other needs, such as "do similar thing as %(trailer:foo) does by default, but do not unwrap; give two or more 'Signed-off-by:' separately)".

I wonder why something like %(trailers:comma,token=foo) were not considered. %(trailers:only,token=foo,token=bar) might even be a good way to grab only Foo: and Bar: trailers in the order they appear in the original commit, filtering out all the other trailers and non-trailer text in the log message.

Show 9 quoted lines
> diff --git a/trailer.c b/trailer.c
> index 0796f326b3..d337bca8dd 100644
> --- a/trailer.c
> +++ b/trailer.c
> @@ -1138,6 +1138,7 @@ static void format_trailer_info(struct strbuf *out,
>  		return;
>  	}
>  
> +	int printed_first = 0;
decl-afer-stmt.
Show 46 quoted lines
>  	for (i = 0; i < info->trailer_nr; i++) {
>  		char *trailer = info->trailers[i];
>  		ssize_t separator_pos = find_separator(trailer, separators);
> @@ -1150,7 +1151,19 @@ static void format_trailer_info(struct strbuf *out,
>  			if (opts->unfold)
>  				unfold_value(&val);
>  
> -			strbuf_addf(out, "%s: %s\n", tok.buf, val.buf);
> +			if (opts->filter_trailer) {
> +				if (!strcasecmp (tok.buf, opts->filter_trailer)) {
> +					if (!printed_first) {
> +						strbuf_addf(out, "(%s: ", opts->filter_trailer);
> +						printed_first = 1;
> +					} else {
> +						strbuf_addstr(out, ", ");
> +					}
> +					strbuf_addstr(out, val.buf);
> +				}
> +			} else {
> +				strbuf_addf(out, "%s: %s\n", tok.buf, val.buf);
> +			}
>  			strbuf_release(&tok);
>  			strbuf_release(&val);
>  
> @@ -1158,7 +1171,8 @@ static void format_trailer_info(struct strbuf *out,
>  			strbuf_addstr(out, trailer);
>  		}
>  	}
> -
> +	if (printed_first)
> +		strbuf_addstr(out, ")");
>  }
>  
>  void format_trailers_from_commit(struct strbuf *out, const char *msg,
> diff --git a/trailer.h b/trailer.h
> index b997739649..852c79d449 100644
> --- a/trailer.h
> +++ b/trailer.h
> @@ -72,6 +72,7 @@ struct process_trailer_options {
>  	int only_input;
>  	int unfold;
>  	int no_divider;
> +	char *filter_trailer;
>  };
>  
>  #define PROCESS_TRAILER_OPTIONS_INIT {0}
Previous: Anders WaldenborgNext: Jeff King
Message 2 of 69 in “pretty: Add %(trailer:X) to display single trailer”
  1. pretty: Add %(trailer:X) to display single trailerAnders Waldenborg, Oct 28, 2018
  2. Junio C HamanoOct 29, 2018
  3. Jeff KingOct 29, 2018
  4. Anders WaldenborgOct 29, 2018
  5. Jeff KingOct 31, 2018
  6. Anders WaldenborgOct 31, 2018
  7. Jeff KingNov 1, 2018
  8. 0/5 %(trailers) improvements in pretty formatAnders Waldenborg, Nov 4, 2018
  9. 1/5 pretty: single return path in %(trailers) handlingAnders Waldenborg, Nov 4, 2018
  10. 2/5 pretty: allow showing specific trailersAnders Waldenborg, Nov 4, 2018
  11. Eric SunshineNov 4, 2018
  12. Junio C HamanoNov 5, 2018
  13. Eric SunshineNov 5, 2018
  14. Anders WaldenborgNov 5, 2018
  15. Eric SunshineNov 5, 2018
  16. Junio C HamanoNov 5, 2018
  17. 3/5 pretty: add support for "nokey" option in %(trailers)Anders Waldenborg, Nov 4, 2018
  18. 4/5 pretty: extract fundamental placeholders to separate functionAnders Waldenborg, Nov 4, 2018
  19. Junio C HamanoNov 5, 2018
  20. Anders WaldenborgNov 5, 2018
  21. Junio C HamanoNov 6, 2018
  22. 5/5 pretty: add support for separator option in %(trailers)Anders Waldenborg, Nov 4, 2018
  23. Junio C HamanoNov 5, 2018
  24. Anders WaldenborgNov 5, 2018
  25. Junio C HamanoNov 6, 2018
  26. Junio C HamanoNov 5, 2018
  27. Eric SunshineNov 4, 2018
  28. Anders WaldenborgNov 5, 2018
  29. 0/5 %(trailers) improvements in pretty formatAnders Waldenborg, Nov 18, 2018
  30. 5/5 pretty: add support for separator option in %(trailers)Anders Waldenborg, Nov 18, 2018
  31. Eric SunshineNov 20, 2018
  32. 2/5 pretty: allow showing specific trailersAnders Waldenborg, Nov 18, 2018
  33. Junio C HamanoNov 20, 2018
  34. Junio C HamanoNov 20, 2018
  35. Anders WaldenborgNov 25, 2018
  36. Junio C HamanoNov 26, 2018
  37. Anders WaldenborgNov 26, 2018
  38. Junio C HamanoNov 26, 2018
  39. 3/5 pretty: add support for "valueonly" option in %(trailers)Anders Waldenborg, Nov 18, 2018
  40. Eric SunshineNov 20, 2018
  41. 1/5 pretty: single return path in %(trailers) handlingAnders Waldenborg, Nov 18, 2018
  42. 4/5 strbuf: separate callback for strbuf_expand:ing literalsAnders Waldenborg, Nov 18, 2018
  43. 0/7 %(trailers) improvements in pretty formatAnders Waldenborg, Dec 8, 2018
  44. 2/7 pretty: allow %(trailers) options with explicit valueAnders Waldenborg, Dec 8, 2018
  45. Junio C HamanoDec 10, 2018
  46. Anders WaldenborgDec 18, 2018
  47. Jeff KingJan 29, 2019
  48. Anders WaldenborgJan 29, 2019
  49. 1/7 doc: group pretty-format.txt placeholders descriptionsAnders Waldenborg, Dec 8, 2018
  50. 3/7 pretty: single return path in %(trailers) handlingAnders Waldenborg, Dec 8, 2018
  51. 5/7 pretty: add support for "valueonly" option in %(trailers)Anders Waldenborg, Dec 8, 2018
  52. 6/7 strbuf: separate callback for strbuf_expand:ing literalsAnders Waldenborg, Dec 8, 2018
  53. 7/7 pretty: add support for separator option in %(trailers)Anders Waldenborg, Dec 8, 2018
  54. 4/7 pretty: allow showing specific trailersAnders Waldenborg, Dec 8, 2018
  55. Junio C HamanoDec 10, 2018
  56. 0/7 %(trailers) improvements in pretty formatAnders Waldenborg, Jan 28, 2019
  57. 2/7 pretty: Allow %(trailers) options with explicit valueAnders Waldenborg, Jan 28, 2019
  58. Junio C HamanoJan 28, 2019
  59. Anders WaldenborgJan 29, 2019
  60. Jeff KingJan 29, 2019
  61. Anders WaldenborgJan 29, 2019
  62. 5/7 pretty: add support for "valueonly" option in %(trailers)Anders Waldenborg, Jan 28, 2019
  63. 7/7 pretty: add support for separator option in %(trailers)Anders Waldenborg, Jan 28, 2019
  64. 1/7 doc: group pretty-format.txt placeholders descriptionsAnders Waldenborg, Jan 28, 2019
  65. 6/7 strbuf: separate callback for strbuf_expand:ing literalsAnders Waldenborg, Jan 28, 2019
  66. 4/7 pretty: allow showing specific trailersAnders Waldenborg, Jan 28, 2019
  67. 3/7 pretty: single return path in %(trailers) handlingAnders Waldenborg, Jan 28, 2019
  68. Anders WaldenborgJan 31, 2019
  69. Оля ТележнаяFeb 2, 2019

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.