merge-recursive: separate out xdl_merge() interface.
[gitweb.git] / builtin-revert.c
index bc3cfcba0751539663e464b14f21cb808c6f311e..4ba0ee63ab4ca5e77aa350d1956f1b3312945f5d 100644 (file)
@@ -207,6 +207,7 @@ static int merge_recursive(const char *base_sha1,
                const char *next_sha1, const char *next_name)
 {
        char buffer[256];
+       const char *argv[6];
 
        sprintf(buffer, "GITHEAD_%s", head_sha1);
        setenv(buffer, head_name, 1);
@@ -219,10 +220,14 @@ static int merge_recursive(const char *base_sha1,
         * and $prev on top of us (when reverting), or the change between
         * $prev and $commit on top of us (when cherry-picking or replaying).
         */
-
-       return run_command_opt(RUN_COMMAND_NO_STDIN | RUN_GIT_CMD,
-                       "merge-recursive", base_sha1, "--",
-                       head_sha1, next_sha1, NULL);
+       argv[0] = "merge-recursive";
+       argv[1] = base_sha1;
+       argv[2] = "--";
+       argv[3] = head_sha1;
+       argv[4] = next_sha1;
+       argv[5] = NULL;
+
+       return run_command_v_opt(argv, RUN_COMMAND_NO_STDIN | RUN_GIT_CMD);
 }
 
 static int revert_or_cherry_pick(int argc, const char **argv)
@@ -230,8 +235,8 @@ static int revert_or_cherry_pick(int argc, const char **argv)
        unsigned char head[20];
        struct commit *base, *next;
        int i;
-       char *oneline, *encoding, *reencoded_message = NULL;
-       const char *message;
+       char *oneline, *reencoded_message = NULL;
+       const char *message, *encoding;
 
        git_config(git_default_config);
        me = action == REVERT ? "revert" : "cherry-pick";
@@ -289,13 +294,13 @@ static int revert_or_cherry_pick(int argc, const char **argv)
        oneline = get_oneline(message);
 
        if (action == REVERT) {
+               char *oneline_body = strchr(oneline, ' ');
+
                base = commit;
                next = commit->parents->item;
-               add_to_msg("Revert ");
-               add_to_msg(find_unique_abbrev(commit->object.sha1,
-                                       DEFAULT_ABBREV));
-               add_to_msg(oneline);
-               add_to_msg("\nThis reverts commit ");
+               add_to_msg("Revert \"");
+               add_to_msg(oneline_body + 1);
+               add_to_msg("\"\n\nThis reverts commit ");
                add_to_msg(sha1_to_hex(commit->object.sha1));
                add_to_msg(".\n");
        } else {
@@ -303,8 +308,8 @@ static int revert_or_cherry_pick(int argc, const char **argv)
                next = commit;
                set_author_ident_env(message);
                add_message_to_msg(message);
-               if (replay) {
-                       add_to_msg("\n(cherry picked from commit ");
+               if (!replay) {
+                       add_to_msg("(cherry picked from commit ");
                        add_to_msg(sha1_to_hex(commit->object.sha1));
                        add_to_msg(")\n");
                }
@@ -323,9 +328,8 @@ static int revert_or_cherry_pick(int argc, const char **argv)
 
        if (merge_recursive(sha1_to_hex(base->object.sha1),
                                sha1_to_hex(head), "HEAD",
-                               sha1_to_hex(next->object.sha1), oneline))
-               exit(1);
-       if (write_tree(head, 0, NULL)) {
+                               sha1_to_hex(next->object.sha1), oneline) ||
+                       write_tree(head, 0, NULL)) {
                const char *target = git_path("MERGE_MSG");
                add_to_msg("\nConflicts:\n\n");
                read_cache();
@@ -350,16 +354,10 @@ static int revert_or_cherry_pick(int argc, const char **argv)
                        "mark the corrected paths with 'git-add <paths>'\n"
                        "and commit the result.\n", me);
                if (action == CHERRY_PICK) {
-                       fprintf(stderr, "You may choose to use the following "
-                               "when making the commit:\n"
-                               "GIT_AUTHOR_NAME=\"%s\"\n",
-                               getenv("GIT_AUTHOR_NAME"));
-                       fprintf(stderr, "GIT_AUTHOR_EMAIL=\"%s\"\n",
-                               getenv("GIT_AUTHOR_EMAIL"));
-                       fprintf(stderr, "GIT_AUTHOR_DATE=\"%s\"\n"
-                               "export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL "
-                               "GIT_AUTHOR_DATE\n",
-                               getenv("GIT_AUTHOR_DATE"));
+                       fprintf(stderr, "When commiting, use the option "
+                               "'-c %s' to retain authorship and message.\n",
+                               find_unique_abbrev(commit->object.sha1,
+                                       DEFAULT_ABBREV));
                }
                exit(1);
        }