cherry-pick/revert: Use advise() for hints
[gitweb.git] / builtin / revert.c
index b082bb425c6e865a3e5d7bae00b9da68e0933517..7f35cc6e1734c4000d8971f808356d0fb344ffc6 100644 (file)
@@ -241,27 +241,30 @@ static void set_author_ident_env(const char *message)
                        sha1_to_hex(commit->object.sha1));
 }
 
-static char *help_msg(void)
+static void advise(const char *advice, ...)
 {
-       struct strbuf helpbuf = STRBUF_INIT;
-       char *msg = getenv("GIT_CHERRY_PICK_HELP");
+       va_list params;
 
-       if (msg)
-               return msg;
+       va_start(params, advice);
+       vreportf("hint: ", advice, params);
+       va_end(params);
+}
 
-       strbuf_addstr(&helpbuf, "  After resolving the conflicts,\n"
-               "mark the corrected paths with 'git add <paths>' or 'git rm <paths>'\n"
-               "and commit the result");
+static void print_advice(void)
+{
+       char *msg = getenv("GIT_CHERRY_PICK_HELP");
 
-       if (action == CHERRY_PICK) {
-               strbuf_addf(&helpbuf, " with: \n"
-                       "\n"
-                       "        git commit -c %s\n",
-                           sha1_to_hex(commit->object.sha1));
+       if (msg) {
+               fprintf(stderr, "%s\n", msg);
+               return;
        }
-       else
-               strbuf_addch(&helpbuf, '.');
-       return strbuf_detach(&helpbuf, NULL);
+
+       advise("after resolving the conflicts, mark the corrected paths");
+       advise("with 'git add <paths>' or 'git rm <paths>'");
+
+       if (action == CHERRY_PICK)
+               advise("and commit the result with 'git commit -c %s'",
+                      find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV));
 }
 
 static void write_message(struct strbuf *msgbuf, const char *filename)
@@ -361,6 +364,32 @@ static int do_recursive_merge(struct commit *base, struct commit *next,
        return !clean;
 }
 
+/*
+ * If we are cherry-pick, and if the merge did not result in
+ * hand-editing, we will hit this commit and inherit the original
+ * author date and name.
+ * If we are revert, or if our cherry-pick results in a hand merge,
+ * we had better say that the current user is responsible for that.
+ */
+static int run_git_commit(const char *defmsg)
+{
+       /* 6 is max possible length of our args array including NULL */
+       const char *args[6];
+       int i = 0;
+
+       args[i++] = "commit";
+       args[i++] = "-n";
+       if (signoff)
+               args[i++] = "-s";
+       if (!edit) {
+               args[i++] = "-F";
+               args[i++] = defmsg;
+       }
+       args[i] = NULL;
+
+       return run_command_v_opt(args, RUN_GIT_CMD);
+}
+
 static int do_pick_commit(void)
 {
        unsigned char head[20];
@@ -369,7 +398,6 @@ static int do_pick_commit(void)
        struct commit_message msg = { NULL, NULL, NULL, NULL, NULL };
        char *defmsg = NULL;
        struct strbuf msgbuf = STRBUF_INIT;
-       struct strbuf mebuf = STRBUF_INIT;
        int res;
 
        if (no_commit) {
@@ -466,8 +494,6 @@ static int do_pick_commit(void)
                }
        }
 
-       strbuf_addstr(&mebuf, me);
-
        if (!strategy || !strcmp(strategy, "recursive") || action == REVERT) {
                res = do_recursive_merge(base, next, base_label, next_label,
                                         head, &msgbuf);
@@ -476,7 +502,6 @@ static int do_pick_commit(void)
                struct commit_list *common = NULL;
                struct commit_list *remotes = NULL;
 
-               strbuf_addf(&mebuf, " with strategy %s", strategy);
                write_message(&msgbuf, defmsg);
 
                commit_list_insert(base, &common);
@@ -488,52 +513,21 @@ static int do_pick_commit(void)
        }
 
        if (res) {
-               fprintf(stderr, "Automatic %s failed.%s\n",
-                       mebuf.buf, help_msg());
+               error("could not %s %s... %s",
+                     action == REVERT ? "revert" : "apply",
+                     find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV),
+                     msg.subject);
+               print_advice();
                rerere(allow_rerere_auto);
        } else {
-               fprintf(stderr, "Finished one %s.\n", mebuf.buf);
+               if (!no_commit)
+                       res = run_git_commit(defmsg);
        }
 
-       strbuf_release(&mebuf);
        free_message(&msg);
-
-       if (res)
-               return 1;
-
-       /*
-        *
-        * If we are cherry-pick, and if the merge did not result in
-        * hand-editing, we will hit this commit and inherit the original
-        * author date and name.
-        * If we are revert, or if our cherry-pick results in a hand merge,
-        * we had better say that the current user is responsible for that.
-        */
-
-       if (!no_commit) {
-               /* 6 is max possible length of our args array including NULL */
-               const char *args[6];
-               int res;
-               int i = 0;
-
-               args[i++] = "commit";
-               args[i++] = "-n";
-               if (signoff)
-                       args[i++] = "-s";
-               if (!edit) {
-                       args[i++] = "-F";
-                       args[i++] = defmsg;
-               }
-               args[i] = NULL;
-               res = run_command_v_opt(args, RUN_GIT_CMD);
-               free(defmsg);
-
-               return res;
-       }
-
        free(defmsg);
 
-       return 0;
+       return res;
 }
 
 static void prepare_revs(struct rev_info *revs)