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

[PATCH v7 09/12] builtin: move run_rewrite_hook() to rewrite.c

From
Felipe Contreras <felipe.contreras@gmail.com>
Date
Apr 24, 2014, 02:44 UTC
Message-ID
<1398307491-21314-10-git-send-email-felipe.contreras@gmail.com>
In-Reply-To
<1398307491-21314-1-git-send-email-felipe.contreras@gmail.com>
And use struct rewrite.
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 builtin/commit.c | 38 +++++---------------------------------
 rewrite.c        | 32 ++++++++++++++++++++++++++++++++
 rewrite.h        |  1 +
 3 files changed, 38 insertions(+), 33 deletions(-)
diff --git a/builtin/commit.c b/builtin/commit.c
index 7d711ea..ea42f22 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -31,6 +31,7 @@
 #include "sequencer.h"
 #include "notes-utils.h"
 #include "mailmap.h"
+#include "rewrite.h"
 
 static const char * const builtin_commit_usage[] = {
 	N_("git commit [options] [--] <pathspec>..."),
@@ -1411,38 +1412,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 unsigned char *oldsha1,
-			    const unsigned char *newsha1)
-{
-	/* oldsha1 SP newsha1 LF NUL */
-	static char buf[2*40 + 3];
-	struct child_process proc;
-	const char *argv[3];
-	int code;
-	size_t n;
-
-	argv[0] = find_hook("post-rewrite");
-	if (!argv[0])
-		return 0;
-
-	argv[1] = "amend";
-	argv[2] = NULL;
-
-	memset(&proc, 0, sizeof(proc));
-	proc.argv = argv;
-	proc.in = -1;
-	proc.stdout_to_stderr = 1;
-
-	code = start_command(&proc);
-	if (code)
-		return code;
-	n = snprintf(buf, sizeof(buf), "%s %s\n",
-		     sha1_to_hex(oldsha1), sha1_to_hex(newsha1));
-	write_in_full(proc.in, buf, n);
-	close(proc.in);
-	return finish_command(&proc);
-}
-
 int run_commit_hook(int editor_is_used, const char *index_file, const char *name, ...)
 {
 	const char *hook_env[3] =  { NULL };
@@ -1693,13 +1662,16 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
 	run_commit_hook(use_editor, get_index_file(), "post-commit", NULL);
 	if (amend && !no_post_rewrite) {
 		struct notes_rewrite_cfg *cfg;
+		struct rewritten rewrite;
+		memset(&rewrite, 0, sizeof(rewrite));
 		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.sha1, sha1);
 			finish_copy_notes_for_rewrite(cfg, "Notes added by 'git commit --amend'");
 		}
-		run_rewrite_hook(current_head->object.sha1, sha1);
+		add_rewritten(&rewrite, current_head->object.sha1, sha1);
+		run_rewrite_hook(&rewrite, "amend");
 	}
 	if (!quiet)
 		print_summary(prefix, sha1, !current_head);
diff --git a/rewrite.c b/rewrite.c
index 436d54a..56617ce 100644
--- a/rewrite.c
+++ b/rewrite.c
@@ -1,5 +1,6 @@
 #include "cache.h"
 #include "rewrite.h"
+#include "run-command.h"
 
 void add_rewritten(struct rewritten *list, unsigned char *from, unsigned char *to)
 {
@@ -69,3 +70,34 @@ void load_rewritten(struct rewritten *list, const char *file)
 	}
 	strbuf_release(&buf);
 }
+
+int run_rewrite_hook(struct rewritten *list, const char *name)
+{
+	struct strbuf buf = STRBUF_INIT;
+	struct child_process proc;
+	const char *argv[3];
+	int code, i;
+
+	argv[0] = find_hook("post-rewrite");
+	if (!argv[0])
+		return 0;
+
+	argv[1] = name;
+	argv[2] = NULL;
+
+	memset(&proc, 0, sizeof(proc));
+	proc.argv = argv;
+	proc.in = -1;
+	proc.stdout_to_stderr = 1;
+
+	code = start_command(&proc);
+	if (code)
+		return code;
+	for (i = 0; i < list->nr; i++) {
+		struct rewritten_item *item = &list->items[i];
+		strbuf_addf(&buf, "%s %s\n", sha1_to_hex(item->from), sha1_to_hex(item->to));
+	}
+	write_in_full(proc.in, buf.buf, buf.len);
+	close(proc.in);
+	return finish_command(&proc);
+}
diff --git a/rewrite.h b/rewrite.h
index 09e7222..fd00e66 100644
--- a/rewrite.h
+++ b/rewrite.h
@@ -14,5 +14,6 @@ struct rewritten {
 void add_rewritten(struct rewritten *list, unsigned char *from, unsigned char *to);
 int store_rewritten(struct rewritten *list, const char *file);
 void load_rewritten(struct rewritten *list, const char *file);
+int run_rewrite_hook(struct rewritten *list, const char *name);
 
 #endif
-- 
1.9.2+fc1.2.gfbaae8c
Previous: Felipe ContrerasNext: Felipe Contreras
Message 16 of 23 in “Improvements to cherry-pick”
  1. 00/12 Improvements to cherry-pickFelipe Contreras, Apr 24, 2014
  2. 01/12 cherry-pick: don't barf when there's nothing to doFelipe Contreras, Apr 24, 2014
  3. 02/12 cherry-pick: add --skip-empty optionFelipe Contreras, Apr 24, 2014
  4. 03/12 revert/cherry-pick: add --quiet optionFelipe Contreras, Apr 24, 2014
  5. Ramkumar RamachandraApr 24, 2014
  6. Felipe ContrerasApr 24, 2014
  7. 04/12 revert/cherry-pick: add --skip optionFelipe Contreras, Apr 24, 2014
  8. Ramkumar RamachandraApr 24, 2014
  9. 05/12 cherry-pick: remember rerere-autoupdateFelipe Contreras, Apr 24, 2014
  10. Eric SunshineApr 24, 2014
  11. 06/12 builtin: add rewrite helperFelipe Contreras, Apr 24, 2014
  12. Ramkumar RamachandraApr 24, 2014
  13. Felipe ContrerasApr 24, 2014
  14. 07/12 cherry-pick: store rewritten commitsFelipe Contreras, Apr 24, 2014
  15. 08/12 cherry-pick: don't store skipped commitFelipe Contreras, Apr 24, 2014
  16. 09/12 builtin: move run_rewrite_hook() to rewrite.cFelipe Contreras, Apr 24, 2014
  17. 10/12 builtin: rewrite: add copy_rewrite_notes()Felipe Contreras, Apr 24, 2014
  18. 11/12 cherry-pick: add --action-name optionFelipe Contreras, Apr 24, 2014
  19. 12/12 cherry-pick: copy notes and run hooksFelipe Contreras, Apr 24, 2014
  20. Ramkumar RamachandraApr 24, 2014
  21. Felipe ContrerasApr 24, 2014
  22. Ramkumar RamachandraApr 24, 2014
  23. Felipe ContrerasApr 24, 2014

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.