You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
244 lines
5.4 KiB
244 lines
5.4 KiB
#!/bin/sh |
|
|
|
test_description='Test handling of overwriting untracked files' |
|
|
|
. ./test-lib.sh |
|
|
|
test_setup_reset () { |
|
git init reset_$1 && |
|
( |
|
cd reset_$1 && |
|
test_commit init && |
|
|
|
git branch stable && |
|
git branch work && |
|
|
|
git checkout work && |
|
test_commit foo && |
|
|
|
git checkout stable |
|
) |
|
} |
|
|
|
test_expect_success 'reset --hard will nuke untracked files/dirs' ' |
|
test_setup_reset hard && |
|
( |
|
cd reset_hard && |
|
git ls-tree -r stable && |
|
git log --all --name-status --oneline && |
|
git ls-tree -r work && |
|
|
|
mkdir foo.t && |
|
echo precious >foo.t/file && |
|
echo foo >expect && |
|
|
|
git reset --hard work && |
|
|
|
# check that untracked directory foo.t/ was nuked |
|
test_path_is_file foo.t && |
|
test_cmp expect foo.t |
|
) |
|
' |
|
|
|
test_expect_success 'reset --merge will preserve untracked files/dirs' ' |
|
test_setup_reset merge && |
|
( |
|
cd reset_merge && |
|
|
|
mkdir foo.t && |
|
echo precious >foo.t/file && |
|
cp foo.t/file expect && |
|
|
|
test_must_fail git reset --merge work 2>error && |
|
test_cmp expect foo.t/file && |
|
grep "Updating .foo.t. would lose untracked files" error |
|
) |
|
' |
|
|
|
test_expect_success 'reset --keep will preserve untracked files/dirs' ' |
|
test_setup_reset keep && |
|
( |
|
cd reset_keep && |
|
|
|
mkdir foo.t && |
|
echo precious >foo.t/file && |
|
cp foo.t/file expect && |
|
|
|
test_must_fail git reset --merge work 2>error && |
|
test_cmp expect foo.t/file && |
|
grep "Updating.*foo.t.*would lose untracked files" error |
|
) |
|
' |
|
|
|
test_setup_checkout_m () { |
|
git init checkout && |
|
( |
|
cd checkout && |
|
test_commit init && |
|
|
|
test_write_lines file has some >filler && |
|
git add filler && |
|
git commit -m filler && |
|
|
|
git branch stable && |
|
|
|
git switch -c work && |
|
echo stuff >notes.txt && |
|
test_write_lines file has some words >filler && |
|
git add notes.txt filler && |
|
git commit -m filler && |
|
|
|
git checkout stable |
|
) |
|
} |
|
|
|
test_expect_success 'checkout -m does not nuke untracked file' ' |
|
test_setup_checkout_m && |
|
( |
|
cd checkout && |
|
|
|
# Tweak filler |
|
test_write_lines this file has some >filler && |
|
# Make an untracked file, save its contents in "expect" |
|
echo precious >notes.txt && |
|
cp notes.txt expect && |
|
|
|
test_must_fail git checkout -m work && |
|
test_cmp expect notes.txt |
|
) |
|
' |
|
|
|
test_setup_sequencing () { |
|
git init sequencing_$1 && |
|
( |
|
cd sequencing_$1 && |
|
test_commit init && |
|
|
|
test_write_lines this file has some words >filler && |
|
git add filler && |
|
git commit -m filler && |
|
|
|
mkdir -p foo/bar && |
|
test_commit foo/bar/baz && |
|
|
|
git branch simple && |
|
git branch fooey && |
|
|
|
git checkout fooey && |
|
git rm foo/bar/baz.t && |
|
echo stuff >>filler && |
|
git add -u && |
|
git commit -m "changes" && |
|
|
|
git checkout simple && |
|
echo items >>filler && |
|
echo newstuff >>newfile && |
|
git add filler newfile && |
|
git commit -m another |
|
) |
|
} |
|
|
|
test_expect_success 'git rebase --abort and untracked files' ' |
|
test_setup_sequencing rebase_abort_and_untracked && |
|
( |
|
cd sequencing_rebase_abort_and_untracked && |
|
git checkout fooey && |
|
test_must_fail git rebase simple && |
|
|
|
cat init.t && |
|
git rm init.t && |
|
echo precious >init.t && |
|
cp init.t expect && |
|
git status --porcelain && |
|
test_must_fail git rebase --abort && |
|
test_cmp expect init.t |
|
) |
|
' |
|
|
|
test_expect_success 'git rebase fast forwarding and untracked files' ' |
|
test_setup_sequencing rebase_fast_forward_and_untracked && |
|
( |
|
cd sequencing_rebase_fast_forward_and_untracked && |
|
git checkout init && |
|
echo precious >filler && |
|
cp filler expect && |
|
test_must_fail git rebase init simple && |
|
test_cmp expect filler |
|
) |
|
' |
|
|
|
test_expect_failure 'git rebase --autostash and untracked files' ' |
|
test_setup_sequencing rebase_autostash_and_untracked && |
|
( |
|
cd sequencing_rebase_autostash_and_untracked && |
|
git checkout simple && |
|
git rm filler && |
|
mkdir filler && |
|
echo precious >filler/file && |
|
cp filler/file expect && |
|
git rebase --autostash init && |
|
test_path_is_file filler/file |
|
) |
|
' |
|
|
|
test_expect_failure 'git stash and untracked files' ' |
|
test_setup_sequencing stash_and_untracked_files && |
|
( |
|
cd sequencing_stash_and_untracked_files && |
|
git checkout simple && |
|
git rm filler && |
|
mkdir filler && |
|
echo precious >filler/file && |
|
cp filler/file expect && |
|
git status --porcelain && |
|
git stash push && |
|
git status --porcelain && |
|
test_path_is_file filler/file |
|
) |
|
' |
|
|
|
test_expect_success 'git am --abort and untracked dir vs. unmerged file' ' |
|
test_setup_sequencing am_abort_and_untracked && |
|
( |
|
cd sequencing_am_abort_and_untracked && |
|
git format-patch -1 --stdout fooey >changes.mbox && |
|
test_must_fail git am --3way changes.mbox && |
|
|
|
# Delete the conflicted file; we will stage and commit it later |
|
rm filler && |
|
|
|
# Put an unrelated untracked directory there |
|
mkdir filler && |
|
echo foo >filler/file1 && |
|
echo bar >filler/file2 && |
|
|
|
test_must_fail git am --abort 2>errors && |
|
test_path_is_dir filler && |
|
grep "Updating .filler. would lose untracked files in it" errors |
|
) |
|
' |
|
|
|
test_expect_success 'git am --skip and untracked dir vs deleted file' ' |
|
test_setup_sequencing am_skip_and_untracked && |
|
( |
|
cd sequencing_am_skip_and_untracked && |
|
git checkout fooey && |
|
git format-patch -1 --stdout simple >changes.mbox && |
|
test_must_fail git am --3way changes.mbox && |
|
|
|
# Delete newfile |
|
rm newfile && |
|
|
|
# Put an unrelated untracked directory there |
|
mkdir newfile && |
|
echo foo >newfile/file1 && |
|
echo bar >newfile/file2 && |
|
|
|
# Change our mind about resolutions, just skip this patch |
|
test_must_fail git am --skip 2>errors && |
|
test_path_is_dir newfile && |
|
grep "Updating .newfile. would lose untracked files in it" errors |
|
) |
|
' |
|
|
|
test_done
|
|
|