| #!/bin/sh | 
 |  | 
 | test_description='test automatic tag following' | 
 |  | 
 | . ./test-lib.sh | 
 |  | 
 | # End state of the repository: | 
 | # | 
 | #         T - tag1          S - tag2 | 
 | #        /                 / | 
 | #   L - A ------ O ------ B | 
 | #    \   \                 \ | 
 | #     \   C - origin/cat    \ | 
 | #      origin/master         master | 
 |  | 
 | test_expect_success setup ' | 
 | 	test_tick && | 
 | 	echo ichi >file && | 
 | 	git add file && | 
 | 	git commit -m L && | 
 | 	L=$(git rev-parse --verify HEAD) && | 
 |  | 
 | 	( | 
 | 		mkdir cloned && | 
 | 		cd cloned && | 
 | 		git init-db && | 
 | 		git remote add -f origin .. | 
 | 	) && | 
 |  | 
 | 	test_tick && | 
 | 	echo A >file && | 
 | 	git add file && | 
 | 	git commit -m A && | 
 | 	A=$(git rev-parse --verify HEAD) | 
 | ' | 
 |  | 
 | U=UPLOAD_LOG | 
 | UPATH="$(pwd)/$U" | 
 |  | 
 | test_expect_success 'setup expect' ' | 
 | cat - <<EOF >expect | 
 | want $A | 
 | EOF | 
 | ' | 
 |  | 
 | get_needs () { | 
 | 	test -s "$1" && | 
 | 	perl -alne ' | 
 | 		next unless $F[1] eq "upload-pack<"; | 
 | 		last if $F[2] eq "0000"; | 
 | 		print $F[2], " ", $F[3]; | 
 | 	' "$1" | 
 | } | 
 |  | 
 | test_expect_success 'fetch A (new commit : 1 connection)' ' | 
 | 	rm -f $U && | 
 | 	( | 
 | 		cd cloned && | 
 | 		GIT_TRACE_PACKET=$UPATH git fetch && | 
 | 		test $A = $(git rev-parse --verify origin/master) | 
 | 	) && | 
 | 	get_needs $U >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success "create tag T on A, create C on branch cat" ' | 
 | 	git tag -a -m tag1 tag1 $A && | 
 | 	T=$(git rev-parse --verify tag1) && | 
 |  | 
 | 	git checkout -b cat && | 
 | 	echo C >file && | 
 | 	git add file && | 
 | 	git commit -m C && | 
 | 	C=$(git rev-parse --verify HEAD) && | 
 | 	git checkout master | 
 | ' | 
 |  | 
 | test_expect_success 'setup expect' ' | 
 | cat - <<EOF >expect | 
 | want $C | 
 | want $T | 
 | EOF | 
 | ' | 
 |  | 
 | test_expect_success 'fetch C, T (new branch, tag : 1 connection)' ' | 
 | 	rm -f $U && | 
 | 	( | 
 | 		cd cloned && | 
 | 		GIT_TRACE_PACKET=$UPATH git fetch && | 
 | 		test $C = $(git rev-parse --verify origin/cat) && | 
 | 		test $T = $(git rev-parse --verify tag1) && | 
 | 		test $A = $(git rev-parse --verify tag1^0) | 
 | 	) && | 
 | 	get_needs $U >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success "create commits O, B, tag S on B" ' | 
 | 	test_tick && | 
 | 	echo O >file && | 
 | 	git add file && | 
 | 	git commit -m O && | 
 |  | 
 | 	test_tick && | 
 | 	echo B >file && | 
 | 	git add file && | 
 | 	git commit -m B && | 
 | 	B=$(git rev-parse --verify HEAD) && | 
 |  | 
 | 	git tag -a -m tag2 tag2 $B && | 
 | 	S=$(git rev-parse --verify tag2) | 
 | ' | 
 |  | 
 | test_expect_success 'setup expect' ' | 
 | cat - <<EOF >expect | 
 | want $B | 
 | want $S | 
 | EOF | 
 | ' | 
 |  | 
 | test_expect_success 'fetch B, S (commit and tag : 1 connection)' ' | 
 | 	rm -f $U && | 
 | 	( | 
 | 		cd cloned && | 
 | 		GIT_TRACE_PACKET=$UPATH git fetch && | 
 | 		test $B = $(git rev-parse --verify origin/master) && | 
 | 		test $B = $(git rev-parse --verify tag2^0) && | 
 | 		test $S = $(git rev-parse --verify tag2) | 
 | 	) && | 
 | 	get_needs $U >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_expect_success 'setup expect' ' | 
 | cat - <<EOF >expect | 
 | want $B | 
 | want $S | 
 | EOF | 
 | ' | 
 |  | 
 | test_expect_success 'new clone fetch master and tags' ' | 
 | 	test_might_fail git branch -D cat && | 
 | 	rm -f $U && | 
 | 	( | 
 | 		mkdir clone2 && | 
 | 		cd clone2 && | 
 | 		git init && | 
 | 		git remote add origin .. && | 
 | 		GIT_TRACE_PACKET=$UPATH git fetch && | 
 | 		test $B = $(git rev-parse --verify origin/master) && | 
 | 		test $S = $(git rev-parse --verify tag2) && | 
 | 		test $B = $(git rev-parse --verify tag2^0) && | 
 | 		test $T = $(git rev-parse --verify tag1) && | 
 | 		test $A = $(git rev-parse --verify tag1^0) | 
 | 	) && | 
 | 	get_needs $U >actual && | 
 | 	test_cmp expect actual | 
 | ' | 
 |  | 
 | test_done |