569 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			569 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
| #!/bin/sh
 | |
| #
 | |
| # Copyright (c) 2006, Junio C Hamano
 | |
| #
 | |
| 
 | |
| test_description='fmt-merge-msg test'
 | |
| 
 | |
| GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 | |
| export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 | |
| 
 | |
| . ./test-lib.sh
 | |
| . "$TEST_DIRECTORY/lib-gpg.sh"
 | |
| 
 | |
| test_expect_success setup '
 | |
| 	echo one >one &&
 | |
| 	git add one &&
 | |
| 	test_tick &&
 | |
| 	git commit -m "Initial" &&
 | |
| 
 | |
| 	git clone . remote &&
 | |
| 
 | |
| 	echo uno >one &&
 | |
| 	echo dos >two &&
 | |
| 	git add two &&
 | |
| 	test_tick &&
 | |
| 	git commit -a -m "Second" &&
 | |
| 
 | |
| 	git checkout -b left &&
 | |
| 
 | |
| 	echo "c1" >one &&
 | |
| 	test_tick &&
 | |
| 	git commit -a -m "Common #1" &&
 | |
| 
 | |
| 	echo "c2" >one &&
 | |
| 	test_tick &&
 | |
| 	git commit -a -m "Common #2" &&
 | |
| 
 | |
| 	git branch right &&
 | |
| 
 | |
| 	echo "l3" >two &&
 | |
| 	test_tick &&
 | |
| 	GIT_COMMITTER_NAME="Another Committer" \
 | |
| 	GIT_AUTHOR_NAME="Another Author" git commit -a -m "Left #3" &&
 | |
| 
 | |
| 	echo "l4" >two &&
 | |
| 	test_tick &&
 | |
| 	GIT_COMMITTER_NAME="Another Committer" \
 | |
| 	GIT_AUTHOR_NAME="Another Author" git commit -a -m "Left #4" &&
 | |
| 
 | |
| 	echo "l5" >two &&
 | |
| 	test_tick &&
 | |
| 	GIT_COMMITTER_NAME="Another Committer" \
 | |
| 	GIT_AUTHOR_NAME="Another Author" git commit -a -m "Left #5" &&
 | |
| 	git tag tag-l5 &&
 | |
| 
 | |
| 	git checkout right &&
 | |
| 
 | |
| 	echo "r3" >three &&
 | |
| 	git add three &&
 | |
| 	test_tick &&
 | |
| 	git commit -a -m "Right #3" &&
 | |
| 	git tag tag-r3 &&
 | |
| 
 | |
| 	echo "r4" >three &&
 | |
| 	test_tick &&
 | |
| 	git commit -a -m "Right #4" &&
 | |
| 
 | |
| 	echo "r5" >three &&
 | |
| 	test_tick &&
 | |
| 	git commit -a -m "Right #5" &&
 | |
| 
 | |
| 	git checkout -b long &&
 | |
| 	test_commit_bulk --start=0 --message=%s --filename=one 30 &&
 | |
| 
 | |
| 	git show-branch &&
 | |
| 
 | |
| 	apos="'\''"
 | |
| '
 | |
| 
 | |
| test_expect_success GPG 'set up a signed tag' '
 | |
| 	git tag -s -m signed-tag-msg signed-good-tag left
 | |
| '
 | |
| 
 | |
| test_expect_success 'message for merging local branch' '
 | |
| 	echo "Merge branch ${apos}left${apos}" >expected &&
 | |
| 
 | |
| 	git checkout main &&
 | |
| 	git fetch . left &&
 | |
| 
 | |
| 	git fmt-merge-msg <.git/FETCH_HEAD >actual &&
 | |
| 	test_cmp expected actual
 | |
| '
 | |
| 
 | |
| test_expect_success GPG 'message for merging local tag signed by good key' '
 | |
| 	git checkout main &&
 | |
| 	git fetch . signed-good-tag &&
 | |
