From: Denton Liu <liu.denton@gmail.com>
To: Git Mailing List <git@vger.kernel.org>
Subject: [PATCH 7/8] pretty: implement 'summary' format
Date: Mon, 4 Nov 2019 15:04:04 -0500 [thread overview]
Message-ID: <64b6f7c9d7434ba39929220c1aebcd9a1fd0ad6e.1572897736.git.liu.denton@gmail.com> (raw)
In-Reply-To: <cover.1572897736.git.liu.denton@gmail.com>
The standard format for referencing other commits within some projects
(such as git.git) is the summary 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 sha1 (subject, date)",
with the subject enclosed in a pair of double-quotes, 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.
This format is implemented as a separate flow that skips most of
pretty_print_commit() and instead calls format_commit_summary(). The
reason why this is done is because the other pretty formats expect
output to be generated in a specific order. Specifically, the header,
including the date, is always printed before the commit message,
including the subject. Reversing the order would be possible but would
involve butchering pretty_print_commit() so it is implemented as a
separate flow.
Signed-off-by: Denton Liu <liu.denton@gmail.com>
---
Documentation/pretty-formats.txt | 9 ++++++
Documentation/pretty-options.txt | 2 +-
Documentation/rev-list-options.txt | 2 +-
builtin/log.c | 30 ++++++++++++++---
log-tree.c | 11 +++++--
pretty.c | 31 +++++++++++++++++-
pretty.h | 1 +
t/t4205-log-pretty-formats.sh | 52 ++++++++++++++++++++++++++++++
8 files changed, 127 insertions(+), 11 deletions(-)
diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt
index 71eef684d0..5641903b93 100644
--- a/Documentation/pretty-formats.txt
+++ b/Documentation/pretty-formats.txt
@@ -63,6 +63,15 @@ This is designed to be as compact as possible.
<full commit message>
+* 'summary'
+
+ <abbrev hash> ("<title line>", <short author date>)
++
+This format is useful for referring to other commits when writing a new
+commit message. Although by default, '<abbrev sha1>' is used, this can
+be overridden with '--no-abbrev'. In addition, '<short author date>' can
+be overridden by with '--date='.
+
* 'email'
From <hash> <date>
diff --git a/Documentation/pretty-options.txt b/Documentation/pretty-options.txt
index e44fc8f738..0a5b206193 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', 'summary', '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..76df494ed6 100644
--- a/Documentation/rev-list-options.txt
+++ b/Documentation/rev-list-options.txt
@@ -289,7 +289,7 @@ depending on a few rules:
4. Otherwise, show the index format.
--
+
-Under `--pretty=oneline`, the commit message is
+Under `--pretty=oneline` and `--pretty=summary`, 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].
diff --git a/builtin/log.c b/builtin/log.c
index e4df16be79..ad96a746a3 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -223,15 +223,35 @@ static void cmd_log_init_finish(int argc, const char **argv, const char *prefix,
read_mailmap(rev->mailmap, NULL);
}
- if (rev->pretty_given && rev->commit_format == CMIT_FMT_RAW) {
+ if (rev->pretty_given) {
+ switch (rev->commit_format) {
+
/*
* "log --pretty=raw" is special; ignore UI oriented
* configuration variables such as decoration.
*/
- if (!decoration_given)
- decoration_style = 0;
- if (!rev->abbrev_commit_explicit)
- rev->abbrev_commit = 0;
+ case CMIT_FMT_RAW:
+ if (!decoration_given)
+ decoration_style = 0;
+ if (!rev->abbrev_commit_explicit)
+ rev->abbrev_commit = 0;
+ break;
+
+ /*
+ * "log --pretty=summary" is special; ignore UI oriented
+ * configuration variables such as decoration but keep
+ * abbreviations.
+ */
+ case CMIT_FMT_SUMMARY:
+ if (!decoration_given)
+ decoration_style = 0;
+ if (!rev->abbrev_commit_explicit)
+ rev->abbrev_commit = 1;
+ break;
+
+ default:
+ break;
+ }
}
if (decoration_style) {
diff --git a/log-tree.c b/log-tree.c
index 4a7d668af6..433adaf0f1 100644
--- a/log-tree.c
+++ b/log-tree.c
@@ -627,7 +627,8 @@ void show_log(struct rev_info *opt)
ctx.print_email_subject = 1;
} else if (opt->commit_format != CMIT_FMT_USERFORMAT) {
fputs(diff_get_color_opt(&opt->diffopt, DIFF_COMMIT), opt->diffopt.file);
- if (opt->commit_format != CMIT_FMT_ONELINE)
+ if (opt->commit_format != CMIT_FMT_ONELINE &&
+ opt->commit_format != CMIT_FMT_SUMMARY)
fputs("commit ", opt->diffopt.file);
if (!opt->graph)
@@ -644,7 +645,8 @@ void show_log(struct rev_info *opt)
find_unique_abbrev(&parent->object.oid, abbrev_commit));
fputs(diff_get_color_opt(&opt->diffopt, DIFF_RESET), opt->diffopt.file);
show_decorations(opt, commit);
- if (opt->commit_format == CMIT_FMT_ONELINE) {
+ if (opt->commit_format == CMIT_FMT_ONELINE ||
+ opt->commit_format == CMIT_FMT_SUMMARY) {
putc(' ', opt->diffopt.file);
} else {
putc('\n', opt->diffopt.file);
@@ -658,12 +660,15 @@ void show_log(struct rev_info *opt)
* graph info here.
*/
show_reflog_message(opt->reflog_info,
- opt->commit_format == CMIT_FMT_ONELINE,
+ (opt->commit_format == CMIT_FMT_ONELINE ||
+ opt->commit_format == CMIT_FMT_SUMMARY),
&opt->date_mode,
opt->date_mode_explicit);
if (opt->commit_format == CMIT_FMT_ONELINE) {
putc('\n', opt->diffopt.file);
return;
+ } else if (opt->commit_format == CMIT_FMT_SUMMARY) {
+ putc(' ', opt->diffopt.file);
}
}
}
diff --git a/pretty.c b/pretty.c
index a6e5fc115a..8efb2486a5 100644
--- a/pretty.c
+++ b/pretty.c
@@ -97,7 +97,8 @@ 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 },
+ { "summary", CMIT_FMT_SUMMARY, 1, 0 },
/*
* Please update $__git_log_pretty_formats in
* git-completion.bash when you add new formats.
@@ -1672,6 +1673,26 @@ void repo_format_commit_message(struct repository *r,
do_repo_format_commit_message, (void *)format);
}
+static void do_repo_format_commit_summary(struct strbuf *sb,
+ struct format_commit_context *context,
+ void *additional_context)
+{
+ struct ident_split ident;
+
+ parse_commit_header(context);
+ parse_commit_message(context);
+
+ strbuf_addstr(sb, "(\"");
+ format_subject(sb, context->message + context->subject_off, " ");
+ if (!split_ident_line(&ident,
+ context->message + context->author.off,
+ context->author.len)) {
+ strbuf_addstr(sb, "\", ");
+ strbuf_addstr(sb, show_ident_date(&ident, &context->pretty_ctx->date_mode));
+ }
+ strbuf_addstr(sb, ")");
+}
+
static void pp_header(struct pretty_print_context *pp,
const char *encoding,
const struct commit *commit,
@@ -1923,6 +1944,14 @@ void pretty_print_commit(struct pretty_print_context *pp,
format_commit_message(commit, user_format, sb, pp);
return;
}
+ if (pp->fmt == CMIT_FMT_SUMMARY) {
+ if (!pp->date_mode_explicit)
+ pp->date_mode = *DATE_MODE(SHORT);
+
+ repo_format_commit_generic(the_repository, commit, sb, pp,
+ do_repo_format_commit_summary, NULL);
+ return;
+ }
encoding = get_log_output_encoding();
msg = reencoded = logmsg_reencode(commit, NULL, encoding);
diff --git a/pretty.h b/pretty.h
index 4ad1fc31ff..6d5b18a4f1 100644
--- a/pretty.h
+++ b/pretty.h
@@ -16,6 +16,7 @@ enum cmit_fmt {
CMIT_FMT_FULL,
CMIT_FMT_FULLER,
CMIT_FMT_ONELINE,
+ CMIT_FMT_SUMMARY,
CMIT_FMT_EMAIL,
CMIT_FMT_MBOXRD,
CMIT_FMT_USERFORMAT,
diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh
index f42a69faa2..09b1a33cf1 100755
--- a/t/t4205-log-pretty-formats.sh
+++ b/t/t4205-log-pretty-formats.sh
@@ -788,4 +788,56 @@ test_expect_success '%S in git log --format works with other placeholders (part
test_cmp expect actual
'
+test_expect_success 'log --pretty=summary' '
+ git log --date=short --pretty="tformat:%h (\"%s\", %ad)" >expect &&
+ git log --pretty=summary >actual &&
+ test_cmp expect actual
+'
+
+test_expect_success 'log --pretty=summary with log.date is overridden by short date' '
+ git log --date=short --pretty="tformat:%h (\"%s\", %ad)" >expect &&
+ test_config log.date rfc &&
+ git log --pretty=summary >actual &&
+ test_cmp expect actual
+'
+
+test_expect_success 'log --pretty=summary with explicit date overrides short date' '
+ git log --date=rfc --pretty="tformat:%h (\"%s\", %ad)" >expect &&
+ git log --date=rfc --pretty=summary >actual &&
+ test_cmp expect actual
+'
+
+test_expect_success 'log --pretty=summary with log.abbrevCommit is overidden' '
+ git log --date=short --pretty="tformat:%h (\"%s\", %ad)" >expect &&
+ test_config log.abbrevCommit false &&
+ git log --pretty=summary >actual &&
+ test_cmp expect actual
+'
+
+test_expect_success 'log --pretty=summary with explicit --no-abbrev overrides abbreviated' '
+ git log --date=short --pretty="tformat:%H (\"%s\", %ad)" >expect &&
+ git log --no-abbrev --pretty=summary >actual &&
+ test_cmp expect actual
+'
+
+test_expect_success 'log --pretty=summary with log.decorate is overridden' '
+ git log --date=short --pretty="tformat:%h (\"%s\", %ad)" >expect &&
+ test_config log.decorate short &&
+ git log --pretty=summary >actual &&
+ test_cmp expect actual
+'
+
+test_expect_success 'log --pretty=summary with explicit decorate overrides no decoration' '
+ git log --date=short --pretty="tformat:%h%d (\"%s\", %ad)" >expect &&
+ git log --decorate=short --pretty=summary >actual &&
+ test_cmp expect actual
+'
+
+test_expect_success 'log --pretty=summary with --walk-reflogs' '
+ test_config log.date short &&
+ git log --walk-reflogs --pretty="tformat:%h %gd: %gs (\"%s\", %ad)" >expect &&
+ git log --walk-reflogs --pretty=summary >actual &&
+ test_cmp expect actual
+'
+
test_done
--
2.24.0.rc2.262.g2d07a97ef5
next prev parent reply other threads:[~2019-11-04 20:04 UTC|newest]
Thread overview: 81+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-04 20:03 [PATCH 0/8] learn the "summary" pretty format Denton Liu
2019-11-04 20:03 ` [PATCH 1/8] pretty-formats.txt: use generic terms for hash Denton Liu
2019-11-04 20:03 ` [PATCH 2/8] revision: make get_revision_mark() return const pointer Denton Liu
2019-11-04 20:03 ` [PATCH 3/8] revision: change abbrev_commit_given to abbrev_commit_explicit Denton Liu
2019-11-04 20:03 ` [PATCH 4/8] pretty.c: inline initalize format_context Denton Liu
2019-11-04 20:03 ` [PATCH 5/8] pretty.c: extract functionality to repo_format_commit_generic() Denton Liu
2019-11-04 20:04 ` [PATCH 6/8] reflog-walk.c: don't print last newline with oneline Denton Liu
2019-11-06 5:12 ` Junio C Hamano
2019-11-08 8:50 ` Denton Liu
2019-11-04 20:04 ` Denton Liu [this message]
2019-11-04 20:16 ` [PATCH 7/8] pretty: implement 'summary' format Eric Sunshine
2019-11-04 20:35 ` Denton Liu
2019-11-04 20:38 ` Eric Sunshine
2019-11-04 20:45 ` Denton Liu
2019-11-04 20:04 ` [PATCH 8/8] SubmittingPatches: use `--pretty=summary` Denton Liu
2019-11-08 20:08 ` [PATCH v2 00/10] learn the "summary" pretty format Denton Liu
2019-11-08 20:08 ` [PATCH v2 01/10] SubmittingPatches: use generic terms for hash Denton Liu
2019-11-08 20:08 ` [PATCH v2 02/10] pretty-formats.txt: " Denton Liu
2019-11-08 20:08 ` [PATCH v2 03/10] revision: make get_revision_mark() return const pointer Denton Liu
2019-11-08 20:08 ` [PATCH v2 04/10] revision: change abbrev_commit_given to abbrev_commit_explicit Denton Liu
2019-11-08 20:08 ` [PATCH v2 05/10] pretty.c: inline initalize format_context Denton Liu
2019-11-08 20:08 ` [PATCH v2 06/10] pretty.c: extract functionality to repo_format_commit_generic() Denton Liu
2019-11-08 20:08 ` [PATCH v2 07/10] t4205: cover `git log --reflog -z` blindspot Denton Liu
2019-11-08 20:36 ` Eric Sunshine
2019-11-08 21:47 ` Denton Liu
2019-11-08 21:58 ` Eric Sunshine
2019-11-08 20:08 ` [PATCH v2 08/10] reflog-walk.c: move where the newline is added Denton Liu
2019-11-08 20:08 ` [PATCH v2 09/10] pretty: implement 'summary' format Denton Liu
2019-11-08 20:46 ` Eric Sunshine
2019-11-09 6:38 ` René Scharfe
2019-11-10 6:25 ` Junio C Hamano
2019-11-11 23:47 ` Denton Liu
2019-11-14 0:37 ` SZEDER Gábor
2019-11-14 2:44 ` Junio C Hamano
2019-11-09 6:38 ` René Scharfe
2019-11-14 1:10 ` SZEDER Gábor
2019-11-08 20:08 ` [PATCH v2 10/10] SubmittingPatches: use `--pretty=summary` Denton Liu
2019-11-14 20:47 ` [PATCH v3 00/10] learn the "reference" pretty format Denton Liu
2019-11-14 20:47 ` [PATCH v3 01/10] SubmittingPatches: use generic terms for hash Denton Liu
2019-11-14 20:47 ` [PATCH v3 02/10] pretty-formats.txt: " Denton Liu
2019-11-14 20:47 ` [PATCH v3 03/10] SubmittingPatches: remove dq from commit reference Denton Liu
2019-11-14 20:47 ` [PATCH v3 04/10] completion: complete `tformat:` pretty format Denton Liu
2019-11-14 20:47 ` [PATCH v3 05/10] revision: make get_revision_mark() return const pointer Denton Liu
2019-11-14 20:47 ` [PATCH v3 06/10] pretty.c: inline initalize format_context Denton Liu
2019-11-14 20:47 ` [PATCH v3 07/10] t4205: cover `git log --reflog -z` blindspot Denton Liu
2019-11-14 20:47 ` [PATCH v3 08/10] pretty: provide short date format Denton Liu
2019-11-14 20:47 ` [PATCH v3 09/10] pretty: implement 'reference' format Denton Liu
2019-11-15 3:33 ` Todd Zullinger
2019-11-15 6:07 ` Junio C Hamano
2019-11-15 13:18 ` SZEDER Gábor
2019-11-16 1:46 ` Junio C Hamano
2019-11-18 1:44 ` Junio C Hamano
2019-11-18 1:42 ` Junio C Hamano
2019-11-15 8:07 ` Eric Sunshine
2019-11-14 20:47 ` [PATCH v3 10/10] SubmittingPatches: use `--pretty=reference` Denton Liu
2019-11-19 0:21 ` [PATCH v4 00/11] learn the "reference" pretty format Denton Liu
2019-11-19 0:21 ` [PATCH v4 01/11] SubmittingPatches: use generic terms for hash Denton Liu
2019-11-19 0:21 ` [PATCH v4 02/11] pretty-formats.txt: " Denton Liu
2019-11-19 0:21 ` [PATCH v4 03/11] SubmittingPatches: remove dq from commit reference Denton Liu
2019-11-19 0:21 ` [PATCH v4 04/11] completion: complete `tformat:` pretty format Denton Liu
2019-11-19 0:21 ` [PATCH v4 05/11] revision: make get_revision_mark() return const pointer Denton Liu
2019-11-19 0:21 ` [PATCH v4 06/11] pretty.c: inline initalize format_context Denton Liu
2019-11-19 0:21 ` [PATCH v4 07/11] t4205: cover `git log --reflog -z` blindspot Denton Liu
2019-11-19 0:21 ` [PATCH v4 08/11] pretty: provide short date format Denton Liu
2019-11-19 0:21 ` [PATCH v4 09/11] pretty: implement 'reference' format Denton Liu
2019-11-19 0:21 ` [PATCH v4 10/11] SubmittingPatches: use `--pretty=reference` Denton Liu
2019-11-19 0:21 ` [PATCH v4 11/11] squash! pretty: implement 'reference' format Denton Liu
2019-11-19 3:10 ` Junio C Hamano
2019-11-20 0:51 ` [PATCH v5 00/11] learn the "reference" pretty format Denton Liu
2019-11-20 0:51 ` [PATCH v5 01/11] SubmittingPatches: use generic terms for hash Denton Liu
2019-11-20 0:51 ` [PATCH v5 02/11] pretty-formats.txt: " Denton Liu
2019-11-20 0:51 ` [PATCH v5 03/11] SubmittingPatches: remove dq from commit reference Denton Liu
2019-11-20 0:51 ` [PATCH v5 04/11] completion: complete `tformat:` pretty format Denton Liu
2019-11-20 0:51 ` [PATCH v5 05/11] revision: make get_revision_mark() return const pointer Denton Liu
2019-11-20 0:51 ` [PATCH v5 06/11] pretty.c: inline initalize format_context Denton Liu
2019-11-20 0:51 ` [PATCH v5 07/11] t4205: cover `git log --reflog -z` blindspot Denton Liu
2019-11-20 0:51 ` [PATCH v5 08/11] pretty: provide short date format Denton Liu
2019-11-20 0:51 ` [PATCH v5 09/11] pretty: add struct cmt_fmt_map::default_date_mode_type Denton Liu
2019-11-20 3:15 ` Junio C Hamano
2019-11-20 0:51 ` [PATCH v5 10/11] pretty: implement 'reference' format Denton Liu
2019-11-20 0:51 ` [PATCH v5 11/11] SubmittingPatches: use `--pretty=reference` Denton Liu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=64b6f7c9d7434ba39929220c1aebcd9a1fd0ad6e.1572897736.git.liu.denton@gmail.com \
--to=liu.denton@gmail.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).