157 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			157 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
#!/bin/sh
 | 
						|
 | 
						|
test_description='merge simplification'
 | 
						|
 | 
						|
. ./test-lib.sh
 | 
						|
 | 
						|
note () {
 | 
						|
	git tag "$1"
 | 
						|
}
 | 
						|
 | 
						|
unnote () {
 | 
						|
	git name-rev --tags --stdin | sed -e "s|$OID_REGEX (tags/\([^)]*\)) |\1 |g"
 | 
						|
}
 | 
						|
 | 
						|
#
 | 
						|
# Create a test repo with interesting commit graph:
 | 
						|
#
 | 
						|
# A--B----------G--H--I--K--L
 | 
						|
#  \  \           /     /
 | 
						|
#   \  \         /     /
 | 
						|
#    C------E---F     J
 | 
						|
#        \_/
 | 
						|
#
 | 
						|
# The commits are laid out from left-to-right starting with
 | 
						|
# the root commit A and terminating at the tip commit L.
 | 
						|
#
 | 
						|
# There are a few places where we adjust the commit date or
 | 
						|
# author date to make the --topo-order, --date-order, and
 | 
						|
# --author-date-order flags produce different output.
 | 
						|
 | 
						|
test_expect_success setup '
 | 
						|
	echo "Hi there" >file &&
 | 
						|
	echo "initial" >lost &&
 | 
						|
	git add file lost &&
 | 
						|
	test_tick && git commit -m "Initial file and lost" &&
 | 
						|
	note A &&
 | 
						|
 | 
						|
	git branch other-branch &&
 | 
						|
 | 
						|
	git symbolic-ref HEAD refs/heads/unrelated &&
 | 
						|
	git rm -f "*" &&
 | 
						|
	echo "Unrelated branch" >side &&
 | 
						|
	git add side &&
 | 
						|
	test_tick && git commit -m "Side root" &&
 | 
						|
	note J &&
 | 
						|
	git checkout master &&
 | 
						|
 | 
						|
	echo "Hello" >file &&
 | 
						|
	echo "second" >lost &&
 | 
						|
	git add file lost &&
 | 
						|
	test_tick && GIT_AUTHOR_DATE=$(($test_tick + 120)) git commit -m "Modified file and lost" &&
 | 
						|
	note B &&
 | 
						|
 | 
						|
	git checkout other-branch &&
 | 
						|
 | 
						|
	echo "Hello" >file &&
 | 
						|
	>lost &&
 | 
						|
	git add file lost &&
 | 
						|
	test_tick && git commit -m "Modified the file identically" &&
 | 
						|
	note C &&
 | 
						|
 | 
						|
	echo "This is a stupid example" >another-file &&
 | 
						|
	git add another-file &&
 | 
						|
	test_tick && git commit -m "Add another file" &&
 | 
						|
	note D &&
 | 
						|
 | 
						|
	test_tick &&
 | 
						|
	test_must_fail git merge -m "merge" master &&
 | 
						|
	>lost && git commit -a -m "merge" &&
 | 
						|
	note E &&
 | 
						|
 | 
						|
	echo "Yet another" >elif &&
 | 
						|
	git add elif &&
 | 
						|
	test_tick && git commit -m "Irrelevant change" &&
 | 
						|
	note F &&
 | 
						|
 | 
						|
	git checkout master &&
 | 
						|
	echo "Yet another" >elif &&
 | 
						|
	git add elif &&
 | 
						|
	test_tick && git commit -m "Another irrelevant change" &&
 | 
						|
	note G &&
 | 
						|
 | 
						|
	test_tick && git merge -m "merge" other-branch &&
 | 
						|
	note H &&
 | 
						|
 | 
						|
	echo "Final change" >file &&
 | 
						|
	test_tick && git commit -a -m "Final change" &&
 | 
						|
	note I &&
 | 
						|
 | 
						|
	git checkout master &&
 | 
						|
	test_tick && git merge --allow-unrelated-histories -m "Coolest" unrelated &&
 | 
						|
	note K &&
 | 
						|
 | 
						|
	echo "Immaterial" >elif &&
 | 
						|
	git add elif &&
 | 
						|
	test_tick && git commit -m "Last" &&
 | 
						|
	note L
 | 
						|
'
 | 
						|
 | 
						|
FMT='tformat:%P 	%H | %s'
 | 
						|
 | 
						|
check_outcome () {
 | 
						|
	outcome=$1
 | 
						|
	shift
 | 
						|
	for c in $1
 | 
						|
	do
 | 
						|
		echo "$c"
 | 
						|
	done >expect &&
 | 
						|
	shift &&
 | 
						|
	param="$*" &&
 | 
						|
	test_expect_$outcome "log $param" '
 | 
						|
		git log --pretty="$FMT" --parents $param |
 | 
						|
		unnote >actual &&
 | 
						|
		sed -e "s/^.*	\([^ ]*\) .*/\1/" >check <actual &&
 | 
						|
		test_cmp expect check
 | 
						|
	'
 | 
						|
}
 | 
						|
 | 
						|
check_result () {
 | 
						|
	check_outcome success "$@"
 | 
						|
}
 | 
						|
 | 
						|
check_result 'L K J I H F E D C G B A' --full-history --topo-order
 | 
						|
check_result 'L K I H G F E D C B J A' --full-history
 | 
						|
check_result 'L K I H G F E D C B J A' --full-history --date-order
 | 
						|
check_result 'L K I H G F E D B C J A' --full-history --author-date-order
 | 
						|
check_result 'K I H E C B A' --full-history -- file
 | 
						|
check_result 'K I H E C B A' --full-history --topo-order -- file
 | 
						|
check_result 'K I H E C B A' --full-history --date-order -- file
 | 
						|
check_result 'K I H E B C A' --full-history --author-date-order -- file
 | 
						|
check_result 'I E C B A' --simplify-merges -- file
 | 
						|
check_result 'I E C B A' --simplify-merges --topo-order -- file
 | 
						|
check_result 'I E C B A' --simplify-merges --date-order -- file
 | 
						|
check_result 'I E B C A' --simplify-merges --author-date-order -- file
 | 
						|
check_result 'I B A' -- file
 | 
						|
check_result 'I B A' --topo-order -- file
 | 
						|
check_result 'I B A' --date-order -- file
 | 
						|
check_result 'I B A' --author-date-order -- file
 | 
						|
check_result 'H' --first-parent -- another-file
 | 
						|
check_result 'H' --first-parent --topo-order -- another-file
 | 
						|
 | 
						|
check_result 'E C B A' --full-history E -- lost
 | 
						|
test_expect_success 'full history simplification without parent' '
 | 
						|
	printf "%s\n" E C B A >expect &&
 | 
						|
	git log --pretty="$FMT" --full-history E -- lost |
 | 
						|
	unnote >actual &&
 | 
						|
	sed -e "s/^.*	\([^ ]*\) .*/\1/" >check <actual &&
 | 
						|
	test_cmp expect check
 | 
						|
'
 | 
						|
 | 
						|
test_expect_success '--full-diff is not affected by --parents' '
 | 
						|
	git log -p --pretty="%H" --full-diff -- file >expected &&
 | 
						|
	git log -p --pretty="%H" --full-diff --parents -- file >actual &&
 | 
						|
	test_cmp expected actual
 | 
						|
'
 | 
						|
 | 
						|
test_done
 |