1#!/bin/sh
   2test_description='merging when a directory was replaced with a symlink'
   4. ./test-lib.sh
   5test_expect_success 'create a commit where dir a/b changed to symlink' '
   7        mkdir -p a/b/c a/b-2/c &&
   8        > a/b/c/d &&
   9        > a/b-2/c/d &&
  10        > a/x &&
  11        git add -A &&
  12        git commit -m base &&
  13        git tag start &&
  14        rm -rf a/b &&
  15        git add -A &&
  16        test_ln_s_add b-2 a/b &&
  17        git commit -m "dir to symlink"
  18'
  19test_expect_success 'checkout does not clobber untracked symlink' '
  21        git checkout HEAD^0 &&
  22        git reset --hard master &&
  23        git rm --cached a/b &&
  24        git commit -m "untracked symlink remains" &&
  25        test_must_fail git checkout start^0
  26'
  27test_expect_success 'a/b-2/c/d is kept when clobbering symlink b' '
  29        git checkout HEAD^0 &&
  30        git reset --hard master &&
  31        git rm --cached a/b &&
  32        git commit -m "untracked symlink remains" &&
  33        git checkout -f start^0 &&
  34        test -f a/b-2/c/d
  35'
  36test_expect_success 'checkout should not have deleted a/b-2/c/d' '
  38        git checkout HEAD^0 &&
  39        git reset --hard master &&
  40         git checkout start^0 &&
  41         test -f a/b-2/c/d
  42'
  43test_expect_success 'setup for merge test' '
  45        git reset --hard &&
  46        test -f a/b-2/c/d &&
  47        echo x > a/x &&
  48        git add a/x &&
  49        git commit -m x &&
  50        git tag baseline
  51'
  52test_expect_success 'Handle D/F conflict, do not lose a/b-2/c/d in merge (resolve)' '
  54        git reset --hard &&
  55        git checkout baseline^0 &&
  56        git merge -s resolve master &&
  57        test -f a/b-2/c/d
  58'
  59test_expect_success SYMLINKS 'a/b was resolved as symlink' '
  61        test -h a/b
  62'
  63test_expect_success 'Handle D/F conflict, do not lose a/b-2/c/d in merge (recursive)' '
  65        git reset --hard &&
  66        git checkout baseline^0 &&
  67        git merge -s recursive master &&
  68        test -f a/b-2/c/d
  69'
  70test_expect_success SYMLINKS 'a/b was resolved as symlink' '
  72        test -h a/b
  73'
  74test_expect_success 'Handle F/D conflict, do not lose a/b-2/c/d in merge (resolve)' '
  76        git reset --hard &&
  77        git checkout master^0 &&
  78        git merge -s resolve baseline^0 &&
  79        test -f a/b-2/c/d
  80'
  81test_expect_success SYMLINKS 'a/b was resolved as symlink' '
  83        test -h a/b
  84'
  85test_expect_success 'Handle F/D conflict, do not lose a/b-2/c/d in merge (recursive)' '
  87        git reset --hard &&
  88        git checkout master^0 &&
  89        git merge -s recursive baseline^0 &&
  90        test -f a/b-2/c/d
  91'
  92test_expect_success SYMLINKS 'a/b was resolved as symlink' '
  94        test -h a/b
  95'
  96test_expect_failure 'do not lose untracked in merge (resolve)' '
  98        git reset --hard &&
  99        git checkout baseline^0 &&
 100        >a/b/c/e &&
 101        test_must_fail git merge -s resolve master &&
 102        test -f a/b/c/e &&
 103        test -f a/b-2/c/d
 104'
 105test_expect_success 'do not lose untracked in merge (recursive)' '
 107        git reset --hard &&
 108        git checkout baseline^0 &&
 109        >a/b/c/e &&
 110        test_must_fail git merge -s recursive master &&
 111        test -f a/b/c/e &&
 112        test -f a/b-2/c/d
 113'
 114test_expect_success 'do not lose modifications in merge (resolve)' '
 116        git reset --hard &&
 117        git checkout baseline^0 &&
 118        echo more content >>a/b/c/d &&
 119        test_must_fail git merge -s resolve master
 120'
 121test_expect_success 'do not lose modifications in merge (recursive)' '
 123        git reset --hard &&
 124        git checkout baseline^0 &&
 125        echo more content >>a/b/c/d &&
 126        test_must_fail git merge -s recursive master
 127'
 128test_expect_success 'setup a merge where dir a/b-2 changed to symlink' '
 130        git reset --hard &&
 131        git checkout start^0 &&
 132        rm -rf a/b-2 &&
 133        git add -A &&
 134        test_ln_s_add b a/b-2 &&
 135        git commit -m "dir a/b-2 to symlink" &&
 136        git tag test2
 137'
 138test_expect_success 'merge should not have D/F conflicts (resolve)' '
 140        git reset --hard &&
 141        git checkout baseline^0 &&
 142        git merge -s resolve test2 &&
 143        test -f a/b/c/d
 144'
 145test_expect_success SYMLINKS 'a/b-2 was resolved as symlink' '
 147        test -h a/b-2
 148'
 149test_expect_success 'merge should not have D/F conflicts (recursive)' '
 151        git reset --hard &&
 152        git checkout baseline^0 &&
 153        git merge -s recursive test2 &&
 154        test -f a/b/c/d
 155'
 156test_expect_success SYMLINKS 'a/b-2 was resolved as symlink' '
 158        test -h a/b-2
 159'
 160test_expect_success 'merge should not have F/D conflicts (recursive)' '
 162        git reset --hard &&
 163        git checkout -b foo test2 &&
 164        git merge -s recursive baseline^0 &&
 165        test -f a/b/c/d
 166'
 167test_expect_success SYMLINKS 'a/b-2 was resolved as symlink' '
 169        test -h a/b-2
 170'
 171test_done