blob: 7d7c5d7ff978b572e2788186ccf45f3e95cb7981 [file] [log] [blame]
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001# ex:ts=4:sw=4:sts=4:et
2# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
3#
4# BitBake Tests for the Fetcher (fetch2/)
5#
6# Copyright (C) 2012 Richard Purdie
7#
8# This program is free software; you can redistribute it and/or modify
9# it under the terms of the GNU General Public License version 2 as
10# published by the Free Software Foundation.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License along
18# with this program; if not, write to the Free Software Foundation, Inc.,
19# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20#
21
22import unittest
23import tempfile
24import subprocess
Patrick Williamsc0f7c042017-02-23 20:41:17 -060025import collections
Patrick Williamsc124f4f2015-09-15 14:41:29 -050026import os
27from bb.fetch2 import URI
28from bb.fetch2 import FetchMethod
29import bb
30
Brad Bishopd7bf8c12018-02-25 22:55:05 -050031def skipIfNoNetwork():
32 if os.environ.get("BB_SKIP_NETTESTS") == "yes":
33 return unittest.skip("Network tests being skipped")
34 return lambda f: f
35
Patrick Williamsc124f4f2015-09-15 14:41:29 -050036class URITest(unittest.TestCase):
37 test_uris = {
38 "http://www.google.com/index.html" : {
39 'uri': 'http://www.google.com/index.html',
40 'scheme': 'http',
41 'hostname': 'www.google.com',
42 'port': None,
43 'hostport': 'www.google.com',
44 'path': '/index.html',
45 'userinfo': '',
46 'username': '',
47 'password': '',
48 'params': {},
49 'query': {},
50 'relative': False
51 },
52 "http://www.google.com/index.html;param1=value1" : {
53 'uri': 'http://www.google.com/index.html;param1=value1',
54 'scheme': 'http',
55 'hostname': 'www.google.com',
56 'port': None,
57 'hostport': 'www.google.com',
58 'path': '/index.html',
59 'userinfo': '',
60 'username': '',
61 'password': '',
62 'params': {
63 'param1': 'value1'
64 },
65 'query': {},
66 'relative': False
67 },
68 "http://www.example.org/index.html?param1=value1" : {
69 'uri': 'http://www.example.org/index.html?param1=value1',
70 'scheme': 'http',
71 'hostname': 'www.example.org',
72 'port': None,
73 'hostport': 'www.example.org',
74 'path': '/index.html',
75 'userinfo': '',
76 'username': '',
77 'password': '',
78 'params': {},
79 'query': {
80 'param1': 'value1'
81 },
82 'relative': False
83 },
84 "http://www.example.org/index.html?qparam1=qvalue1;param2=value2" : {
85 'uri': 'http://www.example.org/index.html?qparam1=qvalue1;param2=value2',
86 'scheme': 'http',
87 'hostname': 'www.example.org',
88 'port': None,
89 'hostport': 'www.example.org',
90 'path': '/index.html',
91 'userinfo': '',
92 'username': '',
93 'password': '',
94 'params': {
95 'param2': 'value2'
96 },
97 'query': {
98 'qparam1': 'qvalue1'
99 },
100 'relative': False
101 },
102 "http://www.example.com:8080/index.html" : {
103 'uri': 'http://www.example.com:8080/index.html',
104 'scheme': 'http',
105 'hostname': 'www.example.com',
106 'port': 8080,
107 'hostport': 'www.example.com:8080',
108 'path': '/index.html',
109 'userinfo': '',
110 'username': '',
111 'password': '',
112 'params': {},
113 'query': {},
114 'relative': False
115 },
116 "cvs://anoncvs@cvs.handhelds.org/cvs;module=familiar/dist/ipkg" : {
117 'uri': 'cvs://anoncvs@cvs.handhelds.org/cvs;module=familiar/dist/ipkg',
118 'scheme': 'cvs',
119 'hostname': 'cvs.handhelds.org',
120 'port': None,
121 'hostport': 'cvs.handhelds.org',
122 'path': '/cvs',
123 'userinfo': 'anoncvs',
124 'username': 'anoncvs',
125 'password': '',
126 'params': {
127 'module': 'familiar/dist/ipkg'
128 },
129 'query': {},
130 'relative': False
131 },
132 "cvs://anoncvs:anonymous@cvs.handhelds.org/cvs;tag=V0-99-81;module=familiar/dist/ipkg": {
133 'uri': 'cvs://anoncvs:anonymous@cvs.handhelds.org/cvs;tag=V0-99-81;module=familiar/dist/ipkg',
134 'scheme': 'cvs',
135 'hostname': 'cvs.handhelds.org',
136 'port': None,
137 'hostport': 'cvs.handhelds.org',
138 'path': '/cvs',
139 'userinfo': 'anoncvs:anonymous',
140 'username': 'anoncvs',
141 'password': 'anonymous',
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600142 'params': collections.OrderedDict([
143 ('tag', 'V0-99-81'),
144 ('module', 'familiar/dist/ipkg')
145 ]),
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500146 'query': {},
147 'relative': False
148 },
149 "file://example.diff": { # NOTE: Not RFC compliant!
150 'uri': 'file:example.diff',
151 'scheme': 'file',
152 'hostname': '',
153 'port': None,
154 'hostport': '',
155 'path': 'example.diff',
156 'userinfo': '',
157 'username': '',
158 'password': '',
159 'params': {},
160 'query': {},
161 'relative': True
162 },
163 "file:example.diff": { # NOTE: RFC compliant version of the former
164 'uri': 'file:example.diff',
165 'scheme': 'file',
166 'hostname': '',
167 'port': None,
168 'hostport': '',
169 'path': 'example.diff',
170 'userinfo': '',
171 'userinfo': '',
172 'username': '',
173 'password': '',
174 'params': {},
175 'query': {},
176 'relative': True
177 },
178 "file:///tmp/example.diff": {
179 'uri': 'file:///tmp/example.diff',
180 'scheme': 'file',
181 'hostname': '',
182 'port': None,
183 'hostport': '',
184 'path': '/tmp/example.diff',
185 'userinfo': '',
186 'userinfo': '',
187 'username': '',
188 'password': '',
189 'params': {},
190 'query': {},
191 'relative': False
192 },
193 "git:///path/example.git": {
194 'uri': 'git:///path/example.git',
195 'scheme': 'git',
196 'hostname': '',
197 'port': None,
198 'hostport': '',
199 'path': '/path/example.git',
200 'userinfo': '',
201 'userinfo': '',
202 'username': '',
203 'password': '',
204 'params': {},
205 'query': {},
206 'relative': False
207 },
208 "git:path/example.git": {
209 'uri': 'git:path/example.git',
210 'scheme': 'git',
211 'hostname': '',
212 'port': None,
213 'hostport': '',
214 'path': 'path/example.git',
215 'userinfo': '',
216 'userinfo': '',
217 'username': '',
218 'password': '',
219 'params': {},
220 'query': {},
221 'relative': True
222 },
223 "git://example.net/path/example.git": {
224 'uri': 'git://example.net/path/example.git',
225 'scheme': 'git',
226 'hostname': 'example.net',
227 'port': None,
228 'hostport': 'example.net',
229 'path': '/path/example.git',
230 'userinfo': '',
231 'userinfo': '',
232 'username': '',
233 'password': '',
234 'params': {},
235 'query': {},
236 'relative': False
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500237 },
238 "http://somesite.net;someparam=1": {
239 'uri': 'http://somesite.net;someparam=1',
240 'scheme': 'http',
241 'hostname': 'somesite.net',
242 'port': None,
243 'hostport': 'somesite.net',
244 'path': '',
245 'userinfo': '',
246 'userinfo': '',
247 'username': '',
248 'password': '',
249 'params': {"someparam" : "1"},
250 'query': {},
251 'relative': False
252 },
253 "file://somelocation;someparam=1": {
254 'uri': 'file:somelocation;someparam=1',
255 'scheme': 'file',
256 'hostname': '',
257 'port': None,
258 'hostport': '',
259 'path': 'somelocation',
260 'userinfo': '',
261 'userinfo': '',
262 'username': '',
263 'password': '',
264 'params': {"someparam" : "1"},
265 'query': {},
266 'relative': True
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500267 }
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500268
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500269 }
270
271 def test_uri(self):
272 for test_uri, ref in self.test_uris.items():
273 uri = URI(test_uri)
274
275 self.assertEqual(str(uri), ref['uri'])
276
277 # expected attributes
278 self.assertEqual(uri.scheme, ref['scheme'])
279
280 self.assertEqual(uri.userinfo, ref['userinfo'])
281 self.assertEqual(uri.username, ref['username'])
282 self.assertEqual(uri.password, ref['password'])
283
284 self.assertEqual(uri.hostname, ref['hostname'])
285 self.assertEqual(uri.port, ref['port'])
286 self.assertEqual(uri.hostport, ref['hostport'])
287
288 self.assertEqual(uri.path, ref['path'])
289 self.assertEqual(uri.params, ref['params'])
290
291 self.assertEqual(uri.relative, ref['relative'])
292
293 def test_dict(self):
294 for test in self.test_uris.values():
295 uri = URI()
296
297 self.assertEqual(uri.scheme, '')
298 self.assertEqual(uri.userinfo, '')
299 self.assertEqual(uri.username, '')
300 self.assertEqual(uri.password, '')
301 self.assertEqual(uri.hostname, '')
302 self.assertEqual(uri.port, None)
303 self.assertEqual(uri.path, '')
304 self.assertEqual(uri.params, {})
305
306
307 uri.scheme = test['scheme']
308 self.assertEqual(uri.scheme, test['scheme'])
309
310 uri.userinfo = test['userinfo']
311 self.assertEqual(uri.userinfo, test['userinfo'])
312 self.assertEqual(uri.username, test['username'])
313 self.assertEqual(uri.password, test['password'])
314
315 # make sure changing the values doesn't do anything unexpected
316 uri.username = 'changeme'
317 self.assertEqual(uri.username, 'changeme')
318 self.assertEqual(uri.password, test['password'])
319 uri.password = 'insecure'
320 self.assertEqual(uri.username, 'changeme')
321 self.assertEqual(uri.password, 'insecure')
322
323 # reset back after our trickery
324 uri.userinfo = test['userinfo']
325 self.assertEqual(uri.userinfo, test['userinfo'])
326 self.assertEqual(uri.username, test['username'])
327 self.assertEqual(uri.password, test['password'])
328
329 uri.hostname = test['hostname']
330 self.assertEqual(uri.hostname, test['hostname'])
331 self.assertEqual(uri.hostport, test['hostname'])
332
333 uri.port = test['port']
334 self.assertEqual(uri.port, test['port'])
335 self.assertEqual(uri.hostport, test['hostport'])
336
337 uri.path = test['path']
338 self.assertEqual(uri.path, test['path'])
339
340 uri.params = test['params']
341 self.assertEqual(uri.params, test['params'])
342
343 uri.query = test['query']
344 self.assertEqual(uri.query, test['query'])
345
346 self.assertEqual(str(uri), test['uri'])
347
348 uri.params = {}
349 self.assertEqual(uri.params, {})
350 self.assertEqual(str(uri), (str(uri).split(";"))[0])
351
352class FetcherTest(unittest.TestCase):
353
354 def setUp(self):
355 self.origdir = os.getcwd()
356 self.d = bb.data.init()
357 self.tempdir = tempfile.mkdtemp()
358 self.dldir = os.path.join(self.tempdir, "download")
359 os.mkdir(self.dldir)
360 self.d.setVar("DL_DIR", self.dldir)
361 self.unpackdir = os.path.join(self.tempdir, "unpacked")
362 os.mkdir(self.unpackdir)
363 persistdir = os.path.join(self.tempdir, "persistdata")
364 self.d.setVar("PERSISTENT_DIR", persistdir)
365
366 def tearDown(self):
367 os.chdir(self.origdir)
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600368 if os.environ.get("BB_TMPDIR_NOCLEAN") == "yes":
369 print("Not cleaning up %s. Please remove manually." % self.tempdir)
370 else:
371 bb.utils.prunedir(self.tempdir)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500372
373class MirrorUriTest(FetcherTest):
374
375 replaceuris = {
376 ("git://git.invalid.infradead.org/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/.*", "http://somewhere.org/somedir/")
377 : "http://somewhere.org/somedir/git2_git.invalid.infradead.org.mtd-utils.git.tar.gz",
378 ("git://git.invalid.infradead.org/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/([^/]+/)*([^/]*)", "git://somewhere.org/somedir/\\2;protocol=http")
379 : "git://somewhere.org/somedir/mtd-utils.git;tag=1234567890123456789012345678901234567890;protocol=http",
380 ("git://git.invalid.infradead.org/foo/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/([^/]+/)*([^/]*)", "git://somewhere.org/somedir/\\2;protocol=http")
381 : "git://somewhere.org/somedir/mtd-utils.git;tag=1234567890123456789012345678901234567890;protocol=http",
382 ("git://git.invalid.infradead.org/foo/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/([^/]+/)*([^/]*)", "git://somewhere.org/\\2;protocol=http")
383 : "git://somewhere.org/mtd-utils.git;tag=1234567890123456789012345678901234567890;protocol=http",
384 ("git://someserver.org/bitbake;tag=1234567890123456789012345678901234567890", "git://someserver.org/bitbake", "git://git.openembedded.org/bitbake")
385 : "git://git.openembedded.org/bitbake;tag=1234567890123456789012345678901234567890",
386 ("file://sstate-xyz.tgz", "file://.*", "file:///somewhere/1234/sstate-cache")
387 : "file:///somewhere/1234/sstate-cache/sstate-xyz.tgz",
388 ("file://sstate-xyz.tgz", "file://.*", "file:///somewhere/1234/sstate-cache/")
389 : "file:///somewhere/1234/sstate-cache/sstate-xyz.tgz",
390 ("http://somewhere.org/somedir1/somedir2/somefile_1.2.3.tar.gz", "http://.*/.*", "http://somewhere2.org/somedir3")
391 : "http://somewhere2.org/somedir3/somefile_1.2.3.tar.gz",
392 ("http://somewhere.org/somedir1/somefile_1.2.3.tar.gz", "http://somewhere.org/somedir1/somefile_1.2.3.tar.gz", "http://somewhere2.org/somedir3/somefile_1.2.3.tar.gz")
393 : "http://somewhere2.org/somedir3/somefile_1.2.3.tar.gz",
394 ("http://www.apache.org/dist/subversion/subversion-1.7.1.tar.bz2", "http://www.apache.org/dist", "http://archive.apache.org/dist")
395 : "http://archive.apache.org/dist/subversion/subversion-1.7.1.tar.bz2",
396 ("http://www.apache.org/dist/subversion/subversion-1.7.1.tar.bz2", "http://.*/.*", "file:///somepath/downloads/")
397 : "file:///somepath/downloads/subversion-1.7.1.tar.bz2",
398 ("git://git.invalid.infradead.org/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/.*", "git://somewhere.org/somedir/BASENAME;protocol=http")
399 : "git://somewhere.org/somedir/mtd-utils.git;tag=1234567890123456789012345678901234567890;protocol=http",
400 ("git://git.invalid.infradead.org/foo/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/.*", "git://somewhere.org/somedir/BASENAME;protocol=http")
401 : "git://somewhere.org/somedir/mtd-utils.git;tag=1234567890123456789012345678901234567890;protocol=http",
402 ("git://git.invalid.infradead.org/foo/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/.*", "git://somewhere.org/somedir/MIRRORNAME;protocol=http")
403 : "git://somewhere.org/somedir/git.invalid.infradead.org.foo.mtd-utils.git;tag=1234567890123456789012345678901234567890;protocol=http",
404
405 #Renaming files doesn't work
406 #("http://somewhere.org/somedir1/somefile_1.2.3.tar.gz", "http://somewhere.org/somedir1/somefile_1.2.3.tar.gz", "http://somewhere2.org/somedir3/somefile_2.3.4.tar.gz") : "http://somewhere2.org/somedir3/somefile_2.3.4.tar.gz"
407 #("file://sstate-xyz.tgz", "file://.*/.*", "file:///somewhere/1234/sstate-cache") : "file:///somewhere/1234/sstate-cache/sstate-xyz.tgz",
408 }
409
410 mirrorvar = "http://.*/.* file:///somepath/downloads/ \n" \
411 "git://someserver.org/bitbake git://git.openembedded.org/bitbake \n" \
412 "https://.*/.* file:///someotherpath/downloads/ \n" \
413 "http://.*/.* file:///someotherpath/downloads/ \n"
414
415 def test_urireplace(self):
416 for k, v in self.replaceuris.items():
417 ud = bb.fetch.FetchData(k[0], self.d)
418 ud.setup_localpath(self.d)
419 mirrors = bb.fetch2.mirror_from_string("%s %s" % (k[1], k[2]))
420 newuris, uds = bb.fetch2.build_mirroruris(ud, mirrors, self.d)
421 self.assertEqual([v], newuris)
422
423 def test_urilist1(self):
424 fetcher = bb.fetch.FetchData("http://downloads.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz", self.d)
425 mirrors = bb.fetch2.mirror_from_string(self.mirrorvar)
426 uris, uds = bb.fetch2.build_mirroruris(fetcher, mirrors, self.d)
427 self.assertEqual(uris, ['file:///somepath/downloads/bitbake-1.0.tar.gz', 'file:///someotherpath/downloads/bitbake-1.0.tar.gz'])
428
429 def test_urilist2(self):
430 # Catch https:// -> files:// bug
431 fetcher = bb.fetch.FetchData("https://downloads.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz", self.d)
432 mirrors = bb.fetch2.mirror_from_string(self.mirrorvar)
433 uris, uds = bb.fetch2.build_mirroruris(fetcher, mirrors, self.d)
434 self.assertEqual(uris, ['file:///someotherpath/downloads/bitbake-1.0.tar.gz'])
435
436 def test_mirror_of_mirror(self):
437 # Test if mirror of a mirror works
438 mirrorvar = self.mirrorvar + " http://.*/.* http://otherdownloads.yoctoproject.org/downloads/ \n"
439 mirrorvar = mirrorvar + " http://otherdownloads.yoctoproject.org/.* http://downloads2.yoctoproject.org/downloads/ \n"
440 fetcher = bb.fetch.FetchData("http://downloads.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz", self.d)
441 mirrors = bb.fetch2.mirror_from_string(mirrorvar)
442 uris, uds = bb.fetch2.build_mirroruris(fetcher, mirrors, self.d)
443 self.assertEqual(uris, ['file:///somepath/downloads/bitbake-1.0.tar.gz',
444 'file:///someotherpath/downloads/bitbake-1.0.tar.gz',
445 'http://otherdownloads.yoctoproject.org/downloads/bitbake-1.0.tar.gz',
446 'http://downloads2.yoctoproject.org/downloads/bitbake-1.0.tar.gz'])
447
Patrick Williamsd7e96312015-09-22 08:09:05 -0500448 recmirrorvar = "https://.*/[^/]* http://AAAA/A/A/A/ \n" \
449 "https://.*/[^/]* https://BBBB/B/B/B/ \n"
450
451 def test_recursive(self):
452 fetcher = bb.fetch.FetchData("https://downloads.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz", self.d)
453 mirrors = bb.fetch2.mirror_from_string(self.recmirrorvar)
454 uris, uds = bb.fetch2.build_mirroruris(fetcher, mirrors, self.d)
455 self.assertEqual(uris, ['http://AAAA/A/A/A/bitbake/bitbake-1.0.tar.gz',
456 'https://BBBB/B/B/B/bitbake/bitbake-1.0.tar.gz',
457 'http://AAAA/A/A/A/B/B/bitbake/bitbake-1.0.tar.gz'])
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500458
459class FetcherLocalTest(FetcherTest):
460 def setUp(self):
461 def touch(fn):
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600462 with open(fn, 'a'):
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500463 os.utime(fn, None)
464
465 super(FetcherLocalTest, self).setUp()
466 self.localsrcdir = os.path.join(self.tempdir, 'localsrc')
467 os.makedirs(self.localsrcdir)
468 touch(os.path.join(self.localsrcdir, 'a'))
469 touch(os.path.join(self.localsrcdir, 'b'))
470 os.makedirs(os.path.join(self.localsrcdir, 'dir'))
471 touch(os.path.join(self.localsrcdir, 'dir', 'c'))
472 touch(os.path.join(self.localsrcdir, 'dir', 'd'))
473 os.makedirs(os.path.join(self.localsrcdir, 'dir', 'subdir'))
474 touch(os.path.join(self.localsrcdir, 'dir', 'subdir', 'e'))
475 self.d.setVar("FILESPATH", self.localsrcdir)
476
477 def fetchUnpack(self, uris):
478 fetcher = bb.fetch.Fetch(uris, self.d)
479 fetcher.download()
480 fetcher.unpack(self.unpackdir)
481 flst = []
482 for root, dirs, files in os.walk(self.unpackdir):
483 for f in files:
484 flst.append(os.path.relpath(os.path.join(root, f), self.unpackdir))
485 flst.sort()
486 return flst
487
488 def test_local(self):
489 tree = self.fetchUnpack(['file://a', 'file://dir/c'])
490 self.assertEqual(tree, ['a', 'dir/c'])
491
492 def test_local_wildcard(self):
493 tree = self.fetchUnpack(['file://a', 'file://dir/*'])
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500494 self.assertEqual(tree, ['a', 'dir/c', 'dir/d', 'dir/subdir/e'])
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500495
496 def test_local_dir(self):
497 tree = self.fetchUnpack(['file://a', 'file://dir'])
498 self.assertEqual(tree, ['a', 'dir/c', 'dir/d', 'dir/subdir/e'])
499
500 def test_local_subdir(self):
501 tree = self.fetchUnpack(['file://dir/subdir'])
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500502 self.assertEqual(tree, ['dir/subdir/e'])
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500503
504 def test_local_subdir_file(self):
505 tree = self.fetchUnpack(['file://dir/subdir/e'])
506 self.assertEqual(tree, ['dir/subdir/e'])
507
508 def test_local_subdirparam(self):
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500509 tree = self.fetchUnpack(['file://a;subdir=bar', 'file://dir;subdir=foo/moo'])
510 self.assertEqual(tree, ['bar/a', 'foo/moo/dir/c', 'foo/moo/dir/d', 'foo/moo/dir/subdir/e'])
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500511
512 def test_local_deepsubdirparam(self):
513 tree = self.fetchUnpack(['file://dir/subdir/e;subdir=bar'])
514 self.assertEqual(tree, ['bar/dir/subdir/e'])
515
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600516 def test_local_absolutedir(self):
517 # Unpacking to an absolute path that is a subdirectory of the root
518 # should work
519 tree = self.fetchUnpack(['file://a;subdir=%s' % os.path.join(self.unpackdir, 'bar')])
520
521 # Unpacking to an absolute path outside of the root should fail
522 with self.assertRaises(bb.fetch2.UnpackError):
523 self.fetchUnpack(['file://a;subdir=/bin/sh'])
524
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500525class FetcherNetworkTest(FetcherTest):
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500526 @skipIfNoNetwork()
527 def test_fetch(self):
528 fetcher = bb.fetch.Fetch(["http://downloads.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz", "http://downloads.yoctoproject.org/releases/bitbake/bitbake-1.1.tar.gz"], self.d)
529 fetcher.download()
530 self.assertEqual(os.path.getsize(self.dldir + "/bitbake-1.0.tar.gz"), 57749)
531 self.assertEqual(os.path.getsize(self.dldir + "/bitbake-1.1.tar.gz"), 57892)
532 self.d.setVar("BB_NO_NETWORK", "1")
533 fetcher = bb.fetch.Fetch(["http://downloads.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz", "http://downloads.yoctoproject.org/releases/bitbake/bitbake-1.1.tar.gz"], self.d)
534 fetcher.download()
535 fetcher.unpack(self.unpackdir)
536 self.assertEqual(len(os.listdir(self.unpackdir + "/bitbake-1.0/")), 9)
537 self.assertEqual(len(os.listdir(self.unpackdir + "/bitbake-1.1/")), 9)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500538
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500539 @skipIfNoNetwork()
540 def test_fetch_mirror(self):
541 self.d.setVar("MIRRORS", "http://.*/.* http://downloads.yoctoproject.org/releases/bitbake")
542 fetcher = bb.fetch.Fetch(["http://invalid.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz"], self.d)
543 fetcher.download()
544 self.assertEqual(os.path.getsize(self.dldir + "/bitbake-1.0.tar.gz"), 57749)
545
546 @skipIfNoNetwork()
547 def test_fetch_mirror_of_mirror(self):
548 self.d.setVar("MIRRORS", "http://.*/.* http://invalid2.yoctoproject.org/ \n http://invalid2.yoctoproject.org/.* http://downloads.yoctoproject.org/releases/bitbake")
549 fetcher = bb.fetch.Fetch(["http://invalid.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz"], self.d)
550 fetcher.download()
551 self.assertEqual(os.path.getsize(self.dldir + "/bitbake-1.0.tar.gz"), 57749)
552
553 @skipIfNoNetwork()
554 def test_fetch_file_mirror_of_mirror(self):
555 self.d.setVar("MIRRORS", "http://.*/.* file:///some1where/ \n file:///some1where/.* file://some2where/ \n file://some2where/.* http://downloads.yoctoproject.org/releases/bitbake")
556 fetcher = bb.fetch.Fetch(["http://invalid.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz"], self.d)
557 os.mkdir(self.dldir + "/some2where")
558 fetcher.download()
559 self.assertEqual(os.path.getsize(self.dldir + "/bitbake-1.0.tar.gz"), 57749)
560
561 @skipIfNoNetwork()
562 def test_fetch_premirror(self):
563 self.d.setVar("PREMIRRORS", "http://.*/.* http://downloads.yoctoproject.org/releases/bitbake")
564 fetcher = bb.fetch.Fetch(["http://invalid.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz"], self.d)
565 fetcher.download()
566 self.assertEqual(os.path.getsize(self.dldir + "/bitbake-1.0.tar.gz"), 57749)
567
568 @skipIfNoNetwork()
569 def gitfetcher(self, url1, url2):
570 def checkrevision(self, fetcher):
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500571 fetcher.unpack(self.unpackdir)
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500572 revision = bb.process.run("git rev-parse HEAD", shell=True, cwd=self.unpackdir + "/git")[0].strip()
573 self.assertEqual(revision, "270a05b0b4ba0959fe0624d2a4885d7b70426da5")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500574
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500575 self.d.setVar("BB_GENERATE_MIRROR_TARBALLS", "1")
576 self.d.setVar("SRCREV", "270a05b0b4ba0959fe0624d2a4885d7b70426da5")
577 fetcher = bb.fetch.Fetch([url1], self.d)
578 fetcher.download()
579 checkrevision(self, fetcher)
580 # Wipe out the dldir clone and the unpacked source, turn off the network and check mirror tarball works
581 bb.utils.prunedir(self.dldir + "/git2/")
582 bb.utils.prunedir(self.unpackdir)
583 self.d.setVar("BB_NO_NETWORK", "1")
584 fetcher = bb.fetch.Fetch([url2], self.d)
585 fetcher.download()
586 checkrevision(self, fetcher)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500587
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500588 @skipIfNoNetwork()
589 def test_gitfetch(self):
590 url1 = url2 = "git://git.openembedded.org/bitbake"
591 self.gitfetcher(url1, url2)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500592
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500593 @skipIfNoNetwork()
594 def test_gitfetch_goodsrcrev(self):
595 # SRCREV is set but matches rev= parameter
596 url1 = url2 = "git://git.openembedded.org/bitbake;rev=270a05b0b4ba0959fe0624d2a4885d7b70426da5"
597 self.gitfetcher(url1, url2)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500598
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500599 @skipIfNoNetwork()
600 def test_gitfetch_badsrcrev(self):
601 # SRCREV is set but does not match rev= parameter
602 url1 = url2 = "git://git.openembedded.org/bitbake;rev=dead05b0b4ba0959fe0624d2a4885d7b70426da5"
603 self.assertRaises(bb.fetch.FetchError, self.gitfetcher, url1, url2)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500604
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500605 @skipIfNoNetwork()
606 def test_gitfetch_tagandrev(self):
607 # SRCREV is set but does not match rev= parameter
608 url1 = url2 = "git://git.openembedded.org/bitbake;rev=270a05b0b4ba0959fe0624d2a4885d7b70426da5;tag=270a05b0b4ba0959fe0624d2a4885d7b70426da5"
609 self.assertRaises(bb.fetch.FetchError, self.gitfetcher, url1, url2)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500610
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500611 @skipIfNoNetwork()
612 def test_gitfetch_localusehead(self):
613 # Create dummy local Git repo
614 src_dir = tempfile.mkdtemp(dir=self.tempdir,
615 prefix='gitfetch_localusehead_')
616 src_dir = os.path.abspath(src_dir)
617 bb.process.run("git init", cwd=src_dir)
618 bb.process.run("git commit --allow-empty -m'Dummy commit'",
619 cwd=src_dir)
620 # Use other branch than master
621 bb.process.run("git checkout -b my-devel", cwd=src_dir)
622 bb.process.run("git commit --allow-empty -m'Dummy commit 2'",
623 cwd=src_dir)
624 stdout = bb.process.run("git rev-parse HEAD", cwd=src_dir)
625 orig_rev = stdout[0].strip()
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500626
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500627 # Fetch and check revision
628 self.d.setVar("SRCREV", "AUTOINC")
629 url = "git://" + src_dir + ";protocol=file;usehead=1"
630 fetcher = bb.fetch.Fetch([url], self.d)
631 fetcher.download()
632 fetcher.unpack(self.unpackdir)
633 stdout = bb.process.run("git rev-parse HEAD",
634 cwd=os.path.join(self.unpackdir, 'git'))
635 unpack_rev = stdout[0].strip()
636 self.assertEqual(orig_rev, unpack_rev)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500637
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500638 @skipIfNoNetwork()
639 def test_gitfetch_remoteusehead(self):
640 url = "git://git.openembedded.org/bitbake;usehead=1"
641 self.assertRaises(bb.fetch.ParameterError, self.gitfetcher, url, url)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500642
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500643 @skipIfNoNetwork()
644 def test_gitfetch_premirror(self):
645 url1 = "git://git.openembedded.org/bitbake"
646 url2 = "git://someserver.org/bitbake"
647 self.d.setVar("PREMIRRORS", "git://someserver.org/bitbake git://git.openembedded.org/bitbake \n")
648 self.gitfetcher(url1, url2)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500649
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500650 @skipIfNoNetwork()
651 def test_gitfetch_premirror2(self):
652 url1 = url2 = "git://someserver.org/bitbake"
653 self.d.setVar("PREMIRRORS", "git://someserver.org/bitbake git://git.openembedded.org/bitbake \n")
654 self.gitfetcher(url1, url2)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500655
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500656 @skipIfNoNetwork()
657 def test_gitfetch_premirror3(self):
658 realurl = "git://git.openembedded.org/bitbake"
659 dummyurl = "git://someserver.org/bitbake"
660 self.sourcedir = self.unpackdir.replace("unpacked", "sourcemirror.git")
661 os.chdir(self.tempdir)
662 bb.process.run("git clone %s %s 2> /dev/null" % (realurl, self.sourcedir), shell=True)
663 self.d.setVar("PREMIRRORS", "%s git://%s;protocol=file \n" % (dummyurl, self.sourcedir))
664 self.gitfetcher(dummyurl, dummyurl)
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600665
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500666 @skipIfNoNetwork()
667 def test_git_submodule(self):
668 fetcher = bb.fetch.Fetch(["gitsm://git.yoctoproject.org/git-submodule-test;rev=f12e57f2edf0aa534cf1616fa983d165a92b0842"], self.d)
669 fetcher.download()
670 # Previous cwd has been deleted
671 os.chdir(os.path.dirname(self.unpackdir))
672 fetcher.unpack(self.unpackdir)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500673
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500674
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500675class TrustedNetworksTest(FetcherTest):
676 def test_trusted_network(self):
677 # Ensure trusted_network returns False when the host IS in the list.
678 url = "git://Someserver.org/foo;rev=1"
679 self.d.setVar("BB_ALLOWED_NETWORKS", "server1.org someserver.org server2.org server3.org")
680 self.assertTrue(bb.fetch.trusted_network(self.d, url))
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500681
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500682 def test_wild_trusted_network(self):
683 # Ensure trusted_network returns true when the *.host IS in the list.
684 url = "git://Someserver.org/foo;rev=1"
685 self.d.setVar("BB_ALLOWED_NETWORKS", "server1.org *.someserver.org server2.org server3.org")
686 self.assertTrue(bb.fetch.trusted_network(self.d, url))
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500687
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500688 def test_prefix_wild_trusted_network(self):
689 # Ensure trusted_network returns true when the prefix matches *.host.
690 url = "git://git.Someserver.org/foo;rev=1"
691 self.d.setVar("BB_ALLOWED_NETWORKS", "server1.org *.someserver.org server2.org server3.org")
692 self.assertTrue(bb.fetch.trusted_network(self.d, url))
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500693
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500694 def test_two_prefix_wild_trusted_network(self):
695 # Ensure trusted_network returns true when the prefix matches *.host.
696 url = "git://something.git.Someserver.org/foo;rev=1"
697 self.d.setVar("BB_ALLOWED_NETWORKS", "server1.org *.someserver.org server2.org server3.org")
698 self.assertTrue(bb.fetch.trusted_network(self.d, url))
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500699
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500700 def test_port_trusted_network(self):
701 # Ensure trusted_network returns True, even if the url specifies a port.
702 url = "git://someserver.org:8080/foo;rev=1"
703 self.d.setVar("BB_ALLOWED_NETWORKS", "someserver.org")
704 self.assertTrue(bb.fetch.trusted_network(self.d, url))
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500705
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500706 def test_untrusted_network(self):
707 # Ensure trusted_network returns False when the host is NOT in the list.
708 url = "git://someserver.org/foo;rev=1"
709 self.d.setVar("BB_ALLOWED_NETWORKS", "server1.org server2.org server3.org")
710 self.assertFalse(bb.fetch.trusted_network(self.d, url))
711
712 def test_wild_untrusted_network(self):
713 # Ensure trusted_network returns False when the host is NOT in the list.
714 url = "git://*.someserver.org/foo;rev=1"
715 self.d.setVar("BB_ALLOWED_NETWORKS", "server1.org server2.org server3.org")
716 self.assertFalse(bb.fetch.trusted_network(self.d, url))
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500717
718class URLHandle(unittest.TestCase):
719
720 datatable = {
721 "http://www.google.com/index.html" : ('http', 'www.google.com', '/index.html', '', '', {}),
722 "cvs://anoncvs@cvs.handhelds.org/cvs;module=familiar/dist/ipkg" : ('cvs', 'cvs.handhelds.org', '/cvs', 'anoncvs', '', {'module': 'familiar/dist/ipkg'}),
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600723 "cvs://anoncvs:anonymous@cvs.handhelds.org/cvs;tag=V0-99-81;module=familiar/dist/ipkg" : ('cvs', 'cvs.handhelds.org', '/cvs', 'anoncvs', 'anonymous', collections.OrderedDict([('tag', 'V0-99-81'), ('module', 'familiar/dist/ipkg')])),
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500724 "git://git.openembedded.org/bitbake;branch=@foo" : ('git', 'git.openembedded.org', '/bitbake', '', '', {'branch': '@foo'}),
725 "file://somelocation;someparam=1": ('file', '', 'somelocation', '', '', {'someparam': '1'}),
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500726 }
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500727 # we require a pathname to encodeurl but users can still pass such urls to
728 # decodeurl and we need to handle them
729 decodedata = datatable.copy()
730 decodedata.update({
731 "http://somesite.net;someparam=1": ('http', 'somesite.net', '', '', '', {'someparam': '1'}),
732 })
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500733
734 def test_decodeurl(self):
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500735 for k, v in self.decodedata.items():
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500736 result = bb.fetch.decodeurl(k)
737 self.assertEqual(result, v)
738
739 def test_encodeurl(self):
740 for k, v in self.datatable.items():
741 result = bb.fetch.encodeurl(v)
742 self.assertEqual(result, k)
743
744class FetchLatestVersionTest(FetcherTest):
745
746 test_git_uris = {
747 # version pattern "X.Y.Z"
748 ("mx-1.0", "git://github.com/clutter-project/mx.git;branch=mx-1.4", "9b1db6b8060bd00b121a692f942404a24ae2960f", "")
749 : "1.99.4",
750 # version pattern "vX.Y"
751 ("mtd-utils", "git://git.infradead.org/mtd-utils.git", "ca39eb1d98e736109c64ff9c1aa2a6ecca222d8f", "")
752 : "1.5.0",
753 # version pattern "pkg_name-X.Y"
754 ("presentproto", "git://anongit.freedesktop.org/git/xorg/proto/presentproto", "24f3a56e541b0a9e6c6ee76081f441221a120ef9", "")
755 : "1.0",
756 # version pattern "pkg_name-vX.Y.Z"
757 ("dtc", "git://git.qemu.org/dtc.git", "65cc4d2748a2c2e6f27f1cf39e07a5dbabd80ebf", "")
758 : "1.4.0",
759 # combination version pattern
760 ("sysprof", "git://git.gnome.org/sysprof", "cd44ee6644c3641507fb53b8a2a69137f2971219", "")
761 : "1.2.0",
762 ("u-boot-mkimage", "git://git.denx.de/u-boot.git;branch=master;protocol=git", "62c175fbb8a0f9a926c88294ea9f7e88eb898f6c", "")
763 : "2014.01",
764 # version pattern "yyyymmdd"
765 ("mobile-broadband-provider-info", "git://git.gnome.org/mobile-broadband-provider-info", "4ed19e11c2975105b71b956440acdb25d46a347d", "")
766 : "20120614",
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500767 # packages with a valid UPSTREAM_CHECK_GITTAGREGEX
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500768 ("xf86-video-omap", "git://anongit.freedesktop.org/xorg/driver/xf86-video-omap", "ae0394e687f1a77e966cf72f895da91840dffb8f", "(?P<pver>(\d+\.(\d\.?)*))")
769 : "0.4.3",
770 ("build-appliance-image", "git://git.yoctoproject.org/poky", "b37dd451a52622d5b570183a81583cc34c2ff555", "(?P<pver>(([0-9][\.|_]?)+[0-9]))")
771 : "11.0.0",
772 ("chkconfig-alternatives-native", "git://github.com/kergoth/chkconfig;branch=sysroot", "cd437ecbd8986c894442f8fce1e0061e20f04dee", "chkconfig\-(?P<pver>((\d+[\.\-_]*)+))")
773 : "1.3.59",
774 ("remake", "git://github.com/rocky/remake.git", "f05508e521987c8494c92d9c2871aec46307d51d", "(?P<pver>(\d+\.(\d+\.)*\d*(\+dbg\d+(\.\d+)*)*))")
775 : "3.82+dbg0.9",
776 }
777
778 test_wget_uris = {
779 # packages with versions inside directory name
780 ("util-linux", "http://kernel.org/pub/linux/utils/util-linux/v2.23/util-linux-2.24.2.tar.bz2", "", "")
781 : "2.24.2",
782 ("enchant", "http://www.abisource.com/downloads/enchant/1.6.0/enchant-1.6.0.tar.gz", "", "")
783 : "1.6.0",
784 ("cmake", "http://www.cmake.org/files/v2.8/cmake-2.8.12.1.tar.gz", "", "")
785 : "2.8.12.1",
786 # packages with versions only in current directory
787 ("eglic", "http://downloads.yoctoproject.org/releases/eglibc/eglibc-2.18-svnr23787.tar.bz2", "", "")
788 : "2.19",
789 ("gnu-config", "http://downloads.yoctoproject.org/releases/gnu-config/gnu-config-20120814.tar.bz2", "", "")
790 : "20120814",
791 # packages with "99" in the name of possible version
792 ("pulseaudio", "http://freedesktop.org/software/pulseaudio/releases/pulseaudio-4.0.tar.xz", "", "")
793 : "5.0",
794 ("xserver-xorg", "http://xorg.freedesktop.org/releases/individual/xserver/xorg-server-1.15.1.tar.bz2", "", "")
795 : "1.15.1",
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500796 # packages with valid UPSTREAM_CHECK_URI and UPSTREAM_CHECK_REGEX
797 ("cups", "http://www.cups.org/software/1.7.2/cups-1.7.2-source.tar.bz2", "https://github.com/apple/cups/releases", "(?P<name>cups\-)(?P<pver>((\d+[\.\-_]*)+))\-source\.tar\.gz")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500798 : "2.0.0",
799 ("db", "http://download.oracle.com/berkeley-db/db-5.3.21.tar.gz", "http://www.oracle.com/technetwork/products/berkeleydb/downloads/index-082944.html", "http://download.oracle.com/otn/berkeley-db/(?P<name>db-)(?P<pver>((\d+[\.\-_]*)+))\.tar\.gz")
800 : "6.1.19",
801 }
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500802
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500803 @skipIfNoNetwork()
804 def test_git_latest_versionstring(self):
805 for k, v in self.test_git_uris.items():
806 self.d.setVar("PN", k[0])
807 self.d.setVar("SRCREV", k[2])
808 self.d.setVar("UPSTREAM_CHECK_GITTAGREGEX", k[3])
809 ud = bb.fetch2.FetchData(k[1], self.d)
810 pupver= ud.method.latest_versionstring(ud, self.d)
811 verstring = pupver[0]
812 self.assertTrue(verstring, msg="Could not find upstream version")
813 r = bb.utils.vercmp_string(v, verstring)
814 self.assertTrue(r == -1 or r == 0, msg="Package %s, version: %s <= %s" % (k[0], v, verstring))
815
816 @skipIfNoNetwork()
817 def test_wget_latest_versionstring(self):
818 for k, v in self.test_wget_uris.items():
819 self.d.setVar("PN", k[0])
820 self.d.setVar("UPSTREAM_CHECK_URI", k[2])
821 self.d.setVar("UPSTREAM_CHECK_REGEX", k[3])
822 ud = bb.fetch2.FetchData(k[1], self.d)
823 pupver = ud.method.latest_versionstring(ud, self.d)
824 verstring = pupver[0]
825 self.assertTrue(verstring, msg="Could not find upstream version")
826 r = bb.utils.vercmp_string(v, verstring)
827 self.assertTrue(r == -1 or r == 0, msg="Package %s, version: %s <= %s" % (k[0], v, verstring))
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500828
829
830class FetchCheckStatusTest(FetcherTest):
831 test_wget_uris = ["http://www.cups.org/software/1.7.2/cups-1.7.2-source.tar.bz2",
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500832 "http://www.cups.org/",
833 "http://downloads.yoctoproject.org/releases/sato/sato-engine-0.1.tar.gz",
834 "http://downloads.yoctoproject.org/releases/sato/sato-engine-0.2.tar.gz",
835 "http://downloads.yoctoproject.org/releases/sato/sato-engine-0.3.tar.gz",
836 "https://yoctoproject.org/",
837 "https://yoctoproject.org/documentation",
838 "http://downloads.yoctoproject.org/releases/opkg/opkg-0.1.7.tar.gz",
839 "http://downloads.yoctoproject.org/releases/opkg/opkg-0.3.0.tar.gz",
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500840 "ftp://sourceware.org/pub/libffi/libffi-1.20.tar.gz",
841 "http://ftp.gnu.org/gnu/autoconf/autoconf-2.60.tar.gz",
842 "https://ftp.gnu.org/gnu/chess/gnuchess-5.08.tar.gz",
843 "https://ftp.gnu.org/gnu/gmp/gmp-4.0.tar.gz",
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500844 # GitHub releases are hosted on Amazon S3, which doesn't support HEAD
845 "https://github.com/kergoth/tslib/releases/download/1.1/tslib-1.1.tar.xz"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500846 ]
847
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500848 @skipIfNoNetwork()
849 def test_wget_checkstatus(self):
850 fetch = bb.fetch2.Fetch(self.test_wget_uris, self.d)
851 for u in self.test_wget_uris:
852 with self.subTest(url=u):
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500853 ud = fetch.ud[u]
854 m = ud.method
855 ret = m.checkstatus(fetch, ud, self.d)
856 self.assertTrue(ret, msg="URI %s, can't check status" % (u))
857
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500858 @skipIfNoNetwork()
859 def test_wget_checkstatus_connection_cache(self):
860 from bb.fetch2 import FetchConnectionCache
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500861
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500862 connection_cache = FetchConnectionCache()
863 fetch = bb.fetch2.Fetch(self.test_wget_uris, self.d,
864 connection_cache = connection_cache)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500865
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500866 for u in self.test_wget_uris:
867 with self.subTest(url=u):
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500868 ud = fetch.ud[u]
869 m = ud.method
870 ret = m.checkstatus(fetch, ud, self.d)
871 self.assertTrue(ret, msg="URI %s, can't check status" % (u))
872
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500873 connection_cache.close_connections()
874
875
876class GitMakeShallowTest(FetcherTest):
877 bitbake_dir = os.path.join(os.path.dirname(os.path.join(__file__)), '..', '..', '..')
878 make_shallow_path = os.path.join(bitbake_dir, 'bin', 'git-make-shallow')
879
880 def setUp(self):
881 FetcherTest.setUp(self)
882 self.gitdir = os.path.join(self.tempdir, 'gitshallow')
883 bb.utils.mkdirhier(self.gitdir)
884 bb.process.run('git init', cwd=self.gitdir)
885
886 def assertRefs(self, expected_refs):
887 actual_refs = self.git(['for-each-ref', '--format=%(refname)']).splitlines()
888 full_expected = self.git(['rev-parse', '--symbolic-full-name'] + expected_refs).splitlines()
889 self.assertEqual(sorted(full_expected), sorted(actual_refs))
890
891 def assertRevCount(self, expected_count, args=None):
892 if args is None:
893 args = ['HEAD']
894 revs = self.git(['rev-list'] + args)
895 actual_count = len(revs.splitlines())
896 self.assertEqual(expected_count, actual_count, msg='Object count `%d` is not the expected `%d`' % (actual_count, expected_count))
897
898 def git(self, cmd):
899 if isinstance(cmd, str):
900 cmd = 'git ' + cmd
901 else:
902 cmd = ['git'] + cmd
903 return bb.process.run(cmd, cwd=self.gitdir)[0]
904
905 def make_shallow(self, args=None):
906 if args is None:
907 args = ['HEAD']
908 return bb.process.run([self.make_shallow_path] + args, cwd=self.gitdir)
909
910 def add_empty_file(self, path, msg=None):
911 if msg is None:
912 msg = path
913 open(os.path.join(self.gitdir, path), 'w').close()
914 self.git(['add', path])
915 self.git(['commit', '-m', msg, path])
916
917 def test_make_shallow_single_branch_no_merge(self):
918 self.add_empty_file('a')
919 self.add_empty_file('b')
920 self.assertRevCount(2)
921 self.make_shallow()
922 self.assertRevCount(1)
923
924 def test_make_shallow_single_branch_one_merge(self):
925 self.add_empty_file('a')
926 self.add_empty_file('b')
927 self.git('checkout -b a_branch')
928 self.add_empty_file('c')
929 self.git('checkout master')
930 self.add_empty_file('d')
931 self.git('merge --no-ff --no-edit a_branch')
932 self.git('branch -d a_branch')
933 self.add_empty_file('e')
934 self.assertRevCount(6)
935 self.make_shallow(['HEAD~2'])
936 self.assertRevCount(5)
937
938 def test_make_shallow_at_merge(self):
939 self.add_empty_file('a')
940 self.git('checkout -b a_branch')
941 self.add_empty_file('b')
942 self.git('checkout master')
943 self.git('merge --no-ff --no-edit a_branch')
944 self.git('branch -d a_branch')
945 self.assertRevCount(3)
946 self.make_shallow()
947 self.assertRevCount(1)
948
949 def test_make_shallow_annotated_tag(self):
950 self.add_empty_file('a')
951 self.add_empty_file('b')
952 self.git('tag -a -m a_tag a_tag')
953 self.assertRevCount(2)
954 self.make_shallow(['a_tag'])
955 self.assertRevCount(1)
956
957 def test_make_shallow_multi_ref(self):
958 self.add_empty_file('a')
959 self.add_empty_file('b')
960 self.git('checkout -b a_branch')
961 self.add_empty_file('c')
962 self.git('checkout master')
963 self.add_empty_file('d')
964 self.git('checkout -b a_branch_2')
965 self.add_empty_file('a_tag')
966 self.git('tag a_tag')
967 self.git('checkout master')
968 self.git('branch -D a_branch_2')
969 self.add_empty_file('e')
970 self.assertRevCount(6, ['--all'])
971 self.make_shallow()
972 self.assertRevCount(5, ['--all'])
973
974 def test_make_shallow_multi_ref_trim(self):
975 self.add_empty_file('a')
976 self.git('checkout -b a_branch')
977 self.add_empty_file('c')
978 self.git('checkout master')
979 self.assertRevCount(1)
980 self.assertRevCount(2, ['--all'])
981 self.assertRefs(['master', 'a_branch'])
982 self.make_shallow(['-r', 'master', 'HEAD'])
983 self.assertRevCount(1, ['--all'])
984 self.assertRefs(['master'])
985
986 def test_make_shallow_noop(self):
987 self.add_empty_file('a')
988 self.assertRevCount(1)
989 self.make_shallow()
990 self.assertRevCount(1)
991
992 @skipIfNoNetwork()
993 def test_make_shallow_bitbake(self):
994 self.git('remote add origin https://github.com/openembedded/bitbake')
995 self.git('fetch --tags origin')
996 orig_revs = len(self.git('rev-list --all').splitlines())
997 self.make_shallow(['refs/tags/1.10.0'])
998 self.assertRevCount(orig_revs - 1746, ['--all'])
999
1000class GitShallowTest(FetcherTest):
1001 def setUp(self):
1002 FetcherTest.setUp(self)
1003 self.gitdir = os.path.join(self.tempdir, 'git')
1004 self.srcdir = os.path.join(self.tempdir, 'gitsource')
1005
1006 bb.utils.mkdirhier(self.srcdir)
1007 self.git('init', cwd=self.srcdir)
1008 self.d.setVar('WORKDIR', self.tempdir)
1009 self.d.setVar('S', self.gitdir)
1010 self.d.delVar('PREMIRRORS')
1011 self.d.delVar('MIRRORS')
1012
1013 uri = 'git://%s;protocol=file;subdir=${S}' % self.srcdir
1014 self.d.setVar('SRC_URI', uri)
1015 self.d.setVar('SRCREV', '${AUTOREV}')
1016 self.d.setVar('AUTOREV', '${@bb.fetch2.get_autorev(d)}')
1017
1018 self.d.setVar('BB_GIT_SHALLOW', '1')
1019 self.d.setVar('BB_GENERATE_MIRROR_TARBALLS', '0')
1020 self.d.setVar('BB_GENERATE_SHALLOW_TARBALLS', '1')
1021
1022 def assertRefs(self, expected_refs, cwd=None):
1023 if cwd is None:
1024 cwd = self.gitdir
1025 actual_refs = self.git(['for-each-ref', '--format=%(refname)'], cwd=cwd).splitlines()
1026 full_expected = self.git(['rev-parse', '--symbolic-full-name'] + expected_refs, cwd=cwd).splitlines()
1027 self.assertEqual(sorted(set(full_expected)), sorted(set(actual_refs)))
1028
1029 def assertRevCount(self, expected_count, args=None, cwd=None):
1030 if args is None:
1031 args = ['HEAD']
1032 if cwd is None:
1033 cwd = self.gitdir
1034 revs = self.git(['rev-list'] + args, cwd=cwd)
1035 actual_count = len(revs.splitlines())
1036 self.assertEqual(expected_count, actual_count, msg='Object count `%d` is not the expected `%d`' % (actual_count, expected_count))
1037
1038 def git(self, cmd, cwd=None):
1039 if isinstance(cmd, str):
1040 cmd = 'git ' + cmd
1041 else:
1042 cmd = ['git'] + cmd
1043 if cwd is None:
1044 cwd = self.gitdir
1045 return bb.process.run(cmd, cwd=cwd)[0]
1046
1047 def add_empty_file(self, path, cwd=None, msg=None):
1048 if msg is None:
1049 msg = path
1050 if cwd is None:
1051 cwd = self.srcdir
1052 open(os.path.join(cwd, path), 'w').close()
1053 self.git(['add', path], cwd)
1054 self.git(['commit', '-m', msg, path], cwd)
1055
1056 def fetch(self, uri=None):
1057 if uri is None:
1058 uris = self.d.getVar('SRC_URI', True).split()
1059 uri = uris[0]
1060 d = self.d
1061 else:
1062 d = self.d.createCopy()
1063 d.setVar('SRC_URI', uri)
1064 uri = d.expand(uri)
1065 uris = [uri]
1066
1067 fetcher = bb.fetch2.Fetch(uris, d)
1068 fetcher.download()
1069 ud = fetcher.ud[uri]
1070 return fetcher, ud
1071
1072 def fetch_and_unpack(self, uri=None):
1073 fetcher, ud = self.fetch(uri)
1074 fetcher.unpack(self.d.getVar('WORKDIR'))
1075 assert os.path.exists(self.d.getVar('S'))
1076 return fetcher, ud
1077
1078 def fetch_shallow(self, uri=None, disabled=False, keepclone=False):
1079 """Fetch a uri, generating a shallow tarball, then unpack using it"""
1080 fetcher, ud = self.fetch_and_unpack(uri)
1081 assert os.path.exists(ud.clonedir), 'Git clone in DLDIR (%s) does not exist for uri %s' % (ud.clonedir, uri)
1082
1083 # Confirm that the unpacked repo is unshallow
1084 if not disabled:
1085 assert os.path.exists(os.path.join(self.dldir, ud.mirrortarballs[0]))
1086
1087 # fetch and unpack, from the shallow tarball
1088 bb.utils.remove(self.gitdir, recurse=True)
1089 bb.utils.remove(ud.clonedir, recurse=True)
1090
1091 # confirm that the unpacked repo is used when no git clone or git
1092 # mirror tarball is available
1093 fetcher, ud = self.fetch_and_unpack(uri)
1094 if not disabled:
1095 assert os.path.exists(os.path.join(self.gitdir, '.git', 'shallow')), 'Unpacked git repository at %s is not shallow' % self.gitdir
1096 else:
1097 assert not os.path.exists(os.path.join(self.gitdir, '.git', 'shallow')), 'Unpacked git repository at %s is shallow' % self.gitdir
1098 return fetcher, ud
1099
1100 def test_shallow_disabled(self):
1101 self.add_empty_file('a')
1102 self.add_empty_file('b')
1103 self.assertRevCount(2, cwd=self.srcdir)
1104
1105 self.d.setVar('BB_GIT_SHALLOW', '0')
1106 self.fetch_shallow(disabled=True)
1107 self.assertRevCount(2)
1108
1109 def test_shallow_nobranch(self):
1110 self.add_empty_file('a')
1111 self.add_empty_file('b')
1112 self.assertRevCount(2, cwd=self.srcdir)
1113
1114 srcrev = self.git('rev-parse HEAD', cwd=self.srcdir).strip()
1115 self.d.setVar('SRCREV', srcrev)
1116 uri = self.d.getVar('SRC_URI', True).split()[0]
1117 uri = '%s;nobranch=1;bare=1' % uri
1118
1119 self.fetch_shallow(uri)
1120 self.assertRevCount(1)
1121
1122 # shallow refs are used to ensure the srcrev sticks around when we
1123 # have no other branches referencing it
1124 self.assertRefs(['refs/shallow/default'])
1125
1126 def test_shallow_default_depth_1(self):
1127 # Create initial git repo
1128 self.add_empty_file('a')
1129 self.add_empty_file('b')
1130 self.assertRevCount(2, cwd=self.srcdir)
1131
1132 self.fetch_shallow()
1133 self.assertRevCount(1)
1134
1135 def test_shallow_depth_0_disables(self):
1136 self.add_empty_file('a')
1137 self.add_empty_file('b')
1138 self.assertRevCount(2, cwd=self.srcdir)
1139
1140 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
1141 self.fetch_shallow(disabled=True)
1142 self.assertRevCount(2)
1143
1144 def test_shallow_depth_default_override(self):
1145 self.add_empty_file('a')
1146 self.add_empty_file('b')
1147 self.assertRevCount(2, cwd=self.srcdir)
1148
1149 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '2')
1150 self.d.setVar('BB_GIT_SHALLOW_DEPTH_default', '1')
1151 self.fetch_shallow()
1152 self.assertRevCount(1)
1153
1154 def test_shallow_depth_default_override_disable(self):
1155 self.add_empty_file('a')
1156 self.add_empty_file('b')
1157 self.add_empty_file('c')
1158 self.assertRevCount(3, cwd=self.srcdir)
1159
1160 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
1161 self.d.setVar('BB_GIT_SHALLOW_DEPTH_default', '2')
1162 self.fetch_shallow()
1163 self.assertRevCount(2)
1164
1165 def test_current_shallow_out_of_date_clone(self):
1166 # Create initial git repo
1167 self.add_empty_file('a')
1168 self.add_empty_file('b')
1169 self.add_empty_file('c')
1170 self.assertRevCount(3, cwd=self.srcdir)
1171
1172 # Clone and generate mirror tarball
1173 fetcher, ud = self.fetch()
1174
1175 # Ensure we have a current mirror tarball, but an out of date clone
1176 self.git('update-ref refs/heads/master refs/heads/master~1', cwd=ud.clonedir)
1177 self.assertRevCount(2, cwd=ud.clonedir)
1178
1179 # Fetch and unpack, from the current tarball, not the out of date clone
1180 bb.utils.remove(self.gitdir, recurse=True)
1181 fetcher, ud = self.fetch()
1182 fetcher.unpack(self.d.getVar('WORKDIR'))
1183 self.assertRevCount(1)
1184
1185 def test_shallow_single_branch_no_merge(self):
1186 self.add_empty_file('a')
1187 self.add_empty_file('b')
1188 self.assertRevCount(2, cwd=self.srcdir)
1189
1190 self.fetch_shallow()
1191 self.assertRevCount(1)
1192 assert os.path.exists(os.path.join(self.gitdir, 'a'))
1193 assert os.path.exists(os.path.join(self.gitdir, 'b'))
1194
1195 def test_shallow_no_dangling(self):
1196 self.add_empty_file('a')
1197 self.add_empty_file('b')
1198 self.assertRevCount(2, cwd=self.srcdir)
1199
1200 self.fetch_shallow()
1201 self.assertRevCount(1)
1202 assert not self.git('fsck --dangling')
1203
1204 def test_shallow_srcrev_branch_truncation(self):
1205 self.add_empty_file('a')
1206 self.add_empty_file('b')
1207 b_commit = self.git('rev-parse HEAD', cwd=self.srcdir).rstrip()
1208 self.add_empty_file('c')
1209 self.assertRevCount(3, cwd=self.srcdir)
1210
1211 self.d.setVar('SRCREV', b_commit)
1212 self.fetch_shallow()
1213
1214 # The 'c' commit was removed entirely, and 'a' was removed from history
1215 self.assertRevCount(1, ['--all'])
1216 self.assertEqual(self.git('rev-parse HEAD').strip(), b_commit)
1217 assert os.path.exists(os.path.join(self.gitdir, 'a'))
1218 assert os.path.exists(os.path.join(self.gitdir, 'b'))
1219 assert not os.path.exists(os.path.join(self.gitdir, 'c'))
1220
1221 def test_shallow_ref_pruning(self):
1222 self.add_empty_file('a')
1223 self.add_empty_file('b')
1224 self.git('branch a_branch', cwd=self.srcdir)
1225 self.assertRefs(['master', 'a_branch'], cwd=self.srcdir)
1226 self.assertRevCount(2, cwd=self.srcdir)
1227
1228 self.fetch_shallow()
1229
1230 self.assertRefs(['master', 'origin/master'])
1231 self.assertRevCount(1)
1232
1233 def test_shallow_submodules(self):
1234 self.add_empty_file('a')
1235 self.add_empty_file('b')
1236
1237 smdir = os.path.join(self.tempdir, 'gitsubmodule')
1238 bb.utils.mkdirhier(smdir)
1239 self.git('init', cwd=smdir)
1240 self.add_empty_file('asub', cwd=smdir)
1241
1242 self.git('submodule init', cwd=self.srcdir)
1243 self.git('submodule add file://%s' % smdir, cwd=self.srcdir)
1244 self.git('submodule update', cwd=self.srcdir)
1245 self.git('commit -m submodule -a', cwd=self.srcdir)
1246
1247 uri = 'gitsm://%s;protocol=file;subdir=${S}' % self.srcdir
1248 fetcher, ud = self.fetch_shallow(uri)
1249
1250 self.assertRevCount(1)
1251 assert './.git/modules/' in bb.process.run('tar -tzf %s' % os.path.join(self.dldir, ud.mirrortarballs[0]))[0]
1252 assert os.listdir(os.path.join(self.gitdir, 'gitsubmodule'))
1253
1254 if any(os.path.exists(os.path.join(p, 'git-annex')) for p in os.environ.get('PATH').split(':')):
1255 def test_shallow_annex(self):
1256 self.add_empty_file('a')
1257 self.add_empty_file('b')
1258 self.git('annex init', cwd=self.srcdir)
1259 open(os.path.join(self.srcdir, 'c'), 'w').close()
1260 self.git('annex add c', cwd=self.srcdir)
1261 self.git('commit -m annex-c -a', cwd=self.srcdir)
1262 bb.process.run('chmod u+w -R %s' % os.path.join(self.srcdir, '.git', 'annex'))
1263
1264 uri = 'gitannex://%s;protocol=file;subdir=${S}' % self.srcdir
1265 fetcher, ud = self.fetch_shallow(uri)
1266
1267 self.assertRevCount(1)
1268 assert './.git/annex/' in bb.process.run('tar -tzf %s' % os.path.join(self.dldir, ud.mirrortarballs[0]))[0]
1269 assert os.path.exists(os.path.join(self.gitdir, 'c'))
1270
1271 def test_shallow_multi_one_uri(self):
1272 # Create initial git repo
1273 self.add_empty_file('a')
1274 self.add_empty_file('b')
1275 self.git('checkout -b a_branch', cwd=self.srcdir)
1276 self.add_empty_file('c')
1277 self.add_empty_file('d')
1278 self.git('checkout master', cwd=self.srcdir)
1279 self.git('tag v0.0 a_branch', cwd=self.srcdir)
1280 self.add_empty_file('e')
1281 self.git('merge --no-ff --no-edit a_branch', cwd=self.srcdir)
1282 self.add_empty_file('f')
1283 self.assertRevCount(7, cwd=self.srcdir)
1284
1285 uri = self.d.getVar('SRC_URI', True).split()[0]
1286 uri = '%s;branch=master,a_branch;name=master,a_branch' % uri
1287
1288 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
1289 self.d.setVar('BB_GIT_SHALLOW_REVS', 'v0.0')
1290 self.d.setVar('SRCREV_master', '${AUTOREV}')
1291 self.d.setVar('SRCREV_a_branch', '${AUTOREV}')
1292
1293 self.fetch_shallow(uri)
1294
1295 self.assertRevCount(5)
1296 self.assertRefs(['master', 'origin/master', 'origin/a_branch'])
1297
1298 def test_shallow_multi_one_uri_depths(self):
1299 # Create initial git repo
1300 self.add_empty_file('a')
1301 self.add_empty_file('b')
1302 self.git('checkout -b a_branch', cwd=self.srcdir)
1303 self.add_empty_file('c')
1304 self.add_empty_file('d')
1305 self.git('checkout master', cwd=self.srcdir)
1306 self.add_empty_file('e')
1307 self.git('merge --no-ff --no-edit a_branch', cwd=self.srcdir)
1308 self.add_empty_file('f')
1309 self.assertRevCount(7, cwd=self.srcdir)
1310
1311 uri = self.d.getVar('SRC_URI', True).split()[0]
1312 uri = '%s;branch=master,a_branch;name=master,a_branch' % uri
1313
1314 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
1315 self.d.setVar('BB_GIT_SHALLOW_DEPTH_master', '3')
1316 self.d.setVar('BB_GIT_SHALLOW_DEPTH_a_branch', '1')
1317 self.d.setVar('SRCREV_master', '${AUTOREV}')
1318 self.d.setVar('SRCREV_a_branch', '${AUTOREV}')
1319
1320 self.fetch_shallow(uri)
1321
1322 self.assertRevCount(4, ['--all'])
1323 self.assertRefs(['master', 'origin/master', 'origin/a_branch'])
1324
1325 def test_shallow_clone_preferred_over_shallow(self):
1326 self.add_empty_file('a')
1327 self.add_empty_file('b')
1328
1329 # Fetch once to generate the shallow tarball
1330 fetcher, ud = self.fetch()
1331 assert os.path.exists(os.path.join(self.dldir, ud.mirrortarballs[0]))
1332
1333 # Fetch and unpack with both the clonedir and shallow tarball available
1334 bb.utils.remove(self.gitdir, recurse=True)
1335 fetcher, ud = self.fetch_and_unpack()
1336
1337 # The unpacked tree should *not* be shallow
1338 self.assertRevCount(2)
1339 assert not os.path.exists(os.path.join(self.gitdir, '.git', 'shallow'))
1340
1341 def test_shallow_mirrors(self):
1342 self.add_empty_file('a')
1343 self.add_empty_file('b')
1344
1345 # Fetch once to generate the shallow tarball
1346 fetcher, ud = self.fetch()
1347 mirrortarball = ud.mirrortarballs[0]
1348 assert os.path.exists(os.path.join(self.dldir, mirrortarball))
1349
1350 # Set up the mirror
1351 mirrordir = os.path.join(self.tempdir, 'mirror')
1352 bb.utils.mkdirhier(mirrordir)
1353 self.d.setVar('PREMIRRORS', 'git://.*/.* file://%s/\n' % mirrordir)
1354
1355 os.rename(os.path.join(self.dldir, mirrortarball),
1356 os.path.join(mirrordir, mirrortarball))
1357
1358 # Fetch from the mirror
1359 bb.utils.remove(self.dldir, recurse=True)
1360 bb.utils.remove(self.gitdir, recurse=True)
1361 self.fetch_and_unpack()
1362 self.assertRevCount(1)
1363
1364 def test_shallow_invalid_depth(self):
1365 self.add_empty_file('a')
1366 self.add_empty_file('b')
1367
1368 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '-12')
1369 with self.assertRaises(bb.fetch2.FetchError):
1370 self.fetch()
1371
1372 def test_shallow_invalid_depth_default(self):
1373 self.add_empty_file('a')
1374 self.add_empty_file('b')
1375
1376 self.d.setVar('BB_GIT_SHALLOW_DEPTH_default', '-12')
1377 with self.assertRaises(bb.fetch2.FetchError):
1378 self.fetch()
1379
1380 def test_shallow_extra_refs(self):
1381 self.add_empty_file('a')
1382 self.add_empty_file('b')
1383 self.git('branch a_branch', cwd=self.srcdir)
1384 self.assertRefs(['master', 'a_branch'], cwd=self.srcdir)
1385 self.assertRevCount(2, cwd=self.srcdir)
1386
1387 self.d.setVar('BB_GIT_SHALLOW_EXTRA_REFS', 'refs/heads/a_branch')
1388 self.fetch_shallow()
1389
1390 self.assertRefs(['master', 'origin/master', 'origin/a_branch'])
1391 self.assertRevCount(1)
1392
1393 def test_shallow_extra_refs_wildcard(self):
1394 self.add_empty_file('a')
1395 self.add_empty_file('b')
1396 self.git('branch a_branch', cwd=self.srcdir)
1397 self.git('tag v1.0', cwd=self.srcdir)
1398 self.assertRefs(['master', 'a_branch', 'v1.0'], cwd=self.srcdir)
1399 self.assertRevCount(2, cwd=self.srcdir)
1400
1401 self.d.setVar('BB_GIT_SHALLOW_EXTRA_REFS', 'refs/tags/*')
1402 self.fetch_shallow()
1403
1404 self.assertRefs(['master', 'origin/master', 'v1.0'])
1405 self.assertRevCount(1)
1406
1407 def test_shallow_missing_extra_refs(self):
1408 self.add_empty_file('a')
1409 self.add_empty_file('b')
1410
1411 self.d.setVar('BB_GIT_SHALLOW_EXTRA_REFS', 'refs/heads/foo')
1412 with self.assertRaises(bb.fetch2.FetchError):
1413 self.fetch()
1414
1415 def test_shallow_missing_extra_refs_wildcard(self):
1416 self.add_empty_file('a')
1417 self.add_empty_file('b')
1418
1419 self.d.setVar('BB_GIT_SHALLOW_EXTRA_REFS', 'refs/tags/*')
1420 self.fetch()
1421
1422 def test_shallow_remove_revs(self):
1423 # Create initial git repo
1424 self.add_empty_file('a')
1425 self.add_empty_file('b')
1426 self.git('checkout -b a_branch', cwd=self.srcdir)
1427 self.add_empty_file('c')
1428 self.add_empty_file('d')
1429 self.git('checkout master', cwd=self.srcdir)
1430 self.git('tag v0.0 a_branch', cwd=self.srcdir)
1431 self.add_empty_file('e')
1432 self.git('merge --no-ff --no-edit a_branch', cwd=self.srcdir)
1433 self.git('branch -d a_branch', cwd=self.srcdir)
1434 self.add_empty_file('f')
1435 self.assertRevCount(7, cwd=self.srcdir)
1436
1437 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
1438 self.d.setVar('BB_GIT_SHALLOW_REVS', 'v0.0')
1439
1440 self.fetch_shallow()
1441
1442 self.assertRevCount(5)
1443
1444 def test_shallow_invalid_revs(self):
1445 self.add_empty_file('a')
1446 self.add_empty_file('b')
1447
1448 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
1449 self.d.setVar('BB_GIT_SHALLOW_REVS', 'v0.0')
1450
1451 with self.assertRaises(bb.fetch2.FetchError):
1452 self.fetch()
1453
1454 @skipIfNoNetwork()
1455 def test_bitbake(self):
1456 self.git('remote add --mirror=fetch origin git://github.com/openembedded/bitbake', cwd=self.srcdir)
1457 self.git('config core.bare true', cwd=self.srcdir)
1458 self.git('fetch', cwd=self.srcdir)
1459
1460 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
1461 # Note that the 1.10.0 tag is annotated, so this also tests
1462 # reference of an annotated vs unannotated tag
1463 self.d.setVar('BB_GIT_SHALLOW_REVS', '1.10.0')
1464
1465 self.fetch_shallow()
1466
1467 # Confirm that the history of 1.10.0 was removed
1468 orig_revs = len(self.git('rev-list master', cwd=self.srcdir).splitlines())
1469 revs = len(self.git('rev-list master').splitlines())
1470 self.assertNotEqual(orig_revs, revs)
1471 self.assertRefs(['master', 'origin/master'])
1472 self.assertRevCount(orig_revs - 1758)