git-stash: fix pushing stash with pathspec from subdir

The `git stash push` command recently gained the ability to get a
pathspec as its argument to only stash matching files. Calling this
command from a subdirectory does not work, though, as one of the first
things we do is changing to the top level directory without keeping
track of the prefix from which the command is being run.

Fix the shortcoming by storing the prefix previous to the call to
`cd_to_toplevel` and then subsequently using `git rev-parse --prefix` to
correctly resolve the pathspec. Add a test to catch future breakage of
this usecase.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Patrick Steinhardt 2017-06-13 13:38:34 +02:00 committed by Junio C Hamano
parent 3851e4483f
commit 22fc703ec9
2 changed files with 19 additions and 0 deletions

View File

@ -19,6 +19,7 @@ OPTIONS_SPEC=
START_DIR=$(pwd) START_DIR=$(pwd)
. git-sh-setup . git-sh-setup
require_work_tree require_work_tree
prefix=$(git rev-parse --show-prefix) || exit 1
cd_to_toplevel cd_to_toplevel
TMP="$GIT_DIR/.git-stash.$$" TMP="$GIT_DIR/.git-stash.$$"
@ -273,6 +274,8 @@ push_stash () {
shift shift
done done
eval "set $(git rev-parse --sq --prefix "$prefix" -- "$@")"
if test -n "$patch_mode" && test -n "$untracked" if test -n "$patch_mode" && test -n "$untracked"
then then
die "$(gettext "Can't use --patch and --include-untracked or --all at the same time")" die "$(gettext "Can't use --patch and --include-untracked or --all at the same time")"

View File

@ -812,6 +812,22 @@ test_expect_success 'stash -- <pathspec> stashes and restores the file' '
test_path_is_file bar test_path_is_file bar
' '
test_expect_success 'stash -- <pathspec> stashes in subdirectory' '
mkdir sub &&
>foo &&
>bar &&
git add foo bar &&
(
cd sub &&
git stash push -- ../foo
) &&
test_path_is_file bar &&
test_path_is_missing foo &&
git stash pop &&
test_path_is_file foo &&
test_path_is_file bar
'
test_expect_success 'stash with multiple pathspec arguments' ' test_expect_success 'stash with multiple pathspec arguments' '
>foo && >foo &&
>bar && >bar &&