bitbake/lib/bb/__init__:
[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 svn repositories"""
45     def supports(url, d):
46         """Check to see if a given url can be fetched with svn.
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("svn 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', "svn:%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 svn options
93             options = []
94             if 'rev' in parm:
95                 revision = parm['rev']
96             else:
97                 revision = ""
98
99             date = Fetch.getSRCDate(d)
100
101             if "method" in parm:
102                 method = parm["method"]
103             else:
104                 method = "pserver"
105
106             if "proto" in parm:
107                 proto = parm["proto"]
108             else:
109                 proto = "svn"
110
111             svn_rsh = None
112             if method == "ext":
113                 if "rsh" in parm:
114                     svn_rsh = parm["rsh"]
115
116             tarfn = data.expand('%s_%s_%s_%s_%s.tar.gz' % (module.replace('/', '.'), host, path.replace('/', '.'), revision, date), localdata)
117             data.setVar('TARFILES', dlfile, localdata)
118             data.setVar('TARFN', tarfn, localdata)
119
120             dl = os.path.join(dldir, tarfn)
121             if os.access(dl, os.R_OK):
122                 bb.debug(1, "%s already exists, skipping svn checkout." % tarfn)
123                 continue
124
125             if Fetch.try_mirror(d, tarfn):
126                 continue
127
128             olddir = os.path.abspath(os.getcwd())
129             os.chdir(data.expand(dldir, localdata))
130
131 #           setup svnroot
132 #            svnroot = ":" + method + ":" + user
133 #            if pswd:
134 #                svnroot += ":" + pswd
135             svnroot = host + path
136
137             data.setVar('SVNROOT', svnroot, localdata)
138             data.setVar('SVNCOOPTS', " ".join(options), localdata)
139             data.setVar('SVNMODULE', module, localdata)
140             svncmd = data.getVar('FETCHCOMMAND', localdata, 1)
141             svncmd = "svn co -r {%s} %s://%s/%s" % (date, proto, svnroot, module)
142
143             if revision:
144                 svncmd = "svn co -r %s %s://%s/%s" % (revision, proto, svnroot, module)
145             if svn_rsh:
146                 svncmd = "svn_RSH=\"%s\" %s" % (svn_rsh, svncmd)
147
148 #           create temp directory
149             bb.debug(2, "Fetch: creating temporary directory")
150             bb.mkdirhier(data.expand('${WORKDIR}', localdata))
151             data.setVar('TMPBASE', data.expand('${WORKDIR}/oesvn.XXXXXX', localdata), localdata)
152             tmppipe = os.popen(data.getVar('MKTEMPDIRCMD', localdata, 1) or "false")
153             tmpfile = tmppipe.readline().strip()
154             if not tmpfile:
155                 bb.error("Fetch: unable to create temporary directory.. make sure 'mktemp' is in the PATH.")
156                 raise FetchError(module)
157
158 #           check out sources there
159             os.chdir(tmpfile)
160             bb.note("Fetch " + loc)
161             bb.debug(1, "Running %s" % svncmd)
162             myret = os.system(svncmd)
163             if myret != 0:
164                 try:
165                     os.rmdir(tmpfile)
166                 except OSError:
167                     pass
168                 raise FetchError(module)
169
170             os.chdir(os.path.join(tmpfile, os.path.dirname(module)))
171 #           tar them up to a defined filename
172             myret = os.system("tar -czf %s %s" % (os.path.join(dldir,tarfn), os.path.basename(module)))
173             if myret != 0:
174                 try:
175                     os.unlink(tarfn)
176                 except OSError:
177                     pass
178 #           cleanup
179             os.system('rm -rf %s' % tmpfile)
180             os.chdir(olddir)
181         del localdata