Cloning from a repo without "current branch"
[gitweb.git] / builtin-revert.c
index f3f3f5c6ee6fa666c3179145655ae7a968c27b3a..499bbe7343a635f1c7fc024ed6a1436042dcb8ac 100644 (file)
@@ -25,7 +25,7 @@ static const char *cherry_pick_usage = "git-cherry-pick [--edit] [-n] [-r] [-x]
 
 static int edit;
 static int replay;
-enum { REVERT, CHERRY_PICK } action;
+static enum { REVERT, CHERRY_PICK } action;
 static int no_commit;
 static struct commit *commit;
 static int needed_deref;
@@ -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;
 
@@ -126,14 +129,14 @@ char *get_encoding(const char *message)
        return NULL;
 }
 
-struct lock_file msg_file;
+static struct lock_file msg_file;
 static int msg_fd;
 
 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)
@@ -237,6 +240,7 @@ static int revert_or_cherry_pick(int argc, const char **argv)
        int i;
        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";
@@ -280,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)
@@ -294,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 {
@@ -330,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;) {
@@ -345,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"
@@ -362,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);
 
        /*
@@ -376,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);