]> git.ipfire.org Git - thirdparty/git.git/commitdiff
builtin-am: don't parse mail when resuming
authorPaul Tan <pyokagan@gmail.com>
Tue, 4 Aug 2015 13:51:33 +0000 (21:51 +0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 5 Aug 2015 05:02:11 +0000 (22:02 -0700)
Since 271440e (git-am: make it easier after fixing up an unapplicable
patch., 2005-10-25), when "git am" is run again after being paused, the
current mail message will not be re-parsed, but instead the contents of
the state directory's patch, msg and author-script files will be used
as-is instead.

Re-implement this in builtin/am.c.

Signed-off-by: Paul Tan <pyokagan@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/am.c

index fd267213aa40e9e71ef2ad49191798e26ad2acc6..ec579a606ff2cf3f2a8be6794a568b367c688c37 100644 (file)
@@ -776,8 +776,12 @@ static void validate_resume_state(const struct am_state *state)
 
 /**
  * Applies all queued mail.
+ *
+ * If `resume` is true, we are "resuming". The "msg" and authorship fields, as
+ * well as the state directory's "patch" file is used as-is for applying the
+ * patch and committing it.
  */
-static void am_run(struct am_state *state)
+static void am_run(struct am_state *state, int resume)
 {
        const char *argv_gc_auto[] = {"gc", "--auto", NULL};
        struct strbuf sb = STRBUF_INIT;
@@ -795,11 +799,16 @@ static void am_run(struct am_state *state)
                if (!file_exists(mail))
                        goto next;
 
-               if (parse_mail(state, mail))
-                       goto next; /* mail should be skipped */
+               if (resume) {
+                       validate_resume_state(state);
+                       resume = 0;
+               } else {
+                       if (parse_mail(state, mail))
+                               goto next; /* mail should be skipped */
 
-               write_author_script(state);
-               write_commit_msg(state);
+                       write_author_script(state);
+                       write_commit_msg(state);
+               }
 
                printf_ln(_("Applying: %.*s"), linelen(state->msg), state->msg);
 
@@ -855,7 +864,7 @@ static void am_resolve(struct am_state *state)
        do_commit(state);
 
        am_next(state);
-       am_run(state);
+       am_run(state, 0);
 }
 
 /**
@@ -875,6 +884,7 @@ static int parse_opt_patchformat(const struct option *opt, const char *arg, int
 
 enum resume_mode {
        RESUME_FALSE = 0,
+       RESUME_APPLY,
        RESUME_RESOLVED
 };
 
@@ -927,9 +937,12 @@ int cmd_am(int argc, const char **argv, const char *prefix)
        if (read_index_preload(&the_index, NULL) < 0)
                die(_("failed to read the index"));
 
-       if (am_in_progress(&state))
+       if (am_in_progress(&state)) {
+               if (resume == RESUME_FALSE)
+                       resume = RESUME_APPLY;
+
                am_load(&state);
-       else {
+       else {
                struct argv_array paths = ARGV_ARRAY_INIT;
                int i;
 
@@ -950,7 +963,10 @@ int cmd_am(int argc, const char **argv, const char *prefix)
 
        switch (resume) {
        case RESUME_FALSE:
-               am_run(&state);
+               am_run(&state, 0);
+               break;
+       case RESUME_APPLY:
+               am_run(&state, 1);
                break;
        case RESUME_RESOLVED:
                am_resolve(&state);