289 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			289 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
| #!/bin/sh
 | |
| 
 | |
| test_description='merge simplification'
 | |
| 
 | |
| GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 | |
| export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 | |
| 
 | |
| . ./test-lib.sh
 | |
| 
 | |
| note () {
 | |
| 	git tag "$1"
 | |
| }
 | |
| 
 | |
| unnote () {
 | |
| 	test_when_finished "rm -f tmp" &&
 | |
| 	git name-rev --tags --annotate-stdin >tmp &&
 | |
| 	sed -e "s|$OID_REGEX (tags/\([^)]*\)) |\1 |g" <tmp
 | |
| }
 | |
| 
 | |
| #
 | |
| # Create a test repo with an interesting commit graph:
 | |
| #
 | |
| # A-----B-----G--H--I--K--L
 | |
| #  \     \      /     /
 | |
| #   \     \    /     /
 | |
| #    C--D--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 main &&
 | |
| 
 | |
| 	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" main &&
 | |
| 	>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 main &&
 | |
| 	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 main &&
 | |
| 	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 >out &&
 | |
| 		unnote >actual <out &&
 | |
| 		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 'L K I H G B A' --first-parent L
 | |
| check_result 'F E D C' --exclude-first-parent-only F ^L
 | |
| check_result '' F ^L
 | |
| check_result 'L K I H G J' L ^F
 | |
| check_result 'L K I H G B J' --exclude-first-parent-only L ^F
 | |
| check_result 'L K I H G B' --exclude-first-parent-only --first-parent L ^F
 | |
| 
 | |
| 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 >out &&
 | |
| 	unnote >actual <out &&
 | |
| 	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
 | |
| '
 | |
| 
 | |
| #
 | |
| # Create a new history to demonstrate the value of --show-pulls
 | |
| # with respect to the subtleties of simplified history, --full-history,
 | |
| # and --simplify-merges.
 | |
| #
 | |
| #   .-A---M-----C--N---O---P
 | |
| #  /     / \  \  \/   /   /
 | |
| # I     B   \  R-'`-Z'   /
 | |
| #  \   /     \/         /
 | |
| #   \ /      /\        /
 | |
| #    `---X--'  `---Y--'
 | |
| #
 | |
| # This example is explained in Documentation/rev-list-options.txt
 | |
| 
 | |
| test_expect_success 'setup rebuild repo' '
 | |
| 	rm -rf .git * &&
 | |
| 	git init &&
 | |
| 	git switch -c topic &&
 | |
| 
 | |
| 	echo base >file &&
 | |
| 	git add file &&
 | |
| 	test_commit I &&
 | |
| 
 | |
| 	echo A >file &&
 | |
| 	git add file &&
 | |
| 	test_commit A &&
 | |
| 
 | |
| 	git switch -c branchB I &&
 | |
| 	echo B >file &&
 | |
| 	git add file &&
 | |
| 	test_commit B &&
 | |
| 
 | |
| 	git switch topic &&
 | |
| 	test_must_fail git merge -m "M" B &&
 | |
| 	echo A >file &&
 | |
| 	echo B >>file &&
 | |
| 	git add file &&
 | |
| 	git merge --continue &&
 | |
| 	note M &&
 | |
| 
 | |
| 	echo C >other &&
 | |
| 	git add other &&
 | |
| 	test_commit C &&
 | |
| 
 | |
| 	git switch -c branchX I &&
 | |
| 	echo X >file &&
 | |
| 	git add file &&
 | |
| 	test_commit X &&
 | |
| 
 | |
| 	git switch -c branchR M &&
 | |
| 	git merge -m R -Xtheirs X &&
 | |
| 	note R &&
 | |
| 
 | |
| 	git switch topic &&
 | |
| 	git merge -m N R &&
 | |
| 	note N &&
 | |
| 
 | |
| 	git switch -c branchY M &&
 | |
| 	echo Y >y &&
 | |
| 	git add y &&
 | |
| 	test_commit Y &&
 | |
| 
 | |
| 	git switch -c branchZ C &&
 | |
| 	echo Z >z &&
 | |
| 	git add z &&
 | |
| 	test_commit Z &&
 | |
| 
 | |
| 	git switch topic &&
 | |
| 	git merge -m O Z &&
 | |
| 	note O &&
 | |
| 
 | |
| 	git merge -m P Y &&
 | |
| 	note P
 | |
| '
 | |
| 
 | |
| check_result 'X I' -- file
 | |
| check_result 'N R X I' --show-pulls -- file
 | |
| 
 | |
| check_result 'P O N R X M B A I' --full-history --topo-order -- file
 | |
| check_result 'N R X M B A I' --simplify-merges --topo-order --show-pulls -- file
 | |
| check_result 'R X M B A I' --simplify-merges --topo-order -- file
 | |
| check_result 'N M A I' --first-parent -- file
 | |
| check_result 'N M A I' --first-parent --show-pulls -- file
 | |
| 
 | |
| # --ancestry-path implies --full-history
 | |
| check_result 'P O N R M' --topo-order \
 | |
| 	--ancestry-path A..HEAD -- file
 | |
| check_result 'P O N R M' --topo-order \
 | |
| 	--show-pulls \
 | |
| 	--ancestry-path A..HEAD -- file
 | |
| check_result 'P O N R M' --topo-order \
 | |
| 	--full-history \
 | |
| 	--ancestry-path A..HEAD -- file
 | |
| check_result 'R M' --topo-order \
 | |
| 	--simplify-merges \
 | |
| 	--ancestry-path A..HEAD -- file
 | |
| check_result 'N R M' --topo-order \
 | |
| 	--simplify-merges --show-pulls \
 | |
| 	--ancestry-path A..HEAD -- file
 | |
| 
 | |
| test_expect_success 'log --graph --simplify-merges --show-pulls' '
 | |
| 	cat >expect <<-\EOF &&
 | |
| 	* N
 | |
| 	*   R
 | |
| 	|\  
 | |
| 	| * X
 | |
| 	* |   M
 | |
| 	|\ \  
 | |
| 	| * | B
 | |
| 	| |/  
 | |
| 	* / A
 | |
| 	|/  
 | |
| 	* I
 | |
| 	EOF
 | |
| 	git log --graph --pretty="%s" \
 | |
| 		--simplify-merges --show-pulls \
 | |
| 		-- file >actual &&
 | |
| 	test_cmp expect actual
 | |
| '
 | |
| 
 | |
| test_done
 |