xref: /OK3568_Linux_fs/yocto/poky/bitbake/lib/bb/fetch2/bzr.py (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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