475dfb57eee051f13c75bbf810938b54c752bad5
   1#!/bin/sh
   2
   3test_description='git apply --3way'
   4
   5. ./test-lib.sh
   6
   7create_file () {
   8        for i
   9        do
  10                echo "$i"
  11        done
  12}
  13
  14sanitize_conflicted_diff () {
  15        sed -e '
  16                /^index /d
  17                s/^\(+[<>][<>][<>][<>]*\) .*/\1/
  18        '
  19}
  20
  21test_expect_success setup '
  22        test_tick &&
  23        create_file >one 1 2 3 4 5 6 7 &&
  24        cat one >two &&
  25        git add one two &&
  26        git commit -m initial &&
  27
  28        git branch side &&
  29
  30        test_tick &&
  31        create_file >one 1 two 3 4 5 six 7 &&
  32        create_file >two 1 two 3 4 5 6 7 &&
  33        git commit -a -m master &&
  34
  35        git checkout side &&
  36        create_file >one 1 2 3 4 five 6 7 &&
  37        create_file >two 1 2 3 4 five 6 7 &&
  38        git commit -a -m side &&
  39
  40        git checkout master
  41'
  42
  43test_expect_success 'apply without --3way' '
  44        git diff side^ side >P.diff &&
  45
  46        # should fail to apply
  47        git reset --hard &&
  48        git checkout master^0 &&
  49        test_must_fail git apply --index P.diff &&
  50        # should leave things intact
  51        git diff-files --exit-code &&
  52        git diff-index --exit-code --cached HEAD
  53'
  54
  55test_expect_success 'apply with --3way' '
  56        # Merging side should be similar to applying this patch
  57        git diff ...side >P.diff &&
  58
  59        # The corresponding conflicted merge
  60        git reset --hard &&
  61        git checkout master^0 &&
  62        test_must_fail git merge --no-commit side &&
  63        git ls-files -s >expect.ls &&
  64        git diff HEAD | sanitize_conflicted_diff >expect.diff &&
  65
  66        # should fail to apply
  67        git reset --hard &&
  68        git checkout master^0 &&
  69        test_must_fail git apply --index --3way P.diff &&
  70        git ls-files -s >actual.ls &&
  71        git diff HEAD | sanitize_conflicted_diff >actual.diff &&
  72
  73        # The result should resemble the corresponding merge
  74        test_cmp expect.ls actual.ls &&
  75        test_cmp expect.diff actual.diff
  76'
  77
  78test_done