t / t7610-mergetool.shon commit Merge branch 'maint' (adfe4e1)
   1#!/bin/sh
   2#
   3# Copyright (c) 2008 Charles Bailey
   4#
   5
   6test_description='git mergetool
   7
   8Testing basic merge tool invocation'
   9
  10. ./test-lib.sh
  11
  12# All the mergetool test work by checking out a temporary branch based
  13# off 'branch1' and then merging in master and checking the results of
  14# running mergetool
  15
  16test_expect_success 'setup' '
  17    git config rerere.enabled true &&
  18    echo master >file1 &&
  19    echo master file11 >file11 &&
  20    echo master file12 >file12 &&
  21    echo master file13 >file13 &&
  22    echo master file14 >file14 &&
  23    mkdir subdir &&
  24    echo master sub >subdir/file3 &&
  25    git add file1 file1[1-4] subdir/file3 &&
  26    git commit -m "add initial versions" &&
  27
  28    git checkout -b branch1 master &&
  29    echo branch1 change >file1 &&
  30    echo branch1 newfile >file2 &&
  31    echo branch1 change file11 >file11 &&
  32    echo branch1 change file13 >file13 &&
  33    echo branch1 sub >subdir/file3 &&
  34    git add file1 file11 file13 file2 subdir/file3 &&
  35    git rm file12 &&
  36    git commit -m "branch1 changes" &&
  37
  38    git checkout master &&
  39    echo master updated >file1 &&
  40    echo master new >file2 &&
  41    echo master updated file12 >file12 &&
  42    echo master updated file14 >file14 &&
  43    echo master new sub >subdir/file3 &&
  44    git add file1 file12 file14 file2 subdir/file3 &&
  45    git rm file11 &&
  46    git commit -m "master updates" &&
  47
  48    git config merge.tool mytool &&
  49    git config mergetool.mytool.cmd "cat \"\$REMOTE\" >\"\$MERGED\"" &&
  50    git config mergetool.mytool.trustExitCode true
  51'
  52
  53test_expect_success 'custom mergetool' '
  54    git checkout -b test1 branch1 &&
  55    test_must_fail git merge master >/dev/null 2>&1 &&
  56    ( yes "" | git mergetool file1 >/dev/null 2>&1 ) &&
  57    ( yes "" | git mergetool file2 >/dev/null 2>&1 ) &&
  58    ( yes "" | git mergetool subdir/file3 >/dev/null 2>&1 ) &&
  59    ( yes "d" | git mergetool file11 >/dev/null 2>&1 ) &&
  60    ( yes "d" | git mergetool file12 >/dev/null 2>&1 ) &&
  61    test "$(cat file1)" = "master updated" &&
  62    test "$(cat file2)" = "master new" &&
  63    test "$(cat subdir/file3)" = "master new sub" &&
  64    git commit -m "branch1 resolved with mergetool"
  65'
  66
  67test_expect_success 'mergetool crlf' '
  68    git config core.autocrlf true &&
  69    git checkout -b test2 branch1 &&
  70    test_must_fail git merge master >/dev/null 2>&1 &&
  71    ( yes "" | git mergetool file1 >/dev/null 2>&1 ) &&
  72    ( yes "" | git mergetool file2 >/dev/null 2>&1 ) &&
  73    ( yes "" | git mergetool subdir/file3 >/dev/null 2>&1 ) &&
  74    ( yes "d" | git mergetool file11 >/dev/null 2>&1 ) &&
  75    ( yes "d" | git mergetool file12 >/dev/null 2>&1 ) &&
  76    test "$(printf x | cat file1 -)" = "$(printf "master updated\r\nx")" &&
  77    test "$(printf x | cat file2 -)" = "$(printf "master new\r\nx")" &&
  78    test "$(printf x | cat subdir/file3 -)" = "$(printf "master new sub\r\nx")" &&
  79    git commit -m "branch1 resolved with mergetool - autocrlf" &&
  80    git config core.autocrlf false &&
  81    git reset --hard
  82'
  83
  84test_expect_success 'mergetool in subdir' '
  85    git checkout -b test3 branch1 &&
  86    (
  87        cd subdir &&
  88        test_must_fail git merge master >/dev/null 2>&1 &&
  89        ( yes "" | git mergetool file3 >/dev/null 2>&1 ) &&
  90        test "$(cat file3)" = "master new sub"
  91    )
  92'
  93
  94test_expect_success 'mergetool on file in parent dir' '
  95    (
  96        cd subdir &&
  97        ( yes "" | git mergetool ../file1 >/dev/null 2>&1 ) &&
  98        ( yes "" | git mergetool ../file2 >/dev/null 2>&1 ) &&
  99        ( yes "d" | git mergetool ../file11 >/dev/null 2>&1 ) &&
 100        ( yes "d" | git mergetool ../file12 >/dev/null 2>&1 ) &&
 101        test "$(cat ../file1)" = "master updated" &&
 102        test "$(cat ../file2)" = "master new" &&
 103        git commit -m "branch1 resolved with mergetool - subdir"
 104    )
 105'
 106
 107test_expect_success 'mergetool skips autoresolved' '
 108    git checkout -b test4 branch1 &&
 109    test_must_fail git merge master &&
 110    test -n "$(git ls-files -u)" &&
 111    ( yes "d" | git mergetool file11 >/dev/null 2>&1 ) &&
 112    ( yes "d" | git mergetool file12 >/dev/null 2>&1 ) &&
 113    output="$(git mergetool --no-prompt)" &&
 114    test "$output" = "No files need merging" &&
 115    git reset --hard
 116'
 117
 118test_expect_success 'mergetool merges all from subdir' '
 119    (
 120        cd subdir &&
 121        git config rerere.enabled false &&
 122        test_must_fail git merge master &&
 123        ( yes "d" "d" | git mergetool --no-prompt ) &&
 124        test "$(cat ../file1)" = "master updated" &&
 125        test "$(cat ../file2)" = "master new" &&
 126        test "$(cat file3)" = "master new sub" &&
 127        git commit -m "branch2 resolved by mergetool from subdir"
 128    )
 129'
 130
 131test_expect_success 'mergetool skips resolved paths when rerere is active' '
 132    git config rerere.enabled true &&
 133    rm -rf .git/rr-cache &&
 134    git checkout -b test5 branch1
 135    test_must_fail git merge master >/dev/null 2>&1 &&
 136    ( yes "d" "d" | git mergetool --no-prompt >/dev/null 2>&1 ) &&
 137    output="$(yes "n" | git mergetool --no-prompt)" &&
 138    test "$output" = "No files need merging" &&
 139    git reset --hard
 140'
 141
 142test_done