Merge branch 'cb/maint-stash-orphaned-file' into maint
* cb/maint-stash-orphaned-file: stash tests: stash can lose data in a file removed from the index stash: Don't overwrite files that have gone from the index
This commit is contained in:
commit
91788cf26e
@ -86,7 +86,7 @@ create_stash () {
|
|||||||
GIT_INDEX_FILE="$TMP-index" &&
|
GIT_INDEX_FILE="$TMP-index" &&
|
||||||
export GIT_INDEX_FILE &&
|
export GIT_INDEX_FILE &&
|
||||||
git read-tree -m $i_tree &&
|
git read-tree -m $i_tree &&
|
||||||
git add -u &&
|
git diff --name-only -z HEAD | git update-index -z --add --remove --stdin &&
|
||||||
git write-tree &&
|
git write-tree &&
|
||||||
rm -f "$TMP-index"
|
rm -f "$TMP-index"
|
||||||
) ) ||
|
) ) ||
|
||||||
|
150
t/t3903-stash.sh
150
t/t3903-stash.sh
@ -228,4 +228,154 @@ test_expect_success 'stash --invalid-option' '
|
|||||||
test bar,bar2 = $(cat file),$(cat file2)
|
test bar,bar2 = $(cat file),$(cat file2)
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'stash an added file' '
|
||||||
|
git reset --hard &&
|
||||||
|
echo new >file3 &&
|
||||||
|
git add file3 &&
|
||||||
|
git stash save "added file" &&
|
||||||
|
! test -r file3 &&
|
||||||
|
git stash apply &&
|
||||||
|
test new = "$(cat file3)"
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'stash rm then recreate' '
|
||||||
|
git reset --hard &&
|
||||||
|
git rm file &&
|
||||||
|
echo bar7 >file &&
|
||||||
|
git stash save "rm then recreate" &&
|
||||||
|
test bar = "$(cat file)" &&
|
||||||
|
git stash apply &&
|
||||||
|
test bar7 = "$(cat file)"
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'stash rm and ignore' '
|
||||||
|
git reset --hard &&
|
||||||
|
git rm file &&
|
||||||
|
echo file >.gitignore &&
|
||||||
|
git stash save "rm and ignore" &&
|
||||||
|
test bar = "$(cat file)" &&
|
||||||
|
test file = "$(cat .gitignore)"
|
||||||
|
git stash apply &&
|
||||||
|
! test -r file &&
|
||||||
|
test file = "$(cat .gitignore)"
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'stash rm and ignore (stage .gitignore)' '
|
||||||
|
git reset --hard &&
|
||||||
|
git rm file &&
|
||||||
|
echo file >.gitignore &&
|
||||||
|
git add .gitignore &&
|
||||||
|
git stash save "rm and ignore (stage .gitignore)" &&
|
||||||
|
test bar = "$(cat file)" &&
|
||||||
|
! test -r .gitignore
|
||||||
|
git stash apply &&
|
||||||
|
! test -r file &&
|
||||||
|
test file = "$(cat .gitignore)"
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success SYMLINKS 'stash file to symlink' '
|
||||||
|
git reset --hard &&
|
||||||
|
rm file &&
|
||||||
|
ln -s file2 file &&
|
||||||
|
git stash save "file to symlink" &&
|
||||||
|
test -f file &&
|
||||||
|
test bar = "$(cat file)" &&
|
||||||
|
git stash apply &&
|
||||||
|
case "$(ls -l file)" in *" file -> file2") :;; *) false;; esac
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success SYMLINKS 'stash file to symlink (stage rm)' '
|
||||||
|
git reset --hard &&
|
||||||
|
git rm file &&
|
||||||
|
ln -s file2 file &&
|
||||||
|
git stash save "file to symlink (stage rm)" &&
|
||||||
|
test -f file &&
|
||||||
|
test bar = "$(cat file)" &&
|
||||||
|
git stash apply &&
|
||||||
|
case "$(ls -l file)" in *" file -> file2") :;; *) false;; esac
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success SYMLINKS 'stash file to symlink (full stage)' '
|
||||||
|
git reset --hard &&
|
||||||
|
rm file &&
|
||||||
|
ln -s file2 file &&
|
||||||
|
git add file &&
|
||||||
|
git stash save "file to symlink (full stage)" &&
|
||||||
|
test -f file &&
|
||||||
|
test bar = "$(cat file)" &&
|
||||||
|
git stash apply &&
|
||||||
|
case "$(ls -l file)" in *" file -> file2") :;; *) false;; esac
|
||||||
|
'
|
||||||
|
|
||||||
|
# This test creates a commit with a symlink used for the following tests
|
||||||
|
|
||||||
|
test_expect_success SYMLINKS 'stash symlink to file' '
|
||||||
|
git reset --hard &&
|
||||||
|
ln -s file filelink &&
|
||||||
|
git add filelink &&
|
||||||
|
git commit -m "Add symlink" &&
|
||||||
|
rm filelink &&
|
||||||
|
cp file filelink &&
|
||||||
|
git stash save "symlink to file" &&
|
||||||
|
test -h filelink &&
|
||||||
|
case "$(ls -l filelink)" in *" filelink -> file") :;; *) false;; esac &&
|
||||||
|
git stash apply &&
|
||||||
|
! test -h filelink &&
|
||||||
|
test bar = "$(cat file)"
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success SYMLINKS 'stash symlink to file (stage rm)' '
|
||||||
|
git reset --hard &&
|
||||||
|
git rm filelink &&
|
||||||
|
cp file filelink &&
|
||||||
|
git stash save "symlink to file (stage rm)" &&
|
||||||
|
test -h filelink &&
|
||||||
|
case "$(ls -l filelink)" in *" filelink -> file") :;; *) false;; esac &&
|
||||||
|
git stash apply &&
|
||||||
|
! test -h filelink &&
|
||||||
|
test bar = "$(cat file)"
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success SYMLINKS 'stash symlink to file (full stage)' '
|
||||||
|
git reset --hard &&
|
||||||
|
rm filelink &&
|
||||||
|
cp file filelink &&
|
||||||
|
git add filelink &&
|
||||||
|
git stash save "symlink to file (full stage)" &&
|
||||||
|
test -h filelink &&
|
||||||
|
case "$(ls -l filelink)" in *" filelink -> file") :;; *) false;; esac &&
|
||||||
|
git stash apply &&
|
||||||
|
! test -h filelink &&
|
||||||
|
test bar = "$(cat file)"
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_failure 'stash directory to file' '
|
||||||
|
git reset --hard &&
|
||||||
|
mkdir dir &&
|
||||||
|
echo foo >dir/file &&
|
||||||
|
git add dir/file &&
|
||||||
|
git commit -m "Add file in dir" &&
|
||||||
|
rm -fr dir &&
|
||||||
|
echo bar >dir &&
|
||||||
|
git stash save "directory to file" &&
|
||||||
|
test -d dir &&
|
||||||
|
test foo = "$(cat dir/file)" &&
|
||||||
|
test_must_fail git stash apply &&
|
||||||
|
test bar = "$(cat dir)" &&
|
||||||
|
git reset --soft HEAD^
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_failure 'stash file to directory' '
|
||||||
|
git reset --hard &&
|
||||||
|
rm file &&
|
||||||
|
mkdir file &&
|
||||||
|
echo foo >file/file &&
|
||||||
|
git stash save "file to directory" &&
|
||||||
|
test -f file &&
|
||||||
|
test bar = "$(cat file)" &&
|
||||||
|
git stash apply &&
|
||||||
|
test -f file/file &&
|
||||||
|
test foo = "$(cat file/file)"
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Loading…
Reference in New Issue
Block a user