Skip to content

Commit 517736f

Browse files
committed
Merge branch 'da/mergetool-delete-delete-conflict' into maint
"git mergetool" did not work well with conflicts that both sides deleted. * da/mergetool-delete-delete-conflict: mergetool: honor tempfile configuration when resolving delete conflicts mergetool: support delete/delete conflicts
2 parents 237e6db + a298604 commit 517736f

File tree

2 files changed

+85
-4
lines changed

2 files changed

+85
-4
lines changed

git-mergetool.sh

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,12 @@ resolve_deleted_merge () {
126126
case "$ans" in
127127
[mMcC]*)
128128
git add -- "$MERGED"
129-
cleanup_temp_files --save-backup
129+
if test "$merge_keep_backup" = "true"
130+
then
131+
cleanup_temp_files --save-backup
132+
else
133+
cleanup_temp_files
134+
fi
130135
return 0
131136
;;
132137
[dD]*)
@@ -135,6 +140,10 @@ resolve_deleted_merge () {
135140
return 0
136141
;;
137142
[aA]*)
143+
if test "$merge_keep_temporaries" = "false"
144+
then
145+
cleanup_temp_files
146+
fi
138147
return 1
139148
;;
140149
esac
@@ -282,8 +291,14 @@ merge_file () {
282291
return
283292
fi
284293

285-
mv -- "$MERGED" "$BACKUP"
286-
cp -- "$BACKUP" "$MERGED"
294+
if test -f "$MERGED"
295+
then
296+
mv -- "$MERGED" "$BACKUP"
297+
cp -- "$BACKUP" "$MERGED"
298+
fi
299+
# Create a parent directory to handle delete/delete conflicts
300+
# where the base's directory no longer exists.
301+
mkdir -p "$(dirname "$MERGED")"
287302

288303
checkout_staged_file 1 "$MERGED" "$BASE"
289304
checkout_staged_file 2 "$MERGED" "$LOCAL"
@@ -295,7 +310,9 @@ merge_file () {
295310
describe_file "$local_mode" "local" "$LOCAL"
296311
describe_file "$remote_mode" "remote" "$REMOTE"
297312
resolve_deleted_merge
298-
return
313+
status=$?
314+
rmdir -p "$(dirname "$MERGED")" 2>/dev/null
315+
return $status
299316
fi
300317

301318
if is_symlink "$local_mode" || is_symlink "$remote_mode"

t/t7610-mergetool.sh

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,70 @@ test_expect_success 'mergetool takes partial path' '
243243
git reset --hard
244244
'
245245

246+
test_expect_success 'mergetool delete/delete conflict' '
247+
git checkout -b delete-base branch1 &&
248+
mkdir -p a/a &&
249+
(echo one; echo two; echo 3; echo 4) >a/a/file.txt &&
250+
git add a/a/file.txt &&
251+
git commit -m"base file" &&
252+
git checkout -b move-to-b delete-base &&
253+
mkdir -p b/b &&
254+
git mv a/a/file.txt b/b/file.txt &&
255+
(echo one; echo two; echo 4) >b/b/file.txt &&
256+
git commit -a -m"move to b" &&
257+
git checkout -b move-to-c delete-base &&
258+
mkdir -p c/c &&
259+
git mv a/a/file.txt c/c/file.txt &&
260+
(echo one; echo two; echo 3) >c/c/file.txt &&
261+
git commit -a -m"move to c" &&
262+
test_must_fail git merge move-to-b &&
263+
echo d | git mergetool a/a/file.txt &&
264+
! test -f a/a/file.txt &&
265+
git reset --hard HEAD &&
266+
test_must_fail git merge move-to-b &&
267+
echo m | git mergetool a/a/file.txt &&
268+
test -f b/b/file.txt &&
269+
git reset --hard HEAD &&
270+
test_must_fail git merge move-to-b &&
271+
! echo a | git mergetool a/a/file.txt &&
272+
! test -f a/a/file.txt &&
273+
git reset --hard HEAD
274+
'
275+
276+
test_expect_success 'mergetool produces no errors when keepBackup is used' '
277+
test_config mergetool.keepBackup true &&
278+
test_must_fail git merge move-to-b &&
279+
: >expect &&
280+
echo d | git mergetool a/a/file.txt 2>actual &&
281+
test_cmp expect actual &&
282+
! test -d a &&
283+
git reset --hard HEAD
284+
'
285+
286+
test_expect_success 'mergetool honors tempfile config for deleted files' '
287+
test_config mergetool.keepTemporaries false &&
288+
test_must_fail git merge move-to-b &&
289+
echo d | git mergetool a/a/file.txt &&
290+
! test -d a &&
291+
git reset --hard HEAD
292+
'
293+
294+
test_expect_success 'mergetool keeps tempfiles when aborting delete/delete' '
295+
test_config mergetool.keepTemporaries true &&
296+
test_must_fail git merge move-to-b &&
297+
! (echo a; echo n) | git mergetool a/a/file.txt &&
298+
test -d a/a &&
299+
cat >expect <<-\EOF &&
300+
file_BASE_.txt
301+
file_LOCAL_.txt
302+
file_REMOTE_.txt
303+
EOF
304+
ls -1 a/a | sed -e "s/[0-9]*//g" >actual &&
305+
test_cmp expect actual &&
306+
git clean -fdx &&
307+
git reset --hard HEAD
308+
'
309+
246310
test_expect_success 'deleted vs modified submodule' '
247311
git checkout -b test6 branch1 &&
248312
git submodule update -N &&

0 commit comments

Comments
 (0)