| 	git fmt-merge-msg <.git/FETCH_HEAD >actual 2>&1 &&
 | |
| 	grep "^Merge tag ${apos}signed-good-tag${apos}" actual &&
 | |
| 	grep "^# gpg: Signature made" actual &&
 | |
| 	grep "^# gpg: Good signature from" actual
 | |
| '
 | |
| 
 | |
| test_expect_success GPG 'message for merging local tag signed by unknown key' '
 | |
| 	git checkout main &&
 | |
| 	git fetch . signed-good-tag &&
 | |
| 	GNUPGHOME=. git fmt-merge-msg <.git/FETCH_HEAD >actual 2>&1 &&
 | |
| 	grep "^Merge tag ${apos}signed-good-tag${apos}" actual &&
 | |
| 	grep "^# gpg: Signature made" actual &&
 | |
| 	grep -E "^# gpg: Can${apos}t check signature: (public key not found|No public key)" actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'message for merging external branch' '
 | |
| 	echo "Merge branch ${apos}left${apos} of $(pwd)" >expected &&
 | |
| 
 | |
| 	git checkout main &&
 | |
| 	git fetch "$(pwd)" left &&
 | |
| 
 | |
| 	git fmt-merge-msg <.git/FETCH_HEAD >actual &&
 | |
| 	test_cmp expected actual
 | |
| '
 | |
| 
 | |
| test_expect_success '[merge] summary/log configuration' '
 | |
| 	cat >expected <<-EOF &&
 | |
| 	Merge branch ${apos}left${apos}
 | |
| 
 | |
| 	# By Another Author (3) and A U Thor (2)
 | |
| 	# Via Another Committer
 | |
| 	* left:
 | |
| 	  Left #5
 | |
| 	  Left #4
 | |
| 	  Left #3
 | |
| 	  Common #2
 | |
| 	  Common #1
 | |
| 	EOF
 | |
| 
 | |
| 	test_config merge.log true &&
 | |
| 	test_unconfig merge.summary &&
 | |
| 
 | |
| 	git checkout main &&
 | |
| 	test_tick &&
 | |
| 	git fetch . left &&
 | |
| 
 | |
| 	git fmt-merge-msg <.git/FETCH_HEAD >actual1 &&
 | |
| 
 | |
| 	test_unconfig merge.log &&
 | |
| 	test_config merge.summary true &&
 | |
| 
 | |
| 	git checkout main &&
 | |
| 	test_tick &&
 | |
| 	git fetch . left &&
 | |
| 
 | |
| 	git fmt-merge-msg <.git/FETCH_HEAD >actual2 &&
 | |
| 
 | |
| 	test_cmp expected actual1 &&
 | |
| 	test_cmp expected actual2
 | |
| '
 | |
| 
 | |
| test_expect_success 'setup FETCH_HEAD' '
 | |
| 	git checkout main &&
 | |
| 	test_tick &&
 | |
| 	git fetch . left
 | |
| '
 | |
| 
 | |
| test_expect_success 'merge.log=3 limits shortlog length' '
 | |
| 	cat >expected <<-EOF &&
 | |
| 	Merge branch ${apos}left${apos}
 | |
| 
 | |
| 	# By Another Author (3) and A U Thor (2)
 | |
| 	# Via Another Committer
 | |
| 	* left: (5 commits)
 | |
| 	  Left #5
 | |
| 	  Left #4
 | |
| 	  Left #3
 | |
| 	  ...
 | |
| 	EOF
 | |
| 
 | |
| 	git -c merge.log=3 fmt-merge-msg <.git/FETCH_HEAD >actual &&
 | |
| 	test_cmp expected actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'merge.log=5 shows all 5 commits' '
 | |
| 	cat >expected <<-EOF &&
 | |
| 	Merge branch ${apos}left${apos}
 | |
| 
 | |
| 	# By Another Author (3) and A U Thor (2)
 | |
| 	# Via Another Committer
 | |
| 	* left:
 | |
| 	  Left #5
 | |
