Merge branch 'jn/paginate-fix'
[gitweb.git] / builtin / revert.c
index 853e9e406c7fe258c39fa7e5c53f15f739a935b1..9215e665046a8991b57f8d4cfda123dae084414c 100644 (file)
@@ -50,10 +50,14 @@ static const char *strategy;
 
 static char *get_encoding(const char *message);
 
+static const char * const *revert_or_cherry_pick_usage(void)
+{
+       return action == REVERT ? revert_usage : cherry_pick_usage;
+}
+
 static void parse_args(int argc, const char **argv)
 {
-       const char * const * usage_str =
-               action == REVERT ?  revert_usage : cherry_pick_usage;
+       const char * const * usage_str = revert_or_cherry_pick_usage();
        int noop;
        struct option options[] = {
                OPT_BOOLEAN('n', "no-commit", &no_commit, "don't automatically commit"),
@@ -78,8 +82,10 @@ static void parse_args(int argc, const char **argv)
                        die("program error");
        }
 
-       commit_argc = parse_options(argc, argv, NULL, options, usage_str, 0);
-       if (commit_argc < 1)
+       commit_argc = parse_options(argc, argv, NULL, options, usage_str,
+                                   PARSE_OPT_KEEP_ARGV0 |
+                                   PARSE_OPT_KEEP_UNKNOWN);
+       if (commit_argc < 2)
                usage_with_options(usage_str, options);
 
        commit_argv = argv;
@@ -96,9 +102,9 @@ struct commit_message {
 static int get_message(const char *raw_message, struct commit_message *out)
 {
        const char *encoding;
-       const char *p, *abbrev, *eol;
+       const char *abbrev, *subject;
+       int abbrev_len, subject_len;
        char *q;
-       int abbrev_len, oneline_len;
 
        if (!raw_message)
                return -1;
@@ -119,27 +125,17 @@ static int get_message(const char *raw_message, struct commit_message *out)
        abbrev = find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV);
        abbrev_len = strlen(abbrev);
 
-       /* Find beginning and end of commit subject. */
-       p = out->message;
-       while (*p && (*p != '\n' || p[1] != '\n'))
-               p++;
-       if (*p) {
-               p += 2;
-               for (eol = p + 1; *eol && *eol != '\n'; eol++)
-                       ; /* do nothing */
-       } else
-               eol = p;
-       oneline_len = eol - p;
+       subject_len = find_commit_subject(out->message, &subject);
 
        out->parent_label = xmalloc(strlen("parent of ") + abbrev_len +
-                             strlen("... ") + oneline_len + 1);
+                             strlen("... ") + subject_len + 1);
        q = out->parent_label;
        q = mempcpy(q, "parent of ", strlen("parent of "));
        out->label = q;
        q = mempcpy(q, abbrev, abbrev_len);
        q = mempcpy(q, "... ", strlen("... "));
        out->subject = q;
-       q = mempcpy(q, p, oneline_len);
+       q = mempcpy(q, subject, subject_len);
        *q = '\0';
        return 0;
 }
@@ -525,27 +521,22 @@ static int do_pick_commit(void)
 
 static void prepare_revs(struct rev_info *revs)
 {
-       int argc = 0;
-       int i;
-       const char **argv = xmalloc((commit_argc + 4) * sizeof(*argv));
+       int argc;
 
-       argv[argc++] = NULL;
-       argv[argc++] = "--no-walk";
+       init_revisions(revs, NULL);
+       revs->no_walk = 1;
        if (action != REVERT)
-               argv[argc++] = "--reverse";
-       for (i = 0; i < commit_argc; i++)
-               argv[argc++] = commit_argv[i];
-       argv[argc++] = NULL;
+               revs->reverse = 1;
+
+       argc = setup_revisions(commit_argc, commit_argv, revs, NULL);
+       if (argc > 1)
+               usage(*revert_or_cherry_pick_usage());
 
-       init_revisions(revs, NULL);
-       setup_revisions(argc - 1, argv, revs, NULL);
        if (prepare_revision_walk(revs))
                die("revision walk setup failed");
 
        if (!revs->commits)
                die("empty commit set passed");
-
-       free(argv);
 }
 
 static int revert_or_cherry_pick(int argc, const char **argv)