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

[PATCH 3/3] commit: show interesting ident information in summary

From
Jeff King <peff@peff.net>
Date
Jan 12, 2010, 15:46 UTC
Message-ID
<20100112154631.GC24957@coredump.intra.peff.net>
In-Reply-To
<20100112153656.GA24840@coredump.intra.peff.net>

There are a few cases of user identity information that we consider interesting:

  1. When the author and committer identities do not match.
  2. When the committer identity was picked automatically
     from the username, hostname and GECOS information.

In these cases, we already show the information in the commit message template. However, users do not always see that template because they might use "-m" or "-F". With this patch, we show these interesting cases after the commit, along with the subject and change summary. The new output looks like:

  $ git commit \
      -m "federalist papers" \
      --author='Publius <alexander@hamilton.com>'
  [master 3d226a7] federalist papers
   Author: Publius <alexander@hamilton.com>
   1 files changed, 1 insertions(+), 0 deletions(-)
for case (1), and:
  $ git config --global --unset user.name
  $ git config --global --unset user.email
  $ git commit -m foo
  [master 7c2a927] foo
   Committer: Jeff King <peff@c-71-185-130-222.hsd1.va.comcast.net>
   1 files changed, 1 insertions(+), 0 deletions(-)
for case (2).
Signed-off-by: Jeff King <peff@peff.net>
---
Note that this has a slight semantic conflict with the jc/ident topic in
next. The user_ident_explicitly_given flag needs to be compared to
IDENT_ALL.

I hope the example output in the commit message is not too verbose. I was recently reviewing somebody's series that made output changes, and they didn't include sample output anywhere, which made reviewing a lot more annoying.

Personally I don't care much about case (2) one way or the other, but it is the one that triggered this thread. I think case (1) is very useful, though.

I tested case (2) manually, but I didn't include anything in the test suite; I feel funny testing output created from the hostname and GECOS (can't it even barf if the user's system isn't set up very well? That would produce a false negative for the test).

 builtin-commit.c  |   25 ++++++++++++++++++++++---
 t/t7501-commit.sh |    6 +++++-
 2 files changed, 27 insertions(+), 4 deletions(-)
diff --git a/builtin-commit.c b/builtin-commit.c
index 073fe90..279145d 100644
--- a/builtin-commit.c
+++ b/builtin-commit.c
@@ -1046,9 +1046,12 @@ static void print_summary(const char *prefix, const unsigned char *sha1)
 {
 	struct rev_info rev;
 	struct commit *commit;
-	static const char *format = "format:%h] %s";
+	struct strbuf format = STRBUF_INIT;
 	unsigned char junk_sha1[20];
 	const char *head = resolve_ref("HEAD", junk_sha1, 0, NULL);
+	struct pretty_print_context pctx = {0};
+	struct strbuf author_ident = STRBUF_INIT;
+	struct strbuf committer_ident = STRBUF_INIT;
 
 	commit = lookup_commit(sha1);
 	if (!commit)
@@ -1056,6 +1059,21 @@ static void print_summary(const char *prefix, const unsigned char *sha1)
 	if (!commit || parse_commit(commit))
 		die("could not parse newly created commit");
 
+	strbuf_addstr(&format, "format:%h] %s");
+
+	format_commit_message(commit, "%an <%ae>", &author_ident, &pctx);
+	format_commit_message(commit, "%cn <%ce>", &committer_ident, &pctx);
+	if (strbuf_cmp(&author_ident, &committer_ident)) {
+		strbuf_addstr(&format, "\n Author: ");
+		strbuf_percentquote_buf(&format, &author_ident);
+	}
+	if (!user_ident_explicitly_given) {
+		strbuf_addstr(&format, "\n Committer: ");
+		strbuf_percentquote_buf(&format, &committer_ident);
+	}
+	strbuf_release(&author_ident);
+	strbuf_release(&committer_ident);
+
 	init_revisions(&rev, prefix);
 	setup_revisions(0, NULL, &rev, NULL);
 
@@ -1066,7 +1084,8 @@ static void print_summary(const char *prefix, const unsigned char *sha1)
 
 	rev.verbose_header = 1;
 	rev.show_root_diff = 1;
-	get_commit_format(format, &rev);
+	get_commit_format(format.buf, &rev);
+	strbuf_release(&format);
 	rev.always_show_header = 0;
 	rev.diffopt.detect_rename = 1;
 	rev.diffopt.rename_limit = 100;
@@ -1085,7 +1104,7 @@ static void print_summary(const char *prefix, const unsigned char *sha1)
 		struct pretty_print_context ctx = {0};
 		struct strbuf buf = STRBUF_INIT;
 		ctx.date_mode = DATE_NORMAL;
-		format_commit_message(commit, format + 7, &buf, &ctx);
+		format_commit_message(commit, format.buf + 7, &buf, &ctx);
 		printf("%s\n", buf.buf);
 		strbuf_release(&buf);
 	}
