Merge branch 'tr/merge-unborn-clobber'
authorJunio C Hamano <gitster@pobox.com>
Thu, 10 Feb 2011 00:41:17 +0000 (16:41 -0800)
committerJunio C Hamano <gitster@pobox.com>
Thu, 10 Feb 2011 00:41:17 +0000 (16:41 -0800)
* tr/merge-unborn-clobber:
Exhibit merge bug that clobbers index&WT

Conflicts:
t/t7607-merge-overwrite.sh

1  2 
t/t7607-merge-overwrite.sh
index 4d5ce4e682c1ea69034c3f7789a8ac0c89b12466,50b6b33efb22e817fdace99f267227f593e92e21..5f731a1177267e76f19dbe1605a4d0f2e8e749bd
@@@ -7,54 -7,48 +7,54 @@@ Do not overwrite changes.
  . ./test-lib.sh
  
  test_expect_success 'setup' '
 -      echo c0 > c0.c &&
 -      git add c0.c &&
 -      git commit -m c0 &&
 -      git tag c0 &&
 -      echo c1 > c1.c &&
 -      git add c1.c &&
 -      git commit -m c1 &&
 -      git tag c1 &&
 +      test_commit c0 c0.c &&
 +      test_commit c1 c1.c &&
 +      test_commit c1a c1.c "c1 a" &&
        git reset --hard c0 &&
 -      echo c2 > c2.c &&
 -      git add c2.c &&
 -      git commit -m c2 &&
 -      git tag c2 &&
 -      git reset --hard c1 &&
 -      echo "c1 a" > c1.c &&
 -      git add c1.c &&
 -      git commit -m "c1 a" &&
 -      git tag c1a &&
 +      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 &&
 -      cat important > c2.c &&
 -      ! git merge c2 &&
 +      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 &&
 -      cat important > c2.c &&
 +      cp important c2.c &&
        git add c2.c &&
 -      ! git merge c2 &&
 +      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 &&
 -      cat important > c2.c &&
 +      cp important c2.c &&
        git add c2.c &&
        rm c2.c &&
 -      ! git merge c2 &&
 +      test_must_fail git merge c2 &&
 +      test_path_is_missing .git/MERGE_HEAD &&
        git checkout c2.c &&
        test_cmp important c2.c
  '
@@@ -63,8 -57,8 +63,8 @@@ test_expect_success 'will not overwrit
        git reset --hard c1 &&
        git rm c1.c &&
        git commit -m "rm c1.c" &&
 -      cat important > c1.c &&
 -      ! git merge c1a &&
 +      cp important c1.c &&
 +      test_must_fail git merge c1a &&
        test_cmp important c1.c
  '
  
@@@ -72,10 -66,9 +72,10 @@@ test_expect_success 'will not overwrit
        git reset --hard c1 &&
        git rm c1.c &&
        git commit -m "rm c1.c" &&
 -      cat important > c1.c &&
 +      cp important c1.c &&
        git add c1.c &&
 -      ! git merge c1a &&
 +      test_must_fail git merge c1a &&
 +      test_path_is_missing .git/MERGE_HEAD &&
        test_cmp important c1.c
  '
  
@@@ -83,77 -76,28 +83,93 @@@ test_expect_success 'will not overwrit
        git reset --hard c1 &&
        git rm c1.c &&
        git commit -m "rm c1.c" &&
 -      cat important > c1.c &&
 +      cp important c1.c &&
        git add c1.c &&
        rm c1.c &&
 -      ! git merge c1a &&
 +      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 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 can merge.
 +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_cmp out expect &&
 +      test_path_is_missing .git/MERGE_HEAD &&
 +      test_cmp important sub &&
 +      test_cmp important sub2 &&
 +      rm -f sub sub2
 +'
 +
 +test_expect_failure 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 SYMLINKS 'will not be confused by symlink in leading path' '
 +      git reset --hard c0 &&
 +      rm -rf sub &&
 +      ln -s sub2 sub &&
 +      git add 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_cmp out expect &&
 +      test_path_is_missing .git/MERGE_HEAD &&
 +      test_cmp important c0.c
 +'
 +
+ 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_failure '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