| #!/bin/sh | 
 |  | 
 | test_description='handling of alternates in environment variables' | 
 |  | 
 | TEST_PASSES_SANITIZE_LEAK=true | 
 | . ./test-lib.sh | 
 |  | 
 | check_obj () { | 
 | 	alt=$1; shift | 
 | 	while read obj expect | 
 | 	do | 
 | 		echo "$obj" >&5 && | 
 | 		echo "$obj $expect" >&6 | 
 | 	done 5>input 6>expect && | 
 | 	GIT_ALTERNATE_OBJECT_DIRECTORIES=$alt \ | 
 | 		git "$@" cat-file --batch-check='%(objectname) %(objecttype)' \ | 
 | 		<input >actual && | 
 | 	test_cmp expect actual | 
 | } | 
 |  | 
 | test_expect_success 'create alternate repositories' ' | 
 | 	git init --bare one.git && | 
 | 	one=$(echo one | git -C one.git hash-object -w --stdin) && | 
 | 	git init --bare two.git && | 
 | 	two=$(echo two | git -C two.git hash-object -w --stdin) | 
 | ' | 
 |  | 
 | test_expect_success 'objects inaccessible without alternates' ' | 
 | 	check_obj "" <<-EOF | 
 | 	$one missing | 
 | 	$two missing | 
 | 	EOF | 
 | ' | 
 |  | 
 | test_expect_success 'access alternate via absolute path' ' | 
 | 	check_obj "$PWD/one.git/objects" <<-EOF | 
 | 	$one blob | 
 | 	$two missing | 
 | 	EOF | 
 | ' | 
 |  | 
 | test_expect_success 'access multiple alternates' ' | 
 | 	check_obj "$PWD/one.git/objects:$PWD/two.git/objects" <<-EOF | 
 | 	$one blob | 
 | 	$two blob | 
 | 	EOF | 
 | ' | 
 |  | 
 | # bare paths are relative from $GIT_DIR | 
 | test_expect_success 'access alternate via relative path (bare)' ' | 
 | 	git init --bare bare.git && | 
 | 	check_obj "../one.git/objects" -C bare.git <<-EOF | 
 | 	$one blob | 
 | 	EOF | 
 | ' | 
 |  | 
 | # non-bare paths are relative to top of worktree | 
 | test_expect_success 'access alternate via relative path (worktree)' ' | 
 | 	git init worktree && | 
 | 	check_obj "../one.git/objects" -C worktree <<-EOF | 
 | 	$one blob | 
 | 	EOF | 
 | ' | 
 |  | 
 | # path is computed after moving to top-level of worktree | 
 | test_expect_success 'access alternate via relative path (subdir)' ' | 
 | 	mkdir subdir && | 
 | 	check_obj "one.git/objects" -C subdir <<-EOF | 
 | 	$one blob | 
 | 	EOF | 
 | ' | 
 |  | 
 | # set variables outside test to avoid quote insanity; the \057 is '/', | 
 | # which doesn't need quoting, but just confirms that de-quoting | 
 | # is working. | 
 | quoted='"one.git\057objects"' | 
 | unquoted='two.git/objects' | 
 | test_expect_success 'mix of quoted and unquoted alternates' ' | 
 | 	check_obj "$quoted:$unquoted" <<-EOF | 
 | 	$one blob | 
 | 	$two blob | 
 | 	EOF | 
 | ' | 
 |  | 
 | test_expect_success !MINGW 'broken quoting falls back to interpreting raw' ' | 
 | 	mv one.git \"one.git && | 
 | 	check_obj \"one.git/objects <<-EOF | 
 | 	$one blob | 
 | 	EOF | 
 | ' | 
 |  | 
 | test_done |