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