From: Phillip Wood Date: Sat, 7 Jun 2025 09:45:25 +0000 (+0100) Subject: stash: allow "git stash -p " to assume push again X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e6659b77dfed6f3778e5c6870927be3da082d4f5;p=thirdparty%2Fgit.git stash: allow "git stash -p " to assume push again Historically "git stash []" was assumed to mean "git stash save []". Since 1ada5020b38 (stash: use stash_push for no verb form, 2017-02-28) it is assumed to mean "git stash push []". As the push subcommand supports pathspecs, 9e140909f61 (stash: allow pathspecs in the no verb form, 2017-02-28) allowed "git stash -p " to mean "git stash push -p ". This was broken in 8c3713cede7 (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. Helped-by: Martin Ă…gren Signed-off-by: Phillip Wood Signed-off-by: Junio C Hamano --- diff --git a/builtin/stash.c b/builtin/stash.c index cfbd92852a..bc2c34fa04 100644 --- a/builtin/stash.c +++ b/builtin/stash.c @@ -1789,7 +1789,7 @@ static int push_stash(int argc, const char **argv, const char *prefix, int ret; if (argc) { - force_assume = !strcmp(argv[0], "-p"); + force_assume = argc > 1 && !strcmp(argv[1], "-p"); argc = parse_options(argc, argv, prefix, options, push_assumed ? git_stash_usage : git_stash_push_usage, diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh index 74666ff3e4..a99a746221 100755 --- a/t/t3903-stash.sh +++ b/t/t3903-stash.sh @@ -1177,6 +1177,28 @@ test_expect_success 'stash -- stashes and restores the file' ' test_path_is_file bar ' +test_expect_success 'stash -p stash and restores the file' ' + test_write_lines b c >file && + git commit -m "add a few lines" file && + test_write_lines a b c d >file && + test_write_lines b c d >expect-file && + echo changed-other-file >other-file && + test_write_lines s y n | git stash -p file && + test_cmp expect-file file && + echo changed-other-file >expect && + test_cmp expect other-file && + git checkout HEAD -- file && + git stash pop && + test_cmp expect other-file && + test_write_lines a b c >expect && + test_cmp expect file +' + +test_expect_success 'stash -p is rejected' ' + test_must_fail git stash file -p 2>err && + test_grep "subcommand wasn${SQ}t specified; ${SQ}push${SQ} can${SQ}t be assumed due to unexpected token ${SQ}file${SQ}" err +' + test_expect_success 'stash -- stashes in subdirectory' ' mkdir sub && >foo &&