Merge branch 'jh/fsck-promisors' into next
[git] / t / t5615-alternate-env.sh
1 #!/bin/sh
2
3 test_description='handling of alternates in environment variables'
4 . ./test-lib.sh
5
6 check_obj () {
7         alt=$1; shift
8         while read obj expect
9         do
10                 echo "$obj" >&5 &&
11                 echo "$obj $expect" >&6
12         done 5>input 6>expect &&
13         GIT_ALTERNATE_OBJECT_DIRECTORIES=$alt \
14                 git "$@" cat-file --batch-check='%(objectname) %(objecttype)' \
15                 <input >actual &&
16         test_cmp expect actual
17 }
18
19 test_expect_success 'create alternate repositories' '
20         git init --bare one.git &&
21         one=$(echo one | git -C one.git hash-object -w --stdin) &&
22         git init --bare two.git &&
23         two=$(echo two | git -C two.git hash-object -w --stdin)
24 '
25
26 test_expect_success 'objects inaccessible without alternates' '
27         check_obj "" <<-EOF
28         $one missing
29         $two missing
30         EOF
31 '
32
33 test_expect_success 'access alternate via absolute path' '
34         check_obj "$PWD/one.git/objects" <<-EOF
35         $one blob
36         $two missing
37         EOF
38 '
39
40 test_expect_success 'access multiple alternates' '
41         check_obj "$PWD/one.git/objects:$PWD/two.git/objects" <<-EOF
42         $one blob
43         $two blob
44         EOF
45 '
46
47 # bare paths are relative from $GIT_DIR
48 test_expect_success 'access alternate via relative path (bare)' '
49         git init --bare bare.git &&
50         check_obj "../one.git/objects" -C bare.git <<-EOF
51         $one blob
52         EOF
53 '
54
55 # non-bare paths are relative to top of worktree
56 test_expect_success 'access alternate via relative path (worktree)' '
57         git init worktree &&
58         check_obj "../one.git/objects" -C worktree <<-EOF
59         $one blob
60         EOF
61 '
62
63 # path is computed after moving to top-level of worktree
64 test_expect_success 'access alternate via relative path (subdir)' '
65         mkdir subdir &&
66         check_obj "one.git/objects" -C subdir <<-EOF
67         $one blob
68         EOF
69 '
70
71 # set variables outside test to avoid quote insanity; the \057 is '/',
72 # which doesn't need quoting, but just confirms that de-quoting
73 # is working.
74 quoted='"one.git\057objects"'
75 unquoted='two.git/objects'
76 test_expect_success 'mix of quoted and unquoted alternates' '
77         check_obj "$quoted:$unquoted" <<-EOF
78         $one blob
79         $two blob
80         EOF
81 '
82
83 test_expect_success !MINGW 'broken quoting falls back to interpreting raw' '
84         mv one.git \"one.git &&
85         check_obj \"one.git/objects <<-EOF
86         $one blob
87         EOF
88 '
89
90 test_done