fetch-pack: refactor command and capability write
[git] / t / t5612-clone-refspec.sh
1 #!/bin/sh
2
3 test_description='test refspec written by clone-command'
4 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
5 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
6
7 . ./test-lib.sh
8
9 test_expect_success 'setup' '
10         # Make two branches, "main" and "side"
11         echo one >file &&
12         git add file &&
13         git commit -m one &&
14         echo two >file &&
15         git commit -a -m two &&
16         git tag two &&
17         echo three >file &&
18         git commit -a -m three &&
19         git checkout -b side &&
20         echo four >file &&
21         git commit -a -m four &&
22         git checkout main &&
23         git tag five &&
24
25         # default clone
26         git clone . dir_all &&
27
28         # default clone --no-tags
29         git clone --no-tags . dir_all_no_tags &&
30
31         # default --single that follows HEAD=main
32         git clone --single-branch . dir_main &&
33
34         # default --single that follows HEAD=main with no tags
35         git clone --single-branch --no-tags . dir_main_no_tags &&
36
37         # default --single that follows HEAD=side
38         git checkout side &&
39         git clone --single-branch . dir_side &&
40
41         # explicit --single that follows side
42         git checkout main &&
43         git clone --single-branch --branch side . dir_side2 &&
44
45         # default --single with --mirror
46         git clone --single-branch --mirror . dir_mirror &&
47
48         # default --single with --branch and --mirror
49         git clone --single-branch --mirror --branch side . dir_mirror_side &&
50
51         # --single that does not know what branch to follow
52         git checkout two^ &&
53         git clone --single-branch . dir_detached &&
54
55         # explicit --single with tag
56         git clone --single-branch --branch two . dir_tag &&
57
58         # explicit --single with tag and --no-tags
59         git clone --single-branch --no-tags --branch two . dir_tag_no_tags &&
60
61         # advance both "main" and "side" branches
62         git checkout side &&
63         echo five >file &&
64         git commit -a -m five &&
65         git checkout main &&
66         echo six >file &&
67         git commit -a -m six &&
68
69         # update tag
70         git tag -d two && git tag two
71 '
72
73 test_expect_success 'by default all branches will be kept updated' '
74         (
75                 cd dir_all &&
76                 git fetch &&
77                 git for-each-ref refs/remotes/origin >refs &&
78                 sed -e "/HEAD$/d" \
79                     -e "s|/remotes/origin/|/heads/|" refs >../actual
80         ) &&
81         # follow both main and side
82         git for-each-ref refs/heads >expect &&
83         test_cmp expect actual
84 '
85
86 test_expect_success 'by default no tags will be kept updated' '
87         (
88                 cd dir_all &&
89                 git fetch &&
90                 git for-each-ref refs/tags >../actual
91         ) &&
92         git for-each-ref refs/tags >expect &&
93         ! test_cmp expect actual &&
94         test_line_count = 2 actual
95 '
96
97 test_expect_success 'clone with --no-tags' '
98         (
99                 cd dir_all_no_tags &&
100                 grep tagOpt .git/config &&
101                 git fetch &&
102                 git for-each-ref refs/tags >../actual
103         ) &&
104         test_must_be_empty actual
105 '
106
107 test_expect_success '--single-branch while HEAD pointing at main' '
108         (
109                 cd dir_main &&
110                 git fetch --force &&
111                 git for-each-ref refs/remotes/origin >refs &&
112                 sed -e "/HEAD$/d" \
113                     -e "s|/remotes/origin/|/heads/|" refs >../actual
114         ) &&
115         # only follow main
116         git for-each-ref refs/heads/main >expect &&
117         # get & check latest tags
118         test_cmp expect actual &&
119         (
120                 cd dir_main &&
121                 git fetch --tags --force &&
122                 git for-each-ref refs/tags >../actual
123         ) &&
124         git for-each-ref refs/tags >expect &&
125         test_cmp expect actual &&
126         test_line_count = 2 actual
127 '
128
129 test_expect_success '--single-branch while HEAD pointing at main and --no-tags' '
130         (
131                 cd dir_main_no_tags &&
132                 git fetch &&
133                 git for-each-ref refs/remotes/origin >refs &&
134                 sed -e "/HEAD$/d" \
135                     -e "s|/remotes/origin/|/heads/|" refs >../actual
136         ) &&
137         # only follow main
138         git for-each-ref refs/heads/main >expect &&
139         test_cmp expect actual &&
140         # get tags (noop)
141         (
142                 cd dir_main_no_tags &&
143                 git fetch &&
144                 git for-each-ref refs/tags >../actual
145         ) &&
146         test_must_be_empty actual &&
147         test_line_count = 0 actual &&
148         # get tags with --tags overrides tagOpt
149         (
150                 cd dir_main_no_tags &&
151                 git fetch --tags &&
152                 git for-each-ref refs/tags >../actual
153         ) &&
154         git for-each-ref refs/tags >expect &&
155         test_cmp expect actual &&
156         test_line_count = 2 actual
157 '
158
159 test_expect_success '--single-branch while HEAD pointing at side' '
160         (
161                 cd dir_side &&
162                 git fetch &&
163                 git for-each-ref refs/remotes/origin >refs &&
164                 sed -e "/HEAD$/d" \
165                     -e "s|/remotes/origin/|/heads/|" refs >../actual
166         ) &&
167         # only follow side
168         git for-each-ref refs/heads/side >expect &&
169         test_cmp expect actual
170 '
171
172 test_expect_success '--single-branch with explicit --branch side' '
173         (
174                 cd dir_side2 &&
175                 git fetch &&
176                 git for-each-ref refs/remotes/origin >refs &&
177                 sed -e "/HEAD$/d" \
178                     -e "s|/remotes/origin/|/heads/|" refs >../actual
179         ) &&
180         # only follow side
181         git for-each-ref refs/heads/side >expect &&
182         test_cmp expect actual
183 '
184
185 test_expect_success '--single-branch with explicit --branch with tag fetches updated tag' '
186         (
187                 cd dir_tag &&
188                 git fetch &&
189                 git for-each-ref refs/tags >../actual
190         ) &&
191         git for-each-ref refs/tags >expect &&
192         test_cmp expect actual
193 '
194
195 test_expect_success '--single-branch with explicit --branch with tag fetches updated tag despite --no-tags' '
196         (
197                 cd dir_tag_no_tags &&
198                 git fetch &&
199                 git for-each-ref refs/tags >../actual
200         ) &&
201         git for-each-ref refs/tags/two >expect &&
202         test_cmp expect actual &&
203         test_line_count = 1 actual
204 '
205
206 test_expect_success '--single-branch with --mirror' '
207         (
208                 cd dir_mirror &&
209                 git fetch &&
210                 git for-each-ref refs > ../actual
211         ) &&
212         git for-each-ref refs >expect &&
213         test_cmp expect actual
214 '
215
216 test_expect_success '--single-branch with explicit --branch and --mirror' '
217         (
218                 cd dir_mirror_side &&
219                 git fetch &&
220                 git for-each-ref refs > ../actual
221         ) &&
222         git for-each-ref refs >expect &&
223         test_cmp expect actual
224 '
225
226 test_expect_success '--single-branch with detached' '
227         (
228                 cd dir_detached &&
229                 git fetch &&
230                 git for-each-ref refs/remotes/origin >refs &&
231                 sed -e "/HEAD$/d" \
232                     -e "s|/remotes/origin/|/heads/|" refs >../actual
233         ) &&
234         # nothing
235         test_must_be_empty actual
236 '
237
238 test_done