1*4882a593Smuzhiyun# 2*4882a593Smuzhiyun# Copyright BitBake Contributors 3*4882a593Smuzhiyun# 4*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0-only 5*4882a593Smuzhiyun# 6*4882a593Smuzhiyun""" 7*4882a593SmuzhiyunBitbake "Fetch" implementation for osc (Opensuse build service client). 8*4882a593SmuzhiyunBased on the svn "Fetch" implementation. 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun""" 11*4882a593Smuzhiyun 12*4882a593Smuzhiyunimport logging 13*4882a593Smuzhiyunimport os 14*4882a593Smuzhiyunimport bb 15*4882a593Smuzhiyunfrom bb.fetch2 import FetchMethod 16*4882a593Smuzhiyunfrom bb.fetch2 import FetchError 17*4882a593Smuzhiyunfrom bb.fetch2 import MissingParameterError 18*4882a593Smuzhiyunfrom bb.fetch2 import runfetchcmd 19*4882a593Smuzhiyun 20*4882a593Smuzhiyunlogger = logging.getLogger(__name__) 21*4882a593Smuzhiyun 22*4882a593Smuzhiyunclass Osc(FetchMethod): 23*4882a593Smuzhiyun """Class to fetch a module or modules from Opensuse build server 24*4882a593Smuzhiyun repositories.""" 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun def supports(self, ud, d): 27*4882a593Smuzhiyun """ 28*4882a593Smuzhiyun Check to see if a given url can be fetched with osc. 29*4882a593Smuzhiyun """ 30*4882a593Smuzhiyun return ud.type in ['osc'] 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun def urldata_init(self, ud, d): 33*4882a593Smuzhiyun if not "module" in ud.parm: 34*4882a593Smuzhiyun raise MissingParameterError('module', ud.url) 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun ud.module = ud.parm["module"] 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun # Create paths to osc checkouts 39*4882a593Smuzhiyun oscdir = d.getVar("OSCDIR") or (d.getVar("DL_DIR") + "/osc") 40*4882a593Smuzhiyun relpath = self._strip_leading_slashes(ud.path) 41*4882a593Smuzhiyun ud.oscdir = oscdir 42*4882a593Smuzhiyun ud.pkgdir = os.path.join(oscdir, ud.host) 43*4882a593Smuzhiyun ud.moddir = os.path.join(ud.pkgdir, relpath, ud.module) 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun if 'rev' in ud.parm: 46*4882a593Smuzhiyun ud.revision = ud.parm['rev'] 47*4882a593Smuzhiyun else: 48*4882a593Smuzhiyun pv = d.getVar("PV", False) 49*4882a593Smuzhiyun rev = bb.fetch2.srcrev_internal_helper(ud, d, '') 50*4882a593Smuzhiyun if rev: 51*4882a593Smuzhiyun ud.revision = rev 52*4882a593Smuzhiyun else: 53*4882a593Smuzhiyun ud.revision = "" 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun ud.localfile = d.expand('%s_%s_%s.tar.gz' % (ud.module.replace('/', '.'), relpath.replace('/', '.'), ud.revision)) 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun def _buildosccommand(self, ud, d, command): 58*4882a593Smuzhiyun """ 59*4882a593Smuzhiyun Build up an ocs commandline based on ud 60*4882a593Smuzhiyun command is "fetch", "update", "info" 61*4882a593Smuzhiyun """ 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun basecmd = d.getVar("FETCHCMD_osc") or "/usr/bin/env osc" 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun proto = ud.parm.get('protocol', 'ocs') 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun options = [] 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun config = "-c %s" % self.generate_config(ud, d) 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun if ud.revision: 72*4882a593Smuzhiyun options.append("-r %s" % ud.revision) 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun coroot = self._strip_leading_slashes(ud.path) 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun if command == "fetch": 77*4882a593Smuzhiyun osccmd = "%s %s co %s/%s %s" % (basecmd, config, coroot, ud.module, " ".join(options)) 78*4882a593Smuzhiyun elif command == "update": 79*4882a593Smuzhiyun osccmd = "%s %s up %s" % (basecmd, config, " ".join(options)) 80*4882a593Smuzhiyun else: 81*4882a593Smuzhiyun raise FetchError("Invalid osc command %s" % command, ud.url) 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun return osccmd 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun def download(self, ud, d): 86*4882a593Smuzhiyun """ 87*4882a593Smuzhiyun Fetch url 88*4882a593Smuzhiyun """ 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun logger.debug2("Fetch: checking for module directory '" + ud.moddir + "'") 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun if os.access(ud.moddir, os.R_OK): 93*4882a593Smuzhiyun oscupdatecmd = self._buildosccommand(ud, d, "update") 94*4882a593Smuzhiyun logger.info("Update "+ ud.url) 95*4882a593Smuzhiyun # update sources there 96*4882a593Smuzhiyun logger.debug("Running %s", oscupdatecmd) 97*4882a593Smuzhiyun bb.fetch2.check_network_access(d, oscupdatecmd, ud.url) 98*4882a593Smuzhiyun runfetchcmd(oscupdatecmd, d, workdir=ud.moddir) 99*4882a593Smuzhiyun else: 100*4882a593Smuzhiyun oscfetchcmd = self._buildosccommand(ud, d, "fetch") 101*4882a593Smuzhiyun logger.info("Fetch " + ud.url) 102*4882a593Smuzhiyun # check out sources there 103*4882a593Smuzhiyun bb.utils.mkdirhier(ud.pkgdir) 104*4882a593Smuzhiyun logger.debug("Running %s", oscfetchcmd) 105*4882a593Smuzhiyun bb.fetch2.check_network_access(d, oscfetchcmd, ud.url) 106*4882a593Smuzhiyun runfetchcmd(oscfetchcmd, d, workdir=ud.pkgdir) 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun # tar them up to a defined filename 109*4882a593Smuzhiyun runfetchcmd("tar -czf %s %s" % (ud.localpath, ud.module), d, 110*4882a593Smuzhiyun cleanup=[ud.localpath], workdir=os.path.join(ud.pkgdir + ud.path)) 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun def supports_srcrev(self): 113*4882a593Smuzhiyun return False 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun def generate_config(self, ud, d): 116*4882a593Smuzhiyun """ 117*4882a593Smuzhiyun Generate a .oscrc to be used for this run. 118*4882a593Smuzhiyun """ 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun config_path = os.path.join(ud.oscdir, "oscrc") 121*4882a593Smuzhiyun if not os.path.exists(ud.oscdir): 122*4882a593Smuzhiyun bb.utils.mkdirhier(ud.oscdir) 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun if (os.path.exists(config_path)): 125*4882a593Smuzhiyun os.remove(config_path) 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun f = open(config_path, 'w') 128*4882a593Smuzhiyun proto = ud.parm.get('proto', 'https') 129*4882a593Smuzhiyun f.write("[general]\n") 130*4882a593Smuzhiyun f.write("apiurl = %s://%s\n" % (proto, ud.host)) 131*4882a593Smuzhiyun f.write("su-wrapper = su -c\n") 132*4882a593Smuzhiyun f.write("build-root = %s\n" % d.getVar('WORKDIR')) 133*4882a593Smuzhiyun f.write("urllist = %s\n" % d.getVar("OSCURLLIST")) 134*4882a593Smuzhiyun f.write("extra-pkgs = gzip\n") 135*4882a593Smuzhiyun f.write("\n") 136*4882a593Smuzhiyun f.write("[%s://%s]\n" % (proto, ud.host)) 137*4882a593Smuzhiyun f.write("user = %s\n" % ud.parm["user"]) 138*4882a593Smuzhiyun f.write("pass = %s\n" % ud.parm["pswd"]) 139*4882a593Smuzhiyun f.close() 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun return config_path 142