And use struct rewrite.

Signed-off-by: Felipe Contreras <felipe.contre...@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 10acc53..7bfe9d0 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -30,6 +30,7 @@
 #include "column.h"
 #include "sequencer.h"
 #include "notes-utils.h"
+#include "rewrite.h"
 
 static const char * const builtin_commit_usage[] = {
        N_("git commit [options] [--] <pathspec>..."),
@@ -1386,38 +1387,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 cmd_commit(int argc, const char **argv, const char *prefix)
 {
        static struct wt_status s;
@@ -1653,13 +1622,16 @@ int cmd_commit(int argc, const char **argv, const char 
*prefix)
        run_hook(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 2793688..c8efaa8 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.8.4-fc

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to