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>
		
			
				
	
	
		
			56 lines
		
	
	
		
			860 B
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			860 B
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/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
 |