blob: 16f975b137a72092446fe5f09c9f9d81df67b207 [file] [log] [blame]
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001#
2# BitBake Tests for the Fetcher (fetch2/)
3#
4# Copyright (C) 2012 Richard Purdie
5#
Brad Bishopc342db32019-05-15 21:57:59 -04006# SPDX-License-Identifier: GPL-2.0-only
Patrick Williamsc124f4f2015-09-15 14:41:29 -05007#
8
9import unittest
Brad Bishop316dfdd2018-06-25 12:45:53 -040010import hashlib
Patrick Williamsc124f4f2015-09-15 14:41:29 -050011import tempfile
12import subprocess
Patrick Williamsc0f7c042017-02-23 20:41:17 -060013import collections
Patrick Williamsc124f4f2015-09-15 14:41:29 -050014import os
15from bb.fetch2 import URI
16from bb.fetch2 import FetchMethod
17import bb
18
Brad Bishopd7bf8c12018-02-25 22:55:05 -050019def skipIfNoNetwork():
20 if os.environ.get("BB_SKIP_NETTESTS") == "yes":
21 return unittest.skip("Network tests being skipped")
22 return lambda f: f
23
Patrick Williamsc124f4f2015-09-15 14:41:29 -050024class URITest(unittest.TestCase):
25 test_uris = {
26 "http://www.google.com/index.html" : {
27 'uri': 'http://www.google.com/index.html',
28 'scheme': 'http',
29 'hostname': 'www.google.com',
30 'port': None,
31 'hostport': 'www.google.com',
32 'path': '/index.html',
33 'userinfo': '',
34 'username': '',
35 'password': '',
36 'params': {},
37 'query': {},
38 'relative': False
39 },
40 "http://www.google.com/index.html;param1=value1" : {
41 'uri': 'http://www.google.com/index.html;param1=value1',
42 'scheme': 'http',
43 'hostname': 'www.google.com',
44 'port': None,
45 'hostport': 'www.google.com',
46 'path': '/index.html',
47 'userinfo': '',
48 'username': '',
49 'password': '',
50 'params': {
51 'param1': 'value1'
52 },
53 'query': {},
54 'relative': False
55 },
56 "http://www.example.org/index.html?param1=value1" : {
57 'uri': 'http://www.example.org/index.html?param1=value1',
58 'scheme': 'http',
59 'hostname': 'www.example.org',
60 'port': None,
61 'hostport': 'www.example.org',
62 'path': '/index.html',
63 'userinfo': '',
64 'username': '',
65 'password': '',
66 'params': {},
67 'query': {
68 'param1': 'value1'
69 },
70 'relative': False
71 },
72 "http://www.example.org/index.html?qparam1=qvalue1;param2=value2" : {
73 'uri': 'http://www.example.org/index.html?qparam1=qvalue1;param2=value2',
74 'scheme': 'http',
75 'hostname': 'www.example.org',
76 'port': None,
77 'hostport': 'www.example.org',
78 'path': '/index.html',
79 'userinfo': '',
80 'username': '',
81 'password': '',
82 'params': {
83 'param2': 'value2'
84 },
85 'query': {
86 'qparam1': 'qvalue1'
87 },
88 'relative': False
89 },
90 "http://www.example.com:8080/index.html" : {
91 'uri': 'http://www.example.com:8080/index.html',
92 'scheme': 'http',
93 'hostname': 'www.example.com',
94 'port': 8080,
95 'hostport': 'www.example.com:8080',
96 'path': '/index.html',
97 'userinfo': '',
98 'username': '',
99 'password': '',
100 'params': {},
101 'query': {},
102 'relative': False
103 },
104 "cvs://anoncvs@cvs.handhelds.org/cvs;module=familiar/dist/ipkg" : {
105 'uri': 'cvs://anoncvs@cvs.handhelds.org/cvs;module=familiar/dist/ipkg',
106 'scheme': 'cvs',
107 'hostname': 'cvs.handhelds.org',
108 'port': None,
109 'hostport': 'cvs.handhelds.org',
110 'path': '/cvs',
111 'userinfo': 'anoncvs',
112 'username': 'anoncvs',
113 'password': '',
114 'params': {
115 'module': 'familiar/dist/ipkg'
116 },
117 'query': {},
118 'relative': False
119 },
120 "cvs://anoncvs:anonymous@cvs.handhelds.org/cvs;tag=V0-99-81;module=familiar/dist/ipkg": {
121 'uri': 'cvs://anoncvs:anonymous@cvs.handhelds.org/cvs;tag=V0-99-81;module=familiar/dist/ipkg',
122 'scheme': 'cvs',
123 'hostname': 'cvs.handhelds.org',
124 'port': None,
125 'hostport': 'cvs.handhelds.org',
126 'path': '/cvs',
127 'userinfo': 'anoncvs:anonymous',
128 'username': 'anoncvs',
129 'password': 'anonymous',
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600130 'params': collections.OrderedDict([
131 ('tag', 'V0-99-81'),
132 ('module', 'familiar/dist/ipkg')
133 ]),
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500134 'query': {},
135 'relative': False
136 },
137 "file://example.diff": { # NOTE: Not RFC compliant!
138 'uri': 'file:example.diff',
139 'scheme': 'file',
140 'hostname': '',
141 'port': None,
142 'hostport': '',
143 'path': 'example.diff',
144 'userinfo': '',
145 'username': '',
146 'password': '',
147 'params': {},
148 'query': {},
149 'relative': True
150 },
151 "file:example.diff": { # NOTE: RFC compliant version of the former
152 'uri': 'file:example.diff',
153 'scheme': 'file',
154 'hostname': '',
155 'port': None,
156 'hostport': '',
157 'path': 'example.diff',
158 'userinfo': '',
159 'userinfo': '',
160 'username': '',
161 'password': '',
162 'params': {},
163 'query': {},
164 'relative': True
165 },
166 "file:///tmp/example.diff": {
167 'uri': 'file:///tmp/example.diff',
168 'scheme': 'file',
169 'hostname': '',
170 'port': None,
171 'hostport': '',
172 'path': '/tmp/example.diff',
173 'userinfo': '',
174 'userinfo': '',
175 'username': '',
176 'password': '',
177 'params': {},
178 'query': {},
179 'relative': False
180 },
181 "git:///path/example.git": {
182 'uri': 'git:///path/example.git',
183 'scheme': 'git',
184 'hostname': '',
185 'port': None,
186 'hostport': '',
187 'path': '/path/example.git',
188 'userinfo': '',
189 'userinfo': '',
190 'username': '',
191 'password': '',
192 'params': {},
193 'query': {},
194 'relative': False
195 },
196 "git:path/example.git": {
197 'uri': 'git:path/example.git',
198 'scheme': 'git',
199 'hostname': '',
200 'port': None,
201 'hostport': '',
202 'path': 'path/example.git',
203 'userinfo': '',
204 'userinfo': '',
205 'username': '',
206 'password': '',
207 'params': {},
208 'query': {},
209 'relative': True
210 },
211 "git://example.net/path/example.git": {
212 'uri': 'git://example.net/path/example.git',
213 'scheme': 'git',
214 'hostname': 'example.net',
215 'port': None,
216 'hostport': 'example.net',
217 'path': '/path/example.git',
218 'userinfo': '',
219 'userinfo': '',
220 'username': '',
221 'password': '',
222 'params': {},
223 'query': {},
224 'relative': False
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500225 },
226 "http://somesite.net;someparam=1": {
227 'uri': 'http://somesite.net;someparam=1',
228 'scheme': 'http',
229 'hostname': 'somesite.net',
230 'port': None,
231 'hostport': 'somesite.net',
232 'path': '',
233 'userinfo': '',
234 'userinfo': '',
235 'username': '',
236 'password': '',
237 'params': {"someparam" : "1"},
238 'query': {},
239 'relative': False
240 },
241 "file://somelocation;someparam=1": {
242 'uri': 'file:somelocation;someparam=1',
243 'scheme': 'file',
244 'hostname': '',
245 'port': None,
246 'hostport': '',
247 'path': 'somelocation',
248 'userinfo': '',
249 'userinfo': '',
250 'username': '',
251 'password': '',
252 'params': {"someparam" : "1"},
253 'query': {},
254 'relative': True
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500255 }
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500256
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500257 }
258
259 def test_uri(self):
260 for test_uri, ref in self.test_uris.items():
261 uri = URI(test_uri)
262
263 self.assertEqual(str(uri), ref['uri'])
264
265 # expected attributes
266 self.assertEqual(uri.scheme, ref['scheme'])
267
268 self.assertEqual(uri.userinfo, ref['userinfo'])
269 self.assertEqual(uri.username, ref['username'])
270 self.assertEqual(uri.password, ref['password'])
271
272 self.assertEqual(uri.hostname, ref['hostname'])
273 self.assertEqual(uri.port, ref['port'])
274 self.assertEqual(uri.hostport, ref['hostport'])
275
276 self.assertEqual(uri.path, ref['path'])
277 self.assertEqual(uri.params, ref['params'])
278
279 self.assertEqual(uri.relative, ref['relative'])
280
281 def test_dict(self):
282 for test in self.test_uris.values():
283 uri = URI()
284
285 self.assertEqual(uri.scheme, '')
286 self.assertEqual(uri.userinfo, '')
287 self.assertEqual(uri.username, '')
288 self.assertEqual(uri.password, '')
289 self.assertEqual(uri.hostname, '')
290 self.assertEqual(uri.port, None)
291 self.assertEqual(uri.path, '')
292 self.assertEqual(uri.params, {})
293
294
295 uri.scheme = test['scheme']
296 self.assertEqual(uri.scheme, test['scheme'])
297
298 uri.userinfo = test['userinfo']
299 self.assertEqual(uri.userinfo, test['userinfo'])
300 self.assertEqual(uri.username, test['username'])
301 self.assertEqual(uri.password, test['password'])
302
303 # make sure changing the values doesn't do anything unexpected
304 uri.username = 'changeme'
305 self.assertEqual(uri.username, 'changeme')
306 self.assertEqual(uri.password, test['password'])
307 uri.password = 'insecure'
308 self.assertEqual(uri.username, 'changeme')
309 self.assertEqual(uri.password, 'insecure')
310
311 # reset back after our trickery
312 uri.userinfo = test['userinfo']
313 self.assertEqual(uri.userinfo, test['userinfo'])
314 self.assertEqual(uri.username, test['username'])
315 self.assertEqual(uri.password, test['password'])
316
317 uri.hostname = test['hostname']
318 self.assertEqual(uri.hostname, test['hostname'])
319 self.assertEqual(uri.hostport, test['hostname'])
320
321 uri.port = test['port']
322 self.assertEqual(uri.port, test['port'])
323 self.assertEqual(uri.hostport, test['hostport'])
324
325 uri.path = test['path']
326 self.assertEqual(uri.path, test['path'])
327
328 uri.params = test['params']
329 self.assertEqual(uri.params, test['params'])
330
331 uri.query = test['query']
332 self.assertEqual(uri.query, test['query'])
333
334 self.assertEqual(str(uri), test['uri'])
335
336 uri.params = {}
337 self.assertEqual(uri.params, {})
338 self.assertEqual(str(uri), (str(uri).split(";"))[0])
339
340class FetcherTest(unittest.TestCase):
341
342 def setUp(self):
343 self.origdir = os.getcwd()
344 self.d = bb.data.init()
345 self.tempdir = tempfile.mkdtemp()
346 self.dldir = os.path.join(self.tempdir, "download")
347 os.mkdir(self.dldir)
348 self.d.setVar("DL_DIR", self.dldir)
349 self.unpackdir = os.path.join(self.tempdir, "unpacked")
350 os.mkdir(self.unpackdir)
351 persistdir = os.path.join(self.tempdir, "persistdata")
352 self.d.setVar("PERSISTENT_DIR", persistdir)
353
354 def tearDown(self):
355 os.chdir(self.origdir)
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600356 if os.environ.get("BB_TMPDIR_NOCLEAN") == "yes":
357 print("Not cleaning up %s. Please remove manually." % self.tempdir)
358 else:
359 bb.utils.prunedir(self.tempdir)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500360
361class MirrorUriTest(FetcherTest):
362
363 replaceuris = {
364 ("git://git.invalid.infradead.org/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/.*", "http://somewhere.org/somedir/")
365 : "http://somewhere.org/somedir/git2_git.invalid.infradead.org.mtd-utils.git.tar.gz",
366 ("git://git.invalid.infradead.org/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/([^/]+/)*([^/]*)", "git://somewhere.org/somedir/\\2;protocol=http")
367 : "git://somewhere.org/somedir/mtd-utils.git;tag=1234567890123456789012345678901234567890;protocol=http",
368 ("git://git.invalid.infradead.org/foo/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/([^/]+/)*([^/]*)", "git://somewhere.org/somedir/\\2;protocol=http")
369 : "git://somewhere.org/somedir/mtd-utils.git;tag=1234567890123456789012345678901234567890;protocol=http",
370 ("git://git.invalid.infradead.org/foo/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/([^/]+/)*([^/]*)", "git://somewhere.org/\\2;protocol=http")
371 : "git://somewhere.org/mtd-utils.git;tag=1234567890123456789012345678901234567890;protocol=http",
372 ("git://someserver.org/bitbake;tag=1234567890123456789012345678901234567890", "git://someserver.org/bitbake", "git://git.openembedded.org/bitbake")
373 : "git://git.openembedded.org/bitbake;tag=1234567890123456789012345678901234567890",
374 ("file://sstate-xyz.tgz", "file://.*", "file:///somewhere/1234/sstate-cache")
375 : "file:///somewhere/1234/sstate-cache/sstate-xyz.tgz",
376 ("file://sstate-xyz.tgz", "file://.*", "file:///somewhere/1234/sstate-cache/")
377 : "file:///somewhere/1234/sstate-cache/sstate-xyz.tgz",
378 ("http://somewhere.org/somedir1/somedir2/somefile_1.2.3.tar.gz", "http://.*/.*", "http://somewhere2.org/somedir3")
379 : "http://somewhere2.org/somedir3/somefile_1.2.3.tar.gz",
380 ("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")
381 : "http://somewhere2.org/somedir3/somefile_1.2.3.tar.gz",
382 ("http://www.apache.org/dist/subversion/subversion-1.7.1.tar.bz2", "http://www.apache.org/dist", "http://archive.apache.org/dist")
383 : "http://archive.apache.org/dist/subversion/subversion-1.7.1.tar.bz2",
384 ("http://www.apache.org/dist/subversion/subversion-1.7.1.tar.bz2", "http://.*/.*", "file:///somepath/downloads/")
385 : "file:///somepath/downloads/subversion-1.7.1.tar.bz2",
386 ("git://git.invalid.infradead.org/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/.*", "git://somewhere.org/somedir/BASENAME;protocol=http")
387 : "git://somewhere.org/somedir/mtd-utils.git;tag=1234567890123456789012345678901234567890;protocol=http",
388 ("git://git.invalid.infradead.org/foo/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/.*", "git://somewhere.org/somedir/BASENAME;protocol=http")
389 : "git://somewhere.org/somedir/mtd-utils.git;tag=1234567890123456789012345678901234567890;protocol=http",
390 ("git://git.invalid.infradead.org/foo/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/.*", "git://somewhere.org/somedir/MIRRORNAME;protocol=http")
391 : "git://somewhere.org/somedir/git.invalid.infradead.org.foo.mtd-utils.git;tag=1234567890123456789012345678901234567890;protocol=http",
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800392 ("http://somewhere.org/somedir1/somedir2/somefile_1.2.3.tar.gz", "http://.*/.*", "http://somewhere2.org")
393 : "http://somewhere2.org/somefile_1.2.3.tar.gz",
394 ("http://somewhere.org/somedir1/somedir2/somefile_1.2.3.tar.gz", "http://.*/.*", "http://somewhere2.org/")
395 : "http://somewhere2.org/somefile_1.2.3.tar.gz",
396 ("git://someserver.org/bitbake;tag=1234567890123456789012345678901234567890;branch=master", "git://someserver.org/bitbake;branch=master", "git://git.openembedded.org/bitbake;protocol=http")
397 : "git://git.openembedded.org/bitbake;tag=1234567890123456789012345678901234567890;branch=master;protocol=http",
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500398
399 #Renaming files doesn't work
400 #("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"
401 #("file://sstate-xyz.tgz", "file://.*/.*", "file:///somewhere/1234/sstate-cache") : "file:///somewhere/1234/sstate-cache/sstate-xyz.tgz",
402 }
403
404 mirrorvar = "http://.*/.* file:///somepath/downloads/ \n" \
405 "git://someserver.org/bitbake git://git.openembedded.org/bitbake \n" \
406 "https://.*/.* file:///someotherpath/downloads/ \n" \
407 "http://.*/.* file:///someotherpath/downloads/ \n"
408
409 def test_urireplace(self):
410 for k, v in self.replaceuris.items():
411 ud = bb.fetch.FetchData(k[0], self.d)
412 ud.setup_localpath(self.d)
413 mirrors = bb.fetch2.mirror_from_string("%s %s" % (k[1], k[2]))
414 newuris, uds = bb.fetch2.build_mirroruris(ud, mirrors, self.d)
415 self.assertEqual([v], newuris)
416
417 def test_urilist1(self):
418 fetcher = bb.fetch.FetchData("http://downloads.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz", self.d)
419 mirrors = bb.fetch2.mirror_from_string(self.mirrorvar)
420 uris, uds = bb.fetch2.build_mirroruris(fetcher, mirrors, self.d)
421 self.assertEqual(uris, ['file:///somepath/downloads/bitbake-1.0.tar.gz', 'file:///someotherpath/downloads/bitbake-1.0.tar.gz'])
422
423 def test_urilist2(self):
424 # Catch https:// -> files:// bug
425 fetcher = bb.fetch.FetchData("https://downloads.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz", self.d)
426 mirrors = bb.fetch2.mirror_from_string(self.mirrorvar)
427 uris, uds = bb.fetch2.build_mirroruris(fetcher, mirrors, self.d)
428 self.assertEqual(uris, ['file:///someotherpath/downloads/bitbake-1.0.tar.gz'])
429
430 def test_mirror_of_mirror(self):
431 # Test if mirror of a mirror works
432 mirrorvar = self.mirrorvar + " http://.*/.* http://otherdownloads.yoctoproject.org/downloads/ \n"
433 mirrorvar = mirrorvar + " http://otherdownloads.yoctoproject.org/.* http://downloads2.yoctoproject.org/downloads/ \n"
434 fetcher = bb.fetch.FetchData("http://downloads.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz", self.d)
435 mirrors = bb.fetch2.mirror_from_string(mirrorvar)
436 uris, uds = bb.fetch2.build_mirroruris(fetcher, mirrors, self.d)
437 self.assertEqual(uris, ['file:///somepath/downloads/bitbake-1.0.tar.gz',
438 'file:///someotherpath/downloads/bitbake-1.0.tar.gz',
439 'http://otherdownloads.yoctoproject.org/downloads/bitbake-1.0.tar.gz',
440 'http://downloads2.yoctoproject.org/downloads/bitbake-1.0.tar.gz'])
441
Patrick Williamsd7e96312015-09-22 08:09:05 -0500442 recmirrorvar = "https://.*/[^/]* http://AAAA/A/A/A/ \n" \
443 "https://.*/[^/]* https://BBBB/B/B/B/ \n"
444
445 def test_recursive(self):
446 fetcher = bb.fetch.FetchData("https://downloads.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz", self.d)
447 mirrors = bb.fetch2.mirror_from_string(self.recmirrorvar)
448 uris, uds = bb.fetch2.build_mirroruris(fetcher, mirrors, self.d)
449 self.assertEqual(uris, ['http://AAAA/A/A/A/bitbake/bitbake-1.0.tar.gz',
450 'https://BBBB/B/B/B/bitbake/bitbake-1.0.tar.gz',
451 'http://AAAA/A/A/A/B/B/bitbake/bitbake-1.0.tar.gz'])
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500452
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800453
454class GitDownloadDirectoryNamingTest(FetcherTest):
455 def setUp(self):
456 super(GitDownloadDirectoryNamingTest, self).setUp()
457 self.recipe_url = "git://git.openembedded.org/bitbake"
458 self.recipe_dir = "git.openembedded.org.bitbake"
459 self.mirror_url = "git://github.com/openembedded/bitbake.git"
460 self.mirror_dir = "github.com.openembedded.bitbake.git"
461
462 self.d.setVar('SRCREV', '82ea737a0b42a8b53e11c9cde141e9e9c0bd8c40')
463
464 def setup_mirror_rewrite(self):
465 self.d.setVar("PREMIRRORS", self.recipe_url + " " + self.mirror_url + " \n")
466
467 @skipIfNoNetwork()
468 def test_that_directory_is_named_after_recipe_url_when_no_mirroring_is_used(self):
469 self.setup_mirror_rewrite()
470 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
471
472 fetcher.download()
473
474 dir = os.listdir(self.dldir + "/git2")
475 self.assertIn(self.recipe_dir, dir)
476
477 @skipIfNoNetwork()
478 def test_that_directory_exists_for_mirrored_url_and_recipe_url_when_mirroring_is_used(self):
479 self.setup_mirror_rewrite()
480 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
481
482 fetcher.download()
483
484 dir = os.listdir(self.dldir + "/git2")
485 self.assertIn(self.mirror_dir, dir)
486 self.assertIn(self.recipe_dir, dir)
487
488 @skipIfNoNetwork()
489 def test_that_recipe_directory_and_mirrored_directory_exists_when_mirroring_is_used_and_the_mirrored_directory_already_exists(self):
490 self.setup_mirror_rewrite()
491 fetcher = bb.fetch.Fetch([self.mirror_url], self.d)
492 fetcher.download()
493 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
494
495 fetcher.download()
496
497 dir = os.listdir(self.dldir + "/git2")
498 self.assertIn(self.mirror_dir, dir)
499 self.assertIn(self.recipe_dir, dir)
500
501
502class TarballNamingTest(FetcherTest):
503 def setUp(self):
504 super(TarballNamingTest, self).setUp()
505 self.recipe_url = "git://git.openembedded.org/bitbake"
506 self.recipe_tarball = "git2_git.openembedded.org.bitbake.tar.gz"
507 self.mirror_url = "git://github.com/openembedded/bitbake.git"
508 self.mirror_tarball = "git2_github.com.openembedded.bitbake.git.tar.gz"
509
510 self.d.setVar('BB_GENERATE_MIRROR_TARBALLS', '1')
511 self.d.setVar('SRCREV', '82ea737a0b42a8b53e11c9cde141e9e9c0bd8c40')
512
513 def setup_mirror_rewrite(self):
514 self.d.setVar("PREMIRRORS", self.recipe_url + " " + self.mirror_url + " \n")
515
516 @skipIfNoNetwork()
517 def test_that_the_recipe_tarball_is_created_when_no_mirroring_is_used(self):
518 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
519
520 fetcher.download()
521
522 dir = os.listdir(self.dldir)
523 self.assertIn(self.recipe_tarball, dir)
524
525 @skipIfNoNetwork()
526 def test_that_the_mirror_tarball_is_created_when_mirroring_is_used(self):
527 self.setup_mirror_rewrite()
528 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
529
530 fetcher.download()
531
532 dir = os.listdir(self.dldir)
533 self.assertIn(self.mirror_tarball, dir)
534
535
536class GitShallowTarballNamingTest(FetcherTest):
537 def setUp(self):
538 super(GitShallowTarballNamingTest, self).setUp()
539 self.recipe_url = "git://git.openembedded.org/bitbake"
540 self.recipe_tarball = "gitshallow_git.openembedded.org.bitbake_82ea737-1_master.tar.gz"
541 self.mirror_url = "git://github.com/openembedded/bitbake.git"
542 self.mirror_tarball = "gitshallow_github.com.openembedded.bitbake.git_82ea737-1_master.tar.gz"
543
544 self.d.setVar('BB_GIT_SHALLOW', '1')
545 self.d.setVar('BB_GENERATE_SHALLOW_TARBALLS', '1')
546 self.d.setVar('SRCREV', '82ea737a0b42a8b53e11c9cde141e9e9c0bd8c40')
547
548 def setup_mirror_rewrite(self):
549 self.d.setVar("PREMIRRORS", self.recipe_url + " " + self.mirror_url + " \n")
550
551 @skipIfNoNetwork()
552 def test_that_the_tarball_is_named_after_recipe_url_when_no_mirroring_is_used(self):
553 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
554
555 fetcher.download()
556
557 dir = os.listdir(self.dldir)
558 self.assertIn(self.recipe_tarball, dir)
559
560 @skipIfNoNetwork()
561 def test_that_the_mirror_tarball_is_created_when_mirroring_is_used(self):
562 self.setup_mirror_rewrite()
563 fetcher = bb.fetch.Fetch([self.recipe_url], self.d)
564
565 fetcher.download()
566
567 dir = os.listdir(self.dldir)
568 self.assertIn(self.mirror_tarball, dir)
569
570
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500571class FetcherLocalTest(FetcherTest):
572 def setUp(self):
573 def touch(fn):
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600574 with open(fn, 'a'):
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500575 os.utime(fn, None)
576
577 super(FetcherLocalTest, self).setUp()
578 self.localsrcdir = os.path.join(self.tempdir, 'localsrc')
579 os.makedirs(self.localsrcdir)
580 touch(os.path.join(self.localsrcdir, 'a'))
581 touch(os.path.join(self.localsrcdir, 'b'))
582 os.makedirs(os.path.join(self.localsrcdir, 'dir'))
583 touch(os.path.join(self.localsrcdir, 'dir', 'c'))
584 touch(os.path.join(self.localsrcdir, 'dir', 'd'))
585 os.makedirs(os.path.join(self.localsrcdir, 'dir', 'subdir'))
586 touch(os.path.join(self.localsrcdir, 'dir', 'subdir', 'e'))
587 self.d.setVar("FILESPATH", self.localsrcdir)
588
589 def fetchUnpack(self, uris):
590 fetcher = bb.fetch.Fetch(uris, self.d)
591 fetcher.download()
592 fetcher.unpack(self.unpackdir)
593 flst = []
594 for root, dirs, files in os.walk(self.unpackdir):
595 for f in files:
596 flst.append(os.path.relpath(os.path.join(root, f), self.unpackdir))
597 flst.sort()
598 return flst
599
600 def test_local(self):
601 tree = self.fetchUnpack(['file://a', 'file://dir/c'])
602 self.assertEqual(tree, ['a', 'dir/c'])
603
604 def test_local_wildcard(self):
605 tree = self.fetchUnpack(['file://a', 'file://dir/*'])
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500606 self.assertEqual(tree, ['a', 'dir/c', 'dir/d', 'dir/subdir/e'])
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500607
608 def test_local_dir(self):
609 tree = self.fetchUnpack(['file://a', 'file://dir'])
610 self.assertEqual(tree, ['a', 'dir/c', 'dir/d', 'dir/subdir/e'])
611
612 def test_local_subdir(self):
613 tree = self.fetchUnpack(['file://dir/subdir'])
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500614 self.assertEqual(tree, ['dir/subdir/e'])
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500615
616 def test_local_subdir_file(self):
617 tree = self.fetchUnpack(['file://dir/subdir/e'])
618 self.assertEqual(tree, ['dir/subdir/e'])
619
620 def test_local_subdirparam(self):
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500621 tree = self.fetchUnpack(['file://a;subdir=bar', 'file://dir;subdir=foo/moo'])
622 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 -0500623
624 def test_local_deepsubdirparam(self):
625 tree = self.fetchUnpack(['file://dir/subdir/e;subdir=bar'])
626 self.assertEqual(tree, ['bar/dir/subdir/e'])
627
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600628 def test_local_absolutedir(self):
629 # Unpacking to an absolute path that is a subdirectory of the root
630 # should work
631 tree = self.fetchUnpack(['file://a;subdir=%s' % os.path.join(self.unpackdir, 'bar')])
632
633 # Unpacking to an absolute path outside of the root should fail
634 with self.assertRaises(bb.fetch2.UnpackError):
635 self.fetchUnpack(['file://a;subdir=/bin/sh'])
636
Brad Bishop316dfdd2018-06-25 12:45:53 -0400637class FetcherNoNetworkTest(FetcherTest):
638 def setUp(self):
639 super().setUp()
640 # all test cases are based on not having network
641 self.d.setVar("BB_NO_NETWORK", "1")
642
643 def test_missing(self):
644 string = "this is a test file\n".encode("utf-8")
645 self.d.setVarFlag("SRC_URI", "md5sum", hashlib.md5(string).hexdigest())
646 self.d.setVarFlag("SRC_URI", "sha256sum", hashlib.sha256(string).hexdigest())
647
648 self.assertFalse(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz")))
649 self.assertFalse(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz.done")))
650 fetcher = bb.fetch.Fetch(["http://invalid.yoctoproject.org/test-file.tar.gz"], self.d)
651 with self.assertRaises(bb.fetch2.NetworkAccess):
652 fetcher.download()
653
654 def test_valid_missing_donestamp(self):
655 # create the file in the download directory with correct hash
656 string = "this is a test file\n".encode("utf-8")
657 with open(os.path.join(self.dldir, "test-file.tar.gz"), "wb") as f:
658 f.write(string)
659
660 self.d.setVarFlag("SRC_URI", "md5sum", hashlib.md5(string).hexdigest())
661 self.d.setVarFlag("SRC_URI", "sha256sum", hashlib.sha256(string).hexdigest())
662
663 self.assertTrue(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz")))
664 self.assertFalse(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz.done")))
665 fetcher = bb.fetch.Fetch(["http://invalid.yoctoproject.org/test-file.tar.gz"], self.d)
666 fetcher.download()
667 self.assertTrue(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz.done")))
668
669 def test_invalid_missing_donestamp(self):
670 # create an invalid file in the download directory with incorrect hash
671 string = "this is a test file\n".encode("utf-8")
672 with open(os.path.join(self.dldir, "test-file.tar.gz"), "wb"):
673 pass
674
675 self.d.setVarFlag("SRC_URI", "md5sum", hashlib.md5(string).hexdigest())
676 self.d.setVarFlag("SRC_URI", "sha256sum", hashlib.sha256(string).hexdigest())
677
678 self.assertTrue(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz")))
679 self.assertFalse(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz.done")))
680 fetcher = bb.fetch.Fetch(["http://invalid.yoctoproject.org/test-file.tar.gz"], self.d)
681 with self.assertRaises(bb.fetch2.NetworkAccess):
682 fetcher.download()
683 # the existing file should not exist or should have be moved to "bad-checksum"
684 self.assertFalse(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz")))
685
686 def test_nochecksums_missing(self):
687 self.assertFalse(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz")))
688 self.assertFalse(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz.done")))
689 # ssh fetch does not support checksums
690 fetcher = bb.fetch.Fetch(["ssh://invalid@invalid.yoctoproject.org/test-file.tar.gz"], self.d)
691 # attempts to download with missing donestamp
692 with self.assertRaises(bb.fetch2.NetworkAccess):
693 fetcher.download()
694
695 def test_nochecksums_missing_donestamp(self):
696 # create a file in the download directory
697 with open(os.path.join(self.dldir, "test-file.tar.gz"), "wb"):
698 pass
699
700 self.assertTrue(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz")))
701 self.assertFalse(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz.done")))
702 # ssh fetch does not support checksums
703 fetcher = bb.fetch.Fetch(["ssh://invalid@invalid.yoctoproject.org/test-file.tar.gz"], self.d)
704 # attempts to download with missing donestamp
705 with self.assertRaises(bb.fetch2.NetworkAccess):
706 fetcher.download()
707
708 def test_nochecksums_has_donestamp(self):
709 # create a file in the download directory with the donestamp
710 with open(os.path.join(self.dldir, "test-file.tar.gz"), "wb"):
711 pass
712 with open(os.path.join(self.dldir, "test-file.tar.gz.done"), "wb"):
713 pass
714
715 self.assertTrue(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz")))
716 self.assertTrue(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz.done")))
717 # ssh fetch does not support checksums
718 fetcher = bb.fetch.Fetch(["ssh://invalid@invalid.yoctoproject.org/test-file.tar.gz"], self.d)
719 # should not fetch
720 fetcher.download()
721 # both files should still exist
722 self.assertTrue(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz")))
723 self.assertTrue(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz.done")))
724
725 def test_nochecksums_missing_has_donestamp(self):
726 # create a file in the download directory with the donestamp
727 with open(os.path.join(self.dldir, "test-file.tar.gz.done"), "wb"):
728 pass
729
730 self.assertFalse(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz")))
731 self.assertTrue(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz.done")))
732 # ssh fetch does not support checksums
733 fetcher = bb.fetch.Fetch(["ssh://invalid@invalid.yoctoproject.org/test-file.tar.gz"], self.d)
734 with self.assertRaises(bb.fetch2.NetworkAccess):
735 fetcher.download()
736 # both files should still exist
737 self.assertFalse(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz")))
738 self.assertFalse(os.path.exists(os.path.join(self.dldir, "test-file.tar.gz.done")))
739
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500740class FetcherNetworkTest(FetcherTest):
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500741 @skipIfNoNetwork()
742 def test_fetch(self):
743 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)
744 fetcher.download()
745 self.assertEqual(os.path.getsize(self.dldir + "/bitbake-1.0.tar.gz"), 57749)
746 self.assertEqual(os.path.getsize(self.dldir + "/bitbake-1.1.tar.gz"), 57892)
747 self.d.setVar("BB_NO_NETWORK", "1")
748 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)
749 fetcher.download()
750 fetcher.unpack(self.unpackdir)
751 self.assertEqual(len(os.listdir(self.unpackdir + "/bitbake-1.0/")), 9)
752 self.assertEqual(len(os.listdir(self.unpackdir + "/bitbake-1.1/")), 9)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500753
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500754 @skipIfNoNetwork()
755 def test_fetch_mirror(self):
756 self.d.setVar("MIRRORS", "http://.*/.* http://downloads.yoctoproject.org/releases/bitbake")
757 fetcher = bb.fetch.Fetch(["http://invalid.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz"], self.d)
758 fetcher.download()
759 self.assertEqual(os.path.getsize(self.dldir + "/bitbake-1.0.tar.gz"), 57749)
760
761 @skipIfNoNetwork()
762 def test_fetch_mirror_of_mirror(self):
763 self.d.setVar("MIRRORS", "http://.*/.* http://invalid2.yoctoproject.org/ \n http://invalid2.yoctoproject.org/.* http://downloads.yoctoproject.org/releases/bitbake")
764 fetcher = bb.fetch.Fetch(["http://invalid.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz"], self.d)
765 fetcher.download()
766 self.assertEqual(os.path.getsize(self.dldir + "/bitbake-1.0.tar.gz"), 57749)
767
768 @skipIfNoNetwork()
769 def test_fetch_file_mirror_of_mirror(self):
770 self.d.setVar("MIRRORS", "http://.*/.* file:///some1where/ \n file:///some1where/.* file://some2where/ \n file://some2where/.* http://downloads.yoctoproject.org/releases/bitbake")
771 fetcher = bb.fetch.Fetch(["http://invalid.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz"], self.d)
772 os.mkdir(self.dldir + "/some2where")
773 fetcher.download()
774 self.assertEqual(os.path.getsize(self.dldir + "/bitbake-1.0.tar.gz"), 57749)
775
776 @skipIfNoNetwork()
777 def test_fetch_premirror(self):
778 self.d.setVar("PREMIRRORS", "http://.*/.* http://downloads.yoctoproject.org/releases/bitbake")
779 fetcher = bb.fetch.Fetch(["http://invalid.yoctoproject.org/releases/bitbake/bitbake-1.0.tar.gz"], self.d)
780 fetcher.download()
781 self.assertEqual(os.path.getsize(self.dldir + "/bitbake-1.0.tar.gz"), 57749)
782
783 @skipIfNoNetwork()
784 def gitfetcher(self, url1, url2):
785 def checkrevision(self, fetcher):
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500786 fetcher.unpack(self.unpackdir)
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500787 revision = bb.process.run("git rev-parse HEAD", shell=True, cwd=self.unpackdir + "/git")[0].strip()
788 self.assertEqual(revision, "270a05b0b4ba0959fe0624d2a4885d7b70426da5")
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500789
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500790 self.d.setVar("BB_GENERATE_MIRROR_TARBALLS", "1")
791 self.d.setVar("SRCREV", "270a05b0b4ba0959fe0624d2a4885d7b70426da5")
792 fetcher = bb.fetch.Fetch([url1], self.d)
793 fetcher.download()
794 checkrevision(self, fetcher)
795 # Wipe out the dldir clone and the unpacked source, turn off the network and check mirror tarball works
796 bb.utils.prunedir(self.dldir + "/git2/")
797 bb.utils.prunedir(self.unpackdir)
798 self.d.setVar("BB_NO_NETWORK", "1")
799 fetcher = bb.fetch.Fetch([url2], self.d)
800 fetcher.download()
801 checkrevision(self, fetcher)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500802
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500803 @skipIfNoNetwork()
804 def test_gitfetch(self):
805 url1 = url2 = "git://git.openembedded.org/bitbake"
806 self.gitfetcher(url1, url2)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500807
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500808 @skipIfNoNetwork()
809 def test_gitfetch_goodsrcrev(self):
810 # SRCREV is set but matches rev= parameter
811 url1 = url2 = "git://git.openembedded.org/bitbake;rev=270a05b0b4ba0959fe0624d2a4885d7b70426da5"
812 self.gitfetcher(url1, url2)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500813
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500814 @skipIfNoNetwork()
815 def test_gitfetch_badsrcrev(self):
816 # SRCREV is set but does not match rev= parameter
817 url1 = url2 = "git://git.openembedded.org/bitbake;rev=dead05b0b4ba0959fe0624d2a4885d7b70426da5"
818 self.assertRaises(bb.fetch.FetchError, self.gitfetcher, url1, url2)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500819
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500820 @skipIfNoNetwork()
821 def test_gitfetch_tagandrev(self):
822 # SRCREV is set but does not match rev= parameter
823 url1 = url2 = "git://git.openembedded.org/bitbake;rev=270a05b0b4ba0959fe0624d2a4885d7b70426da5;tag=270a05b0b4ba0959fe0624d2a4885d7b70426da5"
824 self.assertRaises(bb.fetch.FetchError, self.gitfetcher, url1, url2)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500825
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500826 @skipIfNoNetwork()
827 def test_gitfetch_localusehead(self):
828 # Create dummy local Git repo
829 src_dir = tempfile.mkdtemp(dir=self.tempdir,
830 prefix='gitfetch_localusehead_')
831 src_dir = os.path.abspath(src_dir)
832 bb.process.run("git init", cwd=src_dir)
833 bb.process.run("git commit --allow-empty -m'Dummy commit'",
834 cwd=src_dir)
835 # Use other branch than master
836 bb.process.run("git checkout -b my-devel", cwd=src_dir)
837 bb.process.run("git commit --allow-empty -m'Dummy commit 2'",
838 cwd=src_dir)
839 stdout = bb.process.run("git rev-parse HEAD", cwd=src_dir)
840 orig_rev = stdout[0].strip()
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500841
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500842 # Fetch and check revision
843 self.d.setVar("SRCREV", "AUTOINC")
844 url = "git://" + src_dir + ";protocol=file;usehead=1"
845 fetcher = bb.fetch.Fetch([url], self.d)
846 fetcher.download()
847 fetcher.unpack(self.unpackdir)
848 stdout = bb.process.run("git rev-parse HEAD",
849 cwd=os.path.join(self.unpackdir, 'git'))
850 unpack_rev = stdout[0].strip()
851 self.assertEqual(orig_rev, unpack_rev)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500852
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500853 @skipIfNoNetwork()
854 def test_gitfetch_remoteusehead(self):
855 url = "git://git.openembedded.org/bitbake;usehead=1"
856 self.assertRaises(bb.fetch.ParameterError, self.gitfetcher, url, url)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500857
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500858 @skipIfNoNetwork()
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800859 def test_gitfetch_finds_local_tarball_for_mirrored_url_when_previous_downloaded_by_the_recipe_url(self):
860 recipeurl = "git://git.openembedded.org/bitbake"
861 mirrorurl = "git://someserver.org/bitbake"
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500862 self.d.setVar("PREMIRRORS", "git://someserver.org/bitbake git://git.openembedded.org/bitbake \n")
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800863 self.gitfetcher(recipeurl, mirrorurl)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500864
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500865 @skipIfNoNetwork()
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800866 def test_gitfetch_finds_local_tarball_when_previous_downloaded_from_a_premirror(self):
867 recipeurl = "git://someserver.org/bitbake"
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500868 self.d.setVar("PREMIRRORS", "git://someserver.org/bitbake git://git.openembedded.org/bitbake \n")
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800869 self.gitfetcher(recipeurl, recipeurl)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500870
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500871 @skipIfNoNetwork()
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800872 def test_gitfetch_finds_local_repository_when_premirror_rewrites_the_recipe_url(self):
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500873 realurl = "git://git.openembedded.org/bitbake"
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800874 recipeurl = "git://someserver.org/bitbake"
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500875 self.sourcedir = self.unpackdir.replace("unpacked", "sourcemirror.git")
876 os.chdir(self.tempdir)
877 bb.process.run("git clone %s %s 2> /dev/null" % (realurl, self.sourcedir), shell=True)
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800878 self.d.setVar("PREMIRRORS", "%s git://%s;protocol=file \n" % (recipeurl, self.sourcedir))
879 self.gitfetcher(recipeurl, recipeurl)
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600880
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500881 @skipIfNoNetwork()
882 def test_git_submodule(self):
Brad Bishopf8caae32019-03-25 13:13:56 -0400883 # URL with ssh submodules
884 url = "gitsm://git.yoctoproject.org/git-submodule-test;branch=ssh-gitsm-tests;rev=049da4a6cb198d7c0302e9e8b243a1443cb809a7"
885 # Original URL (comment this if you have ssh access to git.yoctoproject.org)
886 url = "gitsm://git.yoctoproject.org/git-submodule-test;branch=master;rev=a2885dd7d25380d23627e7544b7bbb55014b16ee"
887 fetcher = bb.fetch.Fetch([url], self.d)
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500888 fetcher.download()
889 # Previous cwd has been deleted
890 os.chdir(os.path.dirname(self.unpackdir))
891 fetcher.unpack(self.unpackdir)
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500892
Brad Bishopf8caae32019-03-25 13:13:56 -0400893 repo_path = os.path.join(self.tempdir, 'unpacked', 'git')
894 self.assertTrue(os.path.exists(repo_path), msg='Unpacked repository missing')
895 self.assertTrue(os.path.exists(os.path.join(repo_path, 'bitbake')), msg='bitbake submodule missing')
896 self.assertFalse(os.path.exists(os.path.join(repo_path, 'na')), msg='uninitialized submodule present')
897
898 # Only when we're running the extended test with a submodule's submodule, can we check this.
899 if os.path.exists(os.path.join(repo_path, 'bitbake-gitsm-test1')):
900 self.assertTrue(os.path.exists(os.path.join(repo_path, 'bitbake-gitsm-test1', 'bitbake')), msg='submodule of submodule missing')
901
902 def test_git_submodule_dbus_broker(self):
903 # The following external repositories have show failures in fetch and unpack operations
904 # We want to avoid regressions!
905 url = "gitsm://github.com/bus1/dbus-broker;protocol=git;rev=fc874afa0992d0c75ec25acb43d344679f0ee7d2"
906 fetcher = bb.fetch.Fetch([url], self.d)
907 fetcher.download()
908 # Previous cwd has been deleted
909 os.chdir(os.path.dirname(self.unpackdir))
910 fetcher.unpack(self.unpackdir)
911
912 repo_path = os.path.join(self.tempdir, 'unpacked', 'git')
913 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/subprojects/c-dvar/config')), msg='Missing submodule config "subprojects/c-dvar"')
914 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/subprojects/c-list/config')), msg='Missing submodule config "subprojects/c-list"')
915 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/subprojects/c-rbtree/config')), msg='Missing submodule config "subprojects/c-rbtree"')
916 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/subprojects/c-sundry/config')), msg='Missing submodule config "subprojects/c-sundry"')
917 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/subprojects/c-utf8/config')), msg='Missing submodule config "subprojects/c-utf8"')
918
919 def test_git_submodule_CLI11(self):
920 url = "gitsm://github.com/CLIUtils/CLI11;protocol=git;rev=bd4dc911847d0cde7a6b41dfa626a85aab213baf"
921 fetcher = bb.fetch.Fetch([url], self.d)
922 fetcher.download()
923 # Previous cwd has been deleted
924 os.chdir(os.path.dirname(self.unpackdir))
925 fetcher.unpack(self.unpackdir)
926
927 repo_path = os.path.join(self.tempdir, 'unpacked', 'git')
928 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/extern/googletest/config')), msg='Missing submodule config "extern/googletest"')
929 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/extern/json/config')), msg='Missing submodule config "extern/json"')
930 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/extern/sanitizers/config')), msg='Missing submodule config "extern/sanitizers"')
931
Brad Bishop19323692019-04-05 15:28:33 -0400932 def test_git_submodule_update_CLI11(self):
933 """ Prevent regression on update detection not finding missing submodule, or modules without needed commits """
934 url = "gitsm://github.com/CLIUtils/CLI11;protocol=git;rev=cf6a99fa69aaefe477cc52e3ef4a7d2d7fa40714"
935 fetcher = bb.fetch.Fetch([url], self.d)
936 fetcher.download()
937
938 # CLI11 that pulls in a newer nlohmann-json
939 url = "gitsm://github.com/CLIUtils/CLI11;protocol=git;rev=49ac989a9527ee9bb496de9ded7b4872c2e0e5ca"
940 fetcher = bb.fetch.Fetch([url], self.d)
941 fetcher.download()
942 # Previous cwd has been deleted
943 os.chdir(os.path.dirname(self.unpackdir))
944 fetcher.unpack(self.unpackdir)
945
946 repo_path = os.path.join(self.tempdir, 'unpacked', 'git')
947 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/extern/googletest/config')), msg='Missing submodule config "extern/googletest"')
948 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/extern/json/config')), msg='Missing submodule config "extern/json"')
949 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/extern/sanitizers/config')), msg='Missing submodule config "extern/sanitizers"')
950
Brad Bishopf8caae32019-03-25 13:13:56 -0400951 def test_git_submodule_aktualizr(self):
952 url = "gitsm://github.com/advancedtelematic/aktualizr;branch=master;protocol=git;rev=d00d1a04cc2366d1a5f143b84b9f507f8bd32c44"
953 fetcher = bb.fetch.Fetch([url], self.d)
954 fetcher.download()
955 # Previous cwd has been deleted
956 os.chdir(os.path.dirname(self.unpackdir))
957 fetcher.unpack(self.unpackdir)
958
959 repo_path = os.path.join(self.tempdir, 'unpacked', 'git')
960 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/partial/extern/isotp-c/config')), msg='Missing submodule config "partial/extern/isotp-c/config"')
961 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/partial/extern/isotp-c/modules/deps/bitfield-c/config')), msg='Missing submodule config "partial/extern/isotp-c/modules/deps/bitfield-c/config"')
962 self.assertTrue(os.path.exists(os.path.join(repo_path, 'partial/extern/isotp-c/deps/bitfield-c/.git')), msg="Submodule of submodule isotp-c did not unpack properly")
963 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/tests/tuf-test-vectors/config')), msg='Missing submodule config "tests/tuf-test-vectors/config"')
964 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/third_party/googletest/config')), msg='Missing submodule config "third_party/googletest/config"')
965 self.assertTrue(os.path.exists(os.path.join(repo_path, '.git/modules/third_party/HdrHistogram_c/config')), msg='Missing submodule config "third_party/HdrHistogram_c/config"')
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500966
Brad Bishop393846f2019-05-20 12:24:11 -0400967 def test_git_submodule_iotedge(self):
968 """ Prevent regression on deeply nested submodules not being checked out properly, even though they were fetched. """
969
970 # This repository also has submodules where the module (name), path and url do not align
971 url = "gitsm://github.com/azure/iotedge.git;protocol=git;rev=d76e0316c6f324345d77c48a83ce836d09392699"
972 fetcher = bb.fetch.Fetch([url], self.d)
973 fetcher.download()
974 # Previous cwd has been deleted
975 os.chdir(os.path.dirname(self.unpackdir))
976 fetcher.unpack(self.unpackdir)
977
978 repo_path = os.path.join(self.tempdir, 'unpacked', 'git')
979
980 self.assertTrue(os.path.exists(os.path.join(repo_path, 'edgelet/hsm-sys/azure-iot-hsm-c/deps/c-shared/README.md')), msg='Missing submodule checkout')
981 self.assertTrue(os.path.exists(os.path.join(repo_path, 'edgelet/hsm-sys/azure-iot-hsm-c/deps/c-shared/testtools/ctest/README.md')), msg='Missing submodule checkout')
982 self.assertTrue(os.path.exists(os.path.join(repo_path, 'edgelet/hsm-sys/azure-iot-hsm-c/deps/c-shared/testtools/testrunner/readme.md')), msg='Missing submodule checkout')
983 self.assertTrue(os.path.exists(os.path.join(repo_path, 'edgelet/hsm-sys/azure-iot-hsm-c/deps/c-shared/testtools/umock-c/readme.md')), msg='Missing submodule checkout')
984 self.assertTrue(os.path.exists(os.path.join(repo_path, 'edgelet/hsm-sys/azure-iot-hsm-c/deps/c-shared/testtools/umock-c/deps/ctest/README.md')), msg='Missing submodule checkout')
985 self.assertTrue(os.path.exists(os.path.join(repo_path, 'edgelet/hsm-sys/azure-iot-hsm-c/deps/c-shared/testtools/umock-c/deps/testrunner/readme.md')), msg='Missing submodule checkout')
986 self.assertTrue(os.path.exists(os.path.join(repo_path, 'edgelet/hsm-sys/azure-iot-hsm-c/deps/utpm/README.md')), msg='Missing submodule checkout')
987 self.assertTrue(os.path.exists(os.path.join(repo_path, 'edgelet/hsm-sys/azure-iot-hsm-c/deps/utpm/deps/c-utility/README.md')), msg='Missing submodule checkout')
988 self.assertTrue(os.path.exists(os.path.join(repo_path, 'edgelet/hsm-sys/azure-iot-hsm-c/deps/utpm/deps/c-utility/testtools/ctest/README.md')), msg='Missing submodule checkout')
989 self.assertTrue(os.path.exists(os.path.join(repo_path, 'edgelet/hsm-sys/azure-iot-hsm-c/deps/utpm/deps/c-utility/testtools/testrunner/readme.md')), msg='Missing submodule checkout')
990 self.assertTrue(os.path.exists(os.path.join(repo_path, 'edgelet/hsm-sys/azure-iot-hsm-c/deps/utpm/deps/c-utility/testtools/umock-c/readme.md')), msg='Missing submodule checkout')
991 self.assertTrue(os.path.exists(os.path.join(repo_path, 'edgelet/hsm-sys/azure-iot-hsm-c/deps/utpm/deps/c-utility/testtools/umock-c/deps/ctest/README.md')), msg='Missing submodule checkout')
992 self.assertTrue(os.path.exists(os.path.join(repo_path, 'edgelet/hsm-sys/azure-iot-hsm-c/deps/utpm/deps/c-utility/testtools/umock-c/deps/testrunner/readme.md')), msg='Missing submodule checkout')
993
Brad Bishop15ae2502019-06-18 21:44:24 -0400994class SVNTest(FetcherTest):
995 def skipIfNoSvn():
996 import shutil
997 if not shutil.which("svn"):
998 return unittest.skip("svn not installed, tests being skipped")
999
1000 if not shutil.which("svnadmin"):
1001 return unittest.skip("svnadmin not installed, tests being skipped")
1002
1003 return lambda f: f
1004
1005 @skipIfNoSvn()
1006 def setUp(self):
1007 """ Create a local repository """
1008
1009 super(SVNTest, self).setUp()
1010
1011 # Create something we can fetch
1012 src_dir = tempfile.mkdtemp(dir=self.tempdir,
1013 prefix='svnfetch_srcdir_')
1014 src_dir = os.path.abspath(src_dir)
1015 bb.process.run("echo readme > README.md", cwd=src_dir)
1016
1017 # Store it in a local SVN repository
1018 repo_dir = tempfile.mkdtemp(dir=self.tempdir,
1019 prefix='svnfetch_localrepo_')
1020 repo_dir = os.path.abspath(repo_dir)
1021 bb.process.run("svnadmin create project", cwd=repo_dir)
1022
1023 self.repo_url = "file://%s/project" % repo_dir
1024 bb.process.run("svn import --non-interactive -m 'Initial import' %s %s/trunk" % (src_dir, self.repo_url),
1025 cwd=repo_dir)
1026
1027 bb.process.run("svn co %s svnfetch_co" % self.repo_url, cwd=self.tempdir)
1028 # Github will emulate SVN. Use this to check if we're downloding...
1029 bb.process.run("svn propset svn:externals 'bitbake http://github.com/openembedded/bitbake' .",
1030 cwd=os.path.join(self.tempdir, 'svnfetch_co', 'trunk'))
1031 bb.process.run("svn commit --non-interactive -m 'Add external'",
1032 cwd=os.path.join(self.tempdir, 'svnfetch_co', 'trunk'))
1033
1034 self.src_dir = src_dir
1035 self.repo_dir = repo_dir
1036
1037 @skipIfNoSvn()
1038 def tearDown(self):
1039 os.chdir(self.origdir)
1040 if os.environ.get("BB_TMPDIR_NOCLEAN") == "yes":
1041 print("Not cleaning up %s. Please remove manually." % self.tempdir)
1042 else:
1043 bb.utils.prunedir(self.tempdir)
1044
1045 @skipIfNoSvn()
1046 @skipIfNoNetwork()
1047 def test_noexternal_svn(self):
1048 # Always match the rev count from setUp (currently rev 2)
1049 url = "svn://%s;module=trunk;protocol=file;rev=2" % self.repo_url.replace('file://', '')
1050 fetcher = bb.fetch.Fetch([url], self.d)
1051 fetcher.download()
1052 os.chdir(os.path.dirname(self.unpackdir))
1053 fetcher.unpack(self.unpackdir)
1054
1055 self.assertTrue(os.path.exists(os.path.join(self.unpackdir, 'trunk')), msg="Missing trunk")
1056 self.assertTrue(os.path.exists(os.path.join(self.unpackdir, 'trunk', 'README.md')), msg="Missing contents")
1057 self.assertFalse(os.path.exists(os.path.join(self.unpackdir, 'trunk/bitbake/trunk')), msg="External dir should NOT exist")
1058 self.assertFalse(os.path.exists(os.path.join(self.unpackdir, 'trunk/bitbake/trunk', 'README')), msg="External README should NOT exit")
1059
1060 @skipIfNoSvn()
1061 def test_external_svn(self):
1062 # Always match the rev count from setUp (currently rev 2)
1063 url = "svn://%s;module=trunk;protocol=file;externals=allowed;rev=2" % self.repo_url.replace('file://', '')
1064 fetcher = bb.fetch.Fetch([url], self.d)
1065 fetcher.download()
1066 os.chdir(os.path.dirname(self.unpackdir))
1067 fetcher.unpack(self.unpackdir)
1068
1069 self.assertTrue(os.path.exists(os.path.join(self.unpackdir, 'trunk')), msg="Missing trunk")
1070 self.assertTrue(os.path.exists(os.path.join(self.unpackdir, 'trunk', 'README.md')), msg="Missing contents")
1071 self.assertTrue(os.path.exists(os.path.join(self.unpackdir, 'trunk/bitbake/trunk')), msg="External dir should exist")
1072 self.assertTrue(os.path.exists(os.path.join(self.unpackdir, 'trunk/bitbake/trunk', 'README')), msg="External README should exit")
1073
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001074class TrustedNetworksTest(FetcherTest):
1075 def test_trusted_network(self):
1076 # Ensure trusted_network returns False when the host IS in the list.
1077 url = "git://Someserver.org/foo;rev=1"
1078 self.d.setVar("BB_ALLOWED_NETWORKS", "server1.org someserver.org server2.org server3.org")
1079 self.assertTrue(bb.fetch.trusted_network(self.d, url))
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001080
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001081 def test_wild_trusted_network(self):
1082 # Ensure trusted_network returns true when the *.host IS in the list.
1083 url = "git://Someserver.org/foo;rev=1"
1084 self.d.setVar("BB_ALLOWED_NETWORKS", "server1.org *.someserver.org server2.org server3.org")
1085 self.assertTrue(bb.fetch.trusted_network(self.d, url))
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001086
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001087 def test_prefix_wild_trusted_network(self):
1088 # Ensure trusted_network returns true when the prefix matches *.host.
1089 url = "git://git.Someserver.org/foo;rev=1"
1090 self.d.setVar("BB_ALLOWED_NETWORKS", "server1.org *.someserver.org server2.org server3.org")
1091 self.assertTrue(bb.fetch.trusted_network(self.d, url))
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001092
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001093 def test_two_prefix_wild_trusted_network(self):
1094 # Ensure trusted_network returns true when the prefix matches *.host.
1095 url = "git://something.git.Someserver.org/foo;rev=1"
1096 self.d.setVar("BB_ALLOWED_NETWORKS", "server1.org *.someserver.org server2.org server3.org")
1097 self.assertTrue(bb.fetch.trusted_network(self.d, url))
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001098
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001099 def test_port_trusted_network(self):
1100 # Ensure trusted_network returns True, even if the url specifies a port.
1101 url = "git://someserver.org:8080/foo;rev=1"
1102 self.d.setVar("BB_ALLOWED_NETWORKS", "someserver.org")
1103 self.assertTrue(bb.fetch.trusted_network(self.d, url))
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001104
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001105 def test_untrusted_network(self):
1106 # Ensure trusted_network returns False when the host is NOT in the list.
1107 url = "git://someserver.org/foo;rev=1"
1108 self.d.setVar("BB_ALLOWED_NETWORKS", "server1.org server2.org server3.org")
1109 self.assertFalse(bb.fetch.trusted_network(self.d, url))
1110
1111 def test_wild_untrusted_network(self):
1112 # Ensure trusted_network returns False when the host is NOT in the list.
1113 url = "git://*.someserver.org/foo;rev=1"
1114 self.d.setVar("BB_ALLOWED_NETWORKS", "server1.org server2.org server3.org")
1115 self.assertFalse(bb.fetch.trusted_network(self.d, url))
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001116
1117class URLHandle(unittest.TestCase):
1118
1119 datatable = {
1120 "http://www.google.com/index.html" : ('http', 'www.google.com', '/index.html', '', '', {}),
1121 "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 -06001122 "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 -05001123 "git://git.openembedded.org/bitbake;branch=@foo" : ('git', 'git.openembedded.org', '/bitbake', '', '', {'branch': '@foo'}),
1124 "file://somelocation;someparam=1": ('file', '', 'somelocation', '', '', {'someparam': '1'}),
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001125 }
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001126 # we require a pathname to encodeurl but users can still pass such urls to
1127 # decodeurl and we need to handle them
1128 decodedata = datatable.copy()
1129 decodedata.update({
Brad Bishop1a4b7ee2018-12-16 17:11:34 -08001130 "http://somesite.net;someparam=1": ('http', 'somesite.net', '/', '', '', {'someparam': '1'}),
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001131 })
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001132
1133 def test_decodeurl(self):
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001134 for k, v in self.decodedata.items():
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001135 result = bb.fetch.decodeurl(k)
1136 self.assertEqual(result, v)
1137
1138 def test_encodeurl(self):
1139 for k, v in self.datatable.items():
1140 result = bb.fetch.encodeurl(v)
1141 self.assertEqual(result, k)
1142
1143class FetchLatestVersionTest(FetcherTest):
1144
1145 test_git_uris = {
1146 # version pattern "X.Y.Z"
1147 ("mx-1.0", "git://github.com/clutter-project/mx.git;branch=mx-1.4", "9b1db6b8060bd00b121a692f942404a24ae2960f", "")
1148 : "1.99.4",
1149 # version pattern "vX.Y"
1150 ("mtd-utils", "git://git.infradead.org/mtd-utils.git", "ca39eb1d98e736109c64ff9c1aa2a6ecca222d8f", "")
1151 : "1.5.0",
1152 # version pattern "pkg_name-X.Y"
1153 ("presentproto", "git://anongit.freedesktop.org/git/xorg/proto/presentproto", "24f3a56e541b0a9e6c6ee76081f441221a120ef9", "")
1154 : "1.0",
1155 # version pattern "pkg_name-vX.Y.Z"
1156 ("dtc", "git://git.qemu.org/dtc.git", "65cc4d2748a2c2e6f27f1cf39e07a5dbabd80ebf", "")
1157 : "1.4.0",
1158 # combination version pattern
Brad Bishop1a4b7ee2018-12-16 17:11:34 -08001159 ("sysprof", "git://gitlab.gnome.org/GNOME/sysprof.git;protocol=https", "cd44ee6644c3641507fb53b8a2a69137f2971219", "")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001160 : "1.2.0",
1161 ("u-boot-mkimage", "git://git.denx.de/u-boot.git;branch=master;protocol=git", "62c175fbb8a0f9a926c88294ea9f7e88eb898f6c", "")
1162 : "2014.01",
1163 # version pattern "yyyymmdd"
Brad Bishop1a4b7ee2018-12-16 17:11:34 -08001164 ("mobile-broadband-provider-info", "git://gitlab.gnome.org/GNOME/mobile-broadband-provider-info.git;protocol=https", "4ed19e11c2975105b71b956440acdb25d46a347d", "")
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001165 : "20120614",
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001166 # packages with a valid UPSTREAM_CHECK_GITTAGREGEX
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001167 ("xf86-video-omap", "git://anongit.freedesktop.org/xorg/driver/xf86-video-omap", "ae0394e687f1a77e966cf72f895da91840dffb8f", "(?P<pver>(\d+\.(\d\.?)*))")
1168 : "0.4.3",
1169 ("build-appliance-image", "git://git.yoctoproject.org/poky", "b37dd451a52622d5b570183a81583cc34c2ff555", "(?P<pver>(([0-9][\.|_]?)+[0-9]))")
1170 : "11.0.0",
1171 ("chkconfig-alternatives-native", "git://github.com/kergoth/chkconfig;branch=sysroot", "cd437ecbd8986c894442f8fce1e0061e20f04dee", "chkconfig\-(?P<pver>((\d+[\.\-_]*)+))")
1172 : "1.3.59",
1173 ("remake", "git://github.com/rocky/remake.git", "f05508e521987c8494c92d9c2871aec46307d51d", "(?P<pver>(\d+\.(\d+\.)*\d*(\+dbg\d+(\.\d+)*)*))")
1174 : "3.82+dbg0.9",
1175 }
1176
1177 test_wget_uris = {
1178 # packages with versions inside directory name
1179 ("util-linux", "http://kernel.org/pub/linux/utils/util-linux/v2.23/util-linux-2.24.2.tar.bz2", "", "")
1180 : "2.24.2",
1181 ("enchant", "http://www.abisource.com/downloads/enchant/1.6.0/enchant-1.6.0.tar.gz", "", "")
1182 : "1.6.0",
1183 ("cmake", "http://www.cmake.org/files/v2.8/cmake-2.8.12.1.tar.gz", "", "")
1184 : "2.8.12.1",
1185 # packages with versions only in current directory
1186 ("eglic", "http://downloads.yoctoproject.org/releases/eglibc/eglibc-2.18-svnr23787.tar.bz2", "", "")
1187 : "2.19",
1188 ("gnu-config", "http://downloads.yoctoproject.org/releases/gnu-config/gnu-config-20120814.tar.bz2", "", "")
1189 : "20120814",
1190 # packages with "99" in the name of possible version
1191 ("pulseaudio", "http://freedesktop.org/software/pulseaudio/releases/pulseaudio-4.0.tar.xz", "", "")
1192 : "5.0",
1193 ("xserver-xorg", "http://xorg.freedesktop.org/releases/individual/xserver/xorg-server-1.15.1.tar.bz2", "", "")
1194 : "1.15.1",
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001195 # packages with valid UPSTREAM_CHECK_URI and UPSTREAM_CHECK_REGEX
1196 ("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 -05001197 : "2.0.0",
1198 ("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")
1199 : "6.1.19",
1200 }
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001201
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001202 @skipIfNoNetwork()
1203 def test_git_latest_versionstring(self):
1204 for k, v in self.test_git_uris.items():
1205 self.d.setVar("PN", k[0])
1206 self.d.setVar("SRCREV", k[2])
1207 self.d.setVar("UPSTREAM_CHECK_GITTAGREGEX", k[3])
1208 ud = bb.fetch2.FetchData(k[1], self.d)
1209 pupver= ud.method.latest_versionstring(ud, self.d)
1210 verstring = pupver[0]
Brad Bishop316dfdd2018-06-25 12:45:53 -04001211 self.assertTrue(verstring, msg="Could not find upstream version for %s" % k[0])
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001212 r = bb.utils.vercmp_string(v, verstring)
1213 self.assertTrue(r == -1 or r == 0, msg="Package %s, version: %s <= %s" % (k[0], v, verstring))
1214
1215 @skipIfNoNetwork()
1216 def test_wget_latest_versionstring(self):
1217 for k, v in self.test_wget_uris.items():
1218 self.d.setVar("PN", k[0])
1219 self.d.setVar("UPSTREAM_CHECK_URI", k[2])
1220 self.d.setVar("UPSTREAM_CHECK_REGEX", k[3])
1221 ud = bb.fetch2.FetchData(k[1], self.d)
1222 pupver = ud.method.latest_versionstring(ud, self.d)
1223 verstring = pupver[0]
Brad Bishop316dfdd2018-06-25 12:45:53 -04001224 self.assertTrue(verstring, msg="Could not find upstream version for %s" % k[0])
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001225 r = bb.utils.vercmp_string(v, verstring)
1226 self.assertTrue(r == -1 or r == 0, msg="Package %s, version: %s <= %s" % (k[0], v, verstring))
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001227
1228
1229class FetchCheckStatusTest(FetcherTest):
1230 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 -05001231 "http://www.cups.org/",
1232 "http://downloads.yoctoproject.org/releases/sato/sato-engine-0.1.tar.gz",
1233 "http://downloads.yoctoproject.org/releases/sato/sato-engine-0.2.tar.gz",
1234 "http://downloads.yoctoproject.org/releases/sato/sato-engine-0.3.tar.gz",
1235 "https://yoctoproject.org/",
1236 "https://yoctoproject.org/documentation",
1237 "http://downloads.yoctoproject.org/releases/opkg/opkg-0.1.7.tar.gz",
1238 "http://downloads.yoctoproject.org/releases/opkg/opkg-0.3.0.tar.gz",
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001239 "ftp://sourceware.org/pub/libffi/libffi-1.20.tar.gz",
1240 "http://ftp.gnu.org/gnu/autoconf/autoconf-2.60.tar.gz",
1241 "https://ftp.gnu.org/gnu/chess/gnuchess-5.08.tar.gz",
1242 "https://ftp.gnu.org/gnu/gmp/gmp-4.0.tar.gz",
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001243 # GitHub releases are hosted on Amazon S3, which doesn't support HEAD
1244 "https://github.com/kergoth/tslib/releases/download/1.1/tslib-1.1.tar.xz"
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001245 ]
1246
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001247 @skipIfNoNetwork()
1248 def test_wget_checkstatus(self):
1249 fetch = bb.fetch2.Fetch(self.test_wget_uris, self.d)
1250 for u in self.test_wget_uris:
1251 with self.subTest(url=u):
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001252 ud = fetch.ud[u]
1253 m = ud.method
1254 ret = m.checkstatus(fetch, ud, self.d)
1255 self.assertTrue(ret, msg="URI %s, can't check status" % (u))
1256
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001257 @skipIfNoNetwork()
1258 def test_wget_checkstatus_connection_cache(self):
1259 from bb.fetch2 import FetchConnectionCache
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001260
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001261 connection_cache = FetchConnectionCache()
1262 fetch = bb.fetch2.Fetch(self.test_wget_uris, self.d,
1263 connection_cache = connection_cache)
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001264
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001265 for u in self.test_wget_uris:
1266 with self.subTest(url=u):
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001267 ud = fetch.ud[u]
1268 m = ud.method
1269 ret = m.checkstatus(fetch, ud, self.d)
1270 self.assertTrue(ret, msg="URI %s, can't check status" % (u))
1271
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001272 connection_cache.close_connections()
1273
1274
1275class GitMakeShallowTest(FetcherTest):
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001276 def setUp(self):
1277 FetcherTest.setUp(self)
1278 self.gitdir = os.path.join(self.tempdir, 'gitshallow')
1279 bb.utils.mkdirhier(self.gitdir)
1280 bb.process.run('git init', cwd=self.gitdir)
1281
1282 def assertRefs(self, expected_refs):
1283 actual_refs = self.git(['for-each-ref', '--format=%(refname)']).splitlines()
1284 full_expected = self.git(['rev-parse', '--symbolic-full-name'] + expected_refs).splitlines()
1285 self.assertEqual(sorted(full_expected), sorted(actual_refs))
1286
1287 def assertRevCount(self, expected_count, args=None):
1288 if args is None:
1289 args = ['HEAD']
1290 revs = self.git(['rev-list'] + args)
1291 actual_count = len(revs.splitlines())
1292 self.assertEqual(expected_count, actual_count, msg='Object count `%d` is not the expected `%d`' % (actual_count, expected_count))
1293
1294 def git(self, cmd):
1295 if isinstance(cmd, str):
1296 cmd = 'git ' + cmd
1297 else:
1298 cmd = ['git'] + cmd
1299 return bb.process.run(cmd, cwd=self.gitdir)[0]
1300
1301 def make_shallow(self, args=None):
1302 if args is None:
1303 args = ['HEAD']
Brad Bishop316dfdd2018-06-25 12:45:53 -04001304 return bb.process.run([bb.fetch2.git.Git.make_shallow_path] + args, cwd=self.gitdir)
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001305
1306 def add_empty_file(self, path, msg=None):
1307 if msg is None:
1308 msg = path
1309 open(os.path.join(self.gitdir, path), 'w').close()
1310 self.git(['add', path])
1311 self.git(['commit', '-m', msg, path])
1312
1313 def test_make_shallow_single_branch_no_merge(self):
1314 self.add_empty_file('a')
1315 self.add_empty_file('b')
1316 self.assertRevCount(2)
1317 self.make_shallow()
1318 self.assertRevCount(1)
1319
1320 def test_make_shallow_single_branch_one_merge(self):
1321 self.add_empty_file('a')
1322 self.add_empty_file('b')
1323 self.git('checkout -b a_branch')
1324 self.add_empty_file('c')
1325 self.git('checkout master')
1326 self.add_empty_file('d')
1327 self.git('merge --no-ff --no-edit a_branch')
1328 self.git('branch -d a_branch')
1329 self.add_empty_file('e')
1330 self.assertRevCount(6)
1331 self.make_shallow(['HEAD~2'])
1332 self.assertRevCount(5)
1333
1334 def test_make_shallow_at_merge(self):
1335 self.add_empty_file('a')
1336 self.git('checkout -b a_branch')
1337 self.add_empty_file('b')
1338 self.git('checkout master')
1339 self.git('merge --no-ff --no-edit a_branch')
1340 self.git('branch -d a_branch')
1341 self.assertRevCount(3)
1342 self.make_shallow()
1343 self.assertRevCount(1)
1344
1345 def test_make_shallow_annotated_tag(self):
1346 self.add_empty_file('a')
1347 self.add_empty_file('b')
1348 self.git('tag -a -m a_tag a_tag')
1349 self.assertRevCount(2)
1350 self.make_shallow(['a_tag'])
1351 self.assertRevCount(1)
1352
1353 def test_make_shallow_multi_ref(self):
1354 self.add_empty_file('a')
1355 self.add_empty_file('b')
1356 self.git('checkout -b a_branch')
1357 self.add_empty_file('c')
1358 self.git('checkout master')
1359 self.add_empty_file('d')
1360 self.git('checkout -b a_branch_2')
1361 self.add_empty_file('a_tag')
1362 self.git('tag a_tag')
1363 self.git('checkout master')
1364 self.git('branch -D a_branch_2')
1365 self.add_empty_file('e')
1366 self.assertRevCount(6, ['--all'])
1367 self.make_shallow()
1368 self.assertRevCount(5, ['--all'])
1369
1370 def test_make_shallow_multi_ref_trim(self):
1371 self.add_empty_file('a')
1372 self.git('checkout -b a_branch')
1373 self.add_empty_file('c')
1374 self.git('checkout master')
1375 self.assertRevCount(1)
1376 self.assertRevCount(2, ['--all'])
1377 self.assertRefs(['master', 'a_branch'])
1378 self.make_shallow(['-r', 'master', 'HEAD'])
1379 self.assertRevCount(1, ['--all'])
1380 self.assertRefs(['master'])
1381
1382 def test_make_shallow_noop(self):
1383 self.add_empty_file('a')
1384 self.assertRevCount(1)
1385 self.make_shallow()
1386 self.assertRevCount(1)
1387
1388 @skipIfNoNetwork()
1389 def test_make_shallow_bitbake(self):
1390 self.git('remote add origin https://github.com/openembedded/bitbake')
1391 self.git('fetch --tags origin')
1392 orig_revs = len(self.git('rev-list --all').splitlines())
1393 self.make_shallow(['refs/tags/1.10.0'])
1394 self.assertRevCount(orig_revs - 1746, ['--all'])
1395
1396class GitShallowTest(FetcherTest):
1397 def setUp(self):
1398 FetcherTest.setUp(self)
1399 self.gitdir = os.path.join(self.tempdir, 'git')
1400 self.srcdir = os.path.join(self.tempdir, 'gitsource')
1401
1402 bb.utils.mkdirhier(self.srcdir)
1403 self.git('init', cwd=self.srcdir)
1404 self.d.setVar('WORKDIR', self.tempdir)
1405 self.d.setVar('S', self.gitdir)
1406 self.d.delVar('PREMIRRORS')
1407 self.d.delVar('MIRRORS')
1408
1409 uri = 'git://%s;protocol=file;subdir=${S}' % self.srcdir
1410 self.d.setVar('SRC_URI', uri)
1411 self.d.setVar('SRCREV', '${AUTOREV}')
1412 self.d.setVar('AUTOREV', '${@bb.fetch2.get_autorev(d)}')
1413
1414 self.d.setVar('BB_GIT_SHALLOW', '1')
1415 self.d.setVar('BB_GENERATE_MIRROR_TARBALLS', '0')
1416 self.d.setVar('BB_GENERATE_SHALLOW_TARBALLS', '1')
1417
1418 def assertRefs(self, expected_refs, cwd=None):
1419 if cwd is None:
1420 cwd = self.gitdir
1421 actual_refs = self.git(['for-each-ref', '--format=%(refname)'], cwd=cwd).splitlines()
1422 full_expected = self.git(['rev-parse', '--symbolic-full-name'] + expected_refs, cwd=cwd).splitlines()
1423 self.assertEqual(sorted(set(full_expected)), sorted(set(actual_refs)))
1424
1425 def assertRevCount(self, expected_count, args=None, cwd=None):
1426 if args is None:
1427 args = ['HEAD']
1428 if cwd is None:
1429 cwd = self.gitdir
1430 revs = self.git(['rev-list'] + args, cwd=cwd)
1431 actual_count = len(revs.splitlines())
1432 self.assertEqual(expected_count, actual_count, msg='Object count `%d` is not the expected `%d`' % (actual_count, expected_count))
1433
1434 def git(self, cmd, cwd=None):
1435 if isinstance(cmd, str):
1436 cmd = 'git ' + cmd
1437 else:
1438 cmd = ['git'] + cmd
1439 if cwd is None:
1440 cwd = self.gitdir
1441 return bb.process.run(cmd, cwd=cwd)[0]
1442
1443 def add_empty_file(self, path, cwd=None, msg=None):
1444 if msg is None:
1445 msg = path
1446 if cwd is None:
1447 cwd = self.srcdir
1448 open(os.path.join(cwd, path), 'w').close()
1449 self.git(['add', path], cwd)
1450 self.git(['commit', '-m', msg, path], cwd)
1451
1452 def fetch(self, uri=None):
1453 if uri is None:
Brad Bishop19323692019-04-05 15:28:33 -04001454 uris = self.d.getVar('SRC_URI').split()
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001455 uri = uris[0]
1456 d = self.d
1457 else:
1458 d = self.d.createCopy()
1459 d.setVar('SRC_URI', uri)
1460 uri = d.expand(uri)
1461 uris = [uri]
1462
1463 fetcher = bb.fetch2.Fetch(uris, d)
1464 fetcher.download()
1465 ud = fetcher.ud[uri]
1466 return fetcher, ud
1467
1468 def fetch_and_unpack(self, uri=None):
1469 fetcher, ud = self.fetch(uri)
1470 fetcher.unpack(self.d.getVar('WORKDIR'))
1471 assert os.path.exists(self.d.getVar('S'))
1472 return fetcher, ud
1473
1474 def fetch_shallow(self, uri=None, disabled=False, keepclone=False):
1475 """Fetch a uri, generating a shallow tarball, then unpack using it"""
1476 fetcher, ud = self.fetch_and_unpack(uri)
1477 assert os.path.exists(ud.clonedir), 'Git clone in DLDIR (%s) does not exist for uri %s' % (ud.clonedir, uri)
1478
1479 # Confirm that the unpacked repo is unshallow
1480 if not disabled:
1481 assert os.path.exists(os.path.join(self.dldir, ud.mirrortarballs[0]))
1482
1483 # fetch and unpack, from the shallow tarball
1484 bb.utils.remove(self.gitdir, recurse=True)
1485 bb.utils.remove(ud.clonedir, recurse=True)
Brad Bishopf8caae32019-03-25 13:13:56 -04001486 bb.utils.remove(ud.clonedir.replace('gitsource', 'gitsubmodule'), recurse=True)
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001487
1488 # confirm that the unpacked repo is used when no git clone or git
1489 # mirror tarball is available
1490 fetcher, ud = self.fetch_and_unpack(uri)
1491 if not disabled:
1492 assert os.path.exists(os.path.join(self.gitdir, '.git', 'shallow')), 'Unpacked git repository at %s is not shallow' % self.gitdir
1493 else:
1494 assert not os.path.exists(os.path.join(self.gitdir, '.git', 'shallow')), 'Unpacked git repository at %s is shallow' % self.gitdir
1495 return fetcher, ud
1496
1497 def test_shallow_disabled(self):
1498 self.add_empty_file('a')
1499 self.add_empty_file('b')
1500 self.assertRevCount(2, cwd=self.srcdir)
1501
1502 self.d.setVar('BB_GIT_SHALLOW', '0')
1503 self.fetch_shallow(disabled=True)
1504 self.assertRevCount(2)
1505
1506 def test_shallow_nobranch(self):
1507 self.add_empty_file('a')
1508 self.add_empty_file('b')
1509 self.assertRevCount(2, cwd=self.srcdir)
1510
1511 srcrev = self.git('rev-parse HEAD', cwd=self.srcdir).strip()
1512 self.d.setVar('SRCREV', srcrev)
Brad Bishop19323692019-04-05 15:28:33 -04001513 uri = self.d.getVar('SRC_URI').split()[0]
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001514 uri = '%s;nobranch=1;bare=1' % uri
1515
1516 self.fetch_shallow(uri)
1517 self.assertRevCount(1)
1518
1519 # shallow refs are used to ensure the srcrev sticks around when we
1520 # have no other branches referencing it
1521 self.assertRefs(['refs/shallow/default'])
1522
1523 def test_shallow_default_depth_1(self):
1524 # Create initial git repo
1525 self.add_empty_file('a')
1526 self.add_empty_file('b')
1527 self.assertRevCount(2, cwd=self.srcdir)
1528
1529 self.fetch_shallow()
1530 self.assertRevCount(1)
1531
1532 def test_shallow_depth_0_disables(self):
1533 self.add_empty_file('a')
1534 self.add_empty_file('b')
1535 self.assertRevCount(2, cwd=self.srcdir)
1536
1537 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
1538 self.fetch_shallow(disabled=True)
1539 self.assertRevCount(2)
1540
1541 def test_shallow_depth_default_override(self):
1542 self.add_empty_file('a')
1543 self.add_empty_file('b')
1544 self.assertRevCount(2, cwd=self.srcdir)
1545
1546 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '2')
1547 self.d.setVar('BB_GIT_SHALLOW_DEPTH_default', '1')
1548 self.fetch_shallow()
1549 self.assertRevCount(1)
1550
1551 def test_shallow_depth_default_override_disable(self):
1552 self.add_empty_file('a')
1553 self.add_empty_file('b')
1554 self.add_empty_file('c')
1555 self.assertRevCount(3, cwd=self.srcdir)
1556
1557 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
1558 self.d.setVar('BB_GIT_SHALLOW_DEPTH_default', '2')
1559 self.fetch_shallow()
1560 self.assertRevCount(2)
1561
1562 def test_current_shallow_out_of_date_clone(self):
1563 # Create initial git repo
1564 self.add_empty_file('a')
1565 self.add_empty_file('b')
1566 self.add_empty_file('c')
1567 self.assertRevCount(3, cwd=self.srcdir)
1568
1569 # Clone and generate mirror tarball
1570 fetcher, ud = self.fetch()
1571
1572 # Ensure we have a current mirror tarball, but an out of date clone
1573 self.git('update-ref refs/heads/master refs/heads/master~1', cwd=ud.clonedir)
1574 self.assertRevCount(2, cwd=ud.clonedir)
1575
1576 # Fetch and unpack, from the current tarball, not the out of date clone
1577 bb.utils.remove(self.gitdir, recurse=True)
1578 fetcher, ud = self.fetch()
1579 fetcher.unpack(self.d.getVar('WORKDIR'))
1580 self.assertRevCount(1)
1581
1582 def test_shallow_single_branch_no_merge(self):
1583 self.add_empty_file('a')
1584 self.add_empty_file('b')
1585 self.assertRevCount(2, cwd=self.srcdir)
1586
1587 self.fetch_shallow()
1588 self.assertRevCount(1)
1589 assert os.path.exists(os.path.join(self.gitdir, 'a'))
1590 assert os.path.exists(os.path.join(self.gitdir, 'b'))
1591
1592 def test_shallow_no_dangling(self):
1593 self.add_empty_file('a')
1594 self.add_empty_file('b')
1595 self.assertRevCount(2, cwd=self.srcdir)
1596
1597 self.fetch_shallow()
1598 self.assertRevCount(1)
1599 assert not self.git('fsck --dangling')
1600
1601 def test_shallow_srcrev_branch_truncation(self):
1602 self.add_empty_file('a')
1603 self.add_empty_file('b')
1604 b_commit = self.git('rev-parse HEAD', cwd=self.srcdir).rstrip()
1605 self.add_empty_file('c')
1606 self.assertRevCount(3, cwd=self.srcdir)
1607
1608 self.d.setVar('SRCREV', b_commit)
1609 self.fetch_shallow()
1610
1611 # The 'c' commit was removed entirely, and 'a' was removed from history
1612 self.assertRevCount(1, ['--all'])
1613 self.assertEqual(self.git('rev-parse HEAD').strip(), b_commit)
1614 assert os.path.exists(os.path.join(self.gitdir, 'a'))
1615 assert os.path.exists(os.path.join(self.gitdir, 'b'))
1616 assert not os.path.exists(os.path.join(self.gitdir, 'c'))
1617
1618 def test_shallow_ref_pruning(self):
1619 self.add_empty_file('a')
1620 self.add_empty_file('b')
1621 self.git('branch a_branch', cwd=self.srcdir)
1622 self.assertRefs(['master', 'a_branch'], cwd=self.srcdir)
1623 self.assertRevCount(2, cwd=self.srcdir)
1624
1625 self.fetch_shallow()
1626
1627 self.assertRefs(['master', 'origin/master'])
1628 self.assertRevCount(1)
1629
1630 def test_shallow_submodules(self):
1631 self.add_empty_file('a')
1632 self.add_empty_file('b')
1633
1634 smdir = os.path.join(self.tempdir, 'gitsubmodule')
1635 bb.utils.mkdirhier(smdir)
1636 self.git('init', cwd=smdir)
Brad Bishop1a4b7ee2018-12-16 17:11:34 -08001637 # Make this look like it was cloned from a remote...
1638 self.git('config --add remote.origin.url "%s"' % smdir, cwd=smdir)
1639 self.git('config --add remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"', cwd=smdir)
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001640 self.add_empty_file('asub', cwd=smdir)
Brad Bishopf8caae32019-03-25 13:13:56 -04001641 self.add_empty_file('bsub', cwd=smdir)
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001642
1643 self.git('submodule init', cwd=self.srcdir)
1644 self.git('submodule add file://%s' % smdir, cwd=self.srcdir)
1645 self.git('submodule update', cwd=self.srcdir)
1646 self.git('commit -m submodule -a', cwd=self.srcdir)
1647
1648 uri = 'gitsm://%s;protocol=file;subdir=${S}' % self.srcdir
1649 fetcher, ud = self.fetch_shallow(uri)
1650
Brad Bishopf8caae32019-03-25 13:13:56 -04001651 # Verify the main repository is shallow
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001652 self.assertRevCount(1)
Brad Bishopf8caae32019-03-25 13:13:56 -04001653
1654 # Verify the gitsubmodule directory is present
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001655 assert os.listdir(os.path.join(self.gitdir, 'gitsubmodule'))
1656
Brad Bishopf8caae32019-03-25 13:13:56 -04001657 # Verify the submodule is also shallow
1658 self.assertRevCount(1, cwd=os.path.join(self.gitdir, 'gitsubmodule'))
1659
1660
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001661 if any(os.path.exists(os.path.join(p, 'git-annex')) for p in os.environ.get('PATH').split(':')):
1662 def test_shallow_annex(self):
1663 self.add_empty_file('a')
1664 self.add_empty_file('b')
1665 self.git('annex init', cwd=self.srcdir)
1666 open(os.path.join(self.srcdir, 'c'), 'w').close()
1667 self.git('annex add c', cwd=self.srcdir)
1668 self.git('commit -m annex-c -a', cwd=self.srcdir)
1669 bb.process.run('chmod u+w -R %s' % os.path.join(self.srcdir, '.git', 'annex'))
1670
1671 uri = 'gitannex://%s;protocol=file;subdir=${S}' % self.srcdir
1672 fetcher, ud = self.fetch_shallow(uri)
1673
1674 self.assertRevCount(1)
1675 assert './.git/annex/' in bb.process.run('tar -tzf %s' % os.path.join(self.dldir, ud.mirrortarballs[0]))[0]
1676 assert os.path.exists(os.path.join(self.gitdir, 'c'))
1677
1678 def test_shallow_multi_one_uri(self):
1679 # Create initial git repo
1680 self.add_empty_file('a')
1681 self.add_empty_file('b')
1682 self.git('checkout -b a_branch', cwd=self.srcdir)
1683 self.add_empty_file('c')
1684 self.add_empty_file('d')
1685 self.git('checkout master', cwd=self.srcdir)
1686 self.git('tag v0.0 a_branch', cwd=self.srcdir)
1687 self.add_empty_file('e')
1688 self.git('merge --no-ff --no-edit a_branch', cwd=self.srcdir)
1689 self.add_empty_file('f')
1690 self.assertRevCount(7, cwd=self.srcdir)
1691
Brad Bishop19323692019-04-05 15:28:33 -04001692 uri = self.d.getVar('SRC_URI').split()[0]
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001693 uri = '%s;branch=master,a_branch;name=master,a_branch' % uri
1694
1695 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
1696 self.d.setVar('BB_GIT_SHALLOW_REVS', 'v0.0')
1697 self.d.setVar('SRCREV_master', '${AUTOREV}')
1698 self.d.setVar('SRCREV_a_branch', '${AUTOREV}')
1699
1700 self.fetch_shallow(uri)
1701
1702 self.assertRevCount(5)
1703 self.assertRefs(['master', 'origin/master', 'origin/a_branch'])
1704
1705 def test_shallow_multi_one_uri_depths(self):
1706 # Create initial git repo
1707 self.add_empty_file('a')
1708 self.add_empty_file('b')
1709 self.git('checkout -b a_branch', cwd=self.srcdir)
1710 self.add_empty_file('c')
1711 self.add_empty_file('d')
1712 self.git('checkout master', cwd=self.srcdir)
1713 self.add_empty_file('e')
1714 self.git('merge --no-ff --no-edit a_branch', cwd=self.srcdir)
1715 self.add_empty_file('f')
1716 self.assertRevCount(7, cwd=self.srcdir)
1717
Brad Bishop19323692019-04-05 15:28:33 -04001718 uri = self.d.getVar('SRC_URI').split()[0]
Brad Bishopd7bf8c12018-02-25 22:55:05 -05001719 uri = '%s;branch=master,a_branch;name=master,a_branch' % uri
1720
1721 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
1722 self.d.setVar('BB_GIT_SHALLOW_DEPTH_master', '3')
1723 self.d.setVar('BB_GIT_SHALLOW_DEPTH_a_branch', '1')
1724 self.d.setVar('SRCREV_master', '${AUTOREV}')
1725 self.d.setVar('SRCREV_a_branch', '${AUTOREV}')
1726
1727 self.fetch_shallow(uri)
1728
1729 self.assertRevCount(4, ['--all'])
1730 self.assertRefs(['master', 'origin/master', 'origin/a_branch'])
1731
1732 def test_shallow_clone_preferred_over_shallow(self):
1733 self.add_empty_file('a')
1734 self.add_empty_file('b')
1735
1736 # Fetch once to generate the shallow tarball
1737 fetcher, ud = self.fetch()
1738 assert os.path.exists(os.path.join(self.dldir, ud.mirrortarballs[0]))
1739
1740 # Fetch and unpack with both the clonedir and shallow tarball available
1741 bb.utils.remove(self.gitdir, recurse=True)
1742 fetcher, ud = self.fetch_and_unpack()
1743
1744 # The unpacked tree should *not* be shallow
1745 self.assertRevCount(2)
1746 assert not os.path.exists(os.path.join(self.gitdir, '.git', 'shallow'))
1747
1748 def test_shallow_mirrors(self):
1749 self.add_empty_file('a')
1750 self.add_empty_file('b')
1751
1752 # Fetch once to generate the shallow tarball
1753 fetcher, ud = self.fetch()
1754 mirrortarball = ud.mirrortarballs[0]
1755 assert os.path.exists(os.path.join(self.dldir, mirrortarball))
1756
1757 # Set up the mirror
1758 mirrordir = os.path.join(self.tempdir, 'mirror')
1759 bb.utils.mkdirhier(mirrordir)
1760 self.d.setVar('PREMIRRORS', 'git://.*/.* file://%s/\n' % mirrordir)
1761
1762 os.rename(os.path.join(self.dldir, mirrortarball),
1763 os.path.join(mirrordir, mirrortarball))
1764
1765 # Fetch from the mirror
1766 bb.utils.remove(self.dldir, recurse=True)
1767 bb.utils.remove(self.gitdir, recurse=True)
1768 self.fetch_and_unpack()
1769 self.assertRevCount(1)
1770
1771 def test_shallow_invalid_depth(self):
1772 self.add_empty_file('a')
1773 self.add_empty_file('b')
1774
1775 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '-12')
1776 with self.assertRaises(bb.fetch2.FetchError):
1777 self.fetch()
1778
1779 def test_shallow_invalid_depth_default(self):
1780 self.add_empty_file('a')
1781 self.add_empty_file('b')
1782
1783 self.d.setVar('BB_GIT_SHALLOW_DEPTH_default', '-12')
1784 with self.assertRaises(bb.fetch2.FetchError):
1785 self.fetch()
1786
1787 def test_shallow_extra_refs(self):
1788 self.add_empty_file('a')
1789 self.add_empty_file('b')
1790 self.git('branch a_branch', cwd=self.srcdir)
1791 self.assertRefs(['master', 'a_branch'], cwd=self.srcdir)
1792 self.assertRevCount(2, cwd=self.srcdir)
1793
1794 self.d.setVar('BB_GIT_SHALLOW_EXTRA_REFS', 'refs/heads/a_branch')
1795 self.fetch_shallow()
1796
1797 self.assertRefs(['master', 'origin/master', 'origin/a_branch'])
1798 self.assertRevCount(1)
1799
1800 def test_shallow_extra_refs_wildcard(self):
1801 self.add_empty_file('a')
1802 self.add_empty_file('b')
1803 self.git('branch a_branch', cwd=self.srcdir)
1804 self.git('tag v1.0', cwd=self.srcdir)
1805 self.assertRefs(['master', 'a_branch', 'v1.0'], cwd=self.srcdir)
1806 self.assertRevCount(2, cwd=self.srcdir)
1807
1808 self.d.setVar('BB_GIT_SHALLOW_EXTRA_REFS', 'refs/tags/*')
1809 self.fetch_shallow()
1810
1811 self.assertRefs(['master', 'origin/master', 'v1.0'])
1812 self.assertRevCount(1)
1813
1814 def test_shallow_missing_extra_refs(self):
1815 self.add_empty_file('a')
1816 self.add_empty_file('b')
1817
1818 self.d.setVar('BB_GIT_SHALLOW_EXTRA_REFS', 'refs/heads/foo')
1819 with self.assertRaises(bb.fetch2.FetchError):
1820 self.fetch()
1821
1822 def test_shallow_missing_extra_refs_wildcard(self):
1823 self.add_empty_file('a')
1824 self.add_empty_file('b')
1825
1826 self.d.setVar('BB_GIT_SHALLOW_EXTRA_REFS', 'refs/tags/*')
1827 self.fetch()
1828
1829 def test_shallow_remove_revs(self):
1830 # Create initial git repo
1831 self.add_empty_file('a')
1832 self.add_empty_file('b')
1833 self.git('checkout -b a_branch', cwd=self.srcdir)
1834 self.add_empty_file('c')
1835 self.add_empty_file('d')
1836 self.git('checkout master', cwd=self.srcdir)
1837 self.git('tag v0.0 a_branch', cwd=self.srcdir)
1838 self.add_empty_file('e')
1839 self.git('merge --no-ff --no-edit a_branch', cwd=self.srcdir)
1840 self.git('branch -d a_branch', cwd=self.srcdir)
1841 self.add_empty_file('f')
1842 self.assertRevCount(7, cwd=self.srcdir)
1843
1844 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
1845 self.d.setVar('BB_GIT_SHALLOW_REVS', 'v0.0')
1846
1847 self.fetch_shallow()
1848
1849 self.assertRevCount(5)
1850
1851 def test_shallow_invalid_revs(self):
1852 self.add_empty_file('a')
1853 self.add_empty_file('b')
1854
1855 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
1856 self.d.setVar('BB_GIT_SHALLOW_REVS', 'v0.0')
1857
1858 with self.assertRaises(bb.fetch2.FetchError):
1859 self.fetch()
1860
1861 @skipIfNoNetwork()
1862 def test_bitbake(self):
1863 self.git('remote add --mirror=fetch origin git://github.com/openembedded/bitbake', cwd=self.srcdir)
1864 self.git('config core.bare true', cwd=self.srcdir)
1865 self.git('fetch', cwd=self.srcdir)
1866
1867 self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
1868 # Note that the 1.10.0 tag is annotated, so this also tests
1869 # reference of an annotated vs unannotated tag
1870 self.d.setVar('BB_GIT_SHALLOW_REVS', '1.10.0')
1871
1872 self.fetch_shallow()
1873
1874 # Confirm that the history of 1.10.0 was removed
1875 orig_revs = len(self.git('rev-list master', cwd=self.srcdir).splitlines())
1876 revs = len(self.git('rev-list master').splitlines())
1877 self.assertNotEqual(orig_revs, revs)
1878 self.assertRefs(['master', 'origin/master'])
1879 self.assertRevCount(orig_revs - 1758)
Brad Bishop1a4b7ee2018-12-16 17:11:34 -08001880
1881 def test_that_unpack_throws_an_error_when_the_git_clone_nor_shallow_tarball_exist(self):
1882 self.add_empty_file('a')
1883 fetcher, ud = self.fetch()
1884 bb.utils.remove(self.gitdir, recurse=True)
1885 bb.utils.remove(self.dldir, recurse=True)
1886
1887 with self.assertRaises(bb.fetch2.UnpackError) as context:
1888 fetcher.unpack(self.d.getVar('WORKDIR'))
1889
1890 self.assertIn("No up to date source found", context.exception.msg)
1891 self.assertIn("clone directory not available or not up to date", context.exception.msg)
1892
1893 @skipIfNoNetwork()
1894 def test_that_unpack_does_work_when_using_git_shallow_tarball_but_tarball_is_not_available(self):
1895 self.d.setVar('SRCREV', 'e5939ff608b95cdd4d0ab0e1935781ab9a276ac0')
1896 self.d.setVar('BB_GIT_SHALLOW', '1')
1897 self.d.setVar('BB_GENERATE_SHALLOW_TARBALLS', '1')
1898 fetcher = bb.fetch.Fetch(["git://git.yoctoproject.org/fstests"], self.d)
1899 fetcher.download()
1900
1901 bb.utils.remove(self.dldir + "/*.tar.gz")
1902 fetcher.unpack(self.unpackdir)
1903
1904 dir = os.listdir(self.unpackdir + "/git/")
1905 self.assertIn("fstests.doap", dir)