stash: allow pathspecs in the no verb form

Now that stash_push is used in the no verb form of stash, allow
specifying the command line for this form as well.  Always use -- to
disambiguate pathspecs from other non-option arguments.

Also make git stash -p an alias for git stash push -p.  This allows
users to use git stash -p <pathspec>.

Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Thomas Gummerer 2017-02-28 20:33:40 +00:00 committed by Junio C Hamano
parent 1ada5020b3
commit 9e140909f6
3 changed files with 25 additions and 4 deletions

View File

@ -54,10 +54,13 @@ push [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q
Save your local modifications to a new 'stash' and roll them Save your local modifications to a new 'stash' and roll them
back to HEAD (in the working tree and in the index). back to HEAD (in the working tree and in the index).
The <message> part is optional and gives The <message> part is optional and gives
the description along with the stashed state. For quickly making the description along with the stashed state.
a snapshot, you can omit _both_ "save" and <message>, but giving +
only <message> does not trigger this action to prevent a misspelled For quickly making a snapshot, you can omit "push". In this mode,
subcommand from making an unwanted stash. non-option arguments are not allowed to prevent a misspelled
subcommand from making an unwanted stash. The two exceptions to this
are `stash -p` which acts as alias for `stash push -p` and pathspecs,
which are allowed after a double hyphen `--` for disambiguation.
+ +
When pathspec is given to 'git stash push', the new stash records the When pathspec is given to 'git stash push', the new stash records the
modified states only for the files that match the pathspec. The index modified states only for the files that match the pathspec. The index

View File

@ -656,12 +656,15 @@ apply_to_branch () {
} }
} }
test "$1" = "-p" && set "push" "$@"
PARSE_CACHE='--not-parsed' PARSE_CACHE='--not-parsed'
# The default command is "push" if nothing but options are given # The default command is "push" if nothing but options are given
seen_non_option= seen_non_option=
for opt for opt
do do
case "$opt" in case "$opt" in
--) break ;;
-*) ;; -*) ;;
*) seen_non_option=t; break ;; *) seen_non_option=t; break ;;
esac esac

View File

@ -892,4 +892,19 @@ test_expect_success 'untracked files are left in place when -u is not given' '
test_path_is_file untracked test_path_is_file untracked
' '
test_expect_success 'stash without verb with pathspec' '
>"foo bar" &&
>foo &&
>bar &&
git add foo* &&
git stash -- "foo b*" &&
test_path_is_missing "foo bar" &&
test_path_is_file foo &&
test_path_is_file bar &&
git stash pop &&
test_path_is_file "foo bar" &&
test_path_is_file foo &&
test_path_is_file bar
'
test_done test_done