1*4882a593Smuzhiyun""" 2*4882a593SmuzhiyunBitBake 'Fetch' implementations 3*4882a593Smuzhiyun 4*4882a593SmuzhiyunClasses for obtaining upstream sources for the 5*4882a593SmuzhiyunBitBake build tools. 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun""" 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun# Copyright (C) 2003, 2004 Chris Larson 10*4882a593Smuzhiyun# 11*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0-only 12*4882a593Smuzhiyun# 13*4882a593Smuzhiyun# Based on functions from the base bb module, Copyright 2003 Holger Schurig 14*4882a593Smuzhiyun# 15*4882a593Smuzhiyun 16*4882a593Smuzhiyunimport os 17*4882a593Smuzhiyunimport urllib.request, urllib.parse, urllib.error 18*4882a593Smuzhiyunimport bb 19*4882a593Smuzhiyunimport bb.utils 20*4882a593Smuzhiyunfrom bb.fetch2 import FetchMethod, FetchError, ParameterError 21*4882a593Smuzhiyunfrom bb.fetch2 import logger 22*4882a593Smuzhiyun 23*4882a593Smuzhiyunclass Local(FetchMethod): 24*4882a593Smuzhiyun def supports(self, urldata, d): 25*4882a593Smuzhiyun """ 26*4882a593Smuzhiyun Check to see if a given url represents a local fetch. 27*4882a593Smuzhiyun """ 28*4882a593Smuzhiyun return urldata.type in ['file'] 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun def urldata_init(self, ud, d): 31*4882a593Smuzhiyun # We don't set localfile as for this fetcher the file is already local! 32*4882a593Smuzhiyun ud.decodedurl = urllib.parse.unquote(ud.url.split("://")[1].split(";")[0]) 33*4882a593Smuzhiyun ud.basename = os.path.basename(ud.decodedurl) 34*4882a593Smuzhiyun ud.basepath = ud.decodedurl 35*4882a593Smuzhiyun ud.needdonestamp = False 36*4882a593Smuzhiyun if "*" in ud.decodedurl: 37*4882a593Smuzhiyun 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) 38*4882a593Smuzhiyun return 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun def localpath(self, urldata, d): 41*4882a593Smuzhiyun """ 42*4882a593Smuzhiyun Return the local filename of a given url assuming a successful fetch. 43*4882a593Smuzhiyun """ 44*4882a593Smuzhiyun return self.localpaths(urldata, d)[-1] 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun def localpaths(self, urldata, d): 47*4882a593Smuzhiyun """ 48*4882a593Smuzhiyun Return the local filename of a given url assuming a successful fetch. 49*4882a593Smuzhiyun """ 50*4882a593Smuzhiyun searched = [] 51*4882a593Smuzhiyun path = urldata.decodedurl 52*4882a593Smuzhiyun newpath = path 53*4882a593Smuzhiyun if path[0] == "/": 54*4882a593Smuzhiyun return [path] 55*4882a593Smuzhiyun filespath = d.getVar('FILESPATH') 56*4882a593Smuzhiyun if filespath: 57*4882a593Smuzhiyun logger.debug2("Searching for %s in paths:\n %s" % (path, "\n ".join(filespath.split(":")))) 58*4882a593Smuzhiyun newpath, hist = bb.utils.which(filespath, path, history=True) 59*4882a593Smuzhiyun searched.extend(hist) 60*4882a593Smuzhiyun if not os.path.exists(newpath): 61*4882a593Smuzhiyun dldirfile = os.path.join(d.getVar("DL_DIR"), path) 62*4882a593Smuzhiyun logger.debug2("Defaulting to %s for %s" % (dldirfile, path)) 63*4882a593Smuzhiyun bb.utils.mkdirhier(os.path.dirname(dldirfile)) 64*4882a593Smuzhiyun searched.append(dldirfile) 65*4882a593Smuzhiyun return searched 66*4882a593Smuzhiyun return searched 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun def need_update(self, ud, d): 69*4882a593Smuzhiyun if os.path.exists(ud.localpath): 70*4882a593Smuzhiyun return False 71*4882a593Smuzhiyun return True 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun def download(self, urldata, d): 74*4882a593Smuzhiyun """Fetch urls (no-op for Local method)""" 75*4882a593Smuzhiyun # no need to fetch local files, we'll deal with them in place. 76*4882a593Smuzhiyun if self.supports_checksum(urldata) and not os.path.exists(urldata.localpath): 77*4882a593Smuzhiyun locations = [] 78*4882a593Smuzhiyun filespath = d.getVar('FILESPATH') 79*4882a593Smuzhiyun if filespath: 80*4882a593Smuzhiyun locations = filespath.split(":") 81*4882a593Smuzhiyun locations.append(d.getVar("DL_DIR")) 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun msg = "Unable to find file " + urldata.url + " anywhere. The paths that were searched were:\n " + "\n ".join(locations) 84*4882a593Smuzhiyun raise FetchError(msg) 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun return True 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun def checkstatus(self, fetch, urldata, d): 89*4882a593Smuzhiyun """ 90*4882a593Smuzhiyun Check the status of the url 91*4882a593Smuzhiyun """ 92*4882a593Smuzhiyun if os.path.exists(urldata.localpath): 93*4882a593Smuzhiyun return True 94*4882a593Smuzhiyun return False 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun def clean(self, urldata, d): 97*4882a593Smuzhiyun return 98*4882a593Smuzhiyun 99