diff --git a/t/t7501-commit.sh b/t/t7501-commit.sh
index a529701..7940901 100755
--- a/t/t7501-commit.sh
+++ b/t/t7501-commit.sh
@@ -117,7 +117,11 @@ test_expect_success \
 test_expect_success \
 	"overriding author from command line" \
 	"echo 'gak' >file && \
-	 git commit -m 'author' --author 'Rubber Duck <rduck@convoy.org>' -a"
+	 git commit -m 'author' --author 'Rubber Duck <rduck@convoy.org>' -a >output 2>&1"
+
+test_expect_success \
+	"commit --author output mentions author" \
+	"grep Rubber.Duck output"
 
 test_expect_success PERL \
 	"interactive add" \
-- 
1.6.6.138.g309fc.dirty
Previous: Jeff KingNext: Junio C Hamano
Message 29 of 54 in “edit Author/Date metadata as part of 'git commit' $EDITOR invocation?”
  1. Adam MegaczJan 3, 2010
  2. Sverre RabbelierJan 4, 2010
  3. Adam MegaczJan 4, 2010
  4. Sverre RabbelierJan 4, 2010
  5. David AguilarJan 5, 2010
  6. Nanako ShiraishiJan 5, 2010
  7. Junio C HamanoJan 6, 2010
  8. Adam MegaczJan 8, 2010
  9. Junio C HamanoJan 8, 2010
  10. 1/3 ident.c: remove unused variablesJunio C Hamano, Jan 8, 2010
  11. 2/3 ident.c: check explicit identity for name and email separatelyJunio C Hamano, Jan 8, 2010
  12. Santi BéjarJan 8, 2010
  13. 3/3 ident.c: treat $EMAIL as giving user.email identity explicitlyJunio C Hamano, Jan 8, 2010
  14. Display author and committer after "git commit"Adam Megacz, Jan 11, 2010
  15. Adam MegaczJan 11, 2010
  16. Junio C HamanoJan 11, 2010
  17. Adam MegaczJan 12, 2010
  18. Jeff KingJan 12, 2010
  19. Jeff KingJan 12, 2010
  20. Jeff KingJan 12, 2010
  21. 1/3 strbuf_expand: convert "%%" to "%"Jeff King, Jan 12, 2010
  22. 2/3 strbuf: add strbuf_percentquote_bufJeff King, Jan 12, 2010
  23. Johannes SchindelinJan 12, 2010
  24. Jeff KingJan 12, 2010
  25. Junio C HamanoJan 13, 2010
  26. Jeff KingJan 13, 2010
  27. Junio C HamanoJan 13, 2010
  28. Jeff KingJan 13, 2010
  29. 3/3 commit: show interesting ident information in summaryJeff King, Jan 12, 2010
  30. Junio C HamanoJan 13, 2010
  31. Jeff KingJan 13, 2010
  32. Junio C HamanoJan 13, 2010
  33. Jeff KingJan 13, 2010
  34. Jeff KingJan 13, 2010
  35. Junio C HamanoJan 13, 2010
  36. Jeff KingJan 13, 2010
  37. 1/3 strbuf_expand: convert "%%" to "%"Jeff King, Jan 13, 2010
  38. Chris JohnsenJan 14, 2010
  39. Jeff KingJan 14, 2010
  40. 2/3 strbuf: add strbuf_addbuf_percentquoteJeff King, Jan 13, 2010
  41. 3/3 commit: show interesting ident information in summaryJeff King, Jan 13, 2010
  42. Wincent ColaiutaJan 13, 2010
  43. Jeff KingJan 13, 2010
  44. Wincent ColaiutaJan 13, 2010
  45. Thomas RastJan 14, 2010
  46. Felipe ContrerasJan 14, 2010
  47. Junio C HamanoJan 14, 2010
  48. Felipe ContrerasJan 14, 2010
  49. Junio C HamanoJan 14, 2010
  50. Felipe ContrerasJan 15, 2010
  51. Adam MegaczJan 16, 2010
  52. Matthieu MoyJan 17, 2010
  53. Junio C HamanoJan 17, 2010
  54. Jeff KingJan 17, 2010

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.