t / t6024-recursive-merge.shon commit Merge branch 'js/maint-merge-recursive-r-d-conflict' into maint (94468bc)
   1#!/bin/sh
   2
   3test_description='Test merge without common ancestors'
   4. ./test-lib.sh
   5
   6# This scenario is based on a real-world repository of Shawn Pearce.
   7
   8# 1 - A - D - F
   9#   \   X   /
  10#     B   X
  11#       X   \
  12# 2 - C - E - G
  13
  14GIT_COMMITTER_DATE="2006-12-12 23:28:00 +0100"
  15export GIT_COMMITTER_DATE
  16
  17test_expect_success "setup tests" '
  18echo 1 > a1 &&
  19git add a1 &&
  20GIT_AUTHOR_DATE="2006-12-12 23:00:00" git commit -m 1 a1 &&
  21
  22git checkout -b A master &&
  23echo A > a1 &&
  24GIT_AUTHOR_DATE="2006-12-12 23:00:01" git commit -m A a1 &&
  25
  26git checkout -b B master &&
  27echo B > a1 &&
  28GIT_AUTHOR_DATE="2006-12-12 23:00:02" git commit -m B a1 &&
  29
  30git checkout -b D A &&
  31git rev-parse B > .git/MERGE_HEAD &&
  32echo D > a1 &&
  33git update-index a1 &&
  34GIT_AUTHOR_DATE="2006-12-12 23:00:03" git commit -m D &&
  35
  36git symbolic-ref HEAD refs/heads/other &&
  37echo 2 > a1 &&
  38GIT_AUTHOR_DATE="2006-12-12 23:00:04" git commit -m 2 a1 &&
  39
  40git checkout -b C &&
  41echo C > a1 &&
  42GIT_AUTHOR_DATE="2006-12-12 23:00:05" git commit -m C a1 &&
  43
  44git checkout -b E C &&
  45git rev-parse B > .git/MERGE_HEAD &&
  46echo E > a1 &&
  47git update-index a1 &&
  48GIT_AUTHOR_DATE="2006-12-12 23:00:06" git commit -m E &&
  49
  50git checkout -b G E &&
  51git rev-parse A > .git/MERGE_HEAD &&
  52echo G > a1 &&
  53git update-index a1 &&
  54GIT_AUTHOR_DATE="2006-12-12 23:00:07" git commit -m G &&
  55
  56git checkout -b F D &&
  57git rev-parse C > .git/MERGE_HEAD &&
  58echo F > a1 &&
  59git update-index a1 &&
  60GIT_AUTHOR_DATE="2006-12-12 23:00:08" git commit -m F
  61'
  62
  63test_expect_success "combined merge conflicts" "
  64        test_must_fail git merge -m final G
  65"
  66
  67cat > expect << EOF
  68<<<<<<< HEAD:a1
  69F
  70=======
  71G
  72>>>>>>> G:a1
  73EOF
  74
  75test_expect_success "result contains a conflict" "test_cmp expect a1"
  76
  77git ls-files --stage > out
  78cat > expect << EOF
  79100644 da056ce14a2241509897fa68bb2b3b6e6194ef9e 1       a1
  80100644 cf84443e49e1b366fac938711ddf4be2d4d1d9e9 2       a1
  81100644 fd7923529855d0b274795ae3349c5e0438333979 3       a1
  82EOF
  83
  84test_expect_success "virtual trees were processed" "test_cmp expect out"
  85
  86test_expect_success 'refuse to merge binary files' '
  87        git reset --hard &&
  88        printf "\0" > binary-file &&
  89        git add binary-file &&
  90        git commit -m binary &&
  91        git checkout G &&
  92        printf "\0\0" > binary-file &&
  93        git add binary-file &&
  94        git commit -m binary2 &&
  95        test_must_fail git merge F > merge.out 2> merge.err &&
  96        grep "Cannot merge binary files: HEAD:binary-file vs. F:binary-file" \
  97                merge.err
  98'
  99
 100test_expect_success 'mark rename/delete as unmerged' '
 101
 102        git reset --hard &&
 103        git checkout -b delete &&
 104        git rm a1 &&
 105        test_tick &&
 106        git commit -m delete &&
 107        git checkout -b rename HEAD^ &&
 108        git mv a1 a2
 109        test_tick &&
 110        git commit -m rename &&
 111        test_must_fail git merge delete &&
 112        test 1 = $(git ls-files --unmerged | wc -l) &&
 113        git rev-parse --verify :2:a2 &&
 114        test_must_fail git rev-parse --verify :3:a2 &&
 115        git checkout -f delete &&
 116        test_must_fail git merge rename &&
 117        test 1 = $(git ls-files --unmerged | wc -l) &&
 118        test_must_fail git rev-parse --verify :2:a2 &&
 119        git rev-parse --verify :3:a2
 120
 121'
 122
 123test_done