|  | #!/bin/sh | 
|  |  | 
|  | test_description='handling of alternates in environment variables' | 
|  | . ./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 |