svn fetcher: added my (C) as this is code which I wrote in 2004 (pre-bitbake times)
[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 This implementation is for svn. It is based on the cvs implementation.
8
9 Copyright (C) 2004 Marcin Juszkiewicz
10
11 Classes for obtaining upstream sources for the
12 BitBake build tools.
13
14 Copyright (C) 2003, 2004  Chris Larson
15
16 This program is free software; you can redistribute it and/or modify it under
17 the terms of the GNU General Public License as published by the Free Software
18 Foundation; either version 2 of the License, or (at your option) any later
19 version.
20
21 This program is distributed in the hope that it will be useful, but WITHOUT
22 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
23 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
24
25 You should have received a copy of the GNU General Public License along with
26 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
27 Place, Suite 330, Boston, MA 02111-1307 USA. 
28
29 Based on functions from the base bb module, Copyright 2003 Holger Schurig
30 """
31
32 import os, re
33 import sys
34 import bb
35 from   bb import data
36 from   bb.fetch import Fetch
37 from   bb.fetch import FetchError
38 from   bb.fetch import MissingParameterError
39
40 class Svn(Fetch):
41     """Class to fetch a module or modules from svn repositories"""
42     def supports(self, url, ud, d):
43         """
44         Check to see if a given url can be fetched with svn.
45         """
46         return ud.type in ['svn']
47
48     def localpath(self, url, ud, d):
49         if not "module" in ud.parm:
50             raise MissingParameterError("svn method needs a 'module' parameter")
51         else:
52             ud.module = ud.parm["module"]
53
54         ud.revision = ""
55         if 'rev' in ud.parm:
56             ud.revision = ud.parm['rev']
57
58         ud.localfile = data.expand('%s_%s_%s_%s_%s.tar.gz' % (ud.module.replace('/', '.'), ud.host, ud.path.replace('/', '.'), ud.revision, ud.date), d)
59
60         return os.path.join(data.getVar("DL_DIR", d, True), ud.localfile)
61
62     def forcefetch(self, url, ud, d):
63         if (ud.date == "now"):
64             return True
65         return False
66
67     def go(self, loc, ud, d):
68         """Fetch url"""
69
70         # try to use the tarball stash
71         if not self.forcefetch(loc, ud, d) and Fetch.try_mirror(d, ud.localfile):
72             bb.msg.debug(1, bb.msg.domain.Fetcher, "%s already exists or was mirrored, skipping svn checkout." % ud.localpath)
73             return
74
75         proto = "svn"
76         if "proto" in ud.parm:
77             proto = ud.parm["proto"]
78
79         svn_rsh = None
80         if proto == "svn+ssh" and "rsh" in ud.parm:
81             svn_rsh = ud.parm["rsh"]
82
83         svnroot = ud.host + ud.path
84
85         # either use the revision, or SRCDATE in braces, or nothing for SRCDATE = "now"
86         options = []
87         if ud.revision:
88             options.append("-r %s" % ud.revision)
89         elif ud.date != "now":
90             options.append("-r {%s}" % ud.date)
91
92         localdata = data.createCopy(d)
93         data.setVar('OVERRIDES', "svn:%s" % data.getVar('OVERRIDES', localdata), localdata)
94         data.update_data(localdata)
95
96         data.setVar('SVNROOT', "%s://%s/%s" % (proto, svnroot, ud.module), localdata)
97         data.setVar('SVNCOOPTS', " ".join(options), localdata)
98         data.setVar('SVNMODULE', ud.module, localdata)
99         svncmd = data.getVar('FETCHCOMMAND', localdata, 1)
100         svnupcmd = data.getVar('UPDATECOMMAND', localdata, 1)
101
102         if svn_rsh:
103             svncmd = "svn_RSH=\"%s\" %s" % (svn_rsh, svncmd)
104             svnupcmd = "svn_RSH=\"%s\" %s" % (svn_rsh, svnupcmd)
105
106         pkg = data.expand('${PN}', d)
107         pkgdir = os.path.join(data.expand('${SVNDIR}', localdata), pkg)
108         moddir = os.path.join(pkgdir, ud.module)
109         bb.msg.debug(2, bb.msg.domain.Fetcher, "Fetch: checking for module directory '" + moddir + "'")
110
111         if os.access(os.path.join(moddir, '.svn'), os.R_OK):
112             bb.msg.note(1, bb.msg.domain.Fetcher, "Update " + loc)
113             # update sources there
114             os.chdir(moddir)
115             bb.msg.debug(1, bb.msg.domain.Fetcher, "Running %s" % svnupcmd)
116             myret = os.system(svnupcmd)
117         else:
118             bb.msg.note(1, bb.msg.domain.Fetcher, "Fetch " + loc)
119             # check out sources there
120             bb.mkdirhier(pkgdir)
121             os.chdir(pkgdir)
122             bb.msg.debug(1, bb.msg.domain.Fetcher, "Running %s" % svncmd)
123             myret = os.system(svncmd)
124
125         if myret != 0:
126             raise FetchError(ud.module)
127
128         os.chdir(pkgdir)
129         # tar them up to a defined filename
130         myret = os.system("tar -czf %s %s" % (ud.localpath, os.path.basename(ud.module)))
131         if myret != 0:
132             try:
133                 os.unlink(ud.localpath)
134             except OSError:
135                 pass
136             raise FetchError(ud.module)