]> git.ipfire.org Git - thirdparty/git.git/commitdiff
pretty: implement 'reference' format
authorDenton Liu <liu.denton@gmail.com>
Wed, 20 Nov 2019 00:51:25 +0000 (16:51 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 20 Nov 2019 04:33:37 +0000 (13:33 +0900)
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>
Documentation/pretty-formats.txt
Documentation/pretty-options.txt
Documentation/rev-list-options.txt
contrib/completion/git-completion.bash
pretty.c
t/t4205-log-pretty-formats.sh

index 34bbc39273d516627f460a0be66757c92e0d2ace..0df418e60959813a7d86843c9009aa1e0476fb69 100644 (file)
@@ -63,6 +63,17 @@ This is designed to be as compact as possible.
 
               <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'
 
          From <hash> <date>
index e44fc8f7388d9a187416a573cc82c8a1d35897c5..a59426eefdaf0c08c010b3426d2923c43fa0d570 100644 (file)
@@ -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.
index bb1251c0364dc71880f6e63db7c6116ed859b90f..b94ed85c7aebbda9ffed5f66295a9c999d7e4f10 100644 (file)
@@ -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=reference`, this information will not be shown at all.
 
 --merge::
        After a failed merge, show refs that touch files having a
index 6bf91ab15452165bca5882c4bf54f657b3f884f5..889e707a057a89c5ad211c83e0ef9bf1f2525a01 100644 (file)
@@ -1737,7 +1737,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 ()
index 63fa60027677bce3487651b1874112828ed2f681..5fc8b730d82d7b6a3155c77ba5660be23058f769 100644 (file)
--- a/pretty.c
+++ b/pretty.c
@@ -98,7 +98,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, DATE_SHORT, "%C(auto)%h (%s, %ad)" },
                /*
                 * Please update $__git_log_pretty_formats in
                 * git-completion.bash when you add new formats.
index da9cacffea1c7806cdb51b3cd4dbd97ba0346336..a8ef3784cf123a19473dfd5b4cde456e813d7e9f 100755 (executable)
@@ -824,4 +824,47 @@ 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 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