зеркало из https://github.com/microsoft/git.git
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
This commit is contained in:
Коммит
b371922aa5
|
@ -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 () {
|
|||
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 () {
|
|||
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':"
|
||||
|
|
|
@ -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" &&
|
||||
|
||||
git config merge.tool mytool &&
|
||||
git config mergetool.mytool.cmd "cat \"\$REMOTE\" >\"\$MERGED\"" &&
|
||||
git config mergetool.mytool.trustExitCode true
|
||||
'
|
||||
|
||||
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 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
|
||||
|
|
Загрузка…
Ссылка в новой задаче