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

[PATCH v1 4/8] commit: move print_commit_summary() to libgit

From
PWPhillip Wood <phillip.wood@talktalk.net>
Date
Nov 6, 2017, 11:27 UTC
Message-ID
<20171106112709.2121-5-phillip.wood@talktalk.net>
In-Reply-To
<20171106112709.2121-1-phillip.wood@talktalk.net>
From: Phillip Wood <phillip.wood@dunelm.org.uk>

Move print_commit_summary() from builtin/commit.c to sequencer.c so it can be shared with other commands. The function is modified by changing the last argument to a flag so callers can specify whether they want to show the author date in addition to specifying if this is an initial commit.

Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
---
 builtin/commit.c | 128 ++++---------------------------------------------------
 sequencer.c      | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++
 sequencer.h      |   5 +++
 3 files changed, 131 insertions(+), 119 deletions(-)
diff --git a/builtin/commit.c b/builtin/commit.c
index 4f0092b91b9553855fe16864b16b7779b7d1f330..b109feaca11e3e43b1a59dee1868244824eaf345 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -43,31 +43,6 @@ static const char * const builtin_status_usage[] = {
 	NULL
 };
 
-static const char implicit_ident_advice_noconfig[] =
-N_("Your name and email address were configured automatically based\n"
-"on your username and hostname. Please check that they are accurate.\n"
-"You can suppress this message by setting them explicitly. Run the\n"
-"following command and follow the instructions in your editor to edit\n"
-"your configuration file:\n"
-"\n"
-"    git config --global --edit\n"
-"\n"
-"After doing this, you may fix the identity used for this commit with:\n"
-"\n"
-"    git commit --amend --reset-author\n");
-
-static const char implicit_ident_advice_config[] =
-N_("Your name and email address were configured automatically based\n"
-"on your username and hostname. Please check that they are accurate.\n"
-"You can suppress this message by setting them explicitly:\n"
-"\n"
-"    git config --global user.name \"Your Name\"\n"
-"    git config --global user.email you@example.com\n"
-"\n"
-"After doing this, you may fix the identity used for this commit with:\n"
-"\n"
-"    git commit --amend --reset-author\n");
-
 static const char empty_amend_advice[] =
 N_("You asked to amend the most recent commit, but doing so would make\n"
 "it empty. You can repeat your command with --allow-empty, or you can\n"
@@ -1370,98 +1345,6 @@ int cmd_status(int argc, const char **argv, const char *prefix)
 	return 0;
 }
 
-static const char *implicit_ident_advice(void)
-{
-	char *user_config = expand_user_path("~/.gitconfig", 0);
-	char *xdg_config = xdg_config_home("config");
-	int config_exists = file_exists(user_config) || file_exists(xdg_config);
-
-	free(user_config);
-	free(xdg_config);
-
-	if (config_exists)
-		return _(implicit_ident_advice_config);
-	else
-		return _(implicit_ident_advice_noconfig);
-
-}
-
-static void print_summary(const char *prefix, const struct object_id *oid,
-			  int initial_commit)
-{
-	struct rev_info rev;
-	struct commit *commit;
-	struct strbuf format = STRBUF_INIT;
-	const char *head;
-	struct pretty_print_context pctx = {0};
-	struct strbuf author_ident = STRBUF_INIT;
-	struct strbuf committer_ident = STRBUF_INIT;
-
-	commit = lookup_commit(oid);
-	if (!commit)
-		die(_("couldn't look up newly created commit"));
-	if (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_addbuf_percentquote(&format, &author_ident);
-	}
-	if (author_date_is_interesting()) {
-		struct strbuf date = STRBUF_INIT;
-		format_commit_message(commit, "%ad", &date, &pctx);
-		strbuf_addstr(&format, "\n Date: ");
-		strbuf_addbuf_percentquote(&format, &date);
-		strbuf_release(&date);
-	}
-	if (!committer_ident_sufficiently_given()) {
-		strbuf_addstr(&format, "\n Committer: ");
-		strbuf_addbuf_percentquote(&format, &committer_ident);
-		if (advice_implicit_identity) {
-			strbuf_addch(&format, '\n');
-			strbuf_addstr(&format, implicit_ident_advice());
-		}
-	}
-	strbuf_release(&author_ident);
-	strbuf_release(&committer_ident);
-
-	init_revisions(&rev, prefix);
-	setup_revisions(0, NULL, &rev, NULL);
-
-	rev.diff = 1;
-	rev.diffopt.output_format =
-		DIFF_FORMAT_SHORTSTAT | DIFF_FORMAT_SUMMARY;
-
-	rev.verbose_header = 1;
-	rev.show_root_diff = 1;
-	get_commit_format(format.buf, &rev);
-	rev.always_show_header = 0;
-	rev.diffopt.detect_rename = 1;
-	rev.diffopt.break_opt = 0;
-	diff_setup_done(&rev.diffopt);
-
-	head = resolve_ref_unsafe("HEAD", 0, NULL, NULL);
-	if (!head)
-		die_errno(_("unable to resolve HEAD after creating commit"));
-	if (!strcmp(head, "HEAD"))
-		head = _("detached HEAD");
-	else
-		skip_prefix(head, "refs/heads/", &head);
-	printf("[%s%s ", head, initial_commit ? _(" (root-commit)") : "");
-
-	if (!log_tree_commit(&rev, commit)) {
-		rev.always_show_header = 1;
-		rev.use_terminator = 1;
-		log_tree_commit(&rev, commit);
-	}
-
-	strbuf_release(&format);
-}
-
 static int git_commit_config(const char *k, const char *v, void *cb)
 {
 	struct wt_status *s = cb;
@@ -1722,8 +1605,15 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
 	if (amend && !no_post_rewrite) {
 		commit_post_rewrite(current_head, &oid);
 	}
-	if (!quiet)
-		print_summary(prefix, &oid, !current_head);
+	if (!quiet) {
+		int flags = 0;
+
+		if (!current_head)
+			flags |= SUMMARY_INITIAL_COMMIT;
+		if (author_date_is_interesting())
+			flags |= SUMMARY_SHOW_AUTHOR_DATE;
+		print_commit_summary(prefix, &oid, flags);
+	}
 
 	UNLEAK(err);
 	UNLEAK(sb);
diff --git a/sequencer.c b/sequencer.c
index 6d9e393f8368ac03d92019189f9fccd6a3ba1d77..d4f77a5f24c89479a4a18c2b89a3cd4e7ba7ba6c 100644
--- a/sequencer.c
+++ b/sequencer.c
@@ -834,6 +834,123 @@ void commit_post_rewrite(const struct commit *old_head,
 	run_rewrite_hook(&old_head->object.oid, new_head);
 }
 
+static const char implicit_ident_advice_noconfig[] =
+N_("Your name and email address were configured automatically based\n"
+"on your username and hostname. Please check that they are accurate.\n"
+"You can suppress this message by setting them explicitly. Run the\n"
+"following command and follow the instructions in your editor to edit\n"
+"your configuration file:\n"
+"\n"
+"    git config --global --edit\n"
+"\n"
+"After doing this, you may fix the identity used for this commit with:\n"
+"\n"
+"    git commit --amend --reset-author\n");
+
+static const char implicit_ident_advice_config[] =
+N_("Your name and email address were configured automatically based\n"
+"on your username and hostname. Please check that they are accurate.\n"
+"You can suppress this message by setting them explicitly:\n"
+"\n"
+"    git config --global user.name \"Your Name\"\n"
+"    git config --global user.email you@example.com\n"
+"\n"
+"After doing this, you may fix the identity used for this commit with:\n"
+"\n"
+"    git commit --amend --reset-author\n");
+
+static const char *implicit_ident_advice(void)
+{
+	char *user_config = expand_user_path("~/.gitconfig", 0);
+	char *xdg_config = xdg_config_home("config");
+	int config_exists = file_exists(user_config) || file_exists(xdg_config);
+
+	free(user_config);
+	free(xdg_config);
+
+	if (config_exists)
+		return _(implicit_ident_advice_config);
+	else
+		return _(implicit_ident_advice_noconfig);
+
+}
+
+void print_commit_summary(const char *prefix, const struct object_id *oid,
+			  int flags)
+{
+	struct rev_info rev;
+	struct commit *commit;
+	struct strbuf format = STRBUF_INIT;
+	const char *head;
+	struct pretty_print_context pctx = {0};
+	struct strbuf author_ident = STRBUF_INIT;
+	struct strbuf committer_ident = STRBUF_INIT;
+
+	commit = lookup_commit(oid);
+	if (!commit)
+		die(_("couldn't look up newly created commit"));
+	if (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_addbuf_percentquote(&format, &author_ident);
+	}
+	if (flags & SUMMARY_SHOW_AUTHOR_DATE) {
+		struct strbuf date = STRBUF_INIT;
+		format_commit_message(commit, "%ad", &date, &pctx);
+		strbuf_addstr(&format, "\n Date: ");
+		strbuf_addbuf_percentquote(&format, &date);
+		strbuf_release(&date);
+	}
+	if (!committer_ident_sufficiently_given()) {
+		strbuf_addstr(&format, "\n Committer: ");
+		strbuf_addbuf_percentquote(&format, &committer_ident);
+		if (advice_implicit_identity) {
+			strbuf_addch(&format, '\n');
+			strbuf_addstr(&format, implicit_ident_advice());
+		}
+	}
+	strbuf_release(&author_ident);
+	strbuf_release(&committer_ident);
+
+	init_revisions(&rev, prefix);
+	setup_revisions(0, NULL, &rev, NULL);
+
+	rev.diff = 1;
+	rev.diffopt.output_format =
+		DIFF_FORMAT_SHORTSTAT | DIFF_FORMAT_SUMMARY;
+
+	rev.verbose_header = 1;
+	rev.show_root_diff = 1;
+	get_commit_format(format.buf, &rev);
+	rev.always_show_header = 0;
+	rev.diffopt.detect_rename = 1;
+	rev.diffopt.break_opt = 0;
+	diff_setup_done(&rev.diffopt);
+
+	head = resolve_ref_unsafe("HEAD", 0, NULL, NULL);
+	if (!head)
+		die_errno(_("unable to resolve HEAD after creating commit"));
+	if (!strcmp(head, "HEAD"))
+		head = _("detached HEAD");
+	else
+		skip_prefix(head, "refs/heads/", &head);
+	printf("[%s%s ", head, (flags & SUMMARY_INITIAL_COMMIT) ? _(" (root-commit)") : "");
+
+	if (!log_tree_commit(&rev, commit)) {
+		rev.always_show_header = 1;
+		rev.use_terminator = 1;
+		log_tree_commit(&rev, commit);
+	}
+
+	strbuf_release(&format);
+}
+
 static int is_original_commit_empty(struct commit *commit)
 {
 	const struct object_id *ptree_oid;
diff --git a/sequencer.h b/sequencer.h
index 5734c8a3d869564354e5193c52bf45c119a8b840..c7989f93fcf08f979f5869cd4ec27f0dd0b88c82 100644
--- a/sequencer.h
+++ b/sequencer.h
@@ -73,4 +73,9 @@ int update_head(const struct commit *old_head, const struct object_id *new_head,
 		struct strbuf *err);
 void commit_post_rewrite(const struct commit *current_head,
 			 const struct object_id *new_head);
+
+#define SUMMARY_INITIAL_COMMIT   (1 << 0)
+#define SUMMARY_SHOW_AUTHOR_DATE (1 << 1)
+void print_commit_summary(const char *prefix, const struct object_id *oid,
+			  int flags);
 #endif
-- 
2.14.3
Previous: Johannes SchindelinNext: Junio C Hamano
Message 35 of 120 in “sequencer: dont't fork git commit”
  1. 0/8 sequencer: dont't fork git commitPhillip Wood, Sep 25, 2017
  2. 1/8 commit: move empty message checks to libgitPhillip Wood, Sep 25, 2017
  3. 4/8 commit: move post-rewrite code to libgitPhillip Wood, Sep 25, 2017
  4. 2/8 commit: move code to update HEAD to libgitPhillip Wood, Sep 25, 2017
  5. Junio C HamanoOct 7, 2017
  6. Phillip WoodOct 24, 2017
  7. Junio C HamanoOct 24, 2017
  8. 3/8 sequencer: refactor update_head()Phillip Wood, Sep 25, 2017
  9. 5/8 commit: move print_commit_summary() to libgitPhillip Wood, Sep 25, 2017
  10. 6/8 sequencer: simplify adding Signed-off-by: trailerPhillip Wood, Sep 25, 2017
  11. 7/8 sequencer: load commit related configPhillip Wood, Sep 25, 2017
  12. 8/8 sequencer: try to commit without forking 'git commit'Phillip Wood, Sep 25, 2017
  13. 0/8 sequencer: dont't fork git commitPhillip Wood, Nov 6, 2017
  14. 3/8 commit: move post-rewrite code to libgitPhillip Wood, Nov 6, 2017
  15. Junio C HamanoNov 7, 2017
  16. Phillip WoodNov 7, 2017
  17. 5/8 sequencer: don't die in print_commit_summary()Phillip Wood, Nov 6, 2017
  18. Junio C HamanoNov 7, 2017
  19. Johannes SchindelinNov 7, 2017
  20. Junio C HamanoNov 7, 2017
  21. Phillip WoodNov 10, 2017
  22. Junio C HamanoNov 10, 2017
  23. Phillip WoodNov 13, 2017
  24. 6/8 sequencer: simplify adding Signed-off-by: trailerPhillip Wood, Nov 6, 2017
  25. Johannes SchindelinNov 7, 2017
  26. Junio C HamanoNov 7, 2017
  27. Phillip WoodNov 7, 2017
  28. 7/8 sequencer: load commit related configPhillip Wood, Nov 6, 2017
  29. Johannes SchindelinNov 7, 2017
  30. Phillip WoodNov 7, 2017
  31. 8/8 sequencer: try to commit without forking 'git commit'Phillip Wood, Nov 6, 2017
  32. Johannes SchindelinNov 7, 2017
  33. Phillip WoodNov 7, 2017
  34. Johannes SchindelinNov 7, 2017
  35. 4/8 commit: move print_commit_summary() to libgitPhillip Wood, Nov 6, 2017
  36. Junio C HamanoNov 7, 2017
  37. Phillip WoodNov 7, 2017
  38. Junio C HamanoNov 8, 2017
  39. 2/8 Add a function to update HEAD after creating a commitPhillip Wood, Nov 6, 2017
  40. Junio C HamanoNov 7, 2017
  41. Johannes SchindelinNov 7, 2017
  42. Phillip WoodNov 7, 2017
  43. 1/8 commit: move empty message checks to libgitPhillip Wood, Nov 6, 2017
  44. Johannes SchindelinNov 7, 2017
  45. Phillip WoodNov 7, 2017
  46. 0/9 sequencer: dont't fork git commitPhillip Wood, Nov 10, 2017
  47. 1/9 t3404: check intermediate squash messagesPhillip Wood, Nov 10, 2017
  48. 2/9 commit: move empty message checks to libgitPhillip Wood, Nov 10, 2017
  49. Ramsay JonesNov 10, 2017
  50. Phillip WoodNov 13, 2017
  51. 6/9 sequencer: don't die in print_commit_summary()Phillip Wood, Nov 10, 2017
  52. 3/9 Add a function to update HEAD after creating a commitPhillip Wood, Nov 10, 2017
  53. Junio C HamanoNov 10, 2017
  54. Phillip WoodNov 13, 2017
  55. 4/9 commit: move post-rewrite code to libgitPhillip Wood, Nov 10, 2017
  56. 9/9 sequencer: try to commit without forking 'git commit'Phillip Wood, Nov 10, 2017
  57. 5/9 commit: move print_commit_summary() to libgitPhillip Wood, Nov 10, 2017
  58. 7/9 sequencer: simplify adding Signed-off-by: trailerPhillip Wood, Nov 10, 2017
  59. 8/9 sequencer: load commit related configPhillip Wood, Nov 10, 2017
  60. Junio C HamanoNov 10, 2017
  61. Phillip WoodNov 13, 2017
  62. Junio C HamanoNov 14, 2017
  63. 0/8 sequencer: don't fork git commitPhillip Wood, Nov 17, 2017
  64. 1/8 t3404: check intermediate squash messagesPhillip Wood, Nov 17, 2017
  65. 2/8 commit: move empty message checks to libgitPhillip Wood, Nov 17, 2017
  66. 3/8 Add a function to update HEAD after creating a commitPhillip Wood, Nov 17, 2017
  67. 4/8 commit: move post-rewrite code to libgitPhillip Wood, Nov 17, 2017
  68. 6/8 sequencer: simplify adding Signed-off-by: trailerPhillip Wood, Nov 17, 2017
  69. 7/8 sequencer: load commit related configPhillip Wood, Nov 17, 2017
  70. 5/8 commit: move print_commit_summary() to libgitPhillip Wood, Nov 17, 2017
  71. 8/8 sequencer: try to commit without forking 'git commit'Phillip Wood, Nov 17, 2017
  72. Junio C HamanoNov 18, 2017
  73. Junio C HamanoNov 18, 2017
  74. Phillip WoodNov 18, 2017
  75. Phillip WoodNov 18, 2017
  76. 0/9 sequencer: don't fork git commitPhillip Wood, Nov 24, 2017
  77. 1/9 t3404: check intermediate squash messagesPhillip Wood, Nov 24, 2017
  78. 6/9 sequencer: simplify adding Signed-off-by: trailerPhillip Wood, Nov 24, 2017
  79. 2/9 commit: move empty message checks to libgitPhillip Wood, Nov 24, 2017
  80. 4/9 commit: move post-rewrite code to libgitPhillip Wood, Nov 24, 2017
  81. 3/9 Add a function to update HEAD after creating a commitPhillip Wood, Nov 24, 2017
  82. 5/9 commit: move print_commit_summary() to libgitPhillip Wood, Nov 24, 2017
  83. 7/9 sequencer: load commit related configPhillip Wood, Nov 24, 2017
  84. Junio C HamanoNov 24, 2017
  85. Phillip WoodNov 24, 2017
  86. Junio C HamanoDec 4, 2017
  87. Phillip WoodDec 5, 2017
  88. Phillip WoodDec 5, 2017
  89. Phillip WoodDec 9, 2017
  90. 8/9 sequencer: try to commit without forking 'git commit'Phillip Wood, Nov 24, 2017
  91. 9/9 t3512/t3513: remove KNOWN_FAILURE_CHERRY_PICK_SEES_EMPTY_COMMIT=1Phillip Wood, Nov 24, 2017
  92. Stefan BellerDec 4, 2017
  93. Phillip WoodDec 5, 2017
  94. 0/9 sequencer: don't fork git commitPhillip Wood, Dec 11, 2017
  95. 1/9 t3404: check intermediate squash messagesPhillip Wood, Dec 11, 2017
  96. 4/9 commit: move post-rewrite code to libgitPhillip Wood, Dec 11, 2017
  97. 3/9 Add a function to update HEAD after creating a commitPhillip Wood, Dec 11, 2017
  98. 5/9 commit: move print_commit_summary() to libgitPhillip Wood, Dec 11, 2017
  99. 2/9 commit: move empty message checks to libgitPhillip Wood, Dec 11, 2017
  100. 6/9 sequencer: simplify adding Signed-off-by: trailerPhillip Wood, Dec 11, 2017
  101. 9/9 t3512/t3513: remove KNOWN_FAILURE_CHERRY_PICK_SEES_EMPTY_COMMIT=1Phillip Wood, Dec 11, 2017
  102. 8/9 sequencer: try to commit without forking 'git commit'Phillip Wood, Dec 11, 2017
  103. Jonathan NiederJan 10, 2018
  104. Johannes SchindelinJan 10, 2018
  105. Phillip WoodJan 11, 2018
  106. Johannes SchindelinJan 11, 2018
  107. 7/9 sequencer: load commit related configPhillip Wood, Dec 11, 2017
  108. Phillip WoodDec 11, 2017
  109. Junio C HamanoDec 11, 2017
  110. Phillip WoodDec 12, 2017
  111. sequencer: improve config handlingPhillip Wood, Dec 13, 2017
  112. Error in `git': free(): invalid pointer (was Re: [PATCH] sequencer: improve config handling)Kaartic Sivaraam, Dec 20, 2017
  113. Johannes SchindelinDec 21, 2017
  114. Kaartic SivaraamDec 21, 2017
  115. Johannes SchindelinDec 22, 2017
  116. Kaartic SivaraamDec 25, 2017
  117. phillip.wood@talktalk.netDec 21, 2017
  118. Kaartic SivaraamDec 21, 2017
  119. phillip.wood@talktalk.netDec 22, 2017
  120. Kaartic SivaraamDec 21, 2017

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.