1*4882a593Smuzhiyun""" 2*4882a593SmuzhiyunBitBake 'Fetch' implementation for bzr. 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun""" 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun# Copyright (C) 2007 Ross Burton 7*4882a593Smuzhiyun# Copyright (C) 2007 Richard Purdie 8*4882a593Smuzhiyun# 9*4882a593Smuzhiyun# Classes for obtaining upstream sources for the 10*4882a593Smuzhiyun# BitBake build tools. 11*4882a593Smuzhiyun# Copyright (C) 2003, 2004 Chris Larson 12*4882a593Smuzhiyun# 13*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0-only 14*4882a593Smuzhiyun# 15*4882a593Smuzhiyun 16*4882a593Smuzhiyunimport os 17*4882a593Smuzhiyunimport bb 18*4882a593Smuzhiyunfrom bb.fetch2 import FetchMethod 19*4882a593Smuzhiyunfrom bb.fetch2 import FetchError 20*4882a593Smuzhiyunfrom bb.fetch2 import runfetchcmd 21*4882a593Smuzhiyunfrom bb.fetch2 import logger 22*4882a593Smuzhiyun 23*4882a593Smuzhiyunclass Bzr(FetchMethod): 24*4882a593Smuzhiyun def supports(self, ud, d): 25*4882a593Smuzhiyun return ud.type in ['bzr'] 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun def urldata_init(self, ud, d): 28*4882a593Smuzhiyun """ 29*4882a593Smuzhiyun init bzr specific variable within url data 30*4882a593Smuzhiyun """ 31*4882a593Smuzhiyun # Create paths to bzr checkouts 32*4882a593Smuzhiyun bzrdir = d.getVar("BZRDIR") or (d.getVar("DL_DIR") + "/bzr") 33*4882a593Smuzhiyun relpath = self._strip_leading_slashes(ud.path) 34*4882a593Smuzhiyun ud.pkgdir = os.path.join(bzrdir, ud.host, relpath) 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun ud.setup_revisions(d) 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun if not ud.revision: 39*4882a593Smuzhiyun ud.revision = self.latest_revision(ud, d) 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun ud.localfile = d.expand('bzr_%s_%s_%s.tar.gz' % (ud.host, ud.path.replace('/', '.'), ud.revision)) 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun def _buildbzrcommand(self, ud, d, command): 44*4882a593Smuzhiyun """ 45*4882a593Smuzhiyun Build up an bzr commandline based on ud 46*4882a593Smuzhiyun command is "fetch", "update", "revno" 47*4882a593Smuzhiyun """ 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun basecmd = d.getVar("FETCHCMD_bzr") or "/usr/bin/env bzr" 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun proto = ud.parm.get('protocol', 'http') 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun bzrroot = ud.host + ud.path 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun options = [] 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun if command == "revno": 58*4882a593Smuzhiyun bzrcmd = "%s revno %s %s://%s" % (basecmd, " ".join(options), proto, bzrroot) 59*4882a593Smuzhiyun else: 60*4882a593Smuzhiyun if ud.revision: 61*4882a593Smuzhiyun options.append("-r %s" % ud.revision) 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun if command == "fetch": 64*4882a593Smuzhiyun bzrcmd = "%s branch %s %s://%s" % (basecmd, " ".join(options), proto, bzrroot) 65*4882a593Smuzhiyun elif command == "update": 66*4882a593Smuzhiyun bzrcmd = "%s pull %s --overwrite" % (basecmd, " ".join(options)) 67*4882a593Smuzhiyun else: 68*4882a593Smuzhiyun raise FetchError("Invalid bzr command %s" % command, ud.url) 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun return bzrcmd 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun def download(self, ud, d): 73*4882a593Smuzhiyun """Fetch url""" 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun if os.access(os.path.join(ud.pkgdir, os.path.basename(ud.pkgdir), '.bzr'), os.R_OK): 76*4882a593Smuzhiyun bzrcmd = self._buildbzrcommand(ud, d, "update") 77*4882a593Smuzhiyun logger.debug("BZR Update %s", ud.url) 78*4882a593Smuzhiyun bb.fetch2.check_network_access(d, bzrcmd, ud.url) 79*4882a593Smuzhiyun runfetchcmd(bzrcmd, d, workdir=os.path.join(ud.pkgdir, os.path.basename(ud.path))) 80*4882a593Smuzhiyun else: 81*4882a593Smuzhiyun bb.utils.remove(os.path.join(ud.pkgdir, os.path.basename(ud.pkgdir)), True) 82*4882a593Smuzhiyun bzrcmd = self._buildbzrcommand(ud, d, "fetch") 83*4882a593Smuzhiyun bb.fetch2.check_network_access(d, bzrcmd, ud.url) 84*4882a593Smuzhiyun logger.debug("BZR Checkout %s", ud.url) 85*4882a593Smuzhiyun bb.utils.mkdirhier(ud.pkgdir) 86*4882a593Smuzhiyun logger.debug("Running %s", bzrcmd) 87*4882a593Smuzhiyun runfetchcmd(bzrcmd, d, workdir=ud.pkgdir) 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun scmdata = ud.parm.get("scmdata", "") 90*4882a593Smuzhiyun if scmdata == "keep": 91*4882a593Smuzhiyun tar_flags = "" 92*4882a593Smuzhiyun else: 93*4882a593Smuzhiyun tar_flags = "--exclude='.bzr' --exclude='.bzrtags'" 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun # tar them up to a defined filename 96*4882a593Smuzhiyun runfetchcmd("tar %s -czf %s %s" % (tar_flags, ud.localpath, os.path.basename(ud.pkgdir)), 97*4882a593Smuzhiyun d, cleanup=[ud.localpath], workdir=ud.pkgdir) 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun def supports_srcrev(self): 100*4882a593Smuzhiyun return True 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun def _revision_key(self, ud, d, name): 103*4882a593Smuzhiyun """ 104*4882a593Smuzhiyun Return a unique key for the url 105*4882a593Smuzhiyun """ 106*4882a593Smuzhiyun return "bzr:" + ud.pkgdir 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun def _latest_revision(self, ud, d, name): 109*4882a593Smuzhiyun """ 110*4882a593Smuzhiyun Return the latest upstream revision number 111*4882a593Smuzhiyun """ 112*4882a593Smuzhiyun logger.debug2("BZR fetcher hitting network for %s", ud.url) 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun bb.fetch2.check_network_access(d, self._buildbzrcommand(ud, d, "revno"), ud.url) 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun output = runfetchcmd(self._buildbzrcommand(ud, d, "revno"), d, True) 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun return output.strip() 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun def sortable_revision(self, ud, d, name): 121*4882a593Smuzhiyun """ 122*4882a593Smuzhiyun Return a sortable revision number which in our case is the revision number 123*4882a593Smuzhiyun """ 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun return False, self._build_revision(ud, d) 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun def _build_revision(self, ud, d): 128*4882a593Smuzhiyun return ud.revision 129