| 	  Left #4
 | |
| 	  Left #3
 | |
| 	  Common #2
 | |
| 	  Common #1
 | |
| 	EOF
 | |
| 
 | |
| 	git -c merge.log=5 fmt-merge-msg <.git/FETCH_HEAD >actual &&
 | |
| 	test_cmp expected actual
 | |
| '
 | |
| 
 | |
| test_expect_success '--log=5 with custom comment character' '
 | |
| 	cat >expected <<-EOF &&
 | |
| 	Merge branch ${apos}left${apos}
 | |
| 
 | |
| 	x By Another Author (3) and A U Thor (2)
 | |
| 	x Via Another Committer
 | |
| 	* left:
 | |
| 	  Left #5
 | |
| 	  Left #4
 | |
| 	  Left #3
 | |
| 	  Common #2
 | |
| 	  Common #1
 | |
| 	EOF
 | |
| 
 | |
| 	git -c core.commentchar="x" fmt-merge-msg --log=5 <.git/FETCH_HEAD >actual &&
 | |
| 	test_cmp expected actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'merge.log=0 disables shortlog' '
 | |
| 	echo "Merge branch ${apos}left${apos}" >expected &&
 | |
| 	git -c merge.log=0 fmt-merge-msg <.git/FETCH_HEAD >actual &&
 | |
| 	test_cmp expected actual
 | |
| '
 | |
| 
 | |
| test_expect_success '--log=3 limits shortlog length' '
 | |
| 	cat >expected <<-EOF &&
 | |
| 	Merge branch ${apos}left${apos}
 | |
| 
 | |
| 	# By Another Author (3) and A U Thor (2)
 | |
| 	# Via Another Committer
 | |
| 	* left: (5 commits)
 | |
| 	  Left #5
 | |
| 	  Left #4
 | |
| 	  Left #3
 | |
| 	  ...
 | |
| 	EOF
 | |
| 
 | |
| 	git fmt-merge-msg --log=3 <.git/FETCH_HEAD >actual &&
 | |
| 	test_cmp expected actual
 | |
| '
 | |
| 
 | |
| test_expect_success '--log=5 shows all 5 commits' '
 | |
| 	cat >expected <<-EOF &&
 | |
| 	Merge branch ${apos}left${apos}
 | |
| 
 | |
| 	# By Another Author (3) and A U Thor (2)
 | |
| 	# Via Another Committer
 | |
| 	* left:
 | |
| 	  Left #5
 | |
| 	  Left #4
 | |
| 	  Left #3
 | |
| 	  Common #2
 | |
| 	  Common #1
 | |
| 	EOF
 | |
| 
 | |
| 	git fmt-merge-msg --log=5 <.git/FETCH_HEAD >actual &&
 | |
| 	test_cmp expected actual
 | |
| '
 | |
| 
 | |
| test_expect_success '--no-log disables shortlog' '
 | |
| 	echo "Merge branch ${apos}left${apos}" >expected &&
 | |
| 	git fmt-merge-msg --no-log <.git/FETCH_HEAD >actual &&
 | |
| 	test_cmp expected actual
 | |
| '
 | |
| 
 | |
| test_expect_success '--log=0 disables shortlog' '
 | |
| 	echo "Merge branch ${apos}left${apos}" >expected &&
 | |
| 	git fmt-merge-msg --no-log <.git/FETCH_HEAD >actual &&
 | |
| 	test_cmp expected actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'fmt-merge-msg -m' '
 | |
| 	echo "Sync with left" >expected &&
 | |
| 	cat >expected.log <<-EOF &&
 | |
| 	Sync with left
 | |
| 
 | |
| 	# By Another Author (3) and A U Thor (2)
 | |
| 	# Via Another Committer
 | |
| 	* ${apos}left${apos} of $(pwd):
 | |
| 	  Left #5
 | |
| 	  Left #4
 | |
| 	  Left #3
 | |
| 	  Common #2
 | |
