fetchers: Remove check_for_tarball() in favour of try_mirror directly
[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' % (module.replace('/', '.'), ud.host, ud.tag, ud.date), d)
61
62         return os.path.join(data.getVar("DL_DIR", d, 1), 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         if not "module" in ud.parm:
71             raise MissingParameterError("cvs method needs a 'module' parameter")
72         else:
73             module = ud.parm["module"]
74
75         dlfile = ud.localpath
76         dldir = data.getVar('DL_DIR', localdata, 1)
77
78         # setup cvs options
79         options = []
80
81         if "method" in ud.parm:
82             method = ud.parm["method"]
83         else:
84             method = "pserver"
85
86         if "localdir" in ud.parm:
87             localdir = ud.parm["localdir"]
88         else:
89             localdir = module
90
91         cvs_rsh = None
92         if method == "ext":
93             if "rsh" in ud.parm:
94                 cvs_rsh = ud.parm["rsh"]
95
96         tarfn = ud.localfile
97
98         # try to use the tarball stash
99         if (date != "now") and Fetch.try_mirror(d, ud.localfile):
100             bb.msg.debug(1, bb.msg.domain.Fetcher, "%s already exists or was mirrored, skipping cvs checkout." % tarfn)
101             return
102
103         if ud.date:
104             options.append("-D %s" % ud.date)
105         if ud.tag:
106             options.append("-r %s" % ud.tag)
107
108         olddir = os.path.abspath(os.getcwd())
109         os.chdir(data.expand(dldir, localdata))
110
111         # setup cvsroot
112         if method == "dir":
113             cvsroot = ud.path
114         else:
115             cvsroot = ":" + method + ":" + ud.user
116             if ud.pswd:
117                 cvsroot += ":" + ud.pswd
118             cvsroot += "@" + ud.host + ":" + ud.path
119
120         data.setVar('CVSROOT', cvsroot, localdata)
121         data.setVar('CVSCOOPTS', " ".join(options), localdata)
122         data.setVar('CVSMODULE', module, localdata)
123         cvscmd = data.getVar('FETCHCOMMAND', localdata, 1)
124         cvsupdatecmd = data.getVar('UPDATECOMMAND', localdata, 1)
125
126         if cvs_rsh:
127             cvscmd = "CVS_RSH=\"%s\" %s" % (cvs_rsh, cvscmd)
128             cvsupdatecmd = "CVS_RSH=\"%s\" %s" % (cvs_rsh, cvsupdatecmd)
129
130         # create module directory
131         bb.msg.debug(2, bb.msg.domain.Fetcher, "Fetch: checking for module directory")
132         pkg=data.expand('${PN}', d)
133         pkgdir=os.path.join(data.expand('${CVSDIR}', localdata), pkg)
134         moddir=os.path.join(pkgdir,localdir)
135         if os.access(os.path.join(moddir,'CVS'), os.R_OK):
136             bb.msg.note(1, bb.msg.domain.Fetcher, "Update " + loc)
137             # update sources there
138             os.chdir(moddir)
139             myret = os.system(cvsupdatecmd)
140         else:
141             bb.msg.note(1, bb.msg.domain.Fetcher, "Fetch " + loc)
142             # check out sources there
143             bb.mkdirhier(pkgdir)
144             os.chdir(pkgdir)
145             bb.msg.debug(1, bb.msg.domain.Fetcher, "Running %s" % cvscmd)
146             myret = os.system(cvscmd)
147
148         if myret != 0 or not os.access(moddir, os.R_OK):
149             try:
150                 os.rmdir(moddir)
151             except OSError:
152                  pass
153             raise FetchError(module)
154
155         os.chdir(moddir)
156         os.chdir('..')
157         # tar them up to a defined filename
158         myret = os.system("tar -czf %s %s" % (os.path.join(dldir,tarfn), os.path.basename(moddir)))
159         if myret != 0:
160             try:
161                 os.unlink(tarfn)
162             except OSError:
163                 pass
164         os.chdir(olddir)