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