Convert fetchers to use bb.msg
[bitbake.git] / lib / bb / fetch / svk.py
1 #!/usr/bin/env python
2 # ex:ts=4:sw=4:sts=4:et
3 # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
4 """
5 BitBake 'Fetch' implementations
6
7 This implementation is for svk. It is based on the svn implementation
8
9 Copyright (C) 2006 Holger Hans Peter Freyther
10
11 GPL and MIT licensed
12
13
14
15 Classes for obtaining upstream sources for the
16 BitBake build tools.
17
18 Copyright (C) 2003, 2004  Chris Larson
19
20 This program is free software; you can redistribute it and/or modify it under
21 the terms of the GNU General Public License as published by the Free Software
22 Foundation; either version 2 of the License, or (at your option) any later
23 version.
24
25 This program is distributed in the hope that it will be useful, but WITHOUT
26 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
27 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
28
29 You should have received a copy of the GNU General Public License along with
30 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
31 Place, Suite 330, Boston, MA 02111-1307 USA. 
32
33 Based on functions from the base bb module, Copyright 2003 Holger Schurig
34 """
35
36 import os, re
37 import bb
38 from   bb import data
39 from   bb.fetch import Fetch
40 from   bb.fetch import FetchError
41 from   bb.fetch import MissingParameterError
42
43 class Svk(Fetch):
44     """Class to fetch a module or modules from svk repositories"""
45     def supports(url, d):
46         """Check to see if a given url can be fetched with svk.
47            Expects supplied url in list form, as outputted by bb.decodeurl().
48         """
49         (type, host, path, user, pswd, parm) = bb.decodeurl(data.expand(url, d))
50         return type in ['svk']
51     supports = staticmethod(supports)
52
53     def localpath(url, d):
54         (type, host, path, user, pswd, parm) = bb.decodeurl(data.expand(url, d))
55         if "localpath" in parm:
56 #           if user overrides local path, use it.
57             return parm["localpath"]
58
59         if not "module" in parm:
60             raise MissingParameterError("svk method needs a 'module' parameter")
61         else:
62             module = parm["module"]
63         if 'rev' in parm:
64             revision = parm['rev']
65         else:
66             revision = ""
67
68         date = Fetch.getSRCDate(d)
69
70         return os.path.join(data.getVar("DL_DIR", d, 1),data.expand('%s_%s_%s_%s_%s.tar.gz' % ( module.replace('/', '.'), host, path.replace('/', '.'), revision, date), d))
71     localpath = staticmethod(localpath)
72
73     def go(self, d, urls = []):
74         """Fetch urls"""
75         if not urls:
76             urls = self.urls
77
78         localdata = data.createCopy(d)
79         data.setVar('OVERRIDES', "svk:%s" % data.getVar('OVERRIDES', localdata), localdata)
80         data.update_data(localdata)
81
82         for loc in urls:
83             (type, host, path, user, pswd, parm) = bb.decodeurl(data.expand(loc, localdata))
84             if not "module" in parm:
85                 raise MissingParameterError("svk method needs a 'module' parameter")
86             else:
87                 module = parm["module"]
88
89             dlfile = self.localpath(loc, localdata)
90             dldir = data.getVar('DL_DIR', localdata, 1)
91
92 #           setup svk options
93             options = []
94             if 'rev' in parm:
95                 revision = parm['rev']
96             else:
97                 revision = ""
98
99             date = Fetch.getSRCDate(d)
100             tarfn = data.expand('%s_%s_%s_%s_%s.tar.gz' % (module.replace('/', '.'), host, path.replace('/', '.'), revision, date), localdata)
101             data.setVar('TARFILES', dlfile, localdata)
102             data.setVar('TARFN', tarfn, localdata)
103
104             if Fetch.check_for_tarball(d, tarfn, dldir, date):
105                 continue
106
107             olddir = os.path.abspath(os.getcwd())
108             os.chdir(data.expand(dldir, localdata))
109
110             svkroot = host + path
111
112             data.setVar('SVKROOT', svkroot, localdata)
113             data.setVar('SVKCOOPTS', " ".join(options), localdata)
114             data.setVar('SVKMODULE', module, localdata)
115             svkcmd = "svk co -r {%s} %s/%s" % (date, svkroot, module)
116
117             if revision:
118                 svkcmd = "svk co -r %s/%s" % (revision, svkroot, module)
119
120 #           create temp directory
121             bb.msg.debug(2, bb.msg.domain.Fetcher, "Fetch: creating temporary directory")
122             bb.mkdirhier(data.expand('${WORKDIR}', localdata))
123             data.setVar('TMPBASE', data.expand('${WORKDIR}/oesvk.XXXXXX', localdata), localdata)
124             tmppipe = os.popen(data.getVar('MKTEMPDIRCMD', localdata, 1) or "false")
125             tmpfile = tmppipe.readline().strip()
126             if not tmpfile:
127                 bb.msg.error(bb.msg.domain.Fetcher, "Fetch: unable to create temporary directory.. make sure 'mktemp' is in the PATH.")
128                 raise FetchError(module)
129
130 #           check out sources there
131             os.chdir(tmpfile)
132             bb.msg.note(1, bb.msg.domain.Fetcher, "Fetch " + loc)
133             bb.msg.debug(1, bb.msg.domain.Fetcher, "Running %s" % svkcmd)
134             myret = os.system(svkcmd)
135             if myret != 0:
136                 try:
137                     os.rmdir(tmpfile)
138                 except OSError:
139                     pass
140                 raise FetchError(module)
141
142             os.chdir(os.path.join(tmpfile, os.path.dirname(module)))
143 #           tar them up to a defined filename
144             myret = os.system("tar -czf %s %s" % (os.path.join(dldir,tarfn), os.path.basename(module)))
145             if myret != 0:
146                 try:
147                     os.unlink(tarfn)
148                 except OSError:
149                     pass
150 #           cleanup
151             os.system('rm -rf %s' % tmpfile)
152             os.chdir(olddir)
153         del localdata