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

Re: [PATCH v7 4/5] format-patch: add commitListFormat config

From
Junio C Hamano <gitster@pobox.com>
Date
Mar 10, 2026, 16:45 UTC
Message-ID
<xmqqikb3ws3e.fsf@gitster.g>
In-Reply-To
<6b160915-1cdf-48b5-abe4-3efd0771598e@gmail.com>
Phillip Wood <phillip.wood123@gmail.com> writes:
Show 10 quoted lines
>> Possible values:
>>    - commitListFormat is set but no string is passed: it will default to
>>      "[%(count)/%(total)] %s"
>
> It is unusual for an empty config value to mean something different from 
> it not being set. The reason for this is that it allows
>
>      git -c config.key some-command
>
> to act as though config.key was not set.

That syntax is the same as setting config.key=true; disabling the feature triggered by config.key is quite counter-intuitive, isn't it?

We are by default using "shortlog", but use of this configuration variable is a sign that the user wants to use a more modern custom format that is not the traditional "shortlog". It would be quite natural to invoke the modern default by setting it to "true" (i.e., "I want to enable the new format.commitlistformat feature, but I am not saying which format, and the "log:[%(count)/%(total)] %s" format is used).

Perhaps "format.commitlistformat = false" should disable the modern format and fall back to "shortlog", setting it to true (including the use of "valueless true" syntax) should enable it and use the modern default "log:[%c/%t] %s" format, and non-bool text should be used as a custom specification ("shortlog", or "log:<format>")?

I.e.
	switch (git_parse_maybe_bool_text(value)) {
        case 0: /* false */
		fmt_cover_letter_commit_list = "shortlog";
		break;
	case 1: /* true - use the modern default format */
		fmt_cover_letter_commit_list = "log:[%c/%t] %s";
		break;		
	default:
		fmt_cover_letter_commit_list = value;
		break;
	}
Hmm?
> It would be nice to support a default format on the commandline as well.
Show 143 quoted lines
>
>>    - if a string is passed: will use it as a format spec. Note that this
>>      is either "shortlog" or a format spec prefixed by "log:"
>>      e.g."log:%s (%an)"
>
> Having the config value behave like --cover-letter-format=<value> is 
> sensible
>
>>    - if commitListFormat is not set: it will default to the shortlog
>>      format.
>
> makes sense
>
> Thanks
>
> Phillip
>
>> Signed-off-by: Mirko Faina <mroik@delayed.space>
>> ---
>>   builtin/log.c           | 21 ++++++++++++++++
>>   t/t4014-format-patch.sh | 53 +++++++++++++++++++++++++++++++++++++++++
>>   2 files changed, 74 insertions(+)
>> 
>> diff --git a/builtin/log.c b/builtin/log.c
>> index 95e5d9755f..5fec0ddaf9 100644
>> --- a/builtin/log.c
>> +++ b/builtin/log.c
>> @@ -886,6 +886,7 @@ struct format_config {
>>   	char *signature;
>>   	char *signature_file;
>>   	enum cover_setting config_cover_letter;
>> +	char *fmt_cover_letter_commit_list;
>>   	char *config_output_directory;
>>   	enum cover_from_description cover_from_description_mode;
>>   	int show_notes;
>> @@ -930,6 +931,7 @@ static void format_config_release(struct format_config *cfg)
>>   	string_list_clear(&cfg->extra_cc, 0);
>>   	strbuf_release(&cfg->sprefix);
>>   	free(cfg->fmt_patch_suffix);
>> +	free(cfg->fmt_cover_letter_commit_list);
>>   }
>>   
>>   static enum cover_from_description parse_cover_from_description(const char *arg)
>> @@ -1052,6 +1054,19 @@ static int git_format_config(const char *var, const char *value,
>>   		cfg->config_cover_letter = git_config_bool(var, value) ? COVER_ON : COVER_OFF;
>>   		return 0;
>>   	}
>> +	if (!strcmp(var, "format.commitlistformat")) {
>> +		struct strbuf tmp = STRBUF_INIT;
>> +		strbuf_init(&tmp, 0);
>> +		if (value)
>> +			strbuf_addstr(&tmp, value);
>> +		else
>> +			strbuf_addstr(&tmp, "log:[%(count)/%(total)] %s");
>> +
>> +		FREE_AND_NULL(cfg->fmt_cover_letter_commit_list);
>> +		git_config_string(&cfg->fmt_cover_letter_commit_list, var, tmp.buf);
>
>
>
>> +		strbuf_release(&tmp);
>> +		return 0;
>> +	}
>>   	if (!strcmp(var, "format.outputdirectory")) {
>>   		FREE_AND_NULL(cfg->config_output_directory);
>>   		return git_config_string(&cfg->config_output_directory, var, value);
>> @@ -2329,6 +2344,12 @@ int cmd_format_patch(int argc,
>>   		goto done;
>>   	total = list.nr;
>>   
>> +	if (!cover_letter_fmt) {
>> +		cover_letter_fmt = cfg.fmt_cover_letter_commit_list;
>> +		if (!cover_letter_fmt)
>> +			cover_letter_fmt = "shortlog";
>> +	}
>> +
>>   	if (cover_letter == -1) {
>>   		if (cfg.config_cover_letter == COVER_AUTO)
>>   			cover_letter = (total > 1);
>> diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh
>> index 458da80721..4891389a53 100755
>> --- a/t/t4014-format-patch.sh
>> +++ b/t/t4014-format-patch.sh
>> @@ -428,6 +428,59 @@ test_expect_success 'cover letter no format' '
>>   	test_line_count = 1 result
>>   '
>>   
>> +test_expect_success 'cover letter config with count, subject and author' '
>> +	test_when_finished "rm -rf patches result" &&
>> +	test_when_finished "git config unset format.coverletter" &&
>> +	test_when_finished "git config unset format.commitlistformat" &&
>> +	git config set format.coverletter true &&
>> +	git config set format.commitlistformat "log:[%(count)/%(total)] %s (%an)" &&
>> +	git format-patch -o patches HEAD~2 &&
>> +	grep -E "^[[[:digit:]]+/[[:digit:]]+] .* \(A U Thor\)" patches/0000-cover-letter.patch >result &&
>> +	test_line_count = 2 result
>> +'
>> +
>> +test_expect_success 'cover letter config with count and author' '
>> +	test_when_finished "rm -rf patches result" &&
>> +	test_when_finished "git config unset format.coverletter" &&
>> +	test_when_finished "git config unset format.commitlistformat" &&
>> +	git config set format.coverletter true &&
>> +	git config set format.commitlistformat "log:[%(count)/%(total)] (%an)" &&
>> +	git format-patch -o patches HEAD~2 &&
>> +	grep -E "^[[[:digit:]]+/[[:digit:]]+] \(A U Thor\)" patches/0000-cover-letter.patch >result &&
>> +	test_line_count = 2 result
>> +'
>> +
>> +test_expect_success 'cover letter config commitlistformat set but no format' '
>> +	test_when_finished "rm -rf patches result" &&
>> +	test_when_finished "git config unset format.coverletter" &&
>> +	test_when_finished "git config unset format.commitlistformat" &&
>> +	git config set format.coverletter true &&
>> +	printf "\tcommitlistformat" >> .git/config &&
>> +	git format-patch -o patches HEAD~2 &&
>> +	grep -E "^[[[:digit:]]+/[[:digit:]]+] .*" patches/0000-cover-letter.patch >result &&
>> +	test_line_count = 2 result
>> +'
>> +
>> +test_expect_success 'cover letter config commitlistformat set to shortlog' '
>> +	test_when_finished "rm -rf patches result" &&
>> +	test_when_finished "git config unset format.coverletter" &&
>> +	test_when_finished "git config unset format.commitlistformat" &&
>> +	git config set format.coverletter true &&
>> +	git config set format.commitlistformat shortlog &&
>> +	git format-patch -o patches HEAD~2 &&
>> +	grep -E "^A U Thor \([[:digit:]]+\)" patches/0000-cover-letter.patch >result &&
>> +	test_line_count = 1 result
>> +'
>> +
>> +test_expect_success 'cover letter config commitlistformat not set' '
>> +	test_when_finished "rm -rf patches result" &&
>> +	test_when_finished "git config unset format.coverletter" &&
>> +	git config set format.coverletter true &&
>> +	git format-patch -o patches HEAD~2 &&
>> +	grep -E "^A U Thor \([[:digit:]]+\)" patches/0000-cover-letter.patch >result &&
>> +	test_line_count = 1 result
>> +'
>> +
>>   test_expect_success 'reroll count' '
>>   	rm -fr patches &&
>>   	git format-patch -o patches --cover-letter --reroll-count 4 main..side >list &&
Previous: Phillip WoodNext: Mirko Faina
Message 84 of 113 in “format-patch: better commit list for cover letter”
  1. format-patch: better commit list for cover letterMirko Faina, Feb 20, 2026
  2. format-patch: better commit list for cover letterMirko Faina, Feb 20, 2026
  3. Mirko FainaFeb 21, 2026
  4. Junio C HamanoFeb 21, 2026
  5. Mirko FainaFeb 21, 2026
  6. Junio C HamanoFeb 21, 2026
  7. Junio C HamanoFeb 21, 2026
  8. Mirko FainaFeb 21, 2026
  9. Junio C HamanoFeb 21, 2026
  10. Mirko FainaFeb 21, 2026
  11. 0/3 format-patch: add cover-letter-format optionMirko Faina, Feb 24, 2026
  12. 1/3 pretty.c: fix null pointer dereferenceMirko Faina, Feb 24, 2026
  13. 2/3 format-patch: add ability to use alt cover formatMirko Faina, Feb 24, 2026
  14. 3/3 format-patch: add commitListFormat configMirko Faina, Feb 24, 2026
  15. Mirko FainaFeb 24, 2026
  16. Junio C HamanoFeb 24, 2026
  17. Mirko FainaFeb 24, 2026
  18. Mirko FainaFeb 24, 2026
  19. Jeff KingFeb 24, 2026
  20. Jeff KingFeb 24, 2026
  21. Mirko FainaFeb 24, 2026
  22. Jeff KingFeb 24, 2026
  23. 0/2 format-patch: add cover-letter-format optionMirko Faina, Feb 24, 2026
  24. 1/2 format-patch: add ability to use alt cover formatMirko Faina, Feb 24, 2026
  25. 2/2 format-patch: add commitListFormat configMirko Faina, Feb 24, 2026
  26. Junio C HamanoFeb 24, 2026
  27. Junio C HamanoFeb 24, 2026
  28. Junio C HamanoFeb 24, 2026
  29. Junio C HamanoFeb 24, 2026
  30. Junio C HamanoFeb 24, 2026
  31. Mirko FainaFeb 24, 2026
  32. Mirko FainaFeb 25, 2026
  33. Mirko FainaFeb 25, 2026
  34. Junio C HamanoFeb 25, 2026
  35. Junio C HamanoFeb 25, 2026
  36. Jeff KingFeb 25, 2026
  37. Jeff KingFeb 25, 2026
  38. Junio C HamanoFeb 25, 2026
  39. Mirko FainaFeb 25, 2026
  40. Mirko FainaFeb 26, 2026
  41. Junio C HamanoFeb 26, 2026
  42. 1/4 pretty.c: add %(count) and %(total) placeholdersMirko Faina, Feb 27, 2026
  43. 0/4 format-patch: add cover-letter-format optionMirko Faina, Feb 27, 2026
  44. 2/4 format-patch: move cover letter summary generationMirko Faina, Feb 27, 2026
  45. 4/4 format-patch: add commitListFormat configMirko Faina, Feb 27, 2026
  46. 3/4 format-patch: add ability to use alt cover formatMirko Faina, Feb 27, 2026
  47. Junio C HamanoFeb 27, 2026
  48. Mirko FainaFeb 27, 2026
  49. 0/4 format-patch: add cover-letter-format optionMirko Faina, Feb 27, 2026
  50. 1/4 pretty.c: add %(count) and %(total) placeholdersMirko Faina, Feb 27, 2026
  51. 3/4 format-patch: add ability to use alt cover formatMirko Faina, Feb 27, 2026
  52. 2/4 format-patch: move cover letter summary generationMirko Faina, Feb 27, 2026
  53. 4/4 format-patch: add commitListFormat configMirko Faina, Feb 27, 2026
  54. 5/4 docs: add usage for the cover-letter fmt featureMirko Faina, Feb 27, 2026
  55. Junio C HamanoFeb 27, 2026
  56. Mirko FainaFeb 27, 2026
  57. Junio C HamanoFeb 27, 2026
  58. 0/5 format-patch: add cover-letter-format optionMirko Faina, Feb 27, 2026
  59. 1/5 pretty.c: add %(count) and %(total) placeholdersMirko Faina, Feb 27, 2026
  60. 2/5 format-patch: move cover letter summary generationMirko Faina, Feb 27, 2026
  61. 3/5 format-patch: add ability to use alt cover formatMirko Faina, Feb 27, 2026
  62. 4/5 format-patch: add commitListFormat configMirko Faina, Feb 27, 2026
  63. 5/5 docs: add usage for the cover-letter fmt featureMirko Faina, Feb 27, 2026
  64. Junio C HamanoMar 6, 2026
  65. Mirko FainaMar 6, 2026
  66. 1/5 pretty.c: add %(count) and %(total) placeholdersMirko Faina, Mar 6, 2026
  67. 0/5 format-patch: add cover-letter-format optionMirko Faina, Mar 6, 2026
  68. 2/5 format-patch: move cover letter summary generationMirko Faina, Mar 6, 2026
  69. 3/5 format-patch: add ability to use alt cover formatMirko Faina, Mar 6, 2026
  70. 4/5 format-patch: add commitListFormat configMirko Faina, Mar 6, 2026
  71. 5/5 docs: add usage for the cover-letter fmt featureMirko Faina, Mar 6, 2026
  72. Junio C HamanoMar 6, 2026
  73. 0/5 format-patch: add cover-letter-format optionMirko Faina, Mar 6, 2026
  74. 1/5 pretty.c: add %(count) and %(total) placeholdersMirko Faina, Mar 6, 2026
  75. 2/5 format-patch: move cover letter summary generationMirko Faina, Mar 6, 2026
  76. 3/5 format-patch: add ability to use alt cover formatMirko Faina, Mar 6, 2026
  77. 4/5 format-patch: add commitListFormat configMirko Faina, Mar 6, 2026
  78. 5/5 docs: add usage for the cover-letter fmt featureMirko Faina, Mar 6, 2026
  79. Bert WesargMar 10, 2026
  80. Phillip WoodMar 10, 2026
  81. Phillip WoodMar 10, 2026
  82. Phillip WoodMar 10, 2026
  83. Phillip WoodMar 10, 2026
  84. Junio C HamanoMar 10, 2026
  85. Mirko FainaMar 10, 2026
  86. MroikMar 10, 2026
  87. Mirko FainaMar 10, 2026
  88. Mirko FainaMar 10, 2026
  89. Junio C HamanoMar 10, 2026
  90. Mirko FainaMar 10, 2026
  91. Phillip WoodMar 11, 2026
  92. Phillip WoodMar 11, 2026
  93. Junio C HamanoMar 11, 2026
  94. Junio C HamanoMar 11, 2026
  95. 0/4 format-patch: add cover-letter-format optionMirko Faina, Mar 12, 2026
  96. 1/4 format-patch: move cover letter summary generationMirko Faina, Mar 12, 2026
  97. 2/4 format-patch: add ability to use alt cover formatMirko Faina, Mar 12, 2026
  98. 3/4 format-patch: add "chronological" format for coverMirko Faina, Mar 12, 2026
  99. 4/4 format-patch: add commitListFormat configMirko Faina, Mar 12, 2026
  100. Junio C HamanoMar 12, 2026
  101. Junio C HamanoMar 12, 2026
  102. Junio C HamanoMar 12, 2026
  103. Junio C HamanoMar 12, 2026
  104. Mirko FainaMar 12, 2026
  105. Junio C HamanoMar 12, 2026
  106. Junio C HamanoMar 12, 2026
  107. Junio C HamanoMar 12, 2026
  108. Mirko FainaMar 12, 2026
  109. Junio C HamanoMar 12, 2026
  110. Phillip WoodMar 13, 2026
  111. Junio C HamanoMar 13, 2026
  112. Mirko FainaMar 13, 2026
  113. Junio C HamanoMar 13, 2026

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.