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