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

[PATCH v3 09/10] pretty: implement 'reference' format

From
Denton Liu <liu.denton@gmail.com>
Date
Nov 14, 2019, 20:47 UTC
Message-ID
<470a2b0f4fd450af1d9c9d27ec0f0c91ea59117f.1573764280.git.liu.denton@gmail.com>
In-Reply-To
<cover.1573764280.git.liu.denton@gmail.com>

The standard format for referencing other commits within some projects (such as git.git) is the reference format. This is described in Documentation/SubmittingPatches as

	If you want to reference a previous commit in the history of a stable
	branch, use the format "abbreviated hash (subject, date)", like this:
	....
		Commit f86a374 (pack-bitmap.c: fix a memleak, 2015-03-30)
		noticed that ...
	....

Since this format is so commonly used, standardize it as a pretty format.

The tests that are implemented essentially show that the format-string does not change in response to various log options. This is useful because, for future developers, it shows that we've considered the limitations of the "canned format-string" approach and we are fine with them.

Based-on-a-patch-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Denton Liu <liu.denton@gmail.com>
---
 Documentation/pretty-formats.txt       | 10 +++++++
 Documentation/pretty-options.txt       |  2 +-
 Documentation/rev-list-options.txt     |  4 ++-
 contrib/completion/git-completion.bash |  2 +-
 pretty.c                               |  4 ++-
 t/t4205-log-pretty-formats.sh          | 36 ++++++++++++++++++++++++++
 6 files changed, 54 insertions(+), 4 deletions(-)
diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt
index 11979301ff..ee1a945bae 100644
--- a/Documentation/pretty-formats.txt
+++ b/Documentation/pretty-formats.txt
@@ -63,6 +63,16 @@ This is designed to be as compact as possible.
 
 	       <full commit message>
 
+* 'reference'
+
+	  <abbrev hash> (<title line>, <short author date>)
++
+This format is useful for referring to other commits when writing a new
+commit message. It uses the following canned user format:
+`%C(auto)%h (%s, %as)`. This means it will not respect options that
+change the output format such as `--date` `--no-abbrev-commit`, and
+`--walk-reflogs`.
+
 * 'email'
 
 	  From <hash> <date>
diff --git a/Documentation/pretty-options.txt b/Documentation/pretty-options.txt
index e44fc8f738..a59426eefd 100644
--- a/Documentation/pretty-options.txt
+++ b/Documentation/pretty-options.txt
@@ -3,7 +3,7 @@
 
 	Pretty-print the contents of the commit logs in a given format,
 	where '<format>' can be one of 'oneline', 'short', 'medium',
-	'full', 'fuller', 'email', 'raw', 'format:<string>'
+	'full', 'fuller', 'reference', 'email', 'raw', 'format:<string>'
 	and 'tformat:<string>'.  When '<format>' is none of the above,
 	and has '%placeholder' in it, it acts as if
 	'--pretty=tformat:<format>' were given.
diff --git a/Documentation/rev-list-options.txt b/Documentation/rev-list-options.txt
index 90ff9e2bea..91edeaf6d5 100644
--- a/Documentation/rev-list-options.txt
+++ b/Documentation/rev-list-options.txt
@@ -269,7 +269,7 @@ list.
 	exclude (that is, '{caret}commit', 'commit1..commit2',
 	and 'commit1\...commit2' notations cannot be used).
 +
