Add gitmodules(5)
[gitweb.git] / builtin-revert.c
index 2f2dc1bbaa564d07d38565d4a289157138c5c8b0..8f02ed7bd1b7d4aecb8611ac1c0ebf3978b34ca5 100644 (file)
@@ -45,8 +45,10 @@ static void parse_options(int argc, const char **argv)
        if (argc < 2)
                usage(usage_str);
 
-       for (i = 1; i < argc - 1; i++) {
+       for (i = 1; i < argc; i++) {
                arg = argv[i];
+               if (arg[0] != '-')
+                       break;
                if (!strcmp(arg, "-n") || !strcmp(arg, "--no-commit"))
                        no_commit = 1;
                else if (!strcmp(arg, "-e") || !strcmp(arg, "--edit"))
@@ -59,7 +61,8 @@ static void parse_options(int argc, const char **argv)
                else if (strcmp(arg, "-r"))
                        usage(usage_str);
        }
-
+       if (i != argc - 1)
+               usage(usage_str);
        arg = argv[argc - 1];
        if (get_sha1(arg, sha1))
                die ("Cannot find '%s'", arg);
@@ -104,7 +107,7 @@ static char *get_oneline(const char *message)
        return result;
 }
 
-char *get_encoding(const char *message)
+static char *get_encoding(const char *message)
 {
        const char *p = message, *eol;
 
@@ -133,7 +136,7 @@ static void add_to_msg(const char *string)
 {
        int len = strlen(string);
        if (write_in_full(msg_fd, string, len) < 0)
-               die ("Could not write to .msg");
+               die ("Could not write to MERGE_MSG");
 }
 
 static void add_message_to_msg(const char *message)
@@ -207,6 +210,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 +223,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 +238,9 @@ 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;
+       const char *defmsg = xstrdup(git_path("MERGE_MSG"));
 
        git_config(git_default_config);
        me = action == REVERT ? "revert" : "cherry-pick";
@@ -275,7 +284,7 @@ static int revert_or_cherry_pick(int argc, const char **argv)
         * reverse of it if we are revert.
         */
 
-       msg_fd = hold_lock_file_for_update(&msg_file, ".msg", 1);
+       msg_fd = hold_lock_file_for_update(&msg_file, defmsg, 1);
 
        encoding = get_encoding(message);
        if (!encoding)
@@ -289,13 +298,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 {
@@ -325,7 +334,6 @@ static int revert_or_cherry_pick(int argc, const char **argv)
                                sha1_to_hex(head), "HEAD",
                                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();
                for (i = 0; i < active_nr;) {
@@ -340,10 +348,7 @@ static int revert_or_cherry_pick(int argc, const char **argv)
                        }
                }
                if (close(msg_fd) || commit_lock_file(&msg_file) < 0)
-                       die ("Error wrapping up .msg");
-               unlink(target);
-               if (rename(".msg", target))
-                       die ("Could not move .msg to %s", target);
+                       die ("Error wrapping up %s", defmsg);
                fprintf(stderr, "Automatic %s failed.  "
                        "After resolving the conflicts,\n"
                        "mark the corrected paths with 'git-add <paths>'\n"
@@ -357,7 +362,7 @@ static int revert_or_cherry_pick(int argc, const char **argv)
                exit(1);
        }
        if (close(msg_fd) || commit_lock_file(&msg_file) < 0)
-               die ("Error wrapping up .msg");
+               die ("Error wrapping up %s", defmsg);
        fprintf(stderr, "Finished one %s.\n", me);
 
        /*
@@ -371,11 +376,9 @@ static int revert_or_cherry_pick(int argc, const char **argv)
 
        if (!no_commit) {
                if (edit)
-                       return execl_git_cmd("commit", "-n", "-F", ".msg",
-                               "-e", NULL);
+                       return execl_git_cmd("commit", "-n", NULL);
                else
-                       return execl_git_cmd("commit", "-n", "-F", ".msg",
-                               NULL);
+                       return execl_git_cmd("commit", "-n", "-F", defmsg, NULL);
        }
        if (reencoded_message)
                free(reencoded_message);