| 	  Common #1
 | |
| 	EOF
 | |
| 
 | |
| 	test_unconfig merge.log &&
 | |
| 	test_unconfig merge.summary &&
 | |
| 	git checkout main &&
 | |
| 	git fetch "$(pwd)" left &&
 | |
| 	git fmt-merge-msg -m "Sync with left" <.git/FETCH_HEAD >actual &&
 | |
| 	git fmt-merge-msg --log -m "Sync with left" \
 | |
| 					<.git/FETCH_HEAD >actual.log &&
 | |
| 	test_config merge.log true &&
 | |
| 	git fmt-merge-msg -m "Sync with left" \
 | |
| 					<.git/FETCH_HEAD >actual.log-config &&
 | |
| 	git fmt-merge-msg --no-log -m "Sync with left" \
 | |
| 					<.git/FETCH_HEAD >actual.nolog &&
 | |
| 
 | |
| 	test_cmp expected actual &&
 | |
| 	test_cmp expected.log actual.log &&
 | |
| 	test_cmp expected.log actual.log-config &&
 | |
| 	test_cmp expected actual.nolog
 | |
| '
 | |
| 
 | |
| test_expect_success 'setup: expected shortlog for two branches' '
 | |
| 	cat >expected <<-EOF
 | |
| 	Merge branches ${apos}left${apos} and ${apos}right${apos}
 | |
| 
 | |
| 	# By Another Author (3) and A U Thor (2)
 | |
| 	# Via Another Committer
 | |
| 	* left:
 | |
| 	  Left #5
 | |
| 	  Left #4
 | |
| 	  Left #3
 | |
| 	  Common #2
 | |
| 	  Common #1
 | |
| 
 | |
| 	* right:
 | |
| 	  Right #5
 | |
| 	  Right #4
 | |
| 	  Right #3
 | |
| 	  Common #2
 | |
| 	  Common #1
 | |
| 	EOF
 | |
| '
 | |
| 
 | |
| test_expect_success 'shortlog for two branches' '
 | |
| 	test_config merge.log true &&
 | |
| 	test_unconfig merge.summary &&
 | |
| 	git checkout main &&
 | |
| 	test_tick &&
 | |
| 	git fetch . left right &&
 | |
| 	git fmt-merge-msg <.git/FETCH_HEAD >actual1 &&
 | |
| 
 | |
| 	test_unconfig merge.log &&
 | |
| 	test_config merge.summary true &&
 | |
| 	git checkout main &&
 | |
| 	test_tick &&
 | |
| 	git fetch . left right &&
 | |
| 	git fmt-merge-msg <.git/FETCH_HEAD >actual2 &&
 | |
| 
 | |
| 	test_config merge.log yes &&
 | |
| 	test_unconfig merge.summary &&
 | |
| 	git checkout main &&
 | |
| 	test_tick &&
 | |
| 	git fetch . left right &&
 | |
| 	git fmt-merge-msg <.git/FETCH_HEAD >actual3 &&
 | |
| 
 | |
| 	test_unconfig merge.log &&
 | |
| 	test_config merge.summary yes &&
 | |
| 	git checkout main &&
 | |
| 	test_tick &&
 | |
| 	git fetch . left right &&
 | |
| 	git fmt-merge-msg <.git/FETCH_HEAD >actual4 &&
 | |
| 
 | |
| 	test_cmp expected actual1 &&
 | |
| 	test_cmp expected actual2 &&
 | |
| 	test_cmp expected actual3 &&
 | |
| 	test_cmp expected actual4
 | |
| '
 | |
| 
 | |
| test_expect_success 'merge-msg -F' '
 | |
| 	test_unconfig merge.log &&
 | |
| 	test_config merge.summary yes &&
 | |
| 	git checkout main &&
 | |
| 	test_tick &&
 | |
| 	git fetch . left right &&
 | |
| 	git fmt-merge-msg -F .git/FETCH_HEAD >actual &&
 | |
