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 bb 18*4882a593Smuzhiyunfrom bb.fetch2 import FetchMethod, FetchError, MissingParameterError, logger 19*4882a593Smuzhiyunfrom bb.fetch2 import runfetchcmd 20*4882a593Smuzhiyun 21*4882a593Smuzhiyunclass Cvs(FetchMethod): 22*4882a593Smuzhiyun """ 23*4882a593Smuzhiyun Class to fetch a module or modules from cvs repositories 24*4882a593Smuzhiyun """ 25*4882a593Smuzhiyun def supports(self, ud, d): 26*4882a593Smuzhiyun """ 27*4882a593Smuzhiyun Check to see if a given url can be fetched with cvs. 28*4882a593Smuzhiyun """ 29*4882a593Smuzhiyun return ud.type in ['cvs'] 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun def urldata_init(self, ud, d): 32*4882a593Smuzhiyun if not "module" in ud.parm: 33*4882a593Smuzhiyun raise MissingParameterError("module", ud.url) 34*4882a593Smuzhiyun ud.module = ud.parm["module"] 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun ud.tag = ud.parm.get('tag', "") 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun # Override the default date in certain cases 39*4882a593Smuzhiyun if 'date' in ud.parm: 40*4882a593Smuzhiyun ud.date = ud.parm['date'] 41*4882a593Smuzhiyun elif ud.tag: 42*4882a593Smuzhiyun ud.date = "" 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun norecurse = '' 45*4882a593Smuzhiyun if 'norecurse' in ud.parm: 46*4882a593Smuzhiyun norecurse = '_norecurse' 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun fullpath = '' 49*4882a593Smuzhiyun if 'fullpath' in ud.parm: 50*4882a593Smuzhiyun fullpath = '_fullpath' 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun ud.localfile = d.expand('%s_%s_%s_%s%s%s.tar.gz' % (ud.module.replace('/', '.'), ud.host, ud.tag, ud.date, norecurse, fullpath)) 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun pkg = d.getVar('PN') 55*4882a593Smuzhiyun cvsdir = d.getVar("CVSDIR") or (d.getVar("DL_DIR") + "/cvs") 56*4882a593Smuzhiyun ud.pkgdir = os.path.join(cvsdir, pkg) 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun def need_update(self, ud, d): 59*4882a593Smuzhiyun if (ud.date == "now"): 60*4882a593Smuzhiyun return True 61*4882a593Smuzhiyun if not os.path.exists(ud.localpath): 62*4882a593Smuzhiyun return True 63*4882a593Smuzhiyun return False 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun def download(self, ud, d): 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun method = ud.parm.get('method', 'pserver') 68*4882a593Smuzhiyun localdir = ud.parm.get('localdir', ud.module) 69*4882a593Smuzhiyun cvs_port = ud.parm.get('port', '') 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun cvs_rsh = None 72*4882a593Smuzhiyun if method == "ext": 73*4882a593Smuzhiyun if "rsh" in ud.parm: 74*4882a593Smuzhiyun cvs_rsh = ud.parm["rsh"] 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun if method == "dir": 77*4882a593Smuzhiyun cvsroot = ud.path 78*4882a593Smuzhiyun else: 79*4882a593Smuzhiyun cvsroot = ":" + method 80*4882a593Smuzhiyun cvsproxyhost = d.getVar('CVS_PROXY_HOST') 81*4882a593Smuzhiyun if cvsproxyhost: 82*4882a593Smuzhiyun cvsroot += ";proxy=" + cvsproxyhost 83*4882a593Smuzhiyun cvsproxyport = d.getVar('CVS_PROXY_PORT') 84*4882a593Smuzhiyun if cvsproxyport: 85*4882a593Smuzhiyun cvsroot += ";proxyport=" + cvsproxyport 86*4882a593Smuzhiyun cvsroot += ":" + ud.user 87*4882a593Smuzhiyun if ud.pswd: 88*4882a593Smuzhiyun cvsroot += ":" + ud.pswd 89*4882a593Smuzhiyun cvsroot += "@" + ud.host + ":" + cvs_port + ud.path 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun options = [] 92*4882a593Smuzhiyun if 'norecurse' in ud.parm: 93*4882a593Smuzhiyun options.append("-l") 94*4882a593Smuzhiyun if ud.date: 95*4882a593Smuzhiyun # treat YYYYMMDDHHMM specially for CVS 96*4882a593Smuzhiyun if len(ud.date) == 12: 97*4882a593Smuzhiyun options.append("-D \"%s %s:%s UTC\"" % (ud.date[0:8], ud.date[8:10], ud.date[10:12])) 98*4882a593Smuzhiyun else: 99*4882a593Smuzhiyun options.append("-D \"%s UTC\"" % ud.date) 100*4882a593Smuzhiyun if ud.tag: 101*4882a593Smuzhiyun options.append("-r %s" % ud.tag) 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun cvsbasecmd = d.getVar("FETCHCMD_cvs") or "/usr/bin/env cvs" 104*4882a593Smuzhiyun cvscmd = cvsbasecmd + " '-d" + cvsroot + "' co " + " ".join(options) + " " + ud.module 105*4882a593Smuzhiyun cvsupdatecmd = cvsbasecmd + " '-d" + cvsroot + "' update -d -P " + " ".join(options) 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun if cvs_rsh: 108*4882a593Smuzhiyun cvscmd = "CVS_RSH=\"%s\" %s" % (cvs_rsh, cvscmd) 109*4882a593Smuzhiyun cvsupdatecmd = "CVS_RSH=\"%s\" %s" % (cvs_rsh, cvsupdatecmd) 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun # create module directory 112*4882a593Smuzhiyun logger.debug2("Fetch: checking for module directory") 113*4882a593Smuzhiyun moddir = os.path.join(ud.pkgdir, localdir) 114*4882a593Smuzhiyun workdir = None 115*4882a593Smuzhiyun if os.access(os.path.join(moddir, 'CVS'), os.R_OK): 116*4882a593Smuzhiyun logger.info("Update " + ud.url) 117*4882a593Smuzhiyun bb.fetch2.check_network_access(d, cvsupdatecmd, ud.url) 118*4882a593Smuzhiyun # update sources there 119*4882a593Smuzhiyun workdir = moddir 120*4882a593Smuzhiyun cmd = cvsupdatecmd 121*4882a593Smuzhiyun else: 122*4882a593Smuzhiyun logger.info("Fetch " + ud.url) 123*4882a593Smuzhiyun # check out sources there 124*4882a593Smuzhiyun bb.utils.mkdirhier(ud.pkgdir) 125*4882a593Smuzhiyun workdir = ud.pkgdir 126*4882a593Smuzhiyun logger.debug("Running %s", cvscmd) 127*4882a593Smuzhiyun bb.fetch2.check_network_access(d, cvscmd, ud.url) 128*4882a593Smuzhiyun cmd = cvscmd 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun runfetchcmd(cmd, d, cleanup=[moddir], workdir=workdir) 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun if not os.access(moddir, os.R_OK): 133*4882a593Smuzhiyun raise FetchError("Directory %s was not readable despite sucessful fetch?!" % moddir, ud.url) 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun scmdata = ud.parm.get("scmdata", "") 136*4882a593Smuzhiyun if scmdata == "keep": 137*4882a593Smuzhiyun tar_flags = "" 138*4882a593Smuzhiyun else: 139*4882a593Smuzhiyun tar_flags = "--exclude='CVS'" 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun # tar them up to a defined filename 142*4882a593Smuzhiyun workdir = None 143*4882a593Smuzhiyun if 'fullpath' in ud.parm: 144*4882a593Smuzhiyun workdir = ud.pkgdir 145*4882a593Smuzhiyun cmd = "tar %s -czf %s %s" % (tar_flags, ud.localpath, localdir) 146*4882a593Smuzhiyun else: 147*4882a593Smuzhiyun workdir = os.path.dirname(os.path.realpath(moddir)) 148*4882a593Smuzhiyun cmd = "tar %s -czf %s %s" % (tar_flags, ud.localpath, os.path.basename(moddir)) 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun runfetchcmd(cmd, d, cleanup=[ud.localpath], workdir=workdir) 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun def clean(self, ud, d): 153*4882a593Smuzhiyun """ Clean CVS Files and tarballs """ 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun bb.utils.remove(ud.pkgdir, True) 156*4882a593Smuzhiyun bb.utils.remove(ud.localpath) 157*4882a593Smuzhiyun 158