From 63b50c8ffe7133d2ec7d243dd9240c14ddfe8a26 Mon Sep 17 00:00:00 2001 From: Thomas Gummerer Date: Sat, 15 Jun 2019 12:26:18 +0100 Subject: stash: fix show referencing stash index In the conversion of 'stash show' to C in dc7bd382b1 ("stash: convert show to builtin", 2019-02-25), 'git stash show ', where n is the index of a stash got broken, if n is not a file or a valid revision by itself. 'stash show' accepts any flag 'git diff' accepts for changing the output format. Internally we use 'setup_revisions()' to parse these command line flags. Currently we pass the whole argv through to 'setup_revisions()', which includes the stash index. As the stash index is not a valid revision or a file in the working tree in most cases however, this 'setup_revisions()' call (and thus the whole command) ends up failing if we use this form of 'git stash show'. Instead of passing the whole argv to 'setup_revisions()', only pass the flags (and the command name) through, while excluding the stash reference. The stash reference is parsed (and validated) in 'get_stash_info()' already. This separate parsing also means that we currently do produce the correct output if the command succeeds. Reported-by: Mike Hommey Signed-off-by: Thomas Gummerer Signed-off-by: Junio C Hamano --- t/t3903-stash.sh | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 't/t3903-stash.sh') diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh index ea30d5f6a0..b22e671608 100755 --- a/t/t3903-stash.sh +++ b/t/t3903-stash.sh @@ -708,6 +708,24 @@ test_expect_success 'invalid ref of the form "n", n >= N' ' git stash drop ' +test_expect_success 'valid ref of the form "n", n < N' ' + git stash clear && + echo bar5 >file && + echo bar6 >file2 && + git add file2 && + git stash && + git stash show 0 && + git stash branch tmp 0 && + git checkout master && + git stash && + git stash apply 0 && + git reset --hard && + git stash pop 0 && + git stash && + git stash drop 0 && + test_must_fail git stash drop +' + test_expect_success 'branch: do not drop the stash if the branch exists' ' git stash clear && echo foo >file && -- cgit v1.2.3 From b932f6a5e8cdbb33eff4563fdfb1eae9ebf70a65 Mon Sep 17 00:00:00 2001 From: Thomas Gummerer Date: Tue, 16 Jul 2019 15:23:22 +0100 Subject: stash: fix handling removed files with --keep-index git stash push --keep-index is supposed to keep all changes that have been added to the index, both in the index and on disk. Currently this doesn't behave correctly when a file is removed from the index. Instead of keeping it deleted on disk, --keep-index currently restores the file. Fix that behaviour by using 'git checkout' in no-overlay mode which can faithfully restore the index and working tree. This also simplifies the code. Note that this will overwrite untracked files if the untracked file has the same name as a file that has been deleted in the index. Signed-off-by: Thomas Gummerer Signed-off-by: Junio C Hamano --- t/t3903-stash.sh | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 't/t3903-stash.sh') diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh index ea30d5f6a0..151cd497be 100755 --- a/t/t3903-stash.sh +++ b/t/t3903-stash.sh @@ -1216,4 +1216,11 @@ test_expect_success 'stash works when user.name and user.email are not set' ' ) ' +test_expect_success 'stash --keep-index with file deleted in index does not resurrect it on disk' ' + test_commit to-remove to-remove && + git rm to-remove && + git stash --keep-index && + test_path_is_missing to-remove +' + test_done -- cgit v1.2.3