fetchers: Only call createCopy and update_data after checking if the download already...
[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 svk repositories"""
45     def supports(self, url, ud, d):
46         """
47         Check to see if a given url can be fetched with cvs.
48         """
49         return ud.type in ['svk']
50
51     def localpath(self, url, ud, d):
52         if not "module" in ud.parm:
53             raise MissingParameterError("svk method needs a 'module' parameter")
54         else:
55             ud.module = ud.parm["module"]
56
57         ud.revision = ""
58         if 'rev' in ud.parm:
59             ud.revision = ud.parm['rev']
60
61         ud.localfile = data.expand('%s_%s_%s_%s_%s.tar.gz' % (ud.module.replace('/', '.'), ud.host, ud.path.replace('/', '.'), ud.revision, ud.date), d)
62
63         return os.path.join(data.getVar("DL_DIR", d, True), ud.localfile)
64
65     def go(self, loc, ud, d):
66         """Fetch urls"""
67
68         if (ud.date != "now") and Fetch.try_mirror(d, ud.localfile):
69             return
70
71         svkroot = ud.host + ud.path
72
73         localdata = data.createCopy(d)
74         data.setVar('OVERRIDES', "svk:%s" % data.getVar('OVERRIDES', localdata), localdata)
75         data.update_data(localdata)
76
77         data.setVar('SVKROOT', svkroot, localdata)
78         data.setVar('SVKCOOPTS', '', localdata)
79         data.setVar('SVKMODULE', ud.module, localdata)
80         svkcmd = "svk co -r {%s} %s/%s" % (date, svkroot, ud.module)
81
82         if ud.revision:
83             svkcmd = "svk co -r %s/%s" % (ud.revision, svkroot, ud.module)
84
85         # create temp directory
86         bb.msg.debug(2, bb.msg.domain.Fetcher, "Fetch: creating temporary directory")
87         bb.mkdirhier(data.expand('${WORKDIR}', localdata))
88         data.setVar('TMPBASE', data.expand('${WORKDIR}/oesvk.XXXXXX', localdata), localdata)
89         tmppipe = os.popen(data.getVar('MKTEMPDIRCMD', localdata, 1) or "false")
90         tmpfile = tmppipe.readline().strip()
91         if not tmpfile:
92             bb.msg.error(bb.msg.domain.Fetcher, "Fetch: unable to create temporary directory.. make sure 'mktemp' is in the PATH.")
93             raise FetchError(ud.module)
94
95         # check out sources there
96         os.chdir(tmpfile)
97         bb.msg.note(1, bb.msg.domain.Fetcher, "Fetch " + loc)
98         bb.msg.debug(1, bb.msg.domain.Fetcher, "Running %s" % svkcmd)
99         myret = os.system(svkcmd)
100         if myret != 0:
101             try:
102                 os.rmdir(tmpfile)
103             except OSError:
104                 pass
105             raise FetchError(ud.module)
106
107         os.chdir(os.path.join(tmpfile, os.path.dirname(ud.module)))
108         # tar them up to a defined filename
109         myret = os.system("tar -czf %s %s" % (ud.localpath, os.path.basename(ud.module)))
110         if myret != 0:
111             try:
112                 os.unlink(ud.localpath)
113             except OSError:
114                 pass
115         # cleanup
116         os.system('rm -rf %s' % tmpfile)