t / t7607-merge-overwrite.shon commit Merge branch 'maint' (bb79a82)
   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_failure 'will not overwrite unstaged changes in renamed file' '
  96        git reset --hard c1 &&
  97        git mv c1.c other.c &&
  98        git commit -m rename &&
  99        cp important other.c &&
 100        git merge c1a &&
 101        test_cmp important other.c
 102'
 103
 104test_expect_success 'will not overwrite untracked subtree' '
 105        git reset --hard c0 &&
 106        rm -rf sub &&
 107        mkdir -p sub/f &&
 108        cp important sub/f/important &&
 109        test_must_fail git merge sub &&
 110        test_path_is_missing .git/MERGE_HEAD &&
 111        test_cmp important sub/f/important
 112'
 113
 114cat >expect <<\EOF
 115error: The following untracked working tree files would be overwritten by merge:
 116        sub
 117        sub2
 118Please move or remove them before you can merge.
 119Aborting
 120EOF
 121
 122test_expect_success 'will not overwrite untracked file in leading path' '
 123        git reset --hard c0 &&
 124        rm -rf sub &&
 125        cp important sub &&
 126        cp important sub2 &&
 127        test_must_fail git merge sub 2>out &&
 128        test_cmp out expect &&
 129        test_path_is_missing .git/MERGE_HEAD &&
 130        test_cmp important sub &&
 131        test_cmp important sub2 &&
 132        rm -f sub sub2
 133'
 134
 135test_expect_success SYMLINKS 'will not overwrite untracked symlink in leading path' '
 136        git reset --hard c0 &&
 137        rm -rf sub &&
 138        mkdir sub2 &&
 139        ln -s sub2 sub &&
 140        test_must_fail git merge sub &&
 141        test_path_is_missing .git/MERGE_HEAD
 142'
 143
 144test_expect_success SYMLINKS 'will not be confused by symlink in leading path' '
 145        git reset --hard c0 &&
 146        rm -rf sub &&
 147        ln -s sub2 sub &&
 148        git add sub &&
 149        git commit -m ln &&
 150        git checkout sub
 151'
 152
 153cat >expect <<\EOF
 154error: Untracked working tree file 'c0.c' would be overwritten by merge.
 155fatal: read-tree failed
 156EOF
 157
 158test_expect_success 'will not overwrite untracked file on unborn branch' '
 159        git reset --hard c0 &&
 160        git rm -fr . &&
 161        git checkout --orphan new &&
 162        cp important c0.c &&
 163        test_must_fail git merge c0 2>out &&
 164        test_i18ncmp out expect
 165'
 166
 167test_expect_success 'will not overwrite untracked file on unborn branch .git/MERGE_HEAD sanity etc.' '
 168        test_when_finished "rm c0.c" &&
 169        test_path_is_missing .git/MERGE_HEAD &&
 170        test_cmp important c0.c
 171'
 172
 173test_expect_success 'failed merge leaves unborn branch in the womb' '
 174        test_must_fail git rev-parse --verify HEAD
 175'
 176
 177test_expect_success 'set up unborn branch and content' '
 178        git symbolic-ref HEAD refs/heads/unborn &&
 179        rm -f .git/index &&
 180        echo foo > tracked-file &&
 181        git add tracked-file &&
 182        echo bar > untracked-file
 183'
 184
 185test_expect_success 'will not clobber WT/index when merging into unborn' '
 186        git merge master &&
 187        grep foo tracked-file &&
 188        git show :tracked-file >expect &&
 189        grep foo expect &&
 190        grep bar untracked-file
 191'
 192
 193test_done