]>
Commit | Line | Data |
---|---|---|
399e4a1c JH |
1 | #!/bin/sh |
2 | ||
3 | test_description='checkout <branch> | |
4 | ||
5 | Ensures that checkout on an unborn branch does what the user expects' | |
6 | ||
7 | . ./test-lib.sh | |
8 | ||
9 | # Is the current branch "refs/heads/$1"? | |
10 | test_branch () { | |
11 | printf "%s\n" "refs/heads/$1" >expect.HEAD && | |
12 | git symbolic-ref HEAD >actual.HEAD && | |
13 | test_cmp expect.HEAD actual.HEAD | |
14 | } | |
15 | ||
16 | # Is branch "refs/heads/$1" set to pull from "$2/$3"? | |
17 | test_branch_upstream () { | |
18 | printf "%s\n" "$2" "refs/heads/$3" >expect.upstream && | |
19 | { | |
20 | git config "branch.$1.remote" && | |
21 | git config "branch.$1.merge" | |
22 | } >actual.upstream && | |
23 | test_cmp expect.upstream actual.upstream | |
24 | } | |
25 | ||
26 | test_expect_success 'setup' ' | |
ec2764ee | 27 | test_commit my_master && |
399e4a1c JH |
28 | git init repo_a && |
29 | ( | |
30 | cd repo_a && | |
31 | test_commit a_master && | |
32 | git checkout -b foo && | |
33 | test_commit a_foo && | |
34 | git checkout -b bar && | |
35 | test_commit a_bar | |
36 | ) && | |
37 | git init repo_b && | |
38 | ( | |
39 | cd repo_b && | |
40 | test_commit b_master && | |
41 | git checkout -b foo && | |
42 | test_commit b_foo && | |
43 | git checkout -b baz && | |
44 | test_commit b_baz | |
45 | ) && | |
46 | git remote add repo_a repo_a && | |
47 | git remote add repo_b repo_b && | |
48 | git config remote.repo_b.fetch \ | |
49 | "+refs/heads/*:refs/remotes/other_b/*" && | |
50 | git fetch --all | |
51 | ' | |
52 | ||
53 | test_expect_success 'checkout of non-existing branch fails' ' | |
54 | git checkout -B master && | |
55 | test_might_fail git branch -D xyzzy && | |
56 | ||
57 | test_must_fail git checkout xyzzy && | |
58 | test_must_fail git rev-parse --verify refs/heads/xyzzy && | |
59 | test_branch master | |
60 | ' | |
61 | ||
ec2764ee | 62 | test_expect_success 'checkout of branch from multiple remotes fails #1' ' |
399e4a1c JH |
63 | git checkout -B master && |
64 | test_might_fail git branch -D foo && | |
65 | ||
66 | test_must_fail git checkout foo && | |
67 | test_must_fail git rev-parse --verify refs/heads/foo && | |
68 | test_branch master | |
69 | ' | |
70 | ||
71 | test_expect_success 'checkout of branch from a single remote succeeds #1' ' | |
72 | git checkout -B master && | |
73 | test_might_fail git branch -D bar && | |
74 | ||
75 | git checkout bar && | |
76 | test_branch bar && | |
77 | test_cmp_rev remotes/repo_a/bar HEAD && | |
78 | test_branch_upstream bar repo_a bar | |
79 | ' | |
80 | ||
81 | test_expect_success 'checkout of branch from a single remote succeeds #2' ' | |
82 | git checkout -B master && | |
83 | test_might_fail git branch -D baz && | |
84 | ||
85 | git checkout baz && | |
86 | test_branch baz && | |
87 | test_cmp_rev remotes/other_b/baz HEAD && | |
88 | test_branch_upstream baz repo_b baz | |
89 | ' | |
90 | ||
91 | test_expect_success '--no-guess suppresses branch auto-vivification' ' | |
92 | git checkout -B master && | |
93 | test_might_fail git branch -D bar && | |
94 | ||
95 | test_must_fail git checkout --no-guess bar && | |
96 | test_must_fail git rev-parse --verify refs/heads/bar && | |
97 | test_branch master | |
98 | ' | |
99 | ||
ec2764ee JH |
100 | test_expect_success 'setup more remotes with unconventional refspecs' ' |
101 | git checkout -B master && | |
102 | git init repo_c && | |
103 | ( | |
104 | cd repo_c && | |
105 | test_commit c_master && | |
106 | git checkout -b bar && | |
5a517b1c | 107 | test_commit c_bar && |
ec2764ee JH |
108 | git checkout -b spam && |
109 | test_commit c_spam | |
110 | ) && | |
111 | git init repo_d && | |
112 | ( | |
113 | cd repo_d && | |
114 | test_commit d_master && | |
115 | git checkout -b baz && | |
5a517b1c | 116 | test_commit d_baz && |
ec2764ee | 117 | git checkout -b eggs && |
5a517b1c | 118 | test_commit d_eggs |
ec2764ee JH |
119 | ) && |
120 | git remote add repo_c repo_c && | |
121 | git config remote.repo_c.fetch \ | |
122 | "+refs/heads/*:refs/remotes/extra_dir/repo_c/extra_dir/*" && | |
123 | git remote add repo_d repo_d && | |
124 | git config remote.repo_d.fetch \ | |
125 | "+refs/heads/*:refs/repo_d/*" && | |
126 | git fetch --all | |
127 | ' | |
128 | ||
fa83a33b | 129 | test_expect_success 'checkout of branch from multiple remotes fails #2' ' |
ec2764ee JH |
130 | git checkout -B master && |
131 | test_might_fail git branch -D bar && | |
132 | ||
133 | test_must_fail git checkout bar && | |
134 | test_must_fail git rev-parse --verify refs/heads/bar && | |
135 | test_branch master | |
136 | ' | |
137 | ||
fa83a33b | 138 | test_expect_success 'checkout of branch from multiple remotes fails #3' ' |
ec2764ee JH |
139 | git checkout -B master && |
140 | test_might_fail git branch -D baz && | |
141 | ||
142 | test_must_fail git checkout baz && | |
143 | test_must_fail git rev-parse --verify refs/heads/baz && | |
144 | test_branch master | |
145 | ' | |
146 | ||
fa83a33b | 147 | test_expect_success 'checkout of branch from a single remote succeeds #3' ' |
ec2764ee JH |
148 | git checkout -B master && |
149 | test_might_fail git branch -D spam && | |
150 | ||
151 | git checkout spam && | |
152 | test_branch spam && | |
153 | test_cmp_rev refs/remotes/extra_dir/repo_c/extra_dir/spam HEAD && | |
154 | test_branch_upstream spam repo_c spam | |
155 | ' | |
156 | ||
41c21f22 | 157 | test_expect_success 'checkout of branch from a single remote succeeds #4' ' |
ec2764ee JH |
158 | git checkout -B master && |
159 | test_might_fail git branch -D eggs && | |
160 | ||
161 | git checkout eggs && | |
162 | test_branch eggs && | |
163 | test_cmp_rev refs/repo_d/eggs HEAD && | |
164 | test_branch_upstream eggs repo_d eggs | |
165 | ' | |
166 | ||
a047fafc MM |
167 | test_expect_success 'checkout of branch with a file having the same name fails' ' |
168 | git checkout -B master && | |
169 | test_might_fail git branch -D spam && | |
170 | ||
171 | >spam && | |
172 | test_must_fail git checkout spam && | |
173 | test_must_fail git rev-parse --verify refs/heads/spam && | |
174 | test_branch master | |
175 | ' | |
176 | ||
177 | test_expect_success 'checkout <branch> -- succeeds, even if a file with the same name exists' ' | |
178 | git checkout -B master && | |
179 | test_might_fail git branch -D spam && | |
180 | ||
181 | >spam && | |
182 | git checkout spam -- && | |
183 | test_branch spam && | |
184 | test_cmp_rev refs/remotes/extra_dir/repo_c/extra_dir/spam HEAD && | |
185 | test_branch_upstream spam repo_c spam | |
186 | ' | |
187 | ||
05e73682 JH |
188 | test_expect_success 'loosely defined local base branch is reported correctly' ' |
189 | ||
190 | git checkout master && | |
191 | git branch strict && | |
192 | git branch loose && | |
193 | git commit --allow-empty -m "a bit more" && | |
194 | ||
195 | test_config branch.strict.remote . && | |
196 | test_config branch.loose.remote . && | |
197 | test_config branch.strict.merge refs/heads/master && | |
198 | test_config branch.loose.merge master && | |
199 | ||
200 | git checkout strict | sed -e "s/strict/BRANCHNAME/g" >expect && | |
201 | git checkout loose | sed -e "s/loose/BRANCHNAME/g" >actual && | |
202 | ||
203 | test_cmp expect actual | |
204 | ' | |
205 | ||
399e4a1c | 206 | test_done |