Skip to content

Commit d644c55

Browse files
peffjrn
authored andcommitted
cherry-pick: handle "-" after parsing options
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 <[email protected]> Signed-off-by: Jeff King <[email protected]> Signed-off-by: Jonathan Nieder <[email protected]>
1 parent 182d7dc commit d644c55

File tree

2 files changed

+14
-2
lines changed

2 files changed

+14
-2
lines changed

builtin/revert.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,8 @@ static void parse_args(int argc, const char **argv, struct replay_opts *opts)
198198
opts->revs->no_walk = REVISION_WALK_NO_WALK_UNSORTED;
199199
if (argc < 2)
200200
usage_with_options(usage_str, options);
201+
if (!strcmp(argv[1], "-"))
202+
argv[1] = "@{-1}";
201203
memset(&s_r_opt, 0, sizeof(s_r_opt));
202204
s_r_opt.assume_dashdash = 1;
203205
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)
232234
memset(&opts, 0, sizeof(opts));
233235
opts.action = REPLAY_PICK;
234236
git_config(git_default_config, NULL);
235-
if (!strcmp(argv[1], "-"))
236-
argv[1] = "@{-1}";
237237
parse_args(argc, argv, &opts);
238238
res = sequencer_pick_revisions(&opts);
239239
if (res < 0)

t/t3501-revert-cherry-pick.sh

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,4 +129,16 @@ test_expect_success 'cherry-pick "-" is meaningless without checkout' '
129129
)
130130
'
131131

132+
test_expect_success 'cherry-pick "-" works with arguments' '
133+
git checkout -b side-branch &&
134+
test_commit change actual change &&
135+
git checkout master &&
136+
git cherry-pick -s - &&
137+
echo "Signed-off-by: C O Mitter <[email protected]>" >expect &&
138+
git cat-file commit HEAD | grep ^Signed-off-by: >signoff &&
139+
test_cmp expect signoff &&
140+
echo change >expect &&
141+
test_cmp expect actual
142+
'
143+
132144
test_done

0 commit comments

Comments
 (0)