| #!/bin/sh | 
 |  | 
 | test_description='test various @{X} syntax combinations together' | 
 | . ./test-lib.sh | 
 |  | 
 | check() { | 
 | 	test_expect_${4:-success} "$1 = $3" " | 
 | 		echo '$3' >expect && | 
 | 		if test '$2' = 'commit' | 
 | 		then | 
 | 			git log -1 --format=%s '$1' >actual | 
 | 		elif test '$2' = 'ref' | 
 | 		then | 
 | 			git rev-parse --symbolic-full-name '$1' >actual | 
 | 		else | 
 | 			git cat-file -p '$1' >actual | 
 | 		fi && | 
 | 		test_cmp expect actual | 
 | 	" | 
 | } | 
 |  | 
 | nonsense() { | 
 | 	test_expect_${2:-success} "$1 is nonsensical" " | 
 | 		test_must_fail git rev-parse --verify '$1' | 
 | 	" | 
 | } | 
 |  | 
 | fail() { | 
 | 	"$@" failure | 
 | } | 
 |  | 
 | test_expect_success 'setup' ' | 
 | 	test_commit master-one && | 
 | 	test_commit master-two && | 
 | 	git checkout -b upstream-branch && | 
 | 	test_commit upstream-one && | 
 | 	test_commit upstream-two && | 
 | 	if test_have_prereq !MINGW | 
 | 	then | 
 | 		git checkout -b @/at-test | 
 | 	fi && | 
 | 	git checkout -b @@/at-test && | 
 | 	git checkout -b @at-test && | 
 | 	git checkout -b old-branch && | 
 | 	test_commit old-one && | 
 | 	test_commit old-two && | 
 | 	git checkout -b new-branch && | 
 | 	test_commit new-one && | 
 | 	test_commit new-two && | 
 | 	git branch -u master old-branch && | 
 | 	git branch -u upstream-branch new-branch | 
 | ' | 
 |  | 
 | check HEAD ref refs/heads/new-branch | 
 | check "@{1}" commit new-one | 
 | check "HEAD@{1}" commit new-one | 
 | check "@{now}" commit new-two | 
 | check "HEAD@{now}" commit new-two | 
 | check "@{-1}" ref refs/heads/old-branch | 
 | check "@{-1}@{0}" commit old-two | 
 | check "@{-1}@{1}" commit old-one | 
 | check "@{u}" ref refs/heads/upstream-branch | 
 | check "HEAD@{u}" ref refs/heads/upstream-branch | 
 | check "@{u}@{1}" commit upstream-one | 
 | check "@{-1}@{u}" ref refs/heads/master | 
 | check "@{-1}@{u}@{1}" commit master-one | 
 | check "@" commit new-two | 
 | check "@@{u}" ref refs/heads/upstream-branch | 
 | check "@@/at-test" ref refs/heads/@@/at-test | 
 | test_have_prereq MINGW || | 
 | check "@/at-test" ref refs/heads/@/at-test | 
 | check "@at-test" ref refs/heads/@at-test | 
 | nonsense "@{u}@{-1}" | 
 | nonsense "@{0}@{0}" | 
 | nonsense "@{1}@{u}" | 
 | nonsense "HEAD@{-1}" | 
 | nonsense "@{-1}@{-1}" | 
 |  | 
 | # @{N} versus HEAD@{N} | 
 |  | 
 | check "HEAD@{3}" commit old-two | 
 | nonsense "@{3}" | 
 |  | 
 | test_expect_success 'switch to old-branch' ' | 
 | 	git checkout old-branch | 
 | ' | 
 |  | 
 | check HEAD ref refs/heads/old-branch | 
 | check "HEAD@{1}" commit new-two | 
 | check "@{1}" commit old-one | 
 |  | 
 | test_expect_success 'create path with @' ' | 
 | 	echo content >normal && | 
 | 	echo content >fun@ny && | 
 | 	git add normal fun@ny && | 
 | 	git commit -m "funny path" | 
 | ' | 
 |  | 
 | check "@:normal" blob content | 
 | check "@:fun@ny" blob content | 
 |  | 
 | test_done |