t / t7601-merge-pull-config.shon commit Post 2.3 cycle (batch #3) (f3f4077)
   1#!/bin/sh
   2
   3test_description='git merge
   4
   5Testing pull.* configuration parsing.'
   6
   7. ./test-lib.sh
   8
   9test_expect_success 'setup' '
  10        echo c0 >c0.c &&
  11        git add c0.c &&
  12        git commit -m c0 &&
  13        git tag c0 &&
  14        echo c1 >c1.c &&
  15        git add c1.c &&
  16        git commit -m c1 &&
  17        git tag c1 &&
  18        git reset --hard c0 &&
  19        echo c2 >c2.c &&
  20        git add c2.c &&
  21        git commit -m c2 &&
  22        git tag c2 &&
  23        git reset --hard c0 &&
  24        echo c3 >c3.c &&
  25        git add c3.c &&
  26        git commit -m c3 &&
  27        git tag c3
  28'
  29
  30test_expect_success 'merge c1 with c2' '
  31        git reset --hard c1 &&
  32        test -f c0.c &&
  33        test -f c1.c &&
  34        test ! -f c2.c &&
  35        test ! -f c3.c &&
  36        git merge c2 &&
  37        test -f c1.c &&
  38        test -f c2.c
  39'
  40
  41test_expect_success 'fast-forward pull succeeds with "true" in pull.ff' '
  42        git reset --hard c0 &&
  43        test_config pull.ff true &&
  44        git pull . c1 &&
  45        test "$(git rev-parse HEAD)" = "$(git rev-parse c1)"
  46'
  47
  48test_expect_success 'fast-forward pull creates merge with "false" in pull.ff' '
  49        git reset --hard c0 &&
  50        test_config pull.ff false &&
  51        git pull . c1 &&
  52        test "$(git rev-parse HEAD^1)" = "$(git rev-parse c0)" &&
  53        test "$(git rev-parse HEAD^2)" = "$(git rev-parse c1)"
  54'
  55
  56test_expect_success 'pull prevents non-fast-forward with "only" in pull.ff' '
  57        git reset --hard c1 &&
  58        test_config pull.ff only &&
  59        test_must_fail git pull . c3
  60'
  61
  62test_expect_success 'merge c1 with c2 (ours in pull.twohead)' '
  63        git reset --hard c1 &&
  64        git config pull.twohead ours &&
  65        git merge c2 &&
  66        test -f c1.c &&
  67        ! test -f c2.c
  68'
  69
  70test_expect_success 'merge c1 with c2 and c3 (recursive in pull.octopus)' '
  71        git reset --hard c1 &&
  72        git config pull.octopus "recursive" &&
  73        test_must_fail git merge c2 c3 &&
  74        test "$(git rev-parse c1)" = "$(git rev-parse HEAD)"
  75'
  76
  77test_expect_success 'merge c1 with c2 and c3 (recursive and octopus in pull.octopus)' '
  78        git reset --hard c1 &&
  79        git config pull.octopus "recursive octopus" &&
  80        git merge c2 c3 &&
  81        test "$(git rev-parse c1)" != "$(git rev-parse HEAD)" &&
  82        test "$(git rev-parse c1)" = "$(git rev-parse HEAD^1)" &&
  83        test "$(git rev-parse c2)" = "$(git rev-parse HEAD^2)" &&
  84        test "$(git rev-parse c3)" = "$(git rev-parse HEAD^3)" &&
  85        git diff --exit-code &&
  86        test -f c0.c &&
  87        test -f c1.c &&
  88        test -f c2.c &&
  89        test -f c3.c
  90'
  91
  92conflict_count()
  93{
  94        {
  95                git diff-files --name-only
  96                git ls-files --unmerged
  97        } | wc -l
  98}
  99
 100# c4 - c5
 101#    \ c6
 102#
 103# There are two conflicts here:
 104#
 105# 1) Because foo.c is renamed to bar.c, recursive will handle this,
 106# resolve won't.
 107#
 108# 2) One in conflict.c and that will always fail.
 109
 110test_expect_success 'setup conflicted merge' '
 111        git reset --hard c0 &&
 112        echo A >conflict.c &&
 113        git add conflict.c &&
 114        echo contents >foo.c &&
 115        git add foo.c &&
 116        git commit -m c4 &&
 117        git tag c4 &&
 118        echo B >conflict.c &&
 119        git add conflict.c &&
 120        git mv foo.c bar.c &&
 121        git commit -m c5 &&
 122        git tag c5 &&
 123        git reset --hard c4 &&
 124        echo C >conflict.c &&
 125        git add conflict.c &&
 126        echo secondline >> foo.c &&
 127        git add foo.c &&
 128        git commit -m c6 &&
 129        git tag c6
 130'
 131
 132# First do the merge with resolve and recursive then verify that
 133# recursive is chosen.
 134
 135test_expect_success 'merge picks up the best result' '
 136        git config --unset-all pull.twohead &&
 137        git reset --hard c5 &&
 138        test_must_fail git merge -s resolve c6 &&
 139        resolve_count=$(conflict_count) &&
 140        git reset --hard c5 &&
 141        test_must_fail git merge -s recursive c6 &&
 142        recursive_count=$(conflict_count) &&
 143        git reset --hard c5 &&
 144        test_must_fail git merge -s recursive -s resolve c6 &&
 145        auto_count=$(conflict_count) &&
 146        test $auto_count = $recursive_count &&
 147        test $auto_count != $resolve_count
 148'
 149
 150test_expect_success 'merge picks up the best result (from config)' '
 151        git config pull.twohead "recursive resolve" &&
 152        git reset --hard c5 &&
 153        test_must_fail git merge -s resolve c6 &&
 154        resolve_count=$(conflict_count) &&
 155        git reset --hard c5 &&
 156        test_must_fail git merge -s recursive c6 &&
 157        recursive_count=$(conflict_count) &&
 158        git reset --hard c5 &&
 159        test_must_fail git merge c6 &&
 160        auto_count=$(conflict_count) &&
 161        test $auto_count = $recursive_count &&
 162        test $auto_count != $resolve_count
 163'
 164
 165test_expect_success 'merge errors out on invalid strategy' '
 166        git config pull.twohead "foobar" &&
 167        git reset --hard c5 &&
 168        test_must_fail git merge c6
 169'
 170
 171test_expect_success 'merge errors out on invalid strategy' '
 172        git config --unset-all pull.twohead &&
 173        git reset --hard c5 &&
 174        test_must_fail git merge -s "resolve recursive" c6
 175'
 176
 177test_done