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.
195 lines
4.7 KiB
195 lines
4.7 KiB
#!/bin/sh |
|
|
|
test_description='git-merge |
|
|
|
Do not overwrite changes.' |
|
|
|
. ./test-lib.sh |
|
|
|
test_expect_success 'setup' ' |
|
test_commit c0 c0.c && |
|
test_commit c1 c1.c && |
|
test_commit c1a c1.c "c1 a" && |
|
git reset --hard c0 && |
|
test_commit c2 c2.c && |
|
git reset --hard c0 && |
|
mkdir sub && |
|
echo "sub/f" > sub/f && |
|
mkdir sub2 && |
|
echo "sub2/f" > sub2/f && |
|
git add sub/f sub2/f && |
|
git commit -m sub && |
|
git tag sub && |
|
echo "VERY IMPORTANT CHANGES" > important |
|
' |
|
|
|
test_expect_success 'will not overwrite untracked file' ' |
|
git reset --hard c1 && |
|
cp important c2.c && |
|
test_must_fail git merge c2 && |
|
test_path_is_missing .git/MERGE_HEAD && |
|
test_cmp important c2.c |
|
' |
|
|
|
test_expect_success 'will overwrite tracked file' ' |
|
git reset --hard c1 && |
|
cp important c2.c && |
|
git add c2.c && |
|
git commit -m important && |
|
git checkout c2 |
|
' |
|
|
|
test_expect_success 'will not overwrite new file' ' |
|
git reset --hard c1 && |
|
cp important c2.c && |
|
git add c2.c && |
|
test_must_fail git merge c2 && |
|
test_path_is_missing .git/MERGE_HEAD && |
|
test_cmp important c2.c |
|
' |
|
|
|
test_expect_success 'will not overwrite staged changes' ' |
|
git reset --hard c1 && |
|
cp important c2.c && |
|
git add c2.c && |
|
rm c2.c && |
|
test_must_fail git merge c2 && |
|
test_path_is_missing .git/MERGE_HEAD && |
|
git checkout c2.c && |
|
test_cmp important c2.c |
|
' |
|
|
|
test_expect_success 'will not overwrite removed file' ' |
|
git reset --hard c1 && |
|
git rm c1.c && |
|
git commit -m "rm c1.c" && |
|
cp important c1.c && |
|
test_must_fail git merge c1a && |
|
test_cmp important c1.c |
|
' |
|
|
|
test_expect_success 'will not overwrite re-added file' ' |
|
git reset --hard c1 && |
|
git rm c1.c && |
|
git commit -m "rm c1.c" && |
|
cp important c1.c && |
|
git add c1.c && |
|
test_must_fail git merge c1a && |
|
test_path_is_missing .git/MERGE_HEAD && |
|
test_cmp important c1.c |
|
' |
|
|
|
test_expect_success 'will not overwrite removed file with staged changes' ' |
|
git reset --hard c1 && |
|
git rm c1.c && |
|
git commit -m "rm c1.c" && |
|
cp important c1.c && |
|
git add c1.c && |
|
rm c1.c && |
|
test_must_fail git merge c1a && |
|
test_path_is_missing .git/MERGE_HEAD && |
|
git checkout c1.c && |
|
test_cmp important c1.c |
|
' |
|
|
|
test_expect_success 'will not overwrite unstaged changes in renamed file' ' |
|
git reset --hard c1 && |
|
git mv c1.c other.c && |
|
git commit -m rename && |
|
cp important other.c && |
|
test_must_fail git merge c1a >out && |
|
test_i18ngrep "Refusing to lose dirty file at other.c" out && |
|
test_path_is_file other.c~HEAD && |
|
test $(git hash-object other.c~HEAD) = $(git rev-parse c1a:c1.c) && |
|
test_cmp important other.c |
|
' |
|
|
|
test_expect_success 'will not overwrite untracked subtree' ' |
|
git reset --hard c0 && |
|
rm -rf sub && |
|
mkdir -p sub/f && |
|
cp important sub/f/important && |
|
test_must_fail git merge sub && |
|
test_path_is_missing .git/MERGE_HEAD && |
|
test_cmp important sub/f/important |
|
' |
|
|
|
cat >expect <<\EOF |
|
error: The following untracked working tree files would be overwritten by merge: |
|
sub |
|
sub2 |
|
Please move or remove them before you merge. |
|
Aborting |
|
EOF |
|
|
|
test_expect_success 'will not overwrite untracked file in leading path' ' |
|
git reset --hard c0 && |
|
rm -rf sub && |
|
cp important sub && |
|
cp important sub2 && |
|
test_must_fail git merge sub 2>out && |
|
test_i18ncmp out expect && |
|
test_path_is_missing .git/MERGE_HEAD && |
|
test_cmp important sub && |
|
test_cmp important sub2 && |
|
rm -f sub sub2 |
|
' |
|
|
|
test_expect_success SYMLINKS 'will not overwrite untracked symlink in leading path' ' |
|
git reset --hard c0 && |
|
rm -rf sub && |
|
mkdir sub2 && |
|
ln -s sub2 sub && |
|
test_must_fail git merge sub && |
|
test_path_is_missing .git/MERGE_HEAD |
|
' |
|
|
|
test_expect_success 'will not be confused by symlink in leading path' ' |
|
git reset --hard c0 && |
|
rm -rf sub && |
|
test_ln_s_add sub2 sub && |
|
git commit -m ln && |
|
git checkout sub |
|
' |
|
|
|
cat >expect <<\EOF |
|
error: Untracked working tree file 'c0.c' would be overwritten by merge. |
|
fatal: read-tree failed |
|
EOF |
|
|
|
test_expect_success 'will not overwrite untracked file on unborn branch' ' |
|
git reset --hard c0 && |
|
git rm -fr . && |
|
git checkout --orphan new && |
|
cp important c0.c && |
|
test_must_fail git merge c0 2>out && |
|
test_i18ncmp out expect |
|
' |
|
|
|
test_expect_success 'will not overwrite untracked file on unborn branch .git/MERGE_HEAD sanity etc.' ' |
|
test_when_finished "rm c0.c" && |
|
test_path_is_missing .git/MERGE_HEAD && |
|
test_cmp important c0.c |
|
' |
|
|
|
test_expect_success 'failed merge leaves unborn branch in the womb' ' |
|
test_must_fail git rev-parse --verify HEAD |
|
' |
|
|
|
test_expect_success 'set up unborn branch and content' ' |
|
git symbolic-ref HEAD refs/heads/unborn && |
|
rm -f .git/index && |
|
echo foo > tracked-file && |
|
git add tracked-file && |
|
echo bar > untracked-file |
|
' |
|
|
|
test_expect_success 'will not clobber WT/index when merging into unborn' ' |
|
git merge master && |
|
grep foo tracked-file && |
|
git show :tracked-file >expect && |
|
grep foo expect && |
|
grep bar untracked-file |
|
' |
|
|
|
test_done
|
|
|