lib/bb/fetch/cvs.py:
[bitbake.git] / lib / bb / fetch / svn.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 Classes for obtaining upstream sources for the
8 BitBake build tools.
9
10 Copyright (C) 2003, 2004  Chris Larson
11
12 This program is free software; you can redistribute it and/or modify it under
13 the terms of the GNU General Public License as published by the Free Software
14 Foundation; either version 2 of the License, or (at your option) any later
15 version.
16
17 This program is distributed in the hope that it will be useful, but WITHOUT
18 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
19 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License along with
22 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
23 Place, Suite 330, Boston, MA 02111-1307 USA. 
24
25 Based on functions from the base bb module, Copyright 2003 Holger Schurig
26 """
27
28 import os, re
29 import bb
30 from   bb import data
31 from   bb.fetch import Fetch
32 from   bb.fetch import FetchError
33 from   bb.fetch import MissingParameterError
34
35 class Svn(Fetch):
36     """Class to fetch a module or modules from svn repositories"""
37     def supports(url, d):
38         """Check to see if a given url can be fetched with svn.
39            Expects supplied url in list form, as outputted by bb.decodeurl().
40         """
41         (type, host, path, user, pswd, parm) = bb.decodeurl(data.expand(url, d))
42         return type in ['svn']
43     supports = staticmethod(supports)
44
45     def localpath(url, d):
46         (type, host, path, user, pswd, parm) = bb.decodeurl(data.expand(url, d))
47         if "localpath" in parm:
48 #           if user overrides local path, use it.
49             return parm["localpath"]
50
51         if not "module" in parm:
52             raise MissingParameterError("svn method needs a 'module' parameter")
53         else:
54             module = parm["module"]
55         if 'rev' in parm:
56             revision = parm['rev']
57         else:
58             revision = ""
59
60         date = Fetch.getSRCDate(d)
61
62         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))
63     localpath = staticmethod(localpath)
64
65     def go(self, d, urls = []):
66         """Fetch urls"""
67         if not urls:
68             urls = self.urls
69
70         localdata = data.createCopy(d)
71         data.setVar('OVERRIDES', "svn:%s" % data.getVar('OVERRIDES', localdata), localdata)
72         data.update_data(localdata)
73
74         for loc in urls:
75             (type, host, path, user, pswd, parm) = bb.decodeurl(data.expand(loc, localdata))
76             if not "module" in parm:
77                 raise MissingParameterError("svn method needs a 'module' parameter")
78             else:
79                 module = parm["module"]
80
81             dlfile = self.localpath(loc, localdata)
82             dldir = data.getVar('DL_DIR', localdata, 1)
83 #           if local path contains the svn
84 #           module, consider the dir above it to be the
85 #           download directory
86 #           pos = dlfile.find(module)
87 #           if pos:
88 #               dldir = dlfile[:pos]
89 #           else:
90 #               dldir = os.path.dirname(dlfile)
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 "proto" in parm:
102                 proto = parm["proto"]
103             else:
104                 proto = "svn"
105
106             svn_rsh = None
107             if proto == "svn+ssh" and "rsh" in parm:
108                 svn_rsh = parm["rsh"]
109
110             tarfn = data.expand('%s_%s_%s_%s_%s.tar.gz' % (module.replace('/', '.'), host, path.replace('/', '.'), revision, date), localdata)
111             data.setVar('TARFILES', dlfile, localdata)
112             data.setVar('TARFN', tarfn, localdata)
113
114             # try to use the tarball stash
115             if Fetch.try_mirror(d, tarfn):
116                 bb.debug(1, "%s already exists or was mirrored, skipping svn checkout." % tarfn)
117                 continue
118
119             olddir = os.path.abspath(os.getcwd())
120             os.chdir(data.expand(dldir, localdata))
121
122             svnroot = host + path
123
124             data.setVar('SVNROOT', svnroot, localdata)
125             data.setVar('SVNCOOPTS', " ".join(options), localdata)
126             data.setVar('SVNMODULE', module, localdata)
127             svncmd = data.getVar('FETCHCOMMAND', localdata, 1)
128             svncmd = "svn co -r {%s} %s://%s/%s" % (date, proto, svnroot, module)
129
130             if revision:
131                 svncmd = "svn co -r %s %s://%s/%s" % (revision, proto, svnroot, module)
132             if svn_rsh:
133                 svncmd = "svn_RSH=\"%s\" %s" % (svn_rsh, svncmd)
134
135 #           create temp directory
136             bb.debug(2, "Fetch: creating temporary directory")
137             bb.mkdirhier(data.expand('${WORKDIR}', localdata))
138             data.setVar('TMPBASE', data.expand('${WORKDIR}/oesvn.XXXXXX', localdata), localdata)
139             tmppipe = os.popen(data.getVar('MKTEMPDIRCMD', localdata, 1) or "false")
140             tmpfile = tmppipe.readline().strip()
141             if not tmpfile:
142                 bb.error("Fetch: unable to create temporary directory.. make sure 'mktemp' is in the PATH.")
143                 raise FetchError(module)
144
145 #           check out sources there
146             os.chdir(tmpfile)
147             bb.note("Fetch " + loc)
148             bb.debug(1, "Running %s" % svncmd)
149             myret = os.system(svncmd)
150             if myret != 0:
151                 try:
152                     os.rmdir(tmpfile)
153                 except OSError:
154                     pass
155                 raise FetchError(module)
156
157             os.chdir(os.path.join(tmpfile, os.path.dirname(module)))
158 #           tar them up to a defined filename
159             myret = os.system("tar -czf %s %s" % (os.path.join(dldir,tarfn), os.path.basename(module)))
160             if myret != 0:
161                 try:
162                     os.unlink(tarfn)
163                 except OSError:
164                     pass
165 #           cleanup
166             os.system('rm -rf %s' % tmpfile)
167             os.chdir(olddir)
168         del localdata