stash: allow "git stash [<options>] --patch <pathspec>" to assume push

The support for assuming "push" when "-p" is given introduced in
9e140909f6 (stash: allow pathspecs in the no verb form, 2017-02-28) is
very narrow, neither "git stash -m <message> -p <pathspec>" nor "git
stash --patch <pathspec>" 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
<pathspec> -p" still dies so that it does not assume the user meant
"push" if they mistype a subcommand name but "git stash -m <message> -p
<pathspec>" 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 <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Phillip Wood
2025-06-07 10:45:26 +01:00
committed by Junio C Hamano
parent e6659b77df
commit 468817bab2
2 changed files with 9 additions and 5 deletions

View File

@@ -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) {