From: Phillip Wood Date: Sat, 7 Jun 2025 09:45:26 +0000 (+0100) Subject: stash: allow "git stash [] --patch " to assume push X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=468817bab2ab5fd9b71a8df49e02b8d5521b1631;p=thirdparty%2Fgit.git stash: allow "git stash [] --patch " to assume push The support for assuming "push" when "-p" is given introduced in 9e140909f61 (stash: allow pathspecs in the no verb form, 2017-02-28) is very narrow, neither "git stash -m -p " nor "git stash --patch " imply "push" and die instead. Relax this by passing PARSE_OPT_STOP_AT_NON_OPTION when push is being assumed and then setting "force_assume" if "--patch" was present. This means "git stash -p" still dies so that it does not assume the user meant "push" if they mistype a subcommand name but "git stash -m -p " will now succeed. The test added in the last commit is adjusted to check that push is still assumed when "--patch" comes after other options on the command-line. Signed-off-by: Phillip Wood Signed-off-by: Junio C Hamano --- diff --git a/builtin/stash.c b/builtin/stash.c index bc2c34fa04..b12fd6c40f 100644 --- a/builtin/stash.c +++ b/builtin/stash.c @@ -1789,11 +1789,15 @@ static int push_stash(int argc, const char **argv, const char *prefix, int ret; if (argc) { - force_assume = argc > 1 && !strcmp(argv[1], "-p"); + int flags = PARSE_OPT_KEEP_DASHDASH; + + if (push_assumed) + flags |= PARSE_OPT_STOP_AT_NON_OPTION; + argc = parse_options(argc, argv, prefix, options, push_assumed ? git_stash_usage : - git_stash_push_usage, - PARSE_OPT_KEEP_DASHDASH); + git_stash_push_usage, flags); + force_assume |= patch_mode; } if (argc) { diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh index a99a746221..2bba3baa10 100755 --- a/t/t3903-stash.sh +++ b/t/t3903-stash.sh @@ -1177,13 +1177,13 @@ 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_expect_success 'stash --patch 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_write_lines s y n | git stash -m "stash bar" --patch file && test_cmp expect-file file && echo changed-other-file >expect && test_cmp expect other-file &&