t / t7607-merge-overwrite.shon commit Merge branch 'maint' (f7c6c42)
   1#!/bin/sh
   2
   3test_description='git-merge
   4
   5Do not overwrite changes.'
   6
   7. ./test-lib.sh
   8
   9test_expect_success 'setup' '
  10        test_commit c0 c0.c &&
  11        test_commit c1 c1.c &&
  12        test_commit c1a c1.c "c1 a" &&
  13        git reset --hard c0 &&
  14        test_commit c2 c2.c &&
  15        git reset --hard c0 &&
  16        mkdir sub &&
  17        echo "sub/f" > sub/f &&
  18        mkdir sub2 &&
  19        echo "sub2/f" > sub2/f &&
  20        git add sub/f sub2/f &&
  21        git commit -m sub &&
  22        git tag sub &&
  23        echo "VERY IMPORTANT CHANGES" > important
  24'
  25
  26test_expect_success 'will not overwrite untracked file' '
  27        git reset --hard c1 &&
  28        cp important c2.c &&
  29        test_must_fail git merge c2 &&
  30        test_path_is_missing .git/MERGE_HEAD &&
  31        test_cmp important c2.c
  32'
  33
  34test_expect_success 'will overwrite tracked file' '
  35        git reset --hard c1 &&
  36        cp important c2.c &&
  37        git add c2.c &&
  38        git commit -m important &&
  39        git checkout c2
  40'
  41
  42test_expect_success 'will not overwrite new file' '
  43        git reset --hard c1 &&
  44        cp important c2.c &&
  45        git add c2.c &&
  46        test_must_fail git merge c2 &&
  47        test_path_is_missing .git/MERGE_HEAD &&
  48        test_cmp important c2.c
  49'
  50
  51test_expect_success 'will not overwrite staged changes' '
  52        git reset --hard c1 &&
  53        cp important c2.c &&
  54        git add c2.c &&
  55        rm c2.c &&
  56        test_must_fail git merge c2 &&
  57        test_path_is_missing .git/MERGE_HEAD &&
  58        git checkout c2.c &&
  59        test_cmp important c2.c
  60'
  61
  62test_expect_success 'will not overwrite removed file' '
  63        git reset --hard c1 &&
  64        git rm c1.c &&
  65        git commit -m "rm c1.c" &&
  66        cp important c1.c &&
  67        test_must_fail git merge c1a &&
  68        test_cmp important c1.c
  69'
  70
  71test_expect_success 'will not overwrite re-added file' '
  72        git reset --hard c1 &&
  73        git rm c1.c &&
  74        git commit -m "rm c1.c" &&
  75        cp important c1.c &&
  76        git add c1.c &&
  77        test_must_fail git merge c1a &&
  78        test_path_is_missing .git/MERGE_HEAD &&
  79        test_cmp important c1.c
  80'
  81
  82test_expect_success 'will not overwrite removed file with staged changes' '
  83        git reset --hard c1 &&
  84        git rm c1.c &&
  85        git commit -m "rm c1.c" &&
  86        cp important c1.c &&
  87        git add c1.c &&
  88        rm c1.c &&
  89        test_must_fail git merge c1a &&
  90        test_path_is_missing .git/MERGE_HEAD &&
  91        git checkout c1.c &&
  92        test_cmp important c1.c
  93'
  94
  95test_expect_success 'will not overwrite untracked subtree' '
  96        git reset --hard c0 &&
  97        rm -rf sub &&
  98        mkdir -p sub/f &&
  99        cp important sub/f/important &&
 100        test_must_fail git merge sub &&
 101        test_path_is_missing .git/MERGE_HEAD &&
 102        test_cmp important sub/f/important
 103'
 104
 105cat >expect <<\EOF
 106error: The following untracked working tree files would be overwritten by merge:
 107        sub
 108        sub2
 109Please move or remove them before you can merge.
 110EOF
 111
 112test_expect_success 'will not overwrite untracked file in leading path' '
 113        git reset --hard c0 &&
 114        rm -rf sub &&
 115        cp important sub &&
 116        cp important sub2 &&
 117        test_must_fail git merge sub 2>out &&
 118        test_cmp out expect &&
 119        test_path_is_missing .git/MERGE_HEAD &&
 120        test_cmp important sub &&
 121        test_cmp important sub2 &&
 122        rm -f sub sub2
 123'
 124
 125test_expect_failure SYMLINKS 'will not overwrite untracked symlink in leading path' '
 126        git reset --hard c0 &&
 127        rm -rf sub &&
 128        mkdir sub2 &&
 129        ln -s sub2 sub &&
 130        test_must_fail git merge sub &&
 131        test_path_is_missing .git/MERGE_HEAD
 132'
 133
 134test_expect_success SYMLINKS 'will not be confused by symlink in leading path' '
 135        git reset --hard c0 &&
 136        rm -rf sub &&
 137        ln -s sub2 sub &&
 138        git add sub &&
 139        git commit -m ln &&
 140        git checkout sub
 141'
 142
 143cat >expect <<\EOF
 144error: Untracked working tree file 'c0.c' would be overwritten by merge.
 145fatal: read-tree failed
 146EOF
 147
 148test_expect_success 'will not overwrite untracked file on unborn branch' '
 149        git reset --hard c0 &&
 150        git rm -fr . &&
 151        git checkout --orphan new &&
 152        cp important c0.c &&
 153        test_must_fail git merge c0 2>out &&
 154        test_cmp out expect &&
 155        test_path_is_missing .git/MERGE_HEAD &&
 156        test_cmp important c0.c
 157'
 158
 159test_expect_success 'set up unborn branch and content' '
 160        git symbolic-ref HEAD refs/heads/unborn &&
 161        rm -f .git/index &&
 162        echo foo > tracked-file &&
 163        git add tracked-file &&
 164        echo bar > untracked-file
 165'
 166
 167test_expect_failure 'will not clobber WT/index when merging into unborn' '
 168        git merge master &&
 169        grep foo tracked-file &&
 170        git show :tracked-file >expect &&
 171        grep foo expect &&
 172        grep bar untracked-file
 173'
 174
 175test_done