#!/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