summaryrefslogtreecommitdiffstats
path: root/bitbake/lib
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2020-08-25 14:49:12 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2020-08-26 09:05:38 +0100
commit1560a4b0cbb8b7ad12623635c64ce43d962e8dce (patch)
tree1e78e359a8f93bd7fe4e3e534ea1f7fabbaaa692 /bitbake/lib
parent3cfc4e9fa92ac594a137a4b6b29ae6ca980b26d6 (diff)
downloadpoky-1560a4b0cbb8b7ad12623635c64ce43d962e8dce.tar.gz
bitbake: fetch2: Drop globbing supprt in file:// SRC_URIs
Globbing in file:// urls is terminally broken. Currently when its used, the file checksum code is basically bypassed. This means changes to the source files don't change the task checksum, the task doesn't rebuild when the inputs change and things generally break. To make globbing work generically, we'd have to scan the file system for all possible matches to the glob and log whether they exist or not. We can't simply log the files which exist, we have to also know which files could later exist and influence the choice of file so we know when to reparse. For a simple file://xxx/*, this could be done but for bigger patterns, it becomes much more problemtic. We already support file://xxx/ in urls. So, lets decide we'll not support globs in file://urls. Worse case users can put files in a directory and reference that, moving files into place if needed. Remove all the glob special cases (see the comments if anyone doesn't believe this is terminally broken) and error to the user if they have such urls. (Bitbake rev: 0c9302d950c6f37bfcc4256b41001d63f668bdf7) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib')
-rw-r--r--bitbake/lib/bb/cache.py2
-rw-r--r--bitbake/lib/bb/fetch2/__init__.py12
-rw-r--r--bitbake/lib/bb/fetch2/local.py15
-rw-r--r--bitbake/lib/bb/tests/fetch.py4
4 files changed, 6 insertions, 27 deletions
diff --git a/bitbake/lib/bb/cache.py b/bitbake/lib/bb/cache.py
index b819a0c2da..9e0c931a07 100644
--- a/bitbake/lib/bb/cache.py
+++ b/bitbake/lib/bb/cache.py
@@ -636,7 +636,7 @@ class Cache(NoCache):
636 # Have to be careful about spaces and colons in filenames 636 # Have to be careful about spaces and colons in filenames
637 flist = self.filelist_regex.split(fl) 637 flist = self.filelist_regex.split(fl)
638 for f in flist: 638 for f in flist:
639 if not f or "*" in f: 639 if not f:
640 continue 640 continue
641 f, exist = f.split(":") 641 f, exist = f.split(":")
642 if (exist == "True" and not os.path.exists(f)) or (exist == "False" and os.path.exists(f)): 642 if (exist == "True" and not os.path.exists(f)) or (exist == "False" and os.path.exists(f)):
diff --git a/bitbake/lib/bb/fetch2/__init__.py b/bitbake/lib/bb/fetch2/__init__.py
index 756f60212f..7ec1fea5d0 100644
--- a/bitbake/lib/bb/fetch2/__init__.py
+++ b/bitbake/lib/bb/fetch2/__init__.py
@@ -1195,8 +1195,6 @@ def get_checksum_file_list(d):
1195 paths = ud.method.localpaths(ud, d) 1195 paths = ud.method.localpaths(ud, d)
1196 for f in paths: 1196 for f in paths:
1197 pth = ud.decodedurl 1197 pth = ud.decodedurl
1198 if '*' in pth:
1199 f = os.path.join(os.path.abspath(f), pth)
1200 if f.startswith(dl_dir): 1198 if f.startswith(dl_dir):
1201 # The local fetcher's behaviour is to return a path under DL_DIR if it couldn't find the file anywhere else 1199 # The local fetcher's behaviour is to return a path under DL_DIR if it couldn't find the file anywhere else
1202 if os.path.exists(f): 1200 if os.path.exists(f):
@@ -1365,9 +1363,6 @@ class FetchMethod(object):
1365 # We cannot compute checksums for directories 1363 # We cannot compute checksums for directories
1366 if os.path.isdir(urldata.localpath): 1364 if os.path.isdir(urldata.localpath):
1367 return False 1365 return False
1368 if urldata.localpath.find("*") != -1:
1369 return False
1370
1371 return True 1366 return True
1372 1367
1373 def recommends_checksum(self, urldata): 1368 def recommends_checksum(self, urldata):
@@ -1430,11 +1425,6 @@ class FetchMethod(object):
1430 iterate = False 1425 iterate = False
1431 file = urldata.localpath 1426 file = urldata.localpath
1432 1427
1433 # Localpath can't deal with 'dir/*' entries, so it converts them to '.',
1434 # but it must be corrected back for local files copying
1435 if urldata.basename == '*' and file.endswith('/.'):
1436 file = '%s/%s' % (file.rstrip('/.'), urldata.path)
1437
1438 try: 1428 try:
1439 unpack = bb.utils.to_boolean(urldata.parm.get('unpack'), True) 1429 unpack = bb.utils.to_boolean(urldata.parm.get('unpack'), True)
1440 except ValueError as exc: 1430 except ValueError as exc:
@@ -1613,8 +1603,6 @@ class FetchMethod(object):
1613 """ 1603 """
1614 if os.path.exists(ud.localpath): 1604 if os.path.exists(ud.localpath):
1615 return True 1605 return True
1616 if ud.localpath.find("*") != -1:
1617 return True
1618 return False 1606 return False
1619 1607
1620 def implicit_urldata(self, ud, d): 1608 def implicit_urldata(self, ud, d):
diff --git a/bitbake/lib/bb/fetch2/local.py b/bitbake/lib/bb/fetch2/local.py
index 01d9ff9f8f..25d4557db6 100644
--- a/bitbake/lib/bb/fetch2/local.py
+++ b/bitbake/lib/bb/fetch2/local.py
@@ -17,7 +17,7 @@ import os
17import urllib.request, urllib.parse, urllib.error 17import urllib.request, urllib.parse, urllib.error
18import bb 18import bb
19import bb.utils 19import bb.utils
20from bb.fetch2 import FetchMethod, FetchError 20from bb.fetch2 import FetchMethod, FetchError, ParameterError
21from bb.fetch2 import logger 21from bb.fetch2 import logger
22 22
23class Local(FetchMethod): 23class Local(FetchMethod):
@@ -33,6 +33,8 @@ class Local(FetchMethod):
33 ud.basename = os.path.basename(ud.decodedurl) 33 ud.basename = os.path.basename(ud.decodedurl)
34 ud.basepath = ud.decodedurl 34 ud.basepath = ud.decodedurl
35 ud.needdonestamp = False 35 ud.needdonestamp = False
36 if "*" in ud.decodedurl:
37 raise bb.fetch2.ParameterError("file:// urls using globbing are no longer supported. Please place the files in a directory and reference that instead.", ud.url)
36 return 38 return
37 39
38 def localpath(self, urldata, d): 40 def localpath(self, urldata, d):
@@ -55,12 +57,6 @@ class Local(FetchMethod):
55 logger.debug(2, "Searching for %s in paths:\n %s" % (path, "\n ".join(filespath.split(":")))) 57 logger.debug(2, "Searching for %s in paths:\n %s" % (path, "\n ".join(filespath.split(":"))))
56 newpath, hist = bb.utils.which(filespath, path, history=True) 58 newpath, hist = bb.utils.which(filespath, path, history=True)
57 searched.extend(hist) 59 searched.extend(hist)
58 if (not newpath or not os.path.exists(newpath)) and path.find("*") != -1:
59 # For expressions using '*', best we can do is take the first directory in FILESPATH that exists
60 newpath, hist = bb.utils.which(filespath, ".", history=True)
61 searched.extend(hist)
62 logger.debug(2, "Searching for %s in path: %s" % (path, newpath))
63 return searched
64 if not os.path.exists(newpath): 60 if not os.path.exists(newpath):
65 dldirfile = os.path.join(d.getVar("DL_DIR"), path) 61 dldirfile = os.path.join(d.getVar("DL_DIR"), path)
66 logger.debug(2, "Defaulting to %s for %s" % (dldirfile, path)) 62 logger.debug(2, "Defaulting to %s for %s" % (dldirfile, path))
@@ -70,8 +66,6 @@ class Local(FetchMethod):
70 return searched 66 return searched
71 67
72 def need_update(self, ud, d): 68 def need_update(self, ud, d):
73 if ud.url.find("*") != -1:
74 return False
75 if os.path.exists(ud.localpath): 69 if os.path.exists(ud.localpath):
76 return False 70 return False
77 return True 71 return True
@@ -95,9 +89,6 @@ class Local(FetchMethod):
95 """ 89 """
96 Check the status of the url 90 Check the status of the url
97 """ 91 """
98 if urldata.localpath.find("*") != -1:
99 logger.info("URL %s looks like a glob and was therefore not checked.", urldata.url)
100 return True
101 if os.path.exists(urldata.localpath): 92 if os.path.exists(urldata.localpath):
102 return True 93 return True
103 return False 94 return False
diff --git a/bitbake/lib/bb/tests/fetch.py b/bitbake/lib/bb/tests/fetch.py
index 61b80bedee..13561cea9b 100644
--- a/bitbake/lib/bb/tests/fetch.py
+++ b/bitbake/lib/bb/tests/fetch.py
@@ -602,8 +602,8 @@ class FetcherLocalTest(FetcherTest):
602 self.assertEqual(tree, ['a', 'dir/c']) 602 self.assertEqual(tree, ['a', 'dir/c'])
603 603
604 def test_local_wildcard(self): 604 def test_local_wildcard(self):
605 tree = self.fetchUnpack(['file://a', 'file://dir/*']) 605 with self.assertRaises(bb.fetch2.ParameterError):
606 self.assertEqual(tree, ['a', 'dir/c', 'dir/d', 'dir/subdir/e']) 606 tree = self.fetchUnpack(['file://a', 'file://dir/*'])
607 607
608 def test_local_dir(self): 608 def test_local_dir(self):
609 tree = self.fetchUnpack(['file://a', 'file://dir']) 609 tree = self.fetchUnpack(['file://a', 'file://dir'])