When merge conflicts occur in paths removed by a sparse-checkout, we need to unsparsify those paths (clear the SKIP_WORKTREE bit), and write out the conflicted file to the working copy. In the very unlikely case that someone manually put a file into the working copy at the location of the SKIP_WORKTREE file, we need to avoid overwriting whatever edits they have made and move that file to a different location first. Signed-off-by: Elijah Newren <newren@gmail.com> Reviewed-by: Derrick Stolee <dstolee@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
		
			
				
	
	
		
			159 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/bin/sh
 | 
						|
 | 
						|
test_description="merge cases"
 | 
						|
 | 
						|
# The setup for all of them, pictorially, is:
 | 
						|
#
 | 
						|
#      A
 | 
						|
#      o
 | 
						|
#     / \
 | 
						|
#  O o   ?
 | 
						|
#     \ /
 | 
						|
#      o
 | 
						|
#      B
 | 
						|
#
 | 
						|
# To help make it easier to follow the flow of tests, they have been
 | 
						|
# divided into sections and each test will start with a quick explanation
 | 
						|
# of what commits O, A, and B contain.
 | 
						|
#
 | 
						|
# Notation:
 | 
						|
#    z/{b,c}   means  files z/b and z/c both exist
 | 
						|
#    x/d_1     means  file x/d exists with content d1.  (Purpose of the
 | 
						|
#                     underscore notation is to differentiate different
 | 
						|
#                     files that might be renamed into each other's paths.)
 | 
						|
 | 
						|
. ./test-lib.sh
 | 
						|
. "$TEST_DIRECTORY"/lib-merge.sh
 | 
						|
 | 
						|
 | 
						|
# Testcase basic, conflicting changes in 'numerals'
 | 
						|
 | 
						|
test_setup_numerals () {
 | 
						|
	test_create_repo numerals_$1 &&
 | 
						|
	(
 | 
						|
		cd numerals_$1 &&
 | 
						|
 | 
						|
		>README &&
 | 
						|
		test_write_lines I II III >numerals &&
 | 
						|
		git add README numerals &&
 | 
						|
		test_tick &&
 | 
						|
		git commit -m "O" &&
 | 
						|
 | 
						|
		git branch O &&
 | 
						|
		git branch A &&
 | 
						|
		git branch B &&
 | 
						|
 | 
						|
		git checkout A &&
 | 
						|
		test_write_lines I II III IIII >numerals &&
 | 
						|
		git add numerals &&
 | 
						|
		test_tick &&
 | 
						|
		git commit -m "A" &&
 | 
						|
 | 
						|
		git checkout B &&
 | 
						|
		test_write_lines I II III IV >numerals &&
 | 
						|
		git add numerals &&
 | 
						|
		test_tick &&
 | 
						|
		git commit -m "B" &&
 | 
						|
 | 
						|
		cat <<-EOF >expected-index &&
 | 
						|
		H README
 | 
						|
		M numerals
 | 
						|
		M numerals
 | 
						|
		M numerals
 | 
						|
		EOF
 | 
						|
 | 
						|
		cat <<-EOF >expected-merge
 | 
						|
		I
 | 
						|
		II
 | 
						|
		III
 | 
						|
		<<<<<<< HEAD
 | 
						|
		IIII
 | 
						|
		=======
 | 
						|
		IV
 | 
						|
		>>>>>>> B^0
 | 
						|
		EOF
 | 
						|
 | 
						|
	)
 | 
						|
}
 | 
						|
 | 
						|
test_expect_success 'conflicting entries written to worktree even if sparse' '
 | 
						|
	test_setup_numerals plain &&
 | 
						|
	(
 | 
						|
		cd numerals_plain &&
 | 
						|
 | 
						|
		git checkout A^0 &&
 | 
						|
 | 
						|
		test_path_is_file README &&
 | 
						|
		test_path_is_file numerals &&
 | 
						|
 | 
						|
		git sparse-checkout init &&
 | 
						|
		git sparse-checkout set README &&
 | 
						|
 | 
						|
		test_path_is_file README &&
 | 
						|
		test_path_is_missing numerals &&
 | 
						|
 | 
						|
		test_must_fail git merge -s recursive B^0 &&
 | 
						|
 | 
						|
		git ls-files -t >index_files &&
 | 
						|
		test_cmp expected-index index_files &&
 | 
						|
 | 
						|
		test_path_is_file README &&
 | 
						|
		test_path_is_file numerals &&
 | 
						|
 | 
						|
		test_cmp expected-merge numerals &&
 | 
						|
 | 
						|
		# 4 other files:
 | 
						|
		#   * expected-merge
 | 
						|
		#   * expected-index
 | 
						|
		#   * index_files
 | 
						|
		#   * others
 | 
						|
		git ls-files -o >others &&
 | 
						|
		test_line_count = 4 others
 | 
						|
	)
 | 
						|
'
 | 
						|
 | 
						|
test_expect_merge_algorithm failure success 'present-despite-SKIP_WORKTREE handled reasonably' '
 | 
						|
	test_setup_numerals in_the_way &&
 | 
						|
	(
 | 
						|
		cd numerals_in_the_way &&
 | 
						|
 | 
						|
		git checkout A^0 &&
 | 
						|
 | 
						|
		test_path_is_file README &&
 | 
						|
		test_path_is_file numerals &&
 | 
						|
 | 
						|
		git sparse-checkout init &&
 | 
						|
		git sparse-checkout set README &&
 | 
						|
 | 
						|
		test_path_is_file README &&
 | 
						|
		test_path_is_missing numerals &&
 | 
						|
 | 
						|
		echo foobar >numerals &&
 | 
						|
 | 
						|
		test_must_fail git merge -s recursive B^0 &&
 | 
						|
 | 
						|
		git ls-files -t >index_files &&
 | 
						|
		test_cmp expected-index index_files &&
 | 
						|
 | 
						|
		test_path_is_file README &&
 | 
						|
		test_path_is_file numerals &&
 | 
						|
 | 
						|
		test_cmp expected-merge numerals &&
 | 
						|
 | 
						|
		# There should still be a file with "foobar" in it
 | 
						|
		grep foobar * &&
 | 
						|
 | 
						|
		# 5 other files:
 | 
						|
		#   * expected-merge
 | 
						|
		#   * expected-index
 | 
						|
		#   * index_files
 | 
						|
		#   * others
 | 
						|
		#   * whatever name was given to the numerals file that had
 | 
						|
		#     "foobar" in it
 | 
						|
		git ls-files -o >others &&
 | 
						|
		test_line_count = 5 others
 | 
						|
	)
 | 
						|
'
 | 
						|
 | 
						|
test_done
 |