]> git.scripts.mit.edu Git - git.git/commitdiff
cherry-pick: handle "-" after parsing options
authorJeff King <peff@peff.net>
Thu, 10 Oct 2013 16:41:17 +0000 (12:41 -0400)
committerJonathan Nieder <jrnieder@gmail.com>
Thu, 10 Oct 2013 22:33:46 +0000 (15:33 -0700)
Currently, we only try converting argv[1] from "-" into "@{-1}".  This
means we do not notice "-" when used together with an option.  Worse,
when "git cherry-pick" is run with no options, we segfault.  Fix this
by doing the substitution after we have checked that there is
something in argv to cherry-pick and know any remaining options are
meant for the revision-listing machinery.

This still does not handle "-" after the first non-cherry-pick option.
For example,

git cherry-pick foo~2 - bar~5

and

git cherry-pick --no-merges -

will still dump usage.

Reported-by: Stefan Beller <stefanbeller@googlemail.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
builtin/revert.c
t/t3501-revert-cherry-pick.sh

index e264a151ea99628646374c6f072db1fa4c1ea47c..38aaa16fa9328cb4d776001382d19cec82a73d8d 100644 (file)
@@ -198,6 +198,8 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts)
                opts->revs->no_walk = REVISION_WALK_NO_WALK_UNSORTED;
                if (argc < 2)
                        usage_with_options(usage_str, options);
+               if (!strcmp(argv[1], "-"))
+                       argv[1] = "@{-1}";
                memset(&s_r_opt, 0, sizeof(s_r_opt));
                s_r_opt.assume_dashdash = 1;
                argc = setup_revisions(argc, argv, opts->revs, &s_r_opt);
@@ -232,8 +234,6 @@ int cmd_cherry_pick(int argc, const char **argv, const char *prefix)
        memset(&opts, 0, sizeof(opts));
        opts.action = REPLAY_PICK;
        git_config(git_default_config, NULL);
-       if (!strcmp(argv[1], "-"))
-               argv[1] = "@{-1}";
        parse_args(argc, argv, &opts);
        res = sequencer_pick_revisions(&opts);
        if (res < 0)
index 6281619141afec8cc2d3a0696bbed4ec91e32b54..12c246f7f47812e42c68467c2c5755f4d4c0339d 100755 (executable)
@@ -129,4 +129,16 @@ test_expect_success 'cherry-pick "-" is meaningless without checkout' '
        )
 '
 
+test_expect_success 'cherry-pick "-" works with arguments' '
+       git checkout -b side-branch &&
+       test_commit change actual change &&
+       git checkout master &&
+       git cherry-pick -s - &&
+       echo "Signed-off-by: C O Mitter <committer@example.com>" >expect &&
+       git cat-file commit HEAD | grep ^Signed-off-by: >signoff &&
+       test_cmp expect signoff &&
+       echo change >expect &&
+       test_cmp expect actual
+'
+
 test_done