-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
merge-recursive: don't segfault while handling rename clashes
When a branch moves A to B while the other branch created B (or moved C to B), the code tried to rename one of them to B~something to preserve both versions, and failed to register temporary resolution for the original path B at stage#0 during virtual ancestor computation. This left the index in unmerged state and caused a segfault. A better solution is to merge these two versions of B's in place and use the (potentially conflicting) result as the intermediate merge result in the virtual ancestor. Signed-off-by: Junio C Hamano <gitster@pobox.com>
- Loading branch information
Junio C Hamano
committed
Jul 31, 2009
1 parent
4258c21
commit c94736a
Showing
2 changed files
with
80 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
#!/bin/sh | ||
|
||
test_description='recursive merge corner cases' | ||
|
||
. ./test-lib.sh | ||
|
||
# | ||
# L1 L2 | ||
# o---o | ||
# / \ / \ | ||
# o X ? | ||
# \ / \ / | ||
# o---o | ||
# R1 R2 | ||
# | ||
|
||
test_expect_success setup ' | ||
ten="0 1 2 3 4 5 6 7 8 9" | ||
for i in $ten | ||
do | ||
echo line $i in a sample file | ||
done >one && | ||
for i in $ten | ||
do | ||
echo line $i in another sample file | ||
done >two && | ||
git add one two && | ||
test_tick && git commit -m initial && | ||
git branch L1 && | ||
git checkout -b R1 && | ||
git mv one three && | ||
test_tick && git commit -m R1 && | ||
git checkout L1 && | ||
git mv two three && | ||
test_tick && git commit -m L1 && | ||
git checkout L1^0 && | ||
test_tick && git merge -s ours R1 && | ||
git tag L2 && | ||
git checkout R1^0 && | ||
test_tick && git merge -s ours L1 && | ||
git tag R2 | ||
' | ||
|
||
test_expect_success merge ' | ||
git reset --hard && | ||
git checkout L2^0 && | ||
test_must_fail git merge -s recursive R2^0 | ||
' | ||
|
||
test_done |