Browse Source

Merge branch 'cb/mergetool'

* cb/mergetool:
  mergetool: fix running mergetool in sub-directories
  mergetool: Add a test for running mergetool in a sub-directory
  mergetool: respect autocrlf by using checkout-index
maint
Junio C Hamano 16 years ago
parent
commit
b371922aa5
  1. 15
      git-mergetool.sh
  2. 75
      t/t7610-mergetool.sh

15
git-mergetool.sh

@ -13,7 +13,6 @@ SUBDIRECTORY_OK=Yes @@ -13,7 +13,6 @@ SUBDIRECTORY_OK=Yes
OPTIONS_SPEC=
. git-sh-setup
require_work_tree
prefix=$(git rev-parse --show-prefix)

# Returns true if the mode reflects a symlink
is_symlink () {
@ -127,6 +126,14 @@ check_unchanged () { @@ -127,6 +126,14 @@ check_unchanged () {
fi
}

checkout_staged_file () {
tmpfile=$(expr "$(git checkout-index --temp --stage="$1" "$2")" : '\([^ ]*\) ')

if test $? -eq 0 -a -n "$tmpfile" ; then
mv -- "$(git rev-parse --show-cdup)$tmpfile" "$3"
fi
}

merge_file () {
MERGED="$1"

@ -153,9 +160,9 @@ merge_file () { @@ -153,9 +160,9 @@ merge_file () {
local_mode=`git ls-files -u -- "$MERGED" | awk '{if ($3==2) print $1;}'`
remote_mode=`git ls-files -u -- "$MERGED" | awk '{if ($3==3) print $1;}'`

base_present && git cat-file blob ":1:$prefix$MERGED" >"$BASE" 2>/dev/null
local_present && git cat-file blob ":2:$prefix$MERGED" >"$LOCAL" 2>/dev/null
remote_present && git cat-file blob ":3:$prefix$MERGED" >"$REMOTE" 2>/dev/null
base_present && checkout_staged_file 1 "$MERGED" "$BASE"
local_present && checkout_staged_file 2 "$MERGED" "$LOCAL"
remote_present && checkout_staged_file 3 "$MERGED" "$REMOTE"

if test -z "$local_mode" -o -z "$remote_mode"; then
echo "Deleted merge conflict for '$MERGED':"

75
t/t7610-mergetool.sh

@ -9,38 +9,81 @@ Testing basic merge tool invocation' @@ -9,38 +9,81 @@ Testing basic merge tool invocation'

. ./test-lib.sh

# All the mergetool test work by checking out a temporary branch based
# off 'branch1' and then merging in master and checking the results of
# running mergetool

test_expect_success 'setup' '
echo master >file1 &&
git add file1 &&
mkdir subdir &&
echo master sub >subdir/file3 &&
git add file1 subdir/file3 &&
git commit -m "added file1" &&

git checkout -b branch1 master &&
echo branch1 change >file1 &&
echo branch1 newfile >file2 &&
git add file1 file2 &&
echo branch1 sub >subdir/file3 &&
git add file1 file2 subdir/file3 &&
git commit -m "branch1 changes" &&
git checkout -b branch2 master &&
echo branch2 change >file1 &&
echo branch2 newfile >file2 &&
git add file1 file2 &&
git commit -m "branch2 changes" &&

git checkout master &&
echo master updated >file1 &&
echo master new >file2 &&
git add file1 file2 &&
git commit -m "master updates"
'
echo master new sub >subdir/file3 &&
git add file1 file2 subdir/file3 &&
git commit -m "master updates" &&

test_expect_success 'custom mergetool' '
git config merge.tool mytool &&
git config mergetool.mytool.cmd "cat \"\$REMOTE\" >\"\$MERGED\"" &&
git config mergetool.mytool.trustExitCode true &&
git checkout branch1 &&
git config mergetool.mytool.trustExitCode true
'

test_expect_success 'custom mergetool' '
git checkout -b test1 branch1 &&
test_must_fail git merge master >/dev/null 2>&1 &&
( yes "" | git mergetool file1>/dev/null 2>&1 ) &&
( yes "" | git mergetool file2>/dev/null 2>&1 ) &&
( yes "" | git mergetool file1 >/dev/null 2>&1 ) &&
( yes "" | git mergetool file2 >/dev/null 2>&1 ) &&
( yes "" | git mergetool subdir/file3 >/dev/null 2>&1 ) &&
test "$(cat file1)" = "master updated" &&
test "$(cat file2)" = "master new" &&
git commit -m "branch1 resolved with mergetool"
test "$(cat subdir/file3)" = "master new sub" &&
git commit -m "branch1 resolved with mergetool"
'

test_expect_success 'mergetool crlf' '
git config core.autocrlf true &&
git checkout -b test2 branch1
test_must_fail git merge master >/dev/null 2>&1 &&
( yes "" | git mergetool file1 >/dev/null 2>&1 ) &&
( yes "" | git mergetool file2 >/dev/null 2>&1 ) &&
( yes "" | git mergetool subdir/file3 >/dev/null 2>&1 ) &&
test "$(printf x | cat file1 -)" = "$(printf "master updated\r\nx")" &&
test "$(printf x | cat file2 -)" = "$(printf "master new\r\nx")" &&
test "$(printf x | cat subdir/file3 -)" = "$(printf "master new sub\r\nx")" &&
git commit -m "branch1 resolved with mergetool - autocrlf" &&
git config core.autocrlf false &&
git reset --hard
'

test_expect_success 'mergetool in subdir' '
git checkout -b test3 branch1
cd subdir && (
test_must_fail git merge master >/dev/null 2>&1 &&
( yes "" | git mergetool file3 >/dev/null 2>&1 ) &&
test "$(cat file3)" = "master new sub" )
'

# We can't merge files from parent directories when running mergetool
# from a subdir. Is this a bug?
#
#test_expect_failure 'mergetool in subdir' '
# cd subdir && (
# ( yes "" | git mergetool ../file1 >/dev/null 2>&1 ) &&
# ( yes "" | git mergetool ../file2 >/dev/null 2>&1 ) &&
# test "$(cat ../file1)" = "master updated" &&
# test "$(cat ../file2)" = "master new" &&
# git commit -m "branch1 resolved with mergetool - subdir" )
#'

test_done

Loading…
Cancel
Save