| Patrick Williams | c124f4f | 2015-09-15 14:41:29 -0500 | [diff] [blame] | 1 | """ | 
 | 2 | BitBake 'Fetch' implementations | 
 | 3 |  | 
 | 4 | Classes for obtaining upstream sources for the | 
 | 5 | BitBake build tools. | 
 | 6 |  | 
 | 7 | """ | 
 | 8 |  | 
 | 9 | # Copyright (C) 2003, 2004  Chris Larson | 
 | 10 | # | 
| Brad Bishop | c342db3 | 2019-05-15 21:57:59 -0400 | [diff] [blame] | 11 | # SPDX-License-Identifier: GPL-2.0-only | 
| Patrick Williams | c124f4f | 2015-09-15 14:41:29 -0500 | [diff] [blame] | 12 | # | 
 | 13 | # Based on functions from the base bb module, Copyright 2003 Holger Schurig | 
| Brad Bishop | c342db3 | 2019-05-15 21:57:59 -0400 | [diff] [blame] | 14 | # | 
| Patrick Williams | c124f4f | 2015-09-15 14:41:29 -0500 | [diff] [blame] | 15 |  | 
 | 16 | import os | 
| Patrick Williams | c0f7c04 | 2017-02-23 20:41:17 -0600 | [diff] [blame] | 17 | import urllib.request, urllib.parse, urllib.error | 
| Patrick Williams | c124f4f | 2015-09-15 14:41:29 -0500 | [diff] [blame] | 18 | import bb | 
 | 19 | import bb.utils | 
| Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 20 | from   bb.fetch2 import FetchMethod, FetchError, ParameterError | 
| Patrick Williams | c124f4f | 2015-09-15 14:41:29 -0500 | [diff] [blame] | 21 | from   bb.fetch2 import logger | 
 | 22 |  | 
 | 23 | class Local(FetchMethod): | 
 | 24 |     def supports(self, urldata, d): | 
 | 25 |         """ | 
 | 26 |         Check to see if a given url represents a local fetch. | 
 | 27 |         """ | 
 | 28 |         return urldata.type in ['file'] | 
 | 29 |  | 
 | 30 |     def urldata_init(self, ud, d): | 
 | 31 |         # We don't set localfile as for this fetcher the file is already local! | 
| Patrick Williams | c0f7c04 | 2017-02-23 20:41:17 -0600 | [diff] [blame] | 32 |         ud.decodedurl = urllib.parse.unquote(ud.url.split("://")[1].split(";")[0]) | 
| Patrick Williams | c124f4f | 2015-09-15 14:41:29 -0500 | [diff] [blame] | 33 |         ud.basename = os.path.basename(ud.decodedurl) | 
 | 34 |         ud.basepath = ud.decodedurl | 
| Patrick Williams | d8c66bc | 2016-06-20 12:57:21 -0500 | [diff] [blame] | 35 |         ud.needdonestamp = False | 
| Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 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) | 
| Patrick Williams | c124f4f | 2015-09-15 14:41:29 -0500 | [diff] [blame] | 38 |         return | 
 | 39 |  | 
 | 40 |     def localpath(self, urldata, d): | 
 | 41 |         """ | 
 | 42 |         Return the local filename of a given url assuming a successful fetch. | 
 | 43 |         """ | 
| Patrick Williams | e760df8 | 2023-05-26 11:10:49 -0500 | [diff] [blame] | 44 |         return self.localfile_searchpaths(urldata, d)[-1] | 
| Patrick Williams | c124f4f | 2015-09-15 14:41:29 -0500 | [diff] [blame] | 45 |  | 
| Patrick Williams | e760df8 | 2023-05-26 11:10:49 -0500 | [diff] [blame] | 46 |     def localfile_searchpaths(self, urldata, d): | 
| Patrick Williams | c124f4f | 2015-09-15 14:41:29 -0500 | [diff] [blame] | 47 |         """ | 
 | 48 |         Return the local filename of a given url assuming a successful fetch. | 
 | 49 |         """ | 
 | 50 |         searched = [] | 
 | 51 |         path = urldata.decodedurl | 
 | 52 |         newpath = path | 
 | 53 |         if path[0] == "/": | 