-With `--pretty` format other than `oneline` (for obvious reasons),
+With `--pretty` format other than `oneline` and `reference` (for obvious reasons),
 this causes the output to have two extra lines of information
 taken from the reflog.  The reflog designator in the output may be shown
 as `ref@{Nth}` (where `Nth` is the reverse-chronological index in the
@@ -293,6 +293,8 @@ Under `--pretty=oneline`, the commit message is
 prefixed with this information on the same line.
 This option cannot be combined with `--reverse`.
 See also linkgit:git-reflog[1].
++
+Under `--pretty=summary`, this information will not be shown at all.
 
 --merge::
 	After a failed merge, show refs that touch files having a
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 557d0373c3..007e6a06d6 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -1749,7 +1749,7 @@ __git_log_shortlog_options="
 	--all-match --invert-grep
 "
 
-__git_log_pretty_formats="oneline short medium full fuller email raw format: tformat: mboxrd"
+__git_log_pretty_formats="oneline short medium full fuller reference email raw format: tformat: mboxrd"
 __git_log_date_formats="relative iso8601 iso8601-strict rfc2822 short local default raw unix format:"
 
 _git_log ()
diff --git a/pretty.c b/pretty.c
index 4d7f5e9aab..88a3bc621d 100644
--- a/pretty.c
+++ b/pretty.c
@@ -97,7 +97,9 @@ static void setup_commit_formats(void)
 		{ "mboxrd",	CMIT_FMT_MBOXRD,	0,	0 },
 		{ "fuller",	CMIT_FMT_FULLER,	0,	8 },
 		{ "full",	CMIT_FMT_FULL,		0,	8 },
-		{ "oneline",	CMIT_FMT_ONELINE,	1,	0 }
+		{ "oneline",	CMIT_FMT_ONELINE,	1,	0 },
+		{ "reference",	CMIT_FMT_USERFORMAT,	1,	0,
+			0, "%C(auto)%h (%s, %as)" },
 		/*
 		 * Please update $__git_log_pretty_formats in
 		 * git-completion.bash when you add new formats.
diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh
index da9cacffea..9a9a18f104 100755
--- a/t/t4205-log-pretty-formats.sh
+++ b/t/t4205-log-pretty-formats.sh
@@ -824,4 +824,40 @@ test_expect_success '%S in git log --format works with other placeholders (part
 	test_cmp expect actual
 '
 
+test_expect_success 'log --pretty=reference' '
+	git log --pretty="tformat:%h (%s, %as)" >expect &&
+	git log --pretty=reference >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'log --pretty=reference always uses short date' '
+	git log --pretty="tformat:%h (%s, %as)" >expect &&
+	git log --date=rfc --pretty=reference >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'log --pretty=reference is never unabbreviated' '
+	git log --pretty="tformat:%h (%s, %as)" >expect &&
+	git log --no-abbrev-commit --pretty=reference >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'log --pretty=reference is never decorated' '
+	git log --pretty="tformat:%h (%s, %as)" >expect &&
+	git log --decorate=short --pretty=reference >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'log --pretty=reference does not output reflog info' '
+	git log --walk-reflogs --pretty="tformat:%h (%s, %as)" >expect &&
+	git log --walk-reflogs --pretty=reference >actual &&
+	test_cmp expect actual
+'
+
+test_expect_success 'log --pretty=reference is colored appropriately' '
+	git log --color=always --pretty="tformat:%C(auto)%h (%s, %as)" >expect &&
+	git log --color=always --pretty=reference >actual &&
+	test_cmp expect actual
+'
+
 test_done
-- 
2.24.0.346.gee0de6d492
Previous: Denton LiuNext: Todd Zullinger
Message 48 of 81 in “learn the "summary" pretty format”
  1. 0/8 learn the "summary" pretty formatDenton Liu, Nov 4, 2019
  2. 1/8 pretty-formats.txt: use generic terms for hashDenton Liu, Nov 4, 2019
  3. 2/8 revision: make get_revision_mark() return const pointerDenton Liu, Nov 4, 2019
  4. 3/8 revision: change abbrev_commit_given to abbrev_commit_explicitDenton Liu, Nov 4, 2019
  5. 4/8 pretty.c: inline initalize format_contextDenton Liu, Nov 4, 2019
  6. 5/8 pretty.c: extract functionality to repo_format_commit_generic()Denton Liu, Nov 4, 2019
  7. 6/8 reflog-walk.c: don't print last newline with onelineDenton Liu, Nov 4, 2019
  8. Junio C HamanoNov 6, 2019
  9. Denton LiuNov 8, 2019
  10. 7/8 pretty: implement 'summary' formatDenton Liu, Nov 4, 2019
  11. Eric SunshineNov 4, 2019
  12. Denton LiuNov 4, 2019
  13. Eric SunshineNov 4, 2019
  14. Denton LiuNov 4, 2019
  15. 8/8 SubmittingPatches: use `--pretty=summary`Denton Liu, Nov 4, 2019
  16. 00/10 learn the "summary" pretty formatDenton Liu, Nov 8, 2019
  17. 01/10 SubmittingPatches: use generic terms for hashDenton Liu, Nov 8, 2019
  18. 02/10 pretty-formats.txt: use generic terms for hashDenton Liu, Nov 8, 2019
  19. 03/10 revision: make get_revision_mark() return const pointerDenton Liu, Nov 8, 2019
  20. 04/10 revision: change abbrev_commit_given to abbrev_commit_explicitDenton Liu, Nov 8, 2019
  21. 06/10 pretty.c: extract functionality to repo_format_commit_generic()Denton Liu, Nov 8, 2019
  22. 05/10 pretty.c: inline initalize format_contextDenton Liu, Nov 8, 2019
  23. 07/10 t4205: cover `git log --reflog -z` blindspotDenton Liu, Nov 8, 2019
  24. Eric SunshineNov 8, 2019
  25. Denton LiuNov 8, 2019
  26. Eric SunshineNov 8, 2019
  27. 08/10 reflog-walk.c: move where the newline is addedDenton Liu, Nov 8, 2019
  28. 09/10 pretty: implement 'summary' formatDenton Liu, Nov 8, 2019
  29. Eric SunshineNov 8, 2019
  30. René ScharfeNov 9, 2019
  31. Junio C HamanoNov 10, 2019
  32. Denton LiuNov 11, 2019
  33. SZEDER GáborNov 14, 2019
  34. Junio C HamanoNov 14, 2019
  35. René ScharfeNov 9, 2019
  36. SZEDER GáborNov 14, 2019
  37. 10/10 SubmittingPatches: use `--pretty=summary`Denton Liu, Nov 8, 2019
  38. 00/10 learn the "reference" pretty formatDenton Liu, Nov 14, 2019
  39. 01/10 SubmittingPatches: use generic terms for hashDenton Liu, Nov 14, 2019
  40. 02/10 pretty-formats.txt: use generic terms for hashDenton Liu, Nov 14, 2019
  41. 03/10 SubmittingPatches: remove dq from commit referenceDenton Liu, Nov 14, 2019
  42. 04/10 completion: complete `tformat:` pretty formatDenton Liu, Nov 14, 2019
  43. 05/10 revision: make get_revision_mark() return const pointerDenton Liu, Nov 14, 2019
  44. 06/10 pretty.c: inline initalize format_contextDenton Liu, Nov 14, 2019
  45. 07/10 t4205: cover `git log --reflog -z` blindspotDenton Liu, Nov 14, 2019
  46. 08/10 pretty: provide short date formatDenton Liu, Nov 14, 2019
  47. 10/10 SubmittingPatches: use `--pretty=reference`Denton Liu, Nov 14, 2019
  48. 09/10 pretty: implement 'reference' formatDenton Liu, Nov 14, 2019
  49. Todd ZullingerNov 15, 2019
  50. Junio C HamanoNov 15, 2019
  51. SZEDER GáborNov 15, 2019
  52. Junio C HamanoNov 16, 2019
  53. Junio C HamanoNov 18, 2019
  54. Junio C HamanoNov 18, 2019
  55. Eric SunshineNov 15, 2019
  56. 00/11 learn the "reference" pretty formatDenton Liu, Nov 19, 2019
  57. 01/11 SubmittingPatches: use generic terms for hashDenton Liu, Nov 19, 2019
  58. 02/11 pretty-formats.txt: use generic terms for hashDenton Liu, Nov 19, 2019
  59. 03/11 SubmittingPatches: remove dq from commit referenceDenton Liu, Nov 19, 2019
  60. 04/11 completion: complete `tformat:` pretty formatDenton Liu, Nov 19, 2019
  61. 05/11 revision: make get_revision_mark() return const pointerDenton Liu, Nov 19, 2019
  62. 06/11 pretty.c: inline initalize format_contextDenton Liu, Nov 19, 2019
  63. 07/11 t4205: cover `git log --reflog -z` blindspotDenton Liu, Nov 19, 2019
  64. 08/11 pretty: provide short date formatDenton Liu, Nov 19, 2019
  65. 09/11 pretty: implement 'reference' formatDenton Liu, Nov 19, 2019
  66. 10/11 SubmittingPatches: use `--pretty=reference`Denton Liu, Nov 19, 2019
  67. 11/11 squash! pretty: implement 'reference' formatDenton Liu, Nov 19, 2019
  68. Junio C HamanoNov 19, 2019
  69. 00/11 learn the "reference" pretty formatDenton Liu, Nov 20, 2019
  70. 01/11 SubmittingPatches: use generic terms for hashDenton Liu, Nov 20, 2019
  71. 02/11 pretty-formats.txt: use generic terms for hashDenton Liu, Nov 20, 2019
  72. 03/11 SubmittingPatches: remove dq from commit referenceDenton Liu, Nov 20, 2019
  73. 04/11 completion: complete `tformat:` pretty formatDenton Liu, Nov 20, 2019
  74. 05/11 revision: make get_revision_mark() return const pointerDenton Liu, Nov 20, 2019
  75. 06/11 pretty.c: inline initalize format_contextDenton Liu, Nov 20, 2019
  76. 07/11 t4205: cover `git log --reflog -z` blindspotDenton Liu, Nov 20, 2019
  77. 08/11 pretty: provide short date formatDenton Liu, Nov 20, 2019
  78. 09/11 pretty: add struct cmt_fmt_map::default_date_mode_typeDenton Liu, Nov 20, 2019
  79. Junio C HamanoNov 20, 2019
  80. 10/11 pretty: implement 'reference' formatDenton Liu, Nov 20, 2019
  81. 11/11 SubmittingPatches: use `--pretty=reference`Denton Liu, Nov 20, 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.