Skip to content

Commit 37d4614

Browse files
phillipwoodgitster
authored andcommitted
stash: allow "git stash -p <pathspec>" to assume push again
Historically "git stash [<options>]" was assumed to mean "git stash save [<options>]". Since 1ada502 (stash: use stash_push for no verb form, 2017-02-28) it is assumed to mean "git stash push [<options>]". As the push subcommand supports pathspecs, 9e14090 (stash: allow pathspecs in the no verb form, 2017-02-28) allowed "git stash -p <pathspec>" to mean "git stash push -p <pathspec>". This was broken in 8c3713c (stash: eliminate crude option parsing, 2020-02-17) which failed to account for "push" being added to the start of argv in cmd_stash() before it calls push_stash() and kept looking in argv[0] for "-p" after moving the code to push_stash(). Fix this by regression by checking argv[1] instead of argv[0] and add a couple of tests to prevent future regressions. Signed-off-by: Phillip Wood <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 8613c2b commit 37d4614

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

builtin/stash.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1789,7 +1789,7 @@ static int push_stash(int argc, const char **argv, const char *prefix,
17891789
int ret;
17901790

17911791
if (argc) {
1792-
force_assume = !strcmp(argv[0], "-p");
1792+
force_assume = argc > 1 && !strcmp(argv[1], "-p");
17931793
argc = parse_options(argc, argv, prefix, options,
17941794
push_assumed ? git_stash_usage :
17951795
git_stash_push_usage,

t/t3903-stash.sh

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1177,6 +1177,25 @@ test_expect_success 'stash -- <pathspec> stashes and restores the file' '
11771177
test_path_is_file bar
11781178
'
11791179

1180+
test_expect_success 'stash -p <pathspec> stash and restores the file' '
1181+
cat file >expect-file &&
1182+
echo changed-file >file &&
1183+
echo changed-other-file >other-file &&
1184+
echo a | git stash -p file &&
1185+
test_cmp expect-file file &&
1186+
echo changed-other-file >expect &&
1187+
test_cmp expect other-file &&
1188+
git stash pop &&
1189+
test_cmp expect other-file &&
1190+
echo changed-file >expect &&
1191+
test_cmp expect file
1192+
'
1193+
1194+
test_expect_success 'stash <pathspec> -p is rejected' '
1195+
test_must_fail git stash file -p 2>err &&
1196+
test_grep "subcommand wasn${SQ}t specified; ${SQ}push${SQ} can${SQ}t be assumed due to unexpected token ${SQ}file${SQ}" err
1197+
'
1198+
11801199
test_expect_success 'stash -- <pathspec> stashes in subdirectory' '
11811200
mkdir sub &&
11821201
>foo &&

0 commit comments

Comments
 (0)