cherry-pick: do not give irrelevant advice when cherry-pick punted
[gitweb.git] / builtin / revert.c
index 2bb13ebb1de48e793e01d18ced29a468aa273b34..e38fe0ce7ad2702c4a6edae262635c4f638ffcb6 100644 (file)
@@ -76,7 +76,8 @@ static void parse_args(int argc, const char **argv)
        struct option options[] = {
                OPT_BOOLEAN('n', "no-commit", &no_commit, "don't automatically commit"),
                OPT_BOOLEAN('e', "edit", &edit, "edit the commit message"),
-               OPT_BOOLEAN('r', NULL, &noop, "no-op (backward compatibility)"),
+               { OPTION_BOOLEAN, 'r', NULL, &noop, NULL, "no-op (backward compatibility)",
+                 PARSE_OPT_NOARG | PARSE_OPT_HIDDEN, NULL, 0 },
                OPT_BOOLEAN('s', "signoff", &signoff, "add Signed-off-by:"),
                OPT_INTEGER('m', "mainline", &mainline, "parent number"),
                OPT_RERERE_AUTOUPDATE(&allow_rerere_auto),
@@ -222,7 +223,7 @@ static void advise(const char *advice, ...)
        va_end(params);
 }
 
-static void print_advice(void)
+static void print_advice(int show_hint)
 {
        char *msg = getenv("GIT_CHERRY_PICK_HELP");
 
@@ -237,9 +238,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)
@@ -407,8 +410,6 @@ static int do_pick_commit(void)
        discard_cache();
 
        if (!commit->parents) {
-               if (action == REVERT)
-                       die (_("Cannot revert a root commit"));
                parent = NULL;
        }
        else if (commit->parents->next) {
@@ -466,7 +467,7 @@ static int do_pick_commit(void)
                strbuf_addstr(&msgbuf, "\"\n\nThis reverts commit ");
                strbuf_addstr(&msgbuf, sha1_to_hex(commit->object.sha1));
 
-               if (commit->parents->next) {
+               if (commit->parents && commit->parents->next) {
                        strbuf_addstr(&msgbuf, ", reversing\nchanges made to ");
                        strbuf_addstr(&msgbuf, sha1_to_hex(parent->object.sha1));
                }
@@ -482,8 +483,6 @@ static int do_pick_commit(void)
                        strbuf_addstr(&msgbuf, sha1_to_hex(commit->object.sha1));
                        strbuf_addstr(&msgbuf, ")\n");
                }
-               if (!no_commit)
-                       write_cherry_pick_head();
        }
 
        if (!strategy || !strcmp(strategy, "recursive") || action == REVERT) {
@@ -504,13 +503,22 @@ static int do_pick_commit(void)
                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 (action == CHERRY_PICK && !no_commit && (res == 0 || res == 1))
+               write_cherry_pick_head();
+
        if (res) {
                error(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(allow_rerere_auto);
        } else {
                if (!no_commit)