fetchers: Cleanup more variables
[bitbake.git] / lib / bb / fetch / cvs.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 Cvs(Fetch):
36     """
37     Class to fetch a module or modules from cvs repositories
38     """
39     def supports(self, url, ud, d):
40         """
41         Check to see if a given url can be fetched with cvs.
42         """
43         return ud.type in ['cvs', 'pserver']
44
45     def localpath(self, url, ud, d):
46         if not "module" in ud.parm:
47             raise MissingParameterError("cvs method needs a 'module' parameter")
48         ud.module = ud.parm["module"]
49
50         ud.tag = ""
51         if 'tag' in ud.parm:
52             ud.tag = ud.parm['tag']
53
54         # Override the default date in certain cases
55         if 'date' in ud.parm:
56             ud.date = ud.parm['date']
57         elif ud.tag:
58             ud.date = ""
59
60         ud.localfile = data.expand('%s_%s_%s_%s.tar.gz' % (ud.module.replace('/', '.'), ud.host, ud.tag, ud.date), d)
61
62         return os.path.join(data.getVar("DL_DIR", d, True), ud.localfile)
63
64     def go(self, loc, ud, d):
65
66         localdata = data.createCopy(d)
67         data.setVar('OVERRIDES', "cvs:%s" % data.getVar('OVERRIDES', localdata), localdata)
68         data.update_data(localdata)
69
70         # setup cvs options
71         options = []
72
73         if "method" in ud.parm:
74             method = ud.parm["method"]
75         else:
76             method = "pserver"
77
78         if "localdir" in ud.parm:
79             localdir = ud.parm["localdir"]
80         else:
81             localdir = ud.module
82
83         cvs_rsh = None
84         if method == "ext":
85             if "rsh" in ud.parm:
86                 cvs_rsh = ud.parm["rsh"]
87
88         # try to use the tarball stash
89         if (date != "now") and Fetch.try_mirror(d, ud.localfile):
90             bb.msg.debug(1, bb.msg.domain.Fetcher, "%s already exists or was mirrored, skipping cvs checkout." % ud.localpath)
91             return
92
93         if ud.date:
94             options.append("-D %s" % ud.date)
95         if ud.tag:
96             options.append("-r %s" % ud.tag)
97
98         # setup cvsroot
99         if method == "dir":
100             cvsroot = ud.path
101         else:
102             cvsroot = ":" + method + ":" + ud.user
103             if ud.pswd:
104                 cvsroot += ":" + ud.pswd
105             cvsroot += "@" + ud.host + ":" + ud.path
106
107         data.setVar('CVSROOT', cvsroot, localdata)
108         data.setVar('CVSCOOPTS', " ".join(options), localdata)
109         data.setVar('CVSMODULE', ud.module, localdata)
110         cvscmd = data.getVar('FETCHCOMMAND', localdata, 1)
111         cvsupdatecmd = data.getVar('UPDATECOMMAND', localdata, 1)
112
113         if cvs_rsh:
114             cvscmd = "CVS_RSH=\"%s\" %s" % (cvs_rsh, cvscmd)
115             cvsupdatecmd = "CVS_RSH=\"%s\" %s" % (cvs_rsh, cvsupdatecmd)
116
117         # create module directory
118         bb.msg.debug(2, bb.msg.domain.Fetcher, "Fetch: checking for module directory")
119         pkg=data.expand('${PN}', d)
120         pkgdir=os.path.join(data.expand('${CVSDIR}', localdata), pkg)
121         moddir=os.path.join(pkgdir,localdir)
122         if os.access(os.path.join(moddir,'CVS'), os.R_OK):
123             bb.msg.note(1, bb.msg.domain.Fetcher, "Update " + loc)
124             # update sources there
125             os.chdir(moddir)
126             myret = os.system(cvsupdatecmd)
127         else:
128             bb.msg.note(1, bb.msg.domain.Fetcher, "Fetch " + loc)
129             # check out sources there
130             bb.mkdirhier(pkgdir)
131             os.chdir(pkgdir)
132             bb.msg.debug(1, bb.msg.domain.Fetcher, "Running %s" % cvscmd)
133             myret = os.system(cvscmd)
134
135         if myret != 0 or not os.access(moddir, os.R_OK):
136             try:
137                 os.rmdir(moddir)
138             except OSError:
139                  pass
140             raise FetchError(ud.module)
141
142         os.chdir(moddir)
143         os.chdir('..')
144         # tar them up to a defined filename
145         myret = os.system("tar -czf %s %s" % (ud.localpath, os.path.basename(moddir)))
146         if myret != 0:
147             try:
148                 os.unlink(ud.localpath)
149             except OSError:
150                 pass