| 	test_cmp expected actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'merge-msg -F in subdirectory' '
 | |
| 	test_unconfig merge.log &&
 | |
| 	test_config merge.summary yes &&
 | |
| 	git checkout main &&
 | |
| 	test_tick &&
 | |
| 	git fetch . left right &&
 | |
| 	mkdir sub &&
 | |
| 	cp .git/FETCH_HEAD sub/FETCH_HEAD &&
 | |
| 	(
 | |
| 		cd sub &&
 | |
| 		git fmt-merge-msg -F FETCH_HEAD >../actual
 | |
| 	) &&
 | |
| 	test_cmp expected actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'merge-msg with nothing to merge' '
 | |
| 	test_unconfig merge.log &&
 | |
| 	test_config merge.summary yes &&
 | |
| 
 | |
| 	(
 | |
| 		cd remote &&
 | |
| 		git checkout -b unrelated &&
 | |
| 		test_tick &&
 | |
| 		git fetch origin &&
 | |
| 		git fmt-merge-msg <.git/FETCH_HEAD >../actual
 | |
| 	) &&
 | |
| 
 | |
| 	test_must_be_empty actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'merge-msg tag' '
 | |
| 	cat >expected <<-EOF &&
 | |
| 	Merge tag ${apos}tag-r3${apos}
 | |
| 
 | |
| 	* tag ${apos}tag-r3${apos}:
 | |
| 	  Right #3
 | |
| 	  Common #2
 | |
| 	  Common #1
 | |
| 	EOF
 | |
| 
 | |
| 	test_unconfig merge.log &&
 | |
| 	test_config merge.summary yes &&
 | |
| 
 | |
| 	git checkout main &&
 | |
| 	test_tick &&
 | |
| 	git fetch . tag tag-r3 &&
 | |
| 
 | |
| 	git fmt-merge-msg <.git/FETCH_HEAD >actual &&
 | |
| 	test_cmp expected actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'merge-msg two tags' '
 | |
| 	cat >expected <<-EOF &&
 | |
| 	Merge tags ${apos}tag-r3${apos} and ${apos}tag-l5${apos}
 | |
| 
 | |
| 	* tag ${apos}tag-r3${apos}:
 | |
| 	  Right #3
 | |
| 	  Common #2
 | |
| 	  Common #1
 | |
| 
 | |
| 	# By Another Author (3) and A U Thor (2)
 | |
| 	# Via Another Committer
 | |
| 	* tag ${apos}tag-l5${apos}:
 | |
| 	  Left #5
 | |
| 	  Left #4
 | |
| 	  Left #3
 | |
| 	  Common #2
 | |
| 	  Common #1
 | |
| 	EOF
 | |
| 
 | |
| 	test_unconfig merge.log &&
 | |
| 	test_config merge.summary yes &&
 | |
| 
 | |
| 	git checkout main &&
 | |
| 	test_tick &&
 | |
| 	git fetch . tag tag-r3 tag tag-l5 &&
 | |
| 
 | |
| 	git fmt-merge-msg <.git/FETCH_HEAD >actual &&
 | |
| 	test_cmp expected actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'merge-msg tag and branch' '
 | |
| 	cat >expected <<-EOF &&
 | |
| 	Merge branch ${apos}left${apos}, tag ${apos}tag-r3${apos}
 | |
| 
 | |
| 	* tag ${apos}tag-r3${apos}:
 | |
| 	  Right #3
 | |
| 	  Common #2
 | |
| 	  Common #1
 | |
| 
 | |
| 	# By Another Author (3) and A U Thor (2)
 | |
| 	# Via Another Committer
 | |
| 	* left:
 | |
| 	  Left #5
 | |
| 	  Left #4
 | |
| 	  Left #3
 | |
| 	  Common #2
 | |
| 	  Common #1
 | |
| 	EOF
 | |
| 
 | |
| 	test_unconfig merge.log &&
 | |
| 	test_config merge.summary yes &&
 | |
| 
 | |
| 	git checkout main &&
 | |
| 	test_tick &&
 | |
| 	git fetch . tag tag-r3 left &&
 | |
| 
 | |
| 	git fmt-merge-msg <.git/FETCH_HEAD >actual &&
 | |
| 	test_cmp expected actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'merge-msg lots of commits' '
 | |
| 	{
 | |
| 		cat <<-EOF &&
 | |
| 		Merge branch ${apos}long${apos}
 | |
| 
 | |
| 		* long: (35 commits)
 | |
| 		EOF
 | |
| 
 | |
| 		i=29 &&
 | |
| 		while test $i -gt 9
 | |
| 		do
 | |
| 			echo "  $i" &&
 | |
| 			i=$(($i-1))
 | |
| 		done &&
 | |
| 		echo "  ..."
 | |
| 	} >expected &&
 | |
| 
 | |
| 	test_config merge.summary yes &&
 | |
| 
 | |
| 	git checkout main &&
 | |
| 	test_tick &&
 | |
| 	git fetch . long &&
 | |
| 
 | |
| 	git fmt-merge-msg <.git/FETCH_HEAD >actual &&
 | |
| 	test_cmp expected actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'merge-msg with "merging" an annotated tag' '
 | |
| 	test_config merge.log true &&
 | |
| 
 | |
| 	git checkout main^0 &&
 | |
| 	git commit --allow-empty -m "One step ahead" &&
 | |
| 	git tag -a -m "An annotated one" annote HEAD &&
 | |
| 
 | |
| 	git checkout main &&
 | |
| 	git fetch . annote &&
 | |
| 
 | |
| 	git fmt-merge-msg <.git/FETCH_HEAD >actual &&
 | |
| 	{
 | |
| 		cat <<-\EOF
 | |
| 		Merge tag '\''annote'\''
 | |
| 
 | |
| 		An annotated one
 | |
| 
 | |
| 		* tag '\''annote'\'':
 | |
| 		  One step ahead
 | |
| 		EOF
 | |
| 	} >expected &&
 | |
| 	test_cmp expected actual &&
 | |
| 
 | |
| 	test_when_finished "git reset --hard" &&
 | |
| 	annote=$(git rev-parse annote) &&
 | |
| 	git merge --no-commit --no-ff $annote &&
 | |
| 	{
 | |
| 		cat <<-EOF
 | |
| 		Merge tag '\''$annote'\''
 | |
| 
 | |
| 		An annotated one
 | |
| 
 | |
| 		* tag '\''$annote'\'':
 | |
| 		  One step ahead
 | |
| 		EOF
 | |
| 	} >expected &&
 | |
| 	test_cmp expected .git/MERGE_MSG
 | |
| '
 | |
| 
 | |
| test_expect_success 'merge.suppressDest configuration' '
 | |
| 	git checkout -B side main &&
 | |
| 	git commit --allow-empty -m "One step ahead" &&
 | |
| 	git checkout main &&
 | |
| 	git fetch . side &&
 | |
| 
 | |
| 	git -c merge.suppressDest="" fmt-merge-msg <.git/FETCH_HEAD >full.1 &&
 | |
| 	head -n1 full.1 >actual &&
 | |
| 	grep -e "Merge branch .side. into main" actual &&
 | |
| 
 | |
| 	git -c merge.suppressDest="mast" fmt-merge-msg <.git/FETCH_HEAD >full.2 &&
 | |
| 	head -n1 full.2 >actual &&
 | |
| 	grep -e "Merge branch .side. into main$" actual &&
 | |
| 
 | |
| 	git -c merge.suppressDest="ma?*[rn]" fmt-merge-msg <.git/FETCH_HEAD >full.3 &&
 | |
| 	head -n1 full.3 >actual &&
 | |
| 	grep -e "Merge branch .side." actual &&
 | |
| 	! grep -e " into main$" actual
 | |
| '
 | |
| 
 | |
| test_done
 |