unify mirror support and make it independant of the fetcher
[bitbake.git] / lib / bb / fetch / 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  bb
12 from    bb       import data
13 from    bb.fetch import Fetch
14 from    bb.fetch import FetchError
15 from    bb.fetch import MissingParameterError
16 from    bb.fetch import runfetchcmd
17
18 class Osc(Fetch):
19     """Class to fetch a module or modules from Opensuse build server 
20        repositories."""
21
22     def supports(self, url, ud, d):
23         """
24         Check to see if a given url can be fetched with osc.
25         """
26         return ud.type in ['osc']
27
28     def localpath(self, url, ud, d):
29         if not "module" in ud.parm:
30             raise MissingParameterError("osc method needs a 'module' parameter.")
31
32         ud.module = ud.parm["module"]
33
34         # Create paths to osc checkouts
35         relpath = ud.path
36         if relpath.startswith('/'):
37             # Remove leading slash as os.path.join can't cope
38             relpath = relpath[1:]
39         ud.pkgdir = os.path.join(data.expand('${OSCDIR}', d), ud.host)
40         ud.moddir = os.path.join(ud.pkgdir, relpath, ud.module)
41
42         if 'rev' in ud.parm:
43             ud.revision = ud.parm['rev']
44         else:
45             pv = data.getVar("PV", d, 0)
46             rev = Fetch.srcrev_internal_helper(ud, d)
47             if rev and rev != True:
48                 ud.revision = rev
49             else:
50                 ud.revision = ""
51
52         ud.localfile = data.expand('%s_%s_%s.tar.gz' % (ud.module.replace('/', '.'), ud.path.replace('/', '.'), ud.revision), d)
53
54         return os.path.join(data.getVar("DL_DIR", d, True), ud.localfile)
55
56     def _buildosccommand(self, ud, d, command):
57         """
58         Build up an ocs commandline based on ud
59         command is "fetch", "update", "info"
60         """
61
62         basecmd = data.expand('${FETCHCMD_osc}', d)
63
64         proto = "ocs"
65         if "proto" in ud.parm:
66             proto = ud.parm["proto"]
67         
68         options = []
69
70         config = "-c %s" % self.generate_config(ud, d)
71
72         if ud.revision:
73             options.append("-r %s" % ud.revision)
74
75         coroot = ud.path
76         if coroot.startswith('/'):
77             # Remove leading slash as os.path.join can't cope
78             coroot= coroot[1:]
79
80         if command is "fetch":
81             osccmd = "%s %s co %s/%s %s" % (basecmd, config, coroot, ud.module, " ".join(options))
82         elif command is "update":
83             osccmd = "%s %s up %s" % (basecmd, config, " ".join(options))
84         else:
85             raise FetchError("Invalid osc command %s" % command)
86
87         return osccmd
88
89     def go(self, loc, ud, d):
90         """
91         Fetch url
92         """
93
94         bb.msg.debug(2, bb.msg.domain.Fetcher, "Fetch: checking for module directory '" + ud.moddir + "'")
95
96         if os.access(os.path.join(data.expand('${OSCDIR}', d), ud.path, ud.module), os.R_OK):
97             oscupdatecmd = self._buildosccommand(ud, d, "update")
98             bb.msg.note(1, bb.msg.domain.Fetcher, "Update "+ loc)
99             # update sources there
100             os.chdir(ud.moddir)
101             bb.msg.debug(1, bb.msg.domain.Fetcher, "Running %s" % oscupdatecmd)
102             runfetchcmd(oscupdatecmd, d)
103         else:
104             oscfetchcmd = self._buildosccommand(ud, d, "fetch")
105             bb.msg.note(1, bb.msg.domain.Fetcher, "Fetch " + loc)
106             # check out sources there
107             bb.mkdirhier(ud.pkgdir)
108             os.chdir(ud.pkgdir)
109             bb.msg.debug(1, bb.msg.domain.Fetcher, "Running %s" % oscfetchcmd)
110             runfetchcmd(oscfetchcmd, d)
111         
112         os.chdir(os.path.join(ud.pkgdir + ud.path))
113         # tar them up to a defined filename
114         try:
115             runfetchcmd("tar -czf %s %s" % (ud.localpath, ud.module), d)
116         except:
117             t, v, tb = sys.exc_info()
118             try:
119                 os.unlink(ud.localpath)
120             except OSError:
121                 pass
122             raise t, v, tb
123
124     def supports_srcrev(self):
125         return False
126
127     def generate_config(self, ud, d):
128         """
129         Generate a .oscrc to be used for this run.
130         """
131
132         config_path = "%s/oscrc" % data.expand('${OSCDIR}', d)
133         if (os.path.exists(config_path)):
134             os.remove(config_path) 
135
136         f = open(config_path, 'w')
137         f.write("[general]\n")
138         f.write("apisrv = %s\n" % ud.host)
139         f.write("scheme = http\n")
140         f.write("su-wrapper = su -c\n")
141         f.write("build-root = %s\n" % data.expand('${WORKDIR}', d))
142         f.write("urllist = http://moblin-obs.jf.intel.com:8888/build/%(project)s/%(repository)s/%(buildarch)s/:full/%(name)s.rpm\n")
143         f.write("extra-pkgs = gzip\n")
144         f.write("\n")
145         f.write("[%s]\n" % ud.host)
146         f.write("user = %s\n" % ud.parm["user"])
147         f.write("pass = %s\n" % ud.parm["pswd"])
148         f.close()
149         
150         return config_path