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

[PATCH v2 4/9] commit: move post-rewrite code to libgit

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

Move run_rewrite_hook() from bulitin/commit.c to sequencer.c so it can be shared with other commands and add a new function commit_post_rewrite() based on the code in builtin/commit.c that encapsulates rewriting notes and running the post-rewrite hook. Once the sequencer learns how to create commits without forking 'git commit' these functions will be used when squashing commits.

Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
---
Notes:
    changes since v1:
     - reword commit message to explain why the code is being moved
 builtin/commit.c | 42 +-----------------------------------------
 sequencer.c      | 47 +++++++++++++++++++++++++++++++++++++++++++++++
 sequencer.h      |  2 ++
 3 files changed, 50 insertions(+), 41 deletions(-)
diff --git a/builtin/commit.c b/builtin/commit.c
index 7c28144446644a665f7b7d8f4b6c0a5855aef01b..3bc5dff2c00c9556e6c032381d5baf18246bf8dc 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -31,9 +31,7 @@
 #include "gpg-interface.h"
 #include "column.h"
 #include "sequencer.h"
-#include "notes-utils.h"
 #include "mailmap.h"
-#include "sigchain.h"
 
 static const char * const builtin_commit_usage[] = {
 	N_("git commit [<options>] [--] <pathspec>..."),
@@ -1478,37 +1476,6 @@ static int git_commit_config(const char *k, const char *v, void *cb)
 	return git_status_config(k, v, s);
 }
 
-static int run_rewrite_hook(const struct object_id *oldoid,
-			    const struct object_id *newoid)
-{
-	struct child_process proc = CHILD_PROCESS_INIT;
-	const char *argv[3];
-	int code;
-	struct strbuf sb = STRBUF_INIT;
-
-	argv[0] = find_hook("post-rewrite");
-	if (!argv[0])
-		return 0;
-
-	argv[1] = "amend";
-	argv[2] = NULL;
-
-	proc.argv = argv;
-	proc.in = -1;
-	proc.stdout_to_stderr = 1;
-
-	code = start_command(&proc);
-	if (code)
-		return code;
-	strbuf_addf(&sb, "%s %s\n", oid_to_hex(oldoid), oid_to_hex(newoid));
-	sigchain_push(SIGPIPE, SIG_IGN);
-	write_in_full(proc.in, sb.buf, sb.len);
-	close(proc.in);
-	strbuf_release(&sb);
-	sigchain_pop(SIGPIPE);
-	return finish_command(&proc);
-}
-
 int run_commit_hook(int editor_is_used, const char *index_file, const char *name, ...)
 {
 	struct argv_array hook_env = ARGV_ARRAY_INIT;
@@ -1739,14 +1706,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
 	rerere(0);
 	run_commit_hook(use_editor, get_index_file(), "post-commit", NULL);
 	if (amend && !no_post_rewrite) {
-		struct notes_rewrite_cfg *cfg;
-		cfg = init_copy_notes_for_rewrite("amend");
-		if (cfg) {
-			/* we are amending, so current_head is not NULL */
-			copy_note_for_rewrite(cfg, &current_head->object.oid, &oid);
-			finish_copy_notes_for_rewrite(cfg, "Notes added by 'git commit --amend'");
-		}
-		run_rewrite_hook(&current_head->object.oid, &oid);
+		commit_post_rewrite(current_head, &oid);
 	}
 	if (!quiet)
 		print_summary(prefix, &oid, !current_head);
diff --git a/sequencer.c b/sequencer.c
index fcd8e92531a3fb1f0bc1294925e87b3624ada909..5529e5df1cbe9045b000ecbff6c28a0bee736ccc 100644
--- a/sequencer.c
+++ b/sequencer.c
@@ -21,6 +21,8 @@
 #include "log-tree.h"
 #include "wt-status.h"
 #include "hashmap.h"
+#include "notes-utils.h"
+#include "sigchain.h"
 
 #define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION"
 
@@ -789,6 +791,51 @@ int update_head_with_reflog(const struct commit *old_head,
 	return ret;
 }
 
+static int run_rewrite_hook(const struct object_id *oldoid,
+			    const struct object_id *newoid)
+{
+	struct child_process proc = CHILD_PROCESS_INIT;
+	const char *argv[3];
+	int code;
+	struct strbuf sb = STRBUF_INIT;
+
+	argv[0] = find_hook("post-rewrite");
+	if (!argv[0])
+		return 0;
+
+	argv[1] = "amend";
+	argv[2] = NULL;
+
+	proc.argv = argv;
+	proc.in = -1;
+	proc.stdout_to_stderr = 1;
+
+	code = start_command(&proc);
+	if (code)
+		return code;
+	strbuf_addf(&sb, "%s %s\n", oid_to_hex(oldoid), oid_to_hex(newoid));
+	sigchain_push(SIGPIPE, SIG_IGN);
+	write_in_full(proc.in, sb.buf, sb.len);
+	close(proc.in);
+	strbuf_release(&sb);
+	sigchain_pop(SIGPIPE);
+	return finish_command(&proc);
+}
+
+void commit_post_rewrite(const struct commit *old_head,
+			 const struct object_id *new_head)
+{
+	struct notes_rewrite_cfg *cfg;
+
+	cfg = init_copy_notes_for_rewrite("amend");
+	if (cfg) {
+		/* we are amending, so old_head is not NULL */
+		copy_note_for_rewrite(cfg, &old_head->object.oid, new_head);
+		finish_copy_notes_for_rewrite(cfg, "Notes added by 'git commit --amend'");
+	}
+	run_rewrite_hook(&old_head->object.oid, new_head);
+}
+
 static int is_original_commit_empty(struct commit *commit)
 {
 	const struct object_id *ptree_oid;
diff --git a/sequencer.h b/sequencer.h
index 82035ced129d35ff8ba64710477531a9a713b631..6a69e4a7a42551cbc798b8eb93e447c0f50b234f 100644
--- a/sequencer.h
+++ b/sequencer.h
@@ -73,4 +73,6 @@ int update_head_with_reflog(const struct commit *old_head,
 			    const struct object_id *new_head,
 			    const char* action, const struct strbuf *msg,
 			    struct strbuf *err);
+void commit_post_rewrite(const struct commit *current_head,
+			 const struct object_id *new_head);
 #endif
-- 
2.15.0
Previous: Phillip WoodNext: Phillip Wood
Message 55 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.