#!/bin/sh

test_description='test automatic tag following'

. ./test-lib.sh

if ! test_have_prereq NOT_MINGW; then
	say "GIT_DEBUG_SEND_PACK not supported - skipping tests"
fi

# End state of the repository:
#
#         T - tag1          S - tag2
#        /                 /
#   L - A ------ O ------ B
#    \   \                 \
#     \   C - origin/cat    \
#      origin/master         master

test_expect_success NOT_MINGW 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

test_expect_success NOT_MINGW 'setup expect' '
cat - <<EOF >expect
#S
want $A
#E
EOF
'

test_expect_success NOT_MINGW 'fetch A (new commit : 1 connection)' '
	rm -f $U &&
	(
		cd cloned &&
		GIT_DEBUG_SEND_PACK=3 git fetch 3>../$U &&
		test $A = $(git rev-parse --verify origin/master)
	) &&
	test -s $U &&
	cut -d" " -f1,2 $U >actual &&
	test_cmp expect actual
'

test_expect_success NOT_MINGW "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 NOT_MINGW 'setup expect' '
cat - <<EOF >expect
#S
want $C
want $T
#E
EOF
'

test_expect_success NOT_MINGW 'fetch C, T (new branch, tag : 1 connection)' '
	rm -f $U &&
	(
		cd cloned &&
		GIT_DEBUG_SEND_PACK=3 git fetch 3>../$U &&
		test $C = $(git rev-parse --verify origin/cat) &&
		test $T = $(git rev-parse --verify tag1) &&
		test $A = $(git rev-parse --verify tag1^0)
	) &&
	test -s $U &&
	cut -d" " -f1,2 $U >actual &&
	test_cmp expect actual
'

test_expect_success NOT_MINGW "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 NOT_MINGW 'setup expect' '
cat - <<EOF >expect
#S
want $B
want $S
#E
EOF
'

test_expect_success NOT_MINGW 'fetch B, S (commit and tag : 1 connection)' '
	rm -f $U &&
	(
		cd cloned &&
		GIT_DEBUG_SEND_PACK=3 git fetch 3>../$U &&
		test $B = $(git rev-parse --verify origin/master) &&
		test $B = $(git rev-parse --verify tag2^0) &&
		test $S = $(git rev-parse --verify tag2)
	) &&
	test -s $U &&
	cut -d" " -f1,2 $U >actual &&
	test_cmp expect actual
'

test_expect_success NOT_MINGW 'setup expect' '
cat - <<EOF >expect
#S
want $B
want $S
#E
EOF
'

test_expect_success NOT_MINGW 'new clone fetch master and tags' '
	git branch -D cat
	rm -f $U
	(
		mkdir clone2 &&
		cd clone2 &&
		git init &&
		git remote add origin .. &&
		GIT_DEBUG_SEND_PACK=3 git fetch 3>../$U &&
		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)
	) &&
	test -s $U &&
	cut -d" " -f1,2 $U >actual &&
	test_cmp expect actual
'

test_done
