Code

Merge branch 'rs/diff-whole-function'
[git.git] / builtin / revert.c
index ba27cf15ee5478981a0a9a53493f41b67fcf9440..87df70edc33fcc71177b863e6ced870330e505d0 100644 (file)
@@ -110,7 +110,7 @@ static void verify_opt_compatible(const char *me, const char *base_opt, ...)
 
 static void verify_opt_mutually_compatible(const char *me, ...)
 {
-       const char *opt1, *opt2;
+       const char *opt1, *opt2 = NULL;
        va_list ap;
 
        va_start(ap, me);
@@ -133,7 +133,6 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts)
 {
        const char * const * usage_str = revert_or_cherry_pick_usage(opts);
        const char *me = action_name(opts);
-       int noop;
        int reset = 0;
        int contin = 0;
        struct option options[] = {
@@ -141,8 +140,7 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts)
                OPT_BOOLEAN(0, "continue", &contin, "continue the current operation"),
                OPT_BOOLEAN('n', "no-commit", &opts->no_commit, "don't automatically commit"),
                OPT_BOOLEAN('e', "edit", &opts->edit, "edit the commit message"),
-               { OPTION_BOOLEAN, 'r', NULL, &noop, NULL, "no-op (backward compatibility)",
-                 PARSE_OPT_NOARG | PARSE_OPT_HIDDEN, NULL, 0 },
+               OPT_NOOP_NOARG('r', NULL),
                OPT_BOOLEAN('s', "signoff", &opts->signoff, "add Signed-off-by:"),
                OPT_INTEGER('m', "mainline", &opts->mainline, "parent number"),
                OPT_RERERE_AUTOUPDATE(&opts->allow_rerere_auto),
@@ -304,7 +302,7 @@ static void write_cherry_pick_head(struct commit *commit)
        strbuf_release(&buf);
 }
 
-static void print_advice(void)
+static void print_advice(int show_hint)
 {
        char *msg = getenv("GIT_CHERRY_PICK_HELP");
 
@@ -319,9 +317,11 @@ static void print_advice(void)
                return;
        }
 
-       advise("after resolving the conflicts, mark the corrected paths");
-       advise("with 'git add <paths>' or 'git rm <paths>'");
-       advise("and commit the result with 'git commit'");
+       if (show_hint) {
+               advise("after resolving the conflicts, mark the corrected paths");
+               advise("with 'git add <paths>' or 'git rm <paths>'");
+               advise("and commit the result with 'git commit'");
+       }
 }
 
 static void write_message(struct strbuf *msgbuf, const char *filename)
@@ -566,8 +566,6 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts)
                        strbuf_addstr(&msgbuf, sha1_to_hex(commit->object.sha1));
                        strbuf_addstr(&msgbuf, ")\n");
                }
-               if (!opts->no_commit)
-                       write_cherry_pick_head(commit);
        }
 
        if (!opts->strategy || !strcmp(opts->strategy, "recursive") || opts->action == REVERT) {
@@ -588,13 +586,22 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts)
                free_commit_list(remotes);
        }
 
+       /*
+        * If the merge was clean or if it failed due to conflict, we write
+        * CHERRY_PICK_HEAD for the subsequent invocation of commit to use.
+        * However, if the merge did not even start, then we don't want to
+        * write it at all.
+        */
+       if (opts->action == CHERRY_PICK && !opts->no_commit && (res == 0 || res == 1))
+               write_cherry_pick_head(commit);
+
        if (res) {
                error(opts->action == REVERT
                      ? _("could not revert %s... %s")
                      : _("could not apply %s... %s"),
                      find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV),
                      msg.subject);
-               print_advice();
+               print_advice(res == 1);
                rerere(opts->allow_rerere_auto);
        } else {
                if (!opts->no_commit)