pretty: implement 'reference' format

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>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Denton Liu 2019-11-19 16:51:25 -08:00 committed by Junio C Hamano
parent 618a855083
commit 1f0fc1db85
6 changed files with 62 additions and 4 deletions

View File

@ -63,6 +63,17 @@ This is designed to be as compact as possible.


<full commit message> <full commit message>


* 'reference'

<abbrev hash> (<title line>, <short author date>)
+
This format is used to refer to another commit in a commit message and
is the same as `--pretty='format:%C(auto)%h (%s, %ad)'`. By default,
the date is formatted with `--date=short` unless another `--date` option
is explicitly specified. As with any `format:` with format
placeholders, its output is not affected by other options like
`--decorate` and `--walk-reflogs`.

* 'email' * 'email'


From <hash> <date> From <hash> <date>

View File

@ -3,7 +3,7 @@


Pretty-print the contents of the commit logs in a given format, Pretty-print the contents of the commit logs in a given format,
where '<format>' can be one of 'oneline', 'short', 'medium', 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 'tformat:<string>'. When '<format>' is none of the above,
and has '%placeholder' in it, it acts as if and has '%placeholder' in it, it acts as if
'--pretty=tformat:<format>' were given. '--pretty=tformat:<format>' were given.

View File

@ -269,7 +269,7 @@ list.
exclude (that is, '{caret}commit', 'commit1..commit2', exclude (that is, '{caret}commit', 'commit1..commit2',
and 'commit1\...commit2' notations cannot be used). 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 this causes the output to have two extra lines of information
taken from the reflog. The reflog designator in the output may be shown 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 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. prefixed with this information on the same line.
This option cannot be combined with `--reverse`. This option cannot be combined with `--reverse`.
See also linkgit:git-reflog[1]. See also linkgit:git-reflog[1].
+
Under `--pretty=reference`, this information will not be shown at all.


--merge:: --merge::
After a failed merge, show refs that touch files having a After a failed merge, show refs that touch files having a

View File

@ -1737,7 +1737,7 @@ __git_log_shortlog_options="
--all-match --invert-grep --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_date_formats="relative iso8601 iso8601-strict rfc2822 short local default raw unix format:"


_git_log () _git_log ()

View File

@ -98,7 +98,9 @@ static void setup_commit_formats(void)
{ "mboxrd", CMIT_FMT_MBOXRD, 0, 0 }, { "mboxrd", CMIT_FMT_MBOXRD, 0, 0 },
{ "fuller", CMIT_FMT_FULLER, 0, 8 }, { "fuller", CMIT_FMT_FULLER, 0, 8 },
{ "full", CMIT_FMT_FULL, 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, DATE_SHORT, "%C(auto)%h (%s, %ad)" },
/* /*
* Please update $__git_log_pretty_formats in * Please update $__git_log_pretty_formats in
* git-completion.bash when you add new formats. * git-completion.bash when you add new formats.

View File

@ -824,4 +824,47 @@ test_expect_success '%S in git log --format works with other placeholders (part
test_cmp expect actual 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 with log.date is overridden by short date' '
git log --pretty="tformat:%h (%s, %as)" >expect &&
test_config log.date rfc &&
git log --pretty=reference >actual &&
test_cmp expect actual
'

test_expect_success 'log --pretty=reference with explicit date overrides short date' '
git log --date=rfc --pretty="tformat:%h (%s, %ad)" >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 test_done