| Patrick Williams | e760df8 | 2023-05-26 11:10:49 -0500 | [diff] [blame] | 54 |             logger.debug2("Using absolute %s" % (path)) | 
| Patrick Williams | c124f4f | 2015-09-15 14:41:29 -0500 | [diff] [blame] | 55 |             return [path] | 
| Brad Bishop | 6e60e8b | 2018-02-01 10:27:11 -0500 | [diff] [blame] | 56 |         filespath = d.getVar('FILESPATH') | 
| Patrick Williams | c124f4f | 2015-09-15 14:41:29 -0500 | [diff] [blame] | 57 |         if filespath: | 
| Andrew Geissler | d1e8949 | 2021-02-12 15:35:20 -0600 | [diff] [blame] | 58 |             logger.debug2("Searching for %s in paths:\n    %s" % (path, "\n    ".join(filespath.split(":")))) | 
| Patrick Williams | c124f4f | 2015-09-15 14:41:29 -0500 | [diff] [blame] | 59 |             newpath, hist = bb.utils.which(filespath, path, history=True) | 
| Patrick Williams | e760df8 | 2023-05-26 11:10:49 -0500 | [diff] [blame] | 60 |             logger.debug2("Using %s for %s" % (newpath, path)) | 
| Patrick Williams | c124f4f | 2015-09-15 14:41:29 -0500 | [diff] [blame] | 61 |             searched.extend(hist) | 
| Patrick Williams | c124f4f | 2015-09-15 14:41:29 -0500 | [diff] [blame] | 62 |         return searched | 
 | 63 |  | 
 | 64 |     def need_update(self, ud, d): | 
| Patrick Williams | c124f4f | 2015-09-15 14:41:29 -0500 | [diff] [blame] | 65 |         if os.path.exists(ud.localpath): | 
 | 66 |             return False | 
 | 67 |         return True | 
 | 68 |  | 
 | 69 |     def download(self, urldata, d): | 
 | 70 |         """Fetch urls (no-op for Local method)""" | 
 | 71 |         # no need to fetch local files, we'll deal with them in place. | 
 | 72 |         if self.supports_checksum(urldata) and not os.path.exists(urldata.localpath): | 
 | 73 |             locations = [] | 
| Brad Bishop | 6e60e8b | 2018-02-01 10:27:11 -0500 | [diff] [blame] | 74 |             filespath = d.getVar('FILESPATH') | 
| Patrick Williams | c124f4f | 2015-09-15 14:41:29 -0500 | [diff] [blame] | 75 |             if filespath: | 
 | 76 |                 locations = filespath.split(":") | 
| Andrew Geissler | fc113ea | 2023-03-31 09:59:46 -0500 | [diff] [blame] | 77 |             msg = "Unable to find file " + urldata.url + " anywhere to download to " + urldata.localpath + ". The paths that were searched were:\n    " + "\n    ".join(locations) | 
| Patrick Williams | c124f4f | 2015-09-15 14:41:29 -0500 | [diff] [blame] | 78 |             raise FetchError(msg) | 
 | 79 |  | 
 | 80 |         return True | 
 | 81 |  | 
 | 82 |     def checkstatus(self, fetch, urldata, d): | 
 | 83 |         """ | 
 | 84 |         Check the status of the url | 
 | 85 |         """ | 
| Patrick Williams | c124f4f | 2015-09-15 14:41:29 -0500 | [diff] [blame] | 86 |         if os.path.exists(urldata.localpath): | 
 | 87 |             return True | 
 | 88 |         return False | 
 | 89 |  | 
 | 90 |     def clean(self, urldata, d): | 
 | 91 |         return | 
 | 92 |  |