Merge branch 'jk/log-cherry-pick-duplicate-patches'
[git] / t / t1507-rev-parse-upstream.sh
1 #!/bin/sh
2
3 test_description='test <branch>@{upstream} syntax'
4
5 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
6 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
7
8 . ./test-lib.sh
9
10
11 test_expect_success 'setup' '
12
13         test_commit 1 &&
14         git checkout -b side &&
15         test_commit 2 &&
16         git checkout main &&
17         git clone . clone &&
18         test_commit 3 &&
19         (cd clone &&
20          test_commit 4 &&
21          git branch --track my-side origin/side &&
22          git branch --track local-main main &&
23          git branch --track fun@ny origin/side &&
24          git branch --track @funny origin/side &&
25          git branch --track funny@ origin/side &&
26          git remote add -t main main-only .. &&
27          git fetch main-only &&
28          git branch bad-upstream &&
29          git config branch.bad-upstream.remote main-only &&
30          git config branch.bad-upstream.merge refs/heads/side
31         )
32 '
33
34 commit_subject () {
35         (cd clone &&
36          git show -s --pretty=tformat:%s "$@")
37 }
38
39 error_message () {
40         (cd clone &&
41          test_must_fail git rev-parse --verify "$@" 2>../error)
42 }
43
44 test_expect_success '@{upstream} resolves to correct full name' '
45         echo refs/remotes/origin/main >expect &&
46         git -C clone rev-parse --symbolic-full-name @{upstream} >actual &&
47         test_cmp expect actual &&
48         git -C clone rev-parse --symbolic-full-name @{UPSTREAM} >actual &&
49         test_cmp expect actual &&
50         git -C clone rev-parse --symbolic-full-name @{UpSTReam} >actual &&
51         test_cmp expect actual
52 '
53
54 test_expect_success '@{u} resolves to correct full name' '
55         echo refs/remotes/origin/main >expect &&
56         git -C clone rev-parse --symbolic-full-name @{u} >actual &&
57         test_cmp expect actual &&
58         git -C clone rev-parse --symbolic-full-name @{U} >actual &&
59         test_cmp expect actual
60 '
61
62 test_expect_success 'my-side@{upstream} resolves to correct full name' '
63         echo refs/remotes/origin/side >expect &&
64         git -C clone rev-parse --symbolic-full-name my-side@{u} >actual &&
65         test_cmp expect actual
66 '
67
68 test_expect_success 'upstream of branch with @ in middle' '
69         git -C clone rev-parse --symbolic-full-name fun@ny@{u} >actual &&
70         echo refs/remotes/origin/side >expect &&
71         test_cmp expect actual &&
72         git -C clone rev-parse --symbolic-full-name fun@ny@{U} >actual &&
73         test_cmp expect actual
74 '
75
76 test_expect_success 'upstream of branch with @ at start' '
77         git -C clone rev-parse --symbolic-full-name @funny@{u} >actual &&
78         echo refs/remotes/origin/side >expect &&
79         test_cmp expect actual
80 '
81
82 test_expect_success 'upstream of branch with @ at end' '
83         git -C clone rev-parse --symbolic-full-name funny@@{u} >actual &&
84         echo refs/remotes/origin/side >expect &&
85         test_cmp expect actual
86 '
87
88 test_expect_success 'refs/heads/my-side@{upstream} does not resolve to my-side{upstream}' '
89         test_must_fail git -C clone rev-parse --symbolic-full-name refs/heads/my-side@{upstream}
90 '
91
92 test_expect_success 'my-side@{u} resolves to correct commit' '
93         git checkout side &&
94         test_commit 5 &&
95         (cd clone && git fetch) &&
96         echo 2 >expect &&
97         commit_subject my-side >actual &&
98         test_cmp expect actual &&
99         echo 5 >expect &&
100         commit_subject my-side@{u} >actual
101 '
102
103 test_expect_success 'not-tracking@{u} fails' '
104         test_must_fail git -C clone rev-parse --symbolic-full-name non-tracking@{u} &&
105         (cd clone && git checkout --no-track -b non-tracking) &&
106         test_must_fail git -C clone rev-parse --symbolic-full-name non-tracking@{u}
107 '
108
109 test_expect_success '<branch>@{u}@{1} resolves correctly' '
110         test_commit 6 &&
111         (cd clone && git fetch) &&
112         echo 5 >expect &&
113         commit_subject my-side@{u}@{1} >actual &&
114         test_cmp expect actual &&
115         commit_subject my-side@{U}@{1} >actual &&
116         test_cmp expect actual
117 '
118
119 test_expect_success '@{u} without specifying branch fails on a detached HEAD' '
120         git checkout HEAD^0 &&
121         test_must_fail git rev-parse @{u} &&
122         test_must_fail git rev-parse @{U}
123 '
124
125 test_expect_success 'checkout -b new my-side@{u} forks from the same' '
126 (
127         cd clone &&
128         git checkout -b new my-side@{u} &&
129         git rev-parse --symbolic-full-name my-side@{u} >expect &&
130         git rev-parse --symbolic-full-name new@{u} >actual &&
131         test_cmp expect actual
132 )
133 '
134
135 test_expect_success 'merge my-side@{u} records the correct name' '
136 (
137         cd clone &&
138         git checkout main &&
139         test_might_fail git branch -D new &&
140         git branch -t new my-side@{u} &&
141         git merge -s ours new@{u} &&
142         git show -s --pretty=tformat:%s >actual &&
143         echo "Merge remote-tracking branch ${SQ}origin/side${SQ}" >expect &&
144         test_cmp expect actual
145 )
146 '
147
148 test_expect_success 'branch -d other@{u}' '
149         git checkout -t -b other main &&
150         git branch -d @{u} &&
151         git for-each-ref refs/heads/main >actual &&
152         test_must_be_empty actual
153 '
154
155 test_expect_success 'checkout other@{u}' '
156         git branch -f main HEAD &&
157         git checkout -t -b another main &&
158         git checkout @{u} &&
159         git symbolic-ref HEAD >actual &&
160         echo refs/heads/main >expect &&
161         test_cmp expect actual
162 '
163
164 test_expect_success 'branch@{u} works when tracking a local branch' '
165         echo refs/heads/main >expect &&
166         git -C clone rev-parse --symbolic-full-name local-main@{u} >actual &&
167         test_cmp expect actual
168 '
169
170 test_expect_success 'branch@{u} error message when no upstream' '
171         cat >expect <<-EOF &&
172         fatal: no upstream configured for branch ${SQ}non-tracking${SQ}
173         EOF
174         error_message non-tracking@{u} &&
175         test_i18ncmp expect error
176 '
177
178 test_expect_success '@{u} error message when no upstream' '
179         cat >expect <<-EOF &&
180         fatal: no upstream configured for branch ${SQ}main${SQ}
181         EOF
182         test_must_fail git rev-parse --verify @{u} 2>actual &&
183         test_i18ncmp expect actual
184 '
185
186 test_expect_success 'branch@{u} error message with misspelt branch' '
187         cat >expect <<-EOF &&
188         fatal: no such branch: ${SQ}no-such-branch${SQ}
189         EOF
190         error_message no-such-branch@{u} &&
191         test_i18ncmp expect error
192 '
193
194 test_expect_success '@{u} error message when not on a branch' '
195         cat >expect <<-EOF &&
196         fatal: HEAD does not point to a branch
197         EOF
198         git checkout HEAD^0 &&
199         test_must_fail git rev-parse --verify @{u} 2>actual &&
200         test_i18ncmp expect actual
201 '
202
203 test_expect_success 'branch@{u} error message if upstream branch not fetched' '
204         cat >expect <<-EOF &&
205         fatal: upstream branch ${SQ}refs/heads/side${SQ} not stored as a remote-tracking branch
206         EOF
207         error_message bad-upstream@{u} &&
208         test_i18ncmp expect error
209 '
210
211 test_expect_success 'pull works when tracking a local branch' '
212 (
213         cd clone &&
214         git checkout local-main &&
215         git pull
216 )
217 '
218
219 # makes sense if the previous one succeeded
220 test_expect_success '@{u} works when tracking a local branch' '
221         echo refs/heads/main >expect &&
222         git -C clone rev-parse --symbolic-full-name @{u} >actual &&
223         test_cmp expect actual
224 '
225
226 test_expect_success 'log -g other@{u}' '
227         commit=$(git rev-parse HEAD) &&
228         cat >expect <<-EOF &&
229         commit $commit
230         Reflog: main@{0} (C O Mitter <committer@example.com>)
231         Reflog message: branch: Created from HEAD
232         Author: A U Thor <author@example.com>
233         Date:   Thu Apr 7 15:15:13 2005 -0700
234
235             3
236         EOF
237         git log -1 -g other@{u} >actual &&
238         test_cmp expect actual
239 '
240
241 test_expect_success 'log -g other@{u}@{now}' '
242         commit=$(git rev-parse HEAD) &&
243         cat >expect <<-EOF &&
244         commit $commit
245         Reflog: main@{Thu Apr 7 15:17:13 2005 -0700} (C O Mitter <committer@example.com>)
246         Reflog message: branch: Created from HEAD
247         Author: A U Thor <author@example.com>
248         Date:   Thu Apr 7 15:15:13 2005 -0700
249
250             3
251         EOF
252         git log -1 -g other@{u}@{now} >actual &&
253         test_cmp expect actual
254 '
255
256 test_expect_success '@{reflog}-parsing does not look beyond colon' '
257         echo content >@{yesterday} &&
258         git add @{yesterday} &&
259         git commit -m "funny reflog file" &&
260         git hash-object @{yesterday} >expect &&
261         git rev-parse HEAD:@{yesterday} >actual
262 '
263
264 test_expect_success '@{upstream}-parsing does not look beyond colon' '
265         echo content >@{upstream} &&
266         git add @{upstream} &&
267         git commit -m "funny upstream file" &&
268         git hash-object @{upstream} >expect &&
269         git rev-parse HEAD:@{upstream} >actual
270 '
271
272 test_done