diff options
Diffstat (limited to 'bitbake/lib/bb/fetch')
-rw-r--r-- | bitbake/lib/bb/fetch/__init__.py | 167 | ||||
-rw-r--r-- | bitbake/lib/bb/fetch/cvs.py | 255 | ||||
-rw-r--r-- | bitbake/lib/bb/fetch/git.py | 144 | ||||
-rw-r--r-- | bitbake/lib/bb/fetch/local.py | 18 | ||||
-rw-r--r-- | bitbake/lib/bb/fetch/perforce.py | 213 | ||||
-rw-r--r-- | bitbake/lib/bb/fetch/ssh.py | 94 | ||||
-rw-r--r-- | bitbake/lib/bb/fetch/svk.py | 160 | ||||
-rw-r--r-- | bitbake/lib/bb/fetch/svn.py | 203 | ||||
-rw-r--r-- | bitbake/lib/bb/fetch/wget.py | 152 |
9 files changed, 728 insertions, 678 deletions
diff --git a/bitbake/lib/bb/fetch/__init__.py b/bitbake/lib/bb/fetch/__init__.py index 7ab0590765..24aebc41ca 100644 --- a/bitbake/lib/bb/fetch/__init__.py +++ b/bitbake/lib/bb/fetch/__init__.py | |||
@@ -38,13 +38,16 @@ class NoMethodError(Exception): | |||
38 | class MissingParameterError(Exception): | 38 | class MissingParameterError(Exception): |
39 | """Exception raised when a fetch method is missing a critical parameter in the url""" | 39 | """Exception raised when a fetch method is missing a critical parameter in the url""" |
40 | 40 | ||
41 | class ParameterError(Exception): | ||
42 | """Exception raised when a url cannot be proccessed due to invalid parameters.""" | ||
43 | |||
41 | class MD5SumError(Exception): | 44 | class MD5SumError(Exception): |
42 | """Exception raised when a MD5SUM of a file does not match the expected one""" | 45 | """Exception raised when a MD5SUM of a file does not match the expected one""" |
43 | 46 | ||
44 | def uri_replace(uri, uri_find, uri_replace, d): | 47 | def uri_replace(uri, uri_find, uri_replace, d): |
45 | # bb.note("uri_replace: operating on %s" % uri) | 48 | # bb.msg.note(1, bb.msg.domain.Fetcher, "uri_replace: operating on %s" % uri) |
46 | if not uri or not uri_find or not uri_replace: | 49 | if not uri or not uri_find or not uri_replace: |
47 | bb.debug(1, "uri_replace: passed an undefined value, not replacing") | 50 | bb.msg.debug(1, bb.msg.domain.Fetcher, "uri_replace: passed an undefined value, not replacing") |
48 | uri_decoded = list(bb.decodeurl(uri)) | 51 | uri_decoded = list(bb.decodeurl(uri)) |
49 | uri_find_decoded = list(bb.decodeurl(uri_find)) | 52 | uri_find_decoded = list(bb.decodeurl(uri_find)) |
50 | uri_replace_decoded = list(bb.decodeurl(uri_replace)) | 53 | uri_replace_decoded = list(bb.decodeurl(uri_replace)) |
@@ -62,9 +65,9 @@ def uri_replace(uri, uri_find, uri_replace, d): | |||
62 | localfn = bb.fetch.localpath(uri, d) | 65 | localfn = bb.fetch.localpath(uri, d) |
63 | if localfn: | 66 | if localfn: |
64 | result_decoded[loc] = os.path.dirname(result_decoded[loc]) + "/" + os.path.basename(bb.fetch.localpath(uri, d)) | 67 | result_decoded[loc] = os.path.dirname(result_decoded[loc]) + "/" + os.path.basename(bb.fetch.localpath(uri, d)) |
65 | # bb.note("uri_replace: matching %s against %s and replacing with %s" % (i, uri_decoded[loc], uri_replace_decoded[loc])) | 68 | # bb.msg.note(1, bb.msg.domain.Fetcher, "uri_replace: matching %s against %s and replacing with %s" % (i, uri_decoded[loc], uri_replace_decoded[loc])) |
66 | else: | 69 | else: |
67 | # bb.note("uri_replace: no match") | 70 | # bb.msg.note(1, bb.msg.domain.Fetcher, "uri_replace: no match") |
68 | return uri | 71 | return uri |
69 | # else: | 72 | # else: |
70 | # for j in i.keys(): | 73 | # for j in i.keys(): |
@@ -72,62 +75,94 @@ def uri_replace(uri, uri_find, uri_replace, d): | |||
72 | return bb.encodeurl(result_decoded) | 75 | return bb.encodeurl(result_decoded) |
73 | 76 | ||
74 | methods = [] | 77 | methods = [] |
78 | urldata = {} | ||
75 | 79 | ||
76 | def init(urls = [], d = None): | 80 | def init(urls = [], d = None): |
77 | if d == None: | 81 | if d == None: |
78 | bb.debug(2,"BUG init called with None as data object!!!") | 82 | bb.msg.debug(2, bb.msg.domain.Fetcher, "BUG init called with None as data object!!!") |
79 | return | 83 | return |
80 | 84 | ||
81 | for m in methods: | 85 | for m in methods: |
82 | m.urls = [] | 86 | m.urls = [] |
83 | 87 | ||
84 | for u in urls: | 88 | for u in urls: |
89 | ud = initdata(u, d) | ||
90 | if ud.method: | ||
91 | ud.method.urls.append(u) | ||
92 | |||
93 | def initdata(url, d): | ||
94 | if url not in urldata: | ||
95 | ud = FetchData() | ||
96 | (ud.type, ud.host, ud.path, ud.user, ud.pswd, ud.parm) = bb.decodeurl(data.expand(url, d)) | ||
97 | ud.date = Fetch.getSRCDate(d) | ||
85 | for m in methods: | 98 | for m in methods: |
86 | m.data = d | 99 | if m.supports(url, ud, d): |
87 | if m.supports(u, d): | 100 | ud.localpath = m.localpath(url, ud, d) |
88 | m.urls.append(u) | 101 | ud.md5 = ud.localpath + '.md5' |
102 | # if user sets localpath for file, use it instead. | ||
103 | if "localpath" in ud.parm: | ||
104 | ud.localpath = ud.parm["localpath"] | ||
105 | ud.method = m | ||
106 | break | ||
107 | urldata[url] = ud | ||
108 | return urldata[url] | ||
89 | 109 | ||
90 | def go(d): | 110 | def go(d): |
91 | """Fetch all urls""" | 111 | """Fetch all urls""" |
92 | for m in methods: | 112 | for m in methods: |
93 | if m.urls: | 113 | for u in m.urls: |
94 | m.go(d) | 114 | ud = urldata[u] |
115 | if ud.localfile and not m.forcefetch(u, ud, d) and os.path.exists(urldata[u].md5): | ||
116 | # File already present along with md5 stamp file | ||
117 | # Touch md5 file to show activity | ||
118 | os.utime(ud.md5, None) | ||
119 | continue | ||
120 | # RP - is olddir needed? | ||
121 | # olddir = os.path.abspath(os.getcwd()) | ||
122 | m.go(u, ud , d) | ||
123 | # os.chdir(olddir) | ||
124 | if ud.localfile and not m.forcefetch(u, ud, d): | ||
125 | Fetch.write_md5sum(u, ud, d) | ||
95 | 126 | ||
96 | def localpaths(d): | 127 | def localpaths(d): |
97 | """Return a list of the local filenames, assuming successful fetch""" | 128 | """Return a list of the local filenames, assuming successful fetch""" |
98 | local = [] | 129 | local = [] |
99 | for m in methods: | 130 | for m in methods: |
100 | for u in m.urls: | 131 | for u in m.urls: |
101 | local.append(m.localpath(u, d)) | 132 | local.append(urldata[u].localpath) |
102 | return local | 133 | return local |
103 | 134 | ||
104 | def localpath(url, d): | 135 | def localpath(url, d): |
105 | for m in methods: | 136 | ud = initdata(url, d) |
106 | if m.supports(url, d): | 137 | if ud.method: |
107 | return m.localpath(url, d) | 138 | return ud.localpath |
108 | return url | 139 | return url |
109 | 140 | ||
141 | class FetchData(object): | ||
142 | """Class for fetcher variable store""" | ||
143 | def __init__(self): | ||
144 | self.localfile = "" | ||
145 | |||
146 | |||
110 | class Fetch(object): | 147 | class Fetch(object): |
111 | """Base class for 'fetch'ing data""" | 148 | """Base class for 'fetch'ing data""" |
112 | 149 | ||
113 | def __init__(self, urls = []): | 150 | def __init__(self, urls = []): |
114 | self.urls = [] | 151 | self.urls = [] |
115 | for url in urls: | ||
116 | if self.supports(bb.decodeurl(url), d) is 1: | ||
117 | self.urls.append(url) | ||
118 | 152 | ||
119 | def supports(url, d): | 153 | def supports(self, url, urldata, d): |
120 | """Check to see if this fetch class supports a given url. | 154 | """ |
121 | Expects supplied url in list form, as outputted by bb.decodeurl(). | 155 | Check to see if this fetch class supports a given url. |
122 | """ | 156 | """ |
123 | return 0 | 157 | return 0 |
124 | supports = staticmethod(supports) | ||
125 | 158 | ||
126 | def localpath(url, d): | 159 | def localpath(self, url, urldata, d): |
127 | """Return the local filename of a given url assuming a successful fetch. | 160 | """ |
161 | Return the local filename of a given url assuming a successful fetch. | ||
162 | Can also setup variables in urldata for use in go (saving code duplication | ||
163 | and duplicate code execution) | ||
128 | """ | 164 | """ |
129 | return url | 165 | return url |
130 | localpath = staticmethod(localpath) | ||
131 | 166 | ||
132 | def setUrls(self, urls): | 167 | def setUrls(self, urls): |
133 | self.__urls = urls | 168 | self.__urls = urls |
@@ -137,16 +172,17 @@ class Fetch(object): | |||
137 | 172 | ||
138 | urls = property(getUrls, setUrls, None, "Urls property") | 173 | urls = property(getUrls, setUrls, None, "Urls property") |
139 | 174 | ||
140 | def setData(self, data): | 175 | def forcefetch(self, url, urldata, d): |
141 | self.__data = data | 176 | """ |
142 | 177 | Force a fetch, even if localpath exists? | |
143 | def getData(self): | 178 | """ |
144 | return self.__data | 179 | return False |
145 | |||
146 | data = property(getData, setData, None, "Data property") | ||
147 | 180 | ||
148 | def go(self, urls = []): | 181 | def go(self, url, urldata, d): |
149 | """Fetch urls""" | 182 | """ |
183 | Fetch urls | ||
184 | Assumes localpath was called first | ||
185 | """ | ||
150 | raise NoMethodError("Missing implementation for url") | 186 | raise NoMethodError("Missing implementation for url") |
151 | 187 | ||
152 | def getSRCDate(d): | 188 | def getSRCDate(d): |
@@ -155,7 +191,12 @@ class Fetch(object): | |||
155 | 191 | ||
156 | d the bb.data module | 192 | d the bb.data module |
157 | """ | 193 | """ |
158 | return data.getVar("SRCDATE", d, 1) or data.getVar("CVSDATE", d, 1) or data.getVar("DATE", d, 1 ) | 194 | pn = data.getVar("PN", d, 1) |
195 | |||
196 | if pn: | ||
197 | return data.getVar("SRCDATE_%s" % pn, d, 1) or data.getVar("CVSDATE_%s" % pn, d, 1) or data.getVar("DATE", d, 1) | ||
198 | |||
199 | return data.getVar("SRCDATE", d, 1) or data.getVar("CVSDATE", d, 1) or data.getVar("DATE", d, 1) | ||
159 | getSRCDate = staticmethod(getSRCDate) | 200 | getSRCDate = staticmethod(getSRCDate) |
160 | 201 | ||
161 | def try_mirror(d, tarfn): | 202 | def try_mirror(d, tarfn): |
@@ -168,6 +209,11 @@ class Fetch(object): | |||
168 | d Is a bb.data instance | 209 | d Is a bb.data instance |
169 | tarfn is the name of the tarball | 210 | tarfn is the name of the tarball |
170 | """ | 211 | """ |
212 | tarpath = os.path.join(data.getVar("DL_DIR", d, 1), tarfn) | ||
213 | if os.access(tarpath, os.R_OK): | ||
214 | bb.msg.debug(1, bb.msg.domain.Fetcher, "%s already exists, skipping checkout." % tarfn) | ||
215 | return True | ||
216 | |||
171 | pn = data.getVar('PN', d, True) | 217 | pn = data.getVar('PN', d, True) |
172 | src_tarball_stash = None | 218 | src_tarball_stash = None |
173 | if pn: | 219 | if pn: |
@@ -176,36 +222,45 @@ class Fetch(object): | |||
176 | for stash in src_tarball_stash: | 222 | for stash in src_tarball_stash: |
177 | fetchcmd = data.getVar("FETCHCOMMAND_mirror", d, True) or data.getVar("FETCHCOMMAND_wget", d, True) | 223 | fetchcmd = data.getVar("FETCHCOMMAND_mirror", d, True) or data.getVar("FETCHCOMMAND_wget", d, True) |
178 | uri = stash + tarfn | 224 | uri = stash + tarfn |
179 | bb.note("fetch " + uri) | 225 | bb.msg.note(1, bb.msg.domain.Fetcher, "fetch " + uri) |
180 | fetchcmd = fetchcmd.replace("${URI}", uri) | 226 | fetchcmd = fetchcmd.replace("${URI}", uri) |
181 | ret = os.system(fetchcmd) | 227 | ret = os.system(fetchcmd) |
182 | if ret == 0: | 228 | if ret == 0: |
183 | bb.note("Fetched %s from tarball stash, skipping checkout" % tarfn) | 229 | bb.msg.note(1, bb.msg.domain.Fetcher, "Fetched %s from tarball stash, skipping checkout" % tarfn) |
184 | return True | 230 | return True |
185 | return False | 231 | return False |
186 | try_mirror = staticmethod(try_mirror) | 232 | try_mirror = staticmethod(try_mirror) |
187 | 233 | ||
188 | def check_for_tarball(d, tarfn, dldir, date): | 234 | def verify_md5sum(ud, got_sum): |
189 | """ | 235 | """ |
190 | Check for a local copy then check the tarball stash. | 236 | Verify the md5sum we wanted with the one we got |
191 | Both checks are skipped if date == 'now'. | ||
192 | |||
193 | d Is a bb.data instance | ||
194 | tarfn is the name of the tarball | ||
195 | date is the SRCDATE | ||
196 | """ | 237 | """ |
197 | if "now" != date: | 238 | wanted_sum = None |
198 | dl = os.path.join(dldir, tarfn) | 239 | if 'md5sum' in ud.parm: |
199 | if os.access(dl, os.R_OK): | 240 | wanted_sum = ud.parm['md5sum'] |
200 | bb.debug(1, "%s already exists, skipping checkout." % tarfn) | 241 | if not wanted_sum: |
201 | return True | 242 | return True |
202 | 243 | ||
203 | # try to use the tarball stash | 244 | return wanted_sum == got_sum |
204 | if Fetch.try_mirror(d, tarfn): | 245 | verify_md5sum = staticmethod(verify_md5sum) |
205 | return True | 246 | |
206 | return False | 247 | def write_md5sum(url, ud, d): |
207 | check_for_tarball = staticmethod(check_for_tarball) | 248 | if bb.which(data.getVar('PATH', d), 'md5sum'): |
208 | 249 | try: | |
250 | md5pipe = os.popen('md5sum ' + ud.localpath) | ||
251 | md5data = (md5pipe.readline().split() or [ "" ])[0] | ||
252 | md5pipe.close() | ||
253 | except OSError: | ||
254 | md5data = "" | ||
255 | |||
256 | # verify the md5sum | ||
257 | if not Fetch.verify_md5sum(ud, md5data): | ||
258 | raise MD5SumError(url) | ||
259 | |||
260 | md5out = file(ud.md5, 'w') | ||
261 | md5out.write(md5data) | ||
262 | md5out.close() | ||
263 | write_md5sum = staticmethod(write_md5sum) | ||
209 | 264 | ||
210 | import cvs | 265 | import cvs |
211 | import git | 266 | import git |
@@ -214,6 +269,7 @@ import svn | |||
214 | import wget | 269 | import wget |
215 | import svk | 270 | import svk |
216 | import ssh | 271 | import ssh |
272 | import perforce | ||
217 | 273 | ||
218 | methods.append(cvs.Cvs()) | 274 | methods.append(cvs.Cvs()) |
219 | methods.append(git.Git()) | 275 | methods.append(git.Git()) |
@@ -222,3 +278,4 @@ methods.append(svn.Svn()) | |||
222 | methods.append(wget.Wget()) | 278 | methods.append(wget.Wget()) |
223 | methods.append(svk.Svk()) | 279 | methods.append(svk.Svk()) |
224 | methods.append(ssh.SSH()) | 280 | methods.append(ssh.SSH()) |
281 | methods.append(perforce.Perforce()) | ||
diff --git a/bitbake/lib/bb/fetch/cvs.py b/bitbake/lib/bb/fetch/cvs.py index 0b2477560a..3bdac177eb 100644 --- a/bitbake/lib/bb/fetch/cvs.py +++ b/bitbake/lib/bb/fetch/cvs.py | |||
@@ -33,164 +33,119 @@ from bb.fetch import FetchError | |||
33 | from bb.fetch import MissingParameterError | 33 | from bb.fetch import MissingParameterError |
34 | 34 | ||
35 | class Cvs(Fetch): | 35 | class Cvs(Fetch): |
36 | """Class to fetch a module or modules from cvs repositories""" | 36 | """ |
37 | def supports(url, d): | 37 | Class to fetch a module or modules from cvs repositories |
38 | """Check to see if a given url can be fetched with cvs. | 38 | """ |
39 | Expects supplied url in list form, as outputted by bb.decodeurl(). | 39 | def supports(self, url, ud, d): |
40 | """ | 40 | """ |
41 | (type, host, path, user, pswd, parm) = bb.decodeurl(data.expand(url, d)) | 41 | Check to see if a given url can be fetched with cvs. |
42 | return type in ['cvs', 'pserver'] | 42 | """ |
43 | supports = staticmethod(supports) | 43 | return ud.type in ['cvs', 'pserver'] |
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 | 44 | ||
51 | if not "module" in parm: | 45 | def localpath(self, url, ud, d): |
46 | if not "module" in ud.parm: | ||
52 | raise MissingParameterError("cvs method needs a 'module' parameter") | 47 | raise MissingParameterError("cvs method needs a 'module' parameter") |
53 | else: | 48 | ud.module = ud.parm["module"] |
54 | module = parm["module"] | 49 | |
55 | if 'tag' in parm: | 50 | ud.tag = "" |
56 | tag = parm['tag'] | 51 | if 'tag' in ud.parm: |
57 | else: | 52 | ud.tag = ud.parm['tag'] |
58 | tag = "" | 53 | |
59 | if 'date' in parm: | 54 | # Override the default date in certain cases |
60 | date = parm['date'] | 55 | if 'date' in ud.parm: |
61 | else: | 56 | ud.date = ud.parm['date'] |
62 | if not tag: | 57 | elif ud.tag: |
63 | date = Fetch.getSRCDate(d) | 58 | ud.date = "" |
64 | else: | 59 | |
65 | date = "" | 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) | ||
66 | 63 | ||
67 | return os.path.join(data.getVar("DL_DIR", d, 1),data.expand('%s_%s_%s_%s.tar.gz' % ( module.replace('/', '.'), host, tag, date), d)) | 64 | def forcefetch(self, url, ud, d): |
68 | localpath = staticmethod(localpath) | 65 | if (ud.date == "now"): |
66 | return True | ||
67 | return False | ||
69 | 68 | ||
70 | def go(self, d, urls = []): | 69 | def go(self, loc, ud, d): |
71 | """Fetch urls""" | 70 | |
72 | if not urls: | 71 | # try to use the tarball stash |
73 | urls = self.urls | 72 | if not self.forcefetch(loc, ud, d) and Fetch.try_mirror(d, ud.localfile): |
73 | bb.msg.debug(1, bb.msg.domain.Fetcher, "%s already exists or was mirrored, skipping cvs checkout." % ud.localpath) | ||
74 | return | ||
75 | |||
76 | method = "pserver" | ||
77 | if "method" in ud.parm: | ||
78 | method = ud.parm["method"] | ||
79 | |||
80 | localdir = ud.module | ||
81 | if "localdir" in ud.parm: | ||
82 | localdir = ud.parm["localdir"] | ||
83 | |||
84 | cvs_rsh = None | ||
85 | if method == "ext": | ||
86 | if "rsh" in ud.parm: | ||
87 | cvs_rsh = ud.parm["rsh"] | ||
88 | |||
89 | if method == "dir": | ||
90 | cvsroot = ud.path | ||
91 | else: | ||
92 | cvsroot = ":" + method + ":" + ud.user | ||
93 | if ud.pswd: | ||
94 | cvsroot += ":" + ud.pswd | ||
95 | cvsroot += "@" + ud.host + ":" + ud.path | ||
96 | |||
97 | options = [] | ||
98 | if ud.date: | ||
99 | options.append("-D %s" % ud.date) | ||
100 | if ud.tag: | ||
101 | options.append("-r %s" % ud.tag) | ||
74 | 102 | ||
75 | localdata = data.createCopy(d) | 103 | localdata = data.createCopy(d) |
76 | data.setVar('OVERRIDES', "cvs:%s" % data.getVar('OVERRIDES', localdata), localdata) | 104 | data.setVar('OVERRIDES', "cvs:%s" % data.getVar('OVERRIDES', localdata), localdata) |
77 | data.update_data(localdata) | 105 | data.update_data(localdata) |
78 | 106 | ||
79 | for loc in urls: | 107 | data.setVar('CVSROOT', cvsroot, localdata) |
80 | (type, host, path, user, pswd, parm) = bb.decodeurl(data.expand(loc, localdata)) | 108 | data.setVar('CVSCOOPTS', " ".join(options), localdata) |
81 | if not "module" in parm: | 109 | data.setVar('CVSMODULE', ud.module, localdata) |
82 | raise MissingParameterError("cvs method needs a 'module' parameter") | 110 | cvscmd = data.getVar('FETCHCOMMAND', localdata, 1) |
83 | else: | 111 | cvsupdatecmd = data.getVar('UPDATECOMMAND', localdata, 1) |
84 | module = parm["module"] | 112 | |
85 | 113 | if cvs_rsh: | |
86 | dlfile = self.localpath(loc, localdata) | 114 | cvscmd = "CVS_RSH=\"%s\" %s" % (cvs_rsh, cvscmd) |
87 | dldir = data.getVar('DL_DIR', localdata, 1) | 115 | cvsupdatecmd = "CVS_RSH=\"%s\" %s" % (cvs_rsh, cvsupdatecmd) |
88 | # if local path contains the cvs | 116 | |
89 | # module, consider the dir above it to be the | 117 | # create module directory |
90 | # download directory | 118 | bb.msg.debug(2, bb.msg.domain.Fetcher, "Fetch: checking for module directory") |
91 | # pos = dlfile.find(module) | 119 | pkg = data.expand('${PN}', d) |
92 | # if pos: | 120 | pkgdir = os.path.join(data.expand('${CVSDIR}', localdata), pkg) |
93 | # dldir = dlfile[:pos] | 121 | moddir = os.path.join(pkgdir,localdir) |
94 | # else: | 122 | if os.access(os.path.join(moddir,'CVS'), os.R_OK): |
95 | # dldir = os.path.dirname(dlfile) | 123 | bb.msg.note(1, bb.msg.domain.Fetcher, "Update " + loc) |
96 | 124 | # update sources there | |
97 | # setup cvs options | ||
98 | options = [] | ||
99 | if 'tag' in parm: | ||
100 | tag = parm['tag'] | ||
101 | else: | ||
102 | tag = "" | ||
103 | |||
104 | if 'date' in parm: | ||
105 | date = parm['date'] | ||
106 | else: | ||
107 | if not tag: | ||
108 | date = Fetch.getSRCDate(d) | ||
109 | else: | ||
110 | date = "" | ||
111 | |||
112 | if "method" in parm: | ||
113 | method = parm["method"] | ||
114 | else: | ||
115 | method = "pserver" | ||
116 | |||
117 | if "localdir" in parm: | ||
118 | localdir = parm["localdir"] | ||
119 | else: | ||
120 | localdir = module | ||
121 | |||
122 | cvs_rsh = None | ||
123 | if method == "ext": | ||
124 | if "rsh" in parm: | ||
125 | cvs_rsh = parm["rsh"] | ||
126 | |||
127 | tarfn = data.expand('%s_%s_%s_%s.tar.gz' % (module.replace('/', '.'), host, tag, date), localdata) | ||
128 | data.setVar('TARFILES', dlfile, localdata) | ||
129 | data.setVar('TARFN', tarfn, localdata) | ||
130 | |||
131 | if Fetch.check_for_tarball(d, tarfn, dldir, date): | ||
132 | continue | ||
133 | |||
134 | if date: | ||
135 | options.append("-D %s" % date) | ||
136 | if tag: | ||
137 | options.append("-r %s" % tag) | ||
138 | |||
139 | olddir = os.path.abspath(os.getcwd()) | ||
140 | os.chdir(data.expand(dldir, localdata)) | ||
141 | |||
142 | # setup cvsroot | ||
143 | if method == "dir": | ||
144 | cvsroot = path | ||
145 | else: | ||
146 | cvsroot = ":" + method + ":" + user | ||
147 | if pswd: | ||
148 | cvsroot += ":" + pswd | ||
149 | cvsroot += "@" + host + ":" + path | ||
150 | |||
151 | data.setVar('CVSROOT', cvsroot, localdata) | ||
152 | data.setVar('CVSCOOPTS', " ".join(options), localdata) | ||
153 | data.setVar('CVSMODULE', module, localdata) | ||
154 | cvscmd = data.getVar('FETCHCOMMAND', localdata, 1) | ||
155 | cvsupdatecmd = data.getVar('UPDATECOMMAND', localdata, 1) | ||
156 | |||
157 | if cvs_rsh: | ||
158 | cvscmd = "CVS_RSH=\"%s\" %s" % (cvs_rsh, cvscmd) | ||
159 | cvsupdatecmd = "CVS_RSH=\"%s\" %s" % (cvs_rsh, cvsupdatecmd) | ||
160 | |||
161 | # create module directory | ||
162 | bb.debug(2, "Fetch: checking for module directory") | ||
163 | pkg=data.expand('${PN}', d) | ||
164 | pkgdir=os.path.join(data.expand('${CVSDIR}', localdata), pkg) | ||
165 | moddir=os.path.join(pkgdir,localdir) | ||
166 | if os.access(os.path.join(moddir,'CVS'), os.R_OK): | ||
167 | bb.note("Update " + loc) | ||
168 | # update sources there | ||
169 | os.chdir(moddir) | ||
170 | myret = os.system(cvsupdatecmd) | ||
171 | else: | ||
172 | bb.note("Fetch " + loc) | ||
173 | # check out sources there | ||
174 | bb.mkdirhier(pkgdir) | ||
175 | os.chdir(pkgdir) | ||
176 | bb.debug(1, "Running %s" % cvscmd) | ||
177 | myret = os.system(cvscmd) | ||
178 | |||
179 | if myret != 0 or not os.access(moddir, os.R_OK): | ||
180 | try: | ||
181 | os.rmdir(moddir) | ||
182 | except OSError: | ||
183 | pass | ||
184 | raise FetchError(module) | ||
185 | |||
186 | os.chdir(moddir) | 125 | os.chdir(moddir) |
187 | os.chdir('..') | 126 | myret = os.system(cvsupdatecmd) |
188 | # tar them up to a defined filename | 127 | else: |
189 | myret = os.system("tar -czf %s %s" % (os.path.join(dldir,tarfn), os.path.basename(moddir))) | 128 | bb.msg.note(1, bb.msg.domain.Fetcher, "Fetch " + loc) |
190 | if myret != 0: | 129 | # check out sources there |
191 | try: | 130 | bb.mkdirhier(pkgdir) |
192 | os.unlink(tarfn) | 131 | os.chdir(pkgdir) |
193 | except OSError: | 132 | bb.msg.debug(1, bb.msg.domain.Fetcher, "Running %s" % cvscmd) |
194 | pass | 133 | myret = os.system(cvscmd) |
195 | os.chdir(olddir) | 134 | |
196 | del localdata | 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 | ||
151 | raise FetchError(ud.module) | ||
diff --git a/bitbake/lib/bb/fetch/git.py b/bitbake/lib/bb/fetch/git.py index 49235c141e..75a7629223 100644 --- a/bitbake/lib/bb/fetch/git.py +++ b/bitbake/lib/bb/fetch/git.py | |||
@@ -37,7 +37,7 @@ def prunedir(topdir): | |||
37 | 37 | ||
38 | def rungitcmd(cmd,d): | 38 | def rungitcmd(cmd,d): |
39 | 39 | ||
40 | bb.debug(1, "Running %s" % cmd) | 40 | bb.msg.debug(1, bb.msg.domain.Fetcher, "Running %s" % cmd) |
41 | 41 | ||
42 | # Need to export PATH as git is likely to be in metadata paths | 42 | # Need to export PATH as git is likely to be in metadata paths |
43 | # rather than host provided | 43 | # rather than host provided |
@@ -48,108 +48,80 @@ def rungitcmd(cmd,d): | |||
48 | if myret != 0: | 48 | if myret != 0: |
49 | raise FetchError("Git: %s failed" % pathcmd) | 49 | raise FetchError("Git: %s failed" % pathcmd) |
50 | 50 | ||
51 | def gettag(parm): | ||
52 | if 'tag' in parm: | ||
53 | tag = parm['tag'] | ||
54 | else: | ||
55 | tag = "" | ||
56 | if not tag: | ||
57 | tag = "master" | ||
58 | |||
59 | return tag | ||
60 | |||
61 | def getprotocol(parm): | ||
62 | if 'protocol' in parm: | ||
63 | proto = parm['protocol'] | ||
64 | else: | ||
65 | proto = "" | ||
66 | if not proto: | ||
67 | proto = "rsync" | ||
68 | |||
69 | return proto | ||
70 | |||
71 | def localfile(url, d): | ||
72 | """Return the filename to cache the checkout in""" | ||
73 | (type, host, path, user, pswd, parm) = bb.decodeurl(data.expand(url, d)) | ||
74 | |||
75 | #if user sets localpath for file, use it instead. | ||
76 | if "localpath" in parm: | ||
77 | return parm["localpath"] | ||
78 | |||
79 | tag = gettag(parm) | ||
80 | |||
81 | return data.expand('git_%s%s_%s.tar.gz' % (host, path.replace('/', '.'), tag), d) | ||
82 | |||
83 | class Git(Fetch): | 51 | class Git(Fetch): |
84 | """Class to fetch a module or modules from git repositories""" | 52 | """Class to fetch a module or modules from git repositories""" |
85 | def supports(url, d): | 53 | def supports(self, url, ud, d): |
86 | """Check to see if a given url can be fetched with cvs. | 54 | """ |
87 | Expects supplied url in list form, as outputted by bb.decodeurl(). | 55 | Check to see if a given url can be fetched with cvs. |
88 | """ | 56 | """ |
89 | (type, host, path, user, pswd, parm) = bb.decodeurl(data.expand(url, d)) | 57 | return ud.type in ['git'] |
90 | return type in ['git'] | ||
91 | supports = staticmethod(supports) | ||
92 | 58 | ||
93 | def localpath(url, d): | 59 | def localpath(self, url, ud, d): |
94 | 60 | ||
95 | return os.path.join(data.getVar("DL_DIR", d, 1), localfile(url, d)) | 61 | ud.proto = "rsync" |
62 | if 'protocol' in ud.parm: | ||
63 | ud.proto = ud.parm['protocol'] | ||
96 | 64 | ||
97 | localpath = staticmethod(localpath) | 65 | ud.tag = "master" |
66 | if 'tag' in ud.parm: | ||
67 | ud.tag = ud.parm['tag'] | ||
98 | 68 | ||
99 | def go(self, d, urls = []): | 69 | ud.localfile = data.expand('git_%s%s_%s.tar.gz' % (ud.host, ud.path.replace('/', '.'), ud.tag), d) |
100 | """Fetch urls""" | ||
101 | if not urls: | ||
102 | urls = self.urls | ||
103 | 70 | ||
104 | for loc in urls: | 71 | return os.path.join(data.getVar("DL_DIR", d, True), ud.localfile) |
105 | (type, host, path, user, pswd, parm) = bb.decodeurl(data.expand(loc, d)) | ||
106 | 72 | ||
107 | tag = gettag(parm) | 73 | def forcefetch(self, url, ud, d): |
108 | proto = getprotocol(parm) | 74 | # tag=="master" must always update |
75 | if (ud.tag == "master"): | ||
76 | return True | ||
77 | return False | ||
109 | 78 | ||
110 | gitsrcname = '%s%s' % (host, path.replace('/', '.')) | 79 | def go(self, loc, ud, d): |
80 | """Fetch url""" | ||
111 | 81 | ||
112 | repofilename = 'git_%s.tar.gz' % (gitsrcname) | 82 | if not self.forcefetch(loc, ud, d) and Fetch.try_mirror(d, ud.localfile): |
113 | repofile = os.path.join(data.getVar("DL_DIR", d, 1), repofilename) | 83 | bb.msg.debug(1, bb.msg.domain.Fetcher, "%s already exists (or was stashed). Skipping git checkout." % ud.localpath) |
114 | repodir = os.path.join(data.expand('${GITDIR}', d), gitsrcname) | 84 | return |
115 | 85 | ||
116 | coname = '%s' % (tag) | 86 | gitsrcname = '%s%s' % (ud.host, ud.path.replace('/', '.')) |
117 | codir = os.path.join(repodir, coname) | ||
118 | 87 | ||
119 | cofile = self.localpath(loc, d) | 88 | repofilename = 'git_%s.tar.gz' % (gitsrcname) |
89 | repofile = os.path.join(data.getVar("DL_DIR", d, 1), repofilename) | ||
90 | repodir = os.path.join(data.expand('${GITDIR}', d), gitsrcname) | ||
120 | 91 | ||
121 | # tag=="master" must always update | 92 | coname = '%s' % (ud.tag) |
122 | if (tag != "master") and Fetch.try_mirror(d, localfile(loc, d)): | 93 | codir = os.path.join(repodir, coname) |
123 | bb.debug(1, "%s already exists (or was stashed). Skipping git checkout." % cofile) | ||
124 | continue | ||
125 | 94 | ||
126 | if not os.path.exists(repodir): | 95 | if not os.path.exists(repodir): |
127 | if Fetch.try_mirror(d, repofilename): | 96 | if Fetch.try_mirror(d, repofilename): |
128 | bb.mkdirhier(repodir) | 97 | bb.mkdirhier(repodir) |
129 | os.chdir(repodir) | 98 | os.chdir(repodir) |
130 | rungitcmd("tar -xzf %s" % (repofile),d) | 99 | rungitcmd("tar -xzf %s" % (repofile),d) |
131 | else: | 100 | else: |
132 | rungitcmd("git clone -n %s://%s%s %s" % (proto, host, path, repodir),d) | 101 | rungitcmd("git clone -n %s://%s%s %s" % (ud.proto, ud.host, ud.path, repodir),d) |
133 | 102 | ||
134 | os.chdir(repodir) | 103 | os.chdir(repodir) |
135 | rungitcmd("git pull %s://%s%s" % (proto, host, path),d) | 104 | rungitcmd("git pull %s://%s%s" % (ud.proto, ud.host, ud.path),d) |
136 | rungitcmd("git pull --tags %s://%s%s" % (proto, host, path),d) | 105 | rungitcmd("git pull --tags %s://%s%s" % (ud.proto, ud.host, ud.path),d) |
137 | rungitcmd("git prune-packed", d) | 106 | rungitcmd("git prune-packed", d) |
138 | # old method of downloading tags | 107 | rungitcmd("git pack-redundant --all | xargs -r rm", d) |
139 | #rungitcmd("rsync -a --verbose --stats --progress rsync://%s%s/ %s" % (host, path, os.path.join(repodir, ".git", "")),d) | 108 | # Remove all but the .git directory |
109 | rungitcmd("rm * -Rf", d) | ||
110 | # old method of downloading tags | ||
111 | #rungitcmd("rsync -a --verbose --stats --progress rsync://%s%s/ %s" % (ud.host, ud.path, os.path.join(repodir, ".git", "")),d) | ||
140 | 112 | ||
141 | os.chdir(repodir) | 113 | os.chdir(repodir) |
142 | bb.note("Creating tarball of git repository") | 114 | bb.msg.note(1, bb.msg.domain.Fetcher, "Creating tarball of git repository") |
143 | rungitcmd("tar -czf %s %s" % (repofile, os.path.join(".", ".git", "*") ),d) | 115 | rungitcmd("tar -czf %s %s" % (repofile, os.path.join(".", ".git", "*") ),d) |
144 | 116 | ||
145 | if os.path.exists(codir): | 117 | if os.path.exists(codir): |
146 | prunedir(codir) | 118 | prunedir(codir) |
147 | 119 | ||
148 | bb.mkdirhier(codir) | 120 | bb.mkdirhier(codir) |
149 | os.chdir(repodir) | 121 | os.chdir(repodir) |
150 | rungitcmd("git read-tree %s" % (tag),d) | 122 | rungitcmd("git read-tree %s" % (ud.tag),d) |
151 | rungitcmd("git checkout-index -q -f --prefix=%s -a" % (os.path.join(codir, "git", "")),d) | 123 | rungitcmd("git checkout-index -q -f --prefix=%s -a" % (os.path.join(codir, "git", "")),d) |
152 | 124 | ||
153 | os.chdir(codir) | 125 | os.chdir(codir) |
154 | bb.note("Creating tarball of git checkout") | 126 | bb.msg.note(1, bb.msg.domain.Fetcher, "Creating tarball of git checkout") |
155 | rungitcmd("tar -czf %s %s" % (cofile, os.path.join(".", "*") ),d) | 127 | rungitcmd("tar -czf %s %s" % (ud.localpath, os.path.join(".", "*") ),d) |
diff --git a/bitbake/lib/bb/fetch/local.py b/bitbake/lib/bb/fetch/local.py index 51938f823e..5224976704 100644 --- a/bitbake/lib/bb/fetch/local.py +++ b/bitbake/lib/bb/fetch/local.py | |||
@@ -31,15 +31,13 @@ from bb import data | |||
31 | from bb.fetch import Fetch | 31 | from bb.fetch import Fetch |
32 | 32 | ||
33 | class Local(Fetch): | 33 | class Local(Fetch): |
34 | def supports(url, d): | 34 | def supports(self, url, urldata, d): |
35 | """Check to see if a given url can be fetched in the local filesystem. | ||
36 | Expects supplied url in list form, as outputted by bb.decodeurl(). | ||
37 | """ | 35 | """ |
38 | (type, host, path, user, pswd, parm) = bb.decodeurl(data.expand(url, d)) | 36 | Check to see if a given url can be fetched with cvs. |
39 | return type in ['file','patch'] | 37 | """ |
40 | supports = staticmethod(supports) | 38 | return urldata.type in ['file','patch'] |
41 | 39 | ||
42 | def localpath(url, d): | 40 | def localpath(self, url, urldata, d): |
43 | """Return the local filename of a given url assuming a successful fetch. | 41 | """Return the local filename of a given url assuming a successful fetch. |
44 | """ | 42 | """ |
45 | path = url.split("://")[1] | 43 | path = url.split("://")[1] |
@@ -52,10 +50,10 @@ class Local(Fetch): | |||
52 | filesdir = data.getVar('FILESDIR', d, 1) | 50 | filesdir = data.getVar('FILESDIR', d, 1) |
53 | if filesdir: | 51 | if filesdir: |
54 | newpath = os.path.join(filesdir, path) | 52 | newpath = os.path.join(filesdir, path) |
53 | # We don't set localfile as for this fetcher the file is already local! | ||
55 | return newpath | 54 | return newpath |
56 | localpath = staticmethod(localpath) | ||
57 | 55 | ||
58 | def go(self, urls = []): | 56 | def go(self, url, urldata, d): |
59 | """Fetch urls (no-op for Local method)""" | 57 | """Fetch urls (no-op for Local method)""" |
60 | # no need to fetch local files, we'll deal with them in place. | 58 | # no need to fetch local files, we'll deal with them in place. |
61 | return 1 | 59 | return 1 |
diff --git a/bitbake/lib/bb/fetch/perforce.py b/bitbake/lib/bb/fetch/perforce.py new file mode 100644 index 0000000000..88acf69951 --- /dev/null +++ b/bitbake/lib/bb/fetch/perforce.py | |||
@@ -0,0 +1,213 @@ | |||
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 Perforce(Fetch): | ||
36 | def supports(self, url, ud, d): | ||
37 | return ud.type in ['p4'] | ||
38 | |||
39 | def doparse(url,d): | ||
40 | parm=[] | ||
41 | path = url.split("://")[1] | ||
42 | delim = path.find("@"); | ||
43 | if delim != -1: | ||
44 | (user,pswd,host,port) = path.split('@')[0].split(":") | ||
45 | path = path.split('@')[1] | ||
46 | else: | ||
47 | (host,port) = data.getVar('P4PORT', d).split(':') | ||
48 | user = "" | ||
49 | pswd = "" | ||
50 | |||
51 | if path.find(";") != -1: | ||
52 | keys=[] | ||
53 | values=[] | ||
54 | plist = path.split(';') | ||
55 | for item in plist: | ||
56 | if item.count('='): | ||
57 | (key,value) = item.split('=') | ||
58 | keys.append(key) | ||
59 | values.append(value) | ||
60 | |||
61 | parm = dict(zip(keys,values)) | ||
62 | path = "//" + path.split(';')[0] | ||
63 | host += ":%s" % (port) | ||
64 | parm["cset"] = Perforce.getcset(d, path, host, user, pswd, parm) | ||
65 | |||
66 | return host,path,user,pswd,parm | ||
67 | doparse = staticmethod(doparse) | ||
68 | |||
69 | def getcset(d, depot,host,user,pswd,parm): | ||
70 | if "cset" in parm: | ||
71 | return parm["cset"]; | ||
72 | if user: | ||
73 | data.setVar('P4USER', user, d) | ||
74 | if pswd: | ||
75 | data.setVar('P4PASSWD', pswd, d) | ||
76 | if host: | ||
77 | data.setVar('P4PORT', host, d) | ||
78 | |||
79 | p4date = data.getVar("P4DATE", d, 1) | ||
80 | if "revision" in parm: | ||
81 | depot += "#%s" % (parm["revision"]) | ||
82 | elif "label" in parm: | ||
83 | depot += "@%s" % (parm["label"]) | ||
84 | elif p4date: | ||
85 | depot += "@%s" % (p4date) | ||
86 | |||
87 | p4cmd = data.getVar('FETCHCOMMAND_p4', d, 1) | ||
88 | bb.msg.debug(1, bb.msg.domain.Fetcher, "Running %s changes -m 1 %s" % (p4cmd, depot)) | ||
89 | p4file = os.popen("%s changes -m 1 %s" % (p4cmd,depot)) | ||
90 | cset = p4file.readline().strip() | ||
91 | bb.msg.debug(1, bb.msg.domain.Fetcher, "READ %s" % (cset)) | ||
92 | if not cset: | ||
93 | return -1 | ||
94 | |||
95 | return cset.split(' ')[1] | ||
96 | getcset = staticmethod(getcset) | ||
97 | |||
98 | def localpath(self, url, ud, d): | ||
99 | |||
100 | (host,path,user,pswd,parm) = Perforce.doparse(url,d) | ||
101 | |||
102 | # If a label is specified, we use that as our filename | ||
103 | |||
104 | if "label" in parm: | ||
105 | ud.localfile = "%s.tar.gz" % (parm["label"]) | ||
106 | return os.path.join(data.getVar("DL_DIR", d, 1), ud.localfile) | ||
107 | |||
108 | base = path | ||
109 | which = path.find('/...') | ||
110 | if which != -1: | ||
111 | base = path[:which] | ||
112 | |||
113 | if base[0] == "/": | ||
114 | base = base[1:] | ||
115 | |||
116 | cset = Perforce.getcset(d, path, host, user, pswd, parm) | ||
117 | |||
118 | ud.localfile = data.expand('%s+%s+%s.tar.gz' % (host,base.replace('/', '.'), cset), d) | ||
119 | |||
120 | return os.path.join(data.getVar("DL_DIR", d, 1), ud.localfile) | ||
121 | |||
122 | def go(self, loc, ud, d): | ||
123 | """ | ||
124 | Fetch urls | ||
125 | """ | ||
126 | |||
127 | # try to use the tarball stash | ||
128 | if not self.forcefetch(loc, ud, d) and Fetch.try_mirror(d, ud.localfile): | ||
129 | bb.msg.debug(1, bb.msg.domain.Fetcher, "%s already exists or was mirrored, skipping perforce checkout." % ud.localpath) | ||
130 | return | ||
131 | |||
132 | (host,depot,user,pswd,parm) = Perforce.doparse(loc, d) | ||
133 | |||
134 | if depot.find('/...') != -1: | ||
135 | path = depot[:depot.find('/...')] | ||
136 | else: | ||
137 | path = depot | ||
138 | |||
139 | if "module" in parm: | ||
140 | module = parm["module"] | ||
141 | else: | ||
142 | module = os.path.basename(path) | ||
143 | |||
144 | localdata = data.createCopy(d) | ||
145 | data.setVar('OVERRIDES', "p4:%s" % data.getVar('OVERRIDES', localdata), localdata) | ||
146 | data.update_data(localdata) | ||
147 | |||
148 | # Get the p4 command | ||
149 | if user: | ||
150 | data.setVar('P4USER', user, localdata) | ||
151 | |||
152 | if pswd: | ||
153 | data.setVar('P4PASSWD', pswd, localdata) | ||
154 | |||
155 | if host: | ||
156 | data.setVar('P4PORT', host, localdata) | ||
157 | |||
158 | p4cmd = data.getVar('FETCHCOMMAND', localdata, 1) | ||
159 | |||
160 | # create temp directory | ||
161 | bb.msg.debug(2, bb.msg.domain.Fetcher, "Fetch: creating temporary directory") | ||
162 | bb.mkdirhier(data.expand('${WORKDIR}', localdata)) | ||
163 | data.setVar('TMPBASE', data.expand('${WORKDIR}/oep4.XXXXXX', localdata), localdata) | ||
164 | tmppipe = os.popen(data.getVar('MKTEMPDIRCMD', localdata, 1) or "false") | ||
165 | tmpfile = tmppipe.readline().strip() | ||
166 | if not tmpfile: | ||
167 | bb.error("Fetch: unable to create temporary directory.. make sure 'mktemp' is in the PATH.") | ||
168 | raise FetchError(module) | ||
169 | |||
170 | if "label" in parm: | ||
171 | depot = "%s@%s" % (depot,parm["label"]) | ||
172 | else: | ||
173 | cset = Perforce.getcset(d, depot, host, user, pswd, parm) | ||
174 | depot = "%s@%s" % (depot,cset) | ||
175 | |||
176 | os.chdir(tmpfile) | ||
177 | bb.msg.note(1, bb.msg.domain.Fetcher, "Fetch " + loc) | ||
178 | bb.msg.note(1, bb.msg.domain.Fetcher, "%s files %s" % (p4cmd, depot)) | ||
179 | p4file = os.popen("%s files %s" % (p4cmd, depot)) | ||
180 | |||
181 | if not p4file: | ||
182 | bb.error("Fetch: unable to get the P4 files from %s" % (depot)) | ||
183 | raise FetchError(module) | ||
184 | |||
185 | count = 0 | ||
186 | |||
187 | for file in p4file: | ||
188 | list = file.split() | ||
189 | |||
190 | if list[2] == "delete": | ||
191 | continue | ||
192 | |||
193 | dest = list[0][len(path)+1:] | ||
194 | where = dest.find("#") | ||
195 | |||
196 | os.system("%s print -o %s/%s %s" % (p4cmd, module,dest[:where],list[0])) | ||
197 | count = count + 1 | ||
198 | |||
199 | if count == 0: | ||
200 | bb.error("Fetch: No files gathered from the P4 fetch") | ||
201 | raise FetchError(module) | ||
202 | |||
203 | myret = os.system("tar -czf %s %s" % (ud.localpath, module)) | ||
204 | if myret != 0: | ||
205 | try: | ||
206 | os.unlink(ud.localpath) | ||
207 | except OSError: | ||
208 | pass | ||
209 | raise FetchError(module) | ||
210 | # cleanup | ||
211 | os.system('rm -rf %s' % tmpfile) | ||
212 | |||
213 | |||
diff --git a/bitbake/lib/bb/fetch/ssh.py b/bitbake/lib/bb/fetch/ssh.py index 57874d5ba9..e5f69e33e7 100644 --- a/bitbake/lib/bb/fetch/ssh.py +++ b/bitbake/lib/bb/fetch/ssh.py | |||
@@ -64,59 +64,55 @@ __pattern__ = re.compile(r''' | |||
64 | class SSH(Fetch): | 64 | class SSH(Fetch): |
65 | '''Class to fetch a module or modules via Secure Shell''' | 65 | '''Class to fetch a module or modules via Secure Shell''' |
66 | 66 | ||
67 | def supports(self, url, d): | 67 | def supports(self, url, urldata, d): |
68 | return __pattern__.match(url) != None | 68 | return __pattern__.match(url) != None |
69 | 69 | ||
70 | def localpath(self, url, d): | 70 | def localpath(self, url, urldata, d): |
71 | m = __pattern__.match(url) | 71 | m = __pattern__.match(url) |
72 | path = m.group('path') | 72 | path = m.group('path') |
73 | host = m.group('host') | 73 | host = m.group('host') |
74 | lpath = os.path.join(data.getVar('DL_DIR', d, 1), host, os.path.basename(path)) | 74 | lpath = os.path.join(data.getVar('DL_DIR', d, True), host, os.path.basename(path)) |
75 | return lpath | 75 | return lpath |
76 | 76 | ||
77 | def go(self, d, urls = []): | 77 | def go(self, url, urldata, d): |
78 | if not urls: | 78 | dldir = data.getVar('DL_DIR', d, 1) |
79 | urls = self.urls | 79 | |
80 | 80 | m = __pattern__.match(url) | |
81 | for url in urls: | 81 | path = m.group('path') |
82 | dldir = data.getVar('DL_DIR', d, 1) | 82 | host = m.group('host') |
83 | 83 | port = m.group('port') | |
84 | m = __pattern__.match(url) | 84 | user = m.group('user') |
85 | path = m.group('path') | 85 | password = m.group('pass') |
86 | host = m.group('host') | 86 | |
87 | port = m.group('port') | 87 | ldir = os.path.join(dldir, host) |
88 | user = m.group('user') | 88 | lpath = os.path.join(ldir, os.path.basename(path)) |
89 | password = m.group('pass') | 89 | |
90 | 90 | if not os.path.exists(ldir): | |
91 | ldir = os.path.join(dldir, host) | 91 | os.makedirs(ldir) |
92 | lpath = os.path.join(ldir, os.path.basename(path)) | 92 | |
93 | 93 | if port: | |
94 | if not os.path.exists(ldir): | 94 | port = '-P %s' % port |
95 | os.makedirs(ldir) | 95 | else: |
96 | 96 | port = '' | |
97 | if port: | 97 | |
98 | port = '-P %s' % port | 98 | if user: |
99 | else: | 99 | fr = user |
100 | port = '' | 100 | if password: |
101 | 101 | fr += ':%s' % password | |
102 | if user: | 102 | fr += '@%s' % host |
103 | fr = user | 103 | else: |
104 | if password: | 104 | fr = host |
105 | fr += ':%s' % password | 105 | fr += ':%s' % path |
106 | fr += '@%s' % host | 106 | |
107 | else: | 107 | |
108 | fr = host | 108 | import commands |
109 | fr += ':%s' % path | 109 | cmd = 'scp -B -r %s %s %s/' % ( |
110 | 110 | port, | |
111 | 111 | commands.mkarg(fr), | |
112 | import commands | 112 | commands.mkarg(ldir) |
113 | cmd = 'scp -B -r %s %s %s/' % ( | 113 | ) |
114 | port, | 114 | |
115 | commands.mkarg(fr), | 115 | (exitstatus, output) = commands.getstatusoutput(cmd) |
116 | commands.mkarg(ldir) | 116 | if exitstatus != 0: |
117 | ) | 117 | print output |
118 | 118 | raise FetchError('Unable to fetch %s' % url) | |
119 | (exitstatus, output) = commands.getstatusoutput(cmd) | ||
120 | if exitstatus != 0: | ||
121 | print output | ||
122 | raise FetchError('Unable to fetch %s' % url) | ||
diff --git a/bitbake/lib/bb/fetch/svk.py b/bitbake/lib/bb/fetch/svk.py index 19103213cd..29270ab3d8 100644 --- a/bitbake/lib/bb/fetch/svk.py +++ b/bitbake/lib/bb/fetch/svk.py | |||
@@ -42,112 +42,76 @@ from bb.fetch import MissingParameterError | |||
42 | 42 | ||
43 | class Svk(Fetch): | 43 | class Svk(Fetch): |
44 | """Class to fetch a module or modules from svk repositories""" | 44 | """Class to fetch a module or modules from svk repositories""" |
45 | def supports(url, d): | 45 | def supports(self, url, ud, d): |
46 | """Check to see if a given url can be fetched with svk. | ||
47 | Expects supplied url in list form, as outputted by bb.decodeurl(). | ||
48 | """ | 46 | """ |
49 | (type, host, path, user, pswd, parm) = bb.decodeurl(data.expand(url, d)) | 47 | Check to see if a given url can be fetched with cvs. |
50 | return type in ['svk'] | 48 | """ |
51 | supports = staticmethod(supports) | 49 | return ud.type in ['svk'] |
52 | |||
53 | def localpath(url, d): | ||
54 | (type, host, path, user, pswd, parm) = bb.decodeurl(data.expand(url, d)) | ||
55 | if "localpath" in parm: | ||
56 | # if user overrides local path, use it. | ||
57 | return parm["localpath"] | ||
58 | 50 | ||
59 | if not "module" in parm: | 51 | def localpath(self, url, ud, d): |
52 | if not "module" in ud.parm: | ||
60 | raise MissingParameterError("svk method needs a 'module' parameter") | 53 | raise MissingParameterError("svk method needs a 'module' parameter") |
61 | else: | 54 | else: |
62 | module = parm["module"] | 55 | ud.module = ud.parm["module"] |
63 | if 'rev' in parm: | 56 | |
64 | revision = parm['rev'] | 57 | ud.revision = "" |
65 | else: | 58 | if 'rev' in ud.parm: |
66 | revision = "" | 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) | ||
67 | 62 | ||
68 | date = Fetch.getSRCDate(d) | 63 | return os.path.join(data.getVar("DL_DIR", d, True), ud.localfile) |
69 | 64 | ||
70 | 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)) | 65 | def forcefetch(self, url, ud, d): |
71 | localpath = staticmethod(localpath) | 66 | if (ud.date == "now"): |
67 | return True | ||
68 | return False | ||
72 | 69 | ||
73 | def go(self, d, urls = []): | 70 | def go(self, loc, ud, d): |
74 | """Fetch urls""" | 71 | """Fetch urls""" |
75 | if not urls: | ||
76 | urls = self.urls | ||
77 | 72 | ||
73 | if not self.forcefetch(loc, ud, d) and Fetch.try_mirror(d, ud.localfile): | ||
74 | return | ||
75 | |||
76 | svkroot = ud.host + ud.path | ||
77 | |||
78 | svkcmd = "svk co -r {%s} %s/%s" % (date, svkroot, ud.module) | ||
79 | |||
80 | if ud.revision: | ||
81 | svkcmd = "svk co -r %s/%s" % (ud.revision, svkroot, ud.module) | ||
82 | |||
83 | # create temp directory | ||
78 | localdata = data.createCopy(d) | 84 | localdata = data.createCopy(d) |
79 | data.setVar('OVERRIDES', "svk:%s" % data.getVar('OVERRIDES', localdata), localdata) | ||
80 | data.update_data(localdata) | 85 | data.update_data(localdata) |
81 | 86 | bb.msg.debug(2, bb.msg.domain.Fetcher, "Fetch: creating temporary directory") | |
82 | for loc in urls: | 87 | bb.mkdirhier(data.expand('${WORKDIR}', localdata)) |
83 | (type, host, path, user, pswd, parm) = bb.decodeurl(data.expand(loc, localdata)) | 88 | data.setVar('TMPBASE', data.expand('${WORKDIR}/oesvk.XXXXXX', localdata), localdata) |
84 | if not "module" in parm: | 89 | tmppipe = os.popen(data.getVar('MKTEMPDIRCMD', localdata, 1) or "false") |
85 | raise MissingParameterError("svk method needs a 'module' parameter") | 90 | tmpfile = tmppipe.readline().strip() |
86 | else: | 91 | if not tmpfile: |
87 | module = parm["module"] | 92 | bb.msg.error(bb.msg.domain.Fetcher, "Fetch: unable to create temporary directory.. make sure 'mktemp' is in the PATH.") |
88 | 93 | raise FetchError(ud.module) | |
89 | dlfile = self.localpath(loc, localdata) | 94 | |
90 | dldir = data.getVar('DL_DIR', localdata, 1) | 95 | # check out sources there |
91 | 96 | os.chdir(tmpfile) | |
92 | # setup svk options | 97 | bb.msg.note(1, bb.msg.domain.Fetcher, "Fetch " + loc) |
93 | options = [] | 98 | bb.msg.debug(1, bb.msg.domain.Fetcher, "Running %s" % svkcmd) |
94 | if 'rev' in parm: | 99 | myret = os.system(svkcmd) |
95 | revision = parm['rev'] | 100 | if myret != 0: |
96 | else: | 101 | try: |
97 | revision = "" | 102 | os.rmdir(tmpfile) |
98 | 103 | except OSError: | |
99 | date = Fetch.getSRCDate(d) | 104 | pass |
100 | tarfn = data.expand('%s_%s_%s_%s_%s.tar.gz' % (module.replace('/', '.'), host, path.replace('/', '.'), revision, date), localdata) | 105 | raise FetchError(ud.module) |
101 | data.setVar('TARFILES', dlfile, localdata) | 106 | |
102 | data.setVar('TARFN', tarfn, localdata) | 107 | os.chdir(os.path.join(tmpfile, os.path.dirname(ud.module))) |
103 | 108 | # tar them up to a defined filename | |
104 | if Fetch.check_for_tarball(d, tarfn, dldir, date): | 109 | myret = os.system("tar -czf %s %s" % (ud.localpath, os.path.basename(ud.module))) |
105 | continue | 110 | if myret != 0: |
106 | 111 | try: | |
107 | olddir = os.path.abspath(os.getcwd()) | 112 | os.unlink(ud.localpath) |
108 | os.chdir(data.expand(dldir, localdata)) | 113 | except OSError: |
109 | 114 | pass | |
110 | svkroot = host + path | 115 | raise FetchError(ud.module) |
111 | 116 | # cleanup | |
112 | data.setVar('SVKROOT', svkroot, localdata) | 117 | os.system('rm -rf %s' % tmpfile) |
113 | data.setVar('SVKCOOPTS', " ".join(options), localdata) | ||
114 | data.setVar('SVKMODULE', module, localdata) | ||
115 | svkcmd = "svk co -r {%s} %s/%s" % (date, svkroot, module) | ||
116 | |||
117 | if revision: | ||
118 | svkcmd = "svk co -r %s/%s" % (revision, svkroot, module) | ||
119 | |||
120 | # create temp directory | ||
121 | bb.debug(2, "Fetch: creating temporary directory") | ||
122 | bb.mkdirhier(data.expand('${WORKDIR}', localdata)) | ||
123 | data.setVar('TMPBASE', data.expand('${WORKDIR}/oesvk.XXXXXX', localdata), localdata) | ||
124 | tmppipe = os.popen(data.getVar('MKTEMPDIRCMD', localdata, 1) or "false") | ||
125 | tmpfile = tmppipe.readline().strip() | ||
126 | if not tmpfile: | ||
127 | bb.error("Fetch: unable to create temporary directory.. make sure 'mktemp' is in the PATH.") | ||
128 | raise FetchError(module) | ||
129 | |||
130 | # check out sources there | ||
131 | os.chdir(tmpfile) | ||
132 | bb.note("Fetch " + loc) | ||
133 | bb.debug(1, "Running %s" % svkcmd) | ||
134 | myret = os.system(svkcmd) | ||
135 | if myret != 0: | ||
136 | try: | ||
137 | os.rmdir(tmpfile) | ||
138 | except OSError: | ||
139 | pass | ||
140 | raise FetchError(module) | ||
141 | |||
142 | os.chdir(os.path.join(tmpfile, os.path.dirname(module))) | ||
143 | # tar them up to a defined filename | ||
144 | myret = os.system("tar -czf %s %s" % (os.path.join(dldir,tarfn), os.path.basename(module))) | ||
145 | if myret != 0: | ||
146 | try: | ||
147 | os.unlink(tarfn) | ||
148 | except OSError: | ||
149 | pass | ||
150 | # cleanup | ||
151 | os.system('rm -rf %s' % tmpfile) | ||
152 | os.chdir(olddir) | ||
153 | del localdata | ||
diff --git a/bitbake/lib/bb/fetch/svn.py b/bitbake/lib/bb/fetch/svn.py index d1a959371b..b95de2a79b 100644 --- a/bitbake/lib/bb/fetch/svn.py +++ b/bitbake/lib/bb/fetch/svn.py | |||
@@ -26,6 +26,7 @@ Based on functions from the base bb module, Copyright 2003 Holger Schurig | |||
26 | """ | 26 | """ |
27 | 27 | ||
28 | import os, re | 28 | import os, re |
29 | import sys | ||
29 | import bb | 30 | import bb |
30 | from bb import data | 31 | from bb import data |
31 | from bb.fetch import Fetch | 32 | from bb.fetch import Fetch |
@@ -34,136 +35,98 @@ from bb.fetch import MissingParameterError | |||
34 | 35 | ||
35 | class Svn(Fetch): | 36 | class Svn(Fetch): |
36 | """Class to fetch a module or modules from svn repositories""" | 37 | """Class to fetch a module or modules from svn repositories""" |
37 | def supports(url, d): | 38 | def supports(self, url, ud, 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 | """ | 39 | """ |
41 | (type, host, path, user, pswd, parm) = bb.decodeurl(data.expand(url, d)) | 40 | Check to see if a given url can be fetched with svn. |
42 | return type in ['svn'] | 41 | """ |
43 | supports = staticmethod(supports) | 42 | return ud.type in ['svn'] |
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 | 43 | ||
51 | if not "module" in parm: | 44 | def localpath(self, url, ud, d): |
45 | if not "module" in ud.parm: | ||
52 | raise MissingParameterError("svn method needs a 'module' parameter") | 46 | raise MissingParameterError("svn method needs a 'module' parameter") |
53 | else: | 47 | else: |
54 | module = parm["module"] | 48 | ud.module = ud.parm["module"] |
55 | if 'rev' in parm: | 49 | |
56 | revision = parm['rev'] | 50 | ud.revision = "" |
57 | else: | 51 | if 'rev' in ud.parm: |
58 | revision = "" | 52 | ud.revision = ud.parm['rev'] |
53 | |||
54 | ud.localfile = data.expand('%s_%s_%s_%s_%s.tar.gz' % (ud.module.replace('/', '.'), ud.host, ud.path.replace('/', '.'), ud.revision, ud.date), d) | ||
55 | |||
56 | return os.path.join(data.getVar("DL_DIR", d, True), ud.localfile) | ||
59 | 57 | ||
60 | date = Fetch.getSRCDate(d) | 58 | def forcefetch(self, url, ud, d): |
59 | if (ud.date == "now"): | ||
60 | return True | ||
61 | return False | ||
61 | 62 | ||
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 | def go(self, loc, ud, d): |
63 | localpath = staticmethod(localpath) | 64 | """Fetch url""" |
64 | 65 | ||
65 | def go(self, d, urls = []): | 66 | # try to use the tarball stash |
66 | """Fetch urls""" | 67 | if not self.forcefetch(loc, ud, d) and Fetch.try_mirror(d, ud.localfile): |
67 | if not urls: | 68 | bb.msg.debug(1, bb.msg.domain.Fetcher, "%s already exists or was mirrored, skipping svn checkout." % ud.localpath) |
68 | urls = self.urls | 69 | return |
70 | |||
71 | proto = "svn" | ||
72 | if "proto" in ud.parm: | ||
73 | proto = ud.parm["proto"] | ||
74 | |||
75 | svn_rsh = None | ||
76 | if proto == "svn+ssh" and "rsh" in ud.parm: | ||
77 | svn_rsh = ud.parm["rsh"] | ||
78 | |||
79 | svnroot = ud.host + ud.path | ||
80 | |||
81 | # either use the revision, or SRCDATE in braces, or nothing for SRCDATE = "now" | ||
82 | options = [] | ||
83 | if ud.revision: | ||
84 | options.append("-r %s" % ud.revision) | ||
85 | elif ud.date != "now": | ||
86 | options.append("-r {%s}" % ud.date) | ||
69 | 87 | ||
70 | localdata = data.createCopy(d) | 88 | localdata = data.createCopy(d) |
71 | data.setVar('OVERRIDES', "svn:%s" % data.getVar('OVERRIDES', localdata), localdata) | 89 | data.setVar('OVERRIDES', "svn:%s" % data.getVar('OVERRIDES', localdata), localdata) |
72 | data.update_data(localdata) | 90 | data.update_data(localdata) |
73 | 91 | ||
74 | for loc in urls: | 92 | data.setVar('SVNROOT', "%s://%s/%s" % (proto, svnroot, ud.module), localdata) |
75 | (type, host, path, user, pswd, parm) = bb.decodeurl(data.expand(loc, localdata)) | 93 | data.setVar('SVNCOOPTS', " ".join(options), localdata) |
76 | if not "module" in parm: | 94 | data.setVar('SVNMODULE', ud.module, localdata) |
77 | raise MissingParameterError("svn method needs a 'module' parameter") | 95 | svncmd = data.getVar('FETCHCOMMAND', localdata, 1) |
78 | else: | 96 | svnupcmd = data.getVar('UPDATECOMMAND', localdata, 1) |
79 | module = parm["module"] | 97 | |
80 | 98 | if svn_rsh: | |
81 | dlfile = self.localpath(loc, localdata) | 99 | svncmd = "svn_RSH=\"%s\" %s" % (svn_rsh, svncmd) |
82 | dldir = data.getVar('DL_DIR', localdata, 1) | 100 | svnupcmd = "svn_RSH=\"%s\" %s" % (svn_rsh, svnupcmd) |
83 | # if local path contains the svn | 101 | |
84 | # module, consider the dir above it to be the | 102 | pkg = data.expand('${PN}', d) |
85 | # download directory | 103 | pkgdir = os.path.join(data.expand('${SVNDIR}', localdata), pkg) |
86 | # pos = dlfile.find(module) | 104 | moddir = os.path.join(pkgdir, ud.module) |
87 | # if pos: | 105 | bb.msg.debug(2, bb.msg.domain.Fetcher, "Fetch: checking for module directory '" + moddir + "'") |
88 | # dldir = dlfile[:pos] | 106 | |
89 | # else: | 107 | if os.access(os.path.join(moddir, '.svn'), os.R_OK): |
90 | # dldir = os.path.dirname(dlfile) | 108 | bb.msg.note(1, bb.msg.domain.Fetcher, "Update " + loc) |
91 | 109 | # update sources there | |
92 | # setup svn options | 110 | os.chdir(moddir) |
93 | options = [] | 111 | bb.msg.debug(1, bb.msg.domain.Fetcher, "Running %s" % svnupcmd) |
94 | if 'rev' in parm: | 112 | myret = os.system(svnupcmd) |
95 | revision = parm['rev'] | 113 | else: |
96 | else: | 114 | bb.msg.note(1, bb.msg.domain.Fetcher, "Fetch " + loc) |
97 | revision = "" | 115 | # check out sources there |
98 | 116 | bb.mkdirhier(pkgdir) | |
99 | date = Fetch.getSRCDate(d) | 117 | os.chdir(pkgdir) |
100 | 118 | bb.msg.debug(1, bb.msg.domain.Fetcher, "Running %s" % svncmd) | |
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 | if Fetch.check_for_tarball(d, tarfn, dldir, date): | ||
115 | continue | ||
116 | |||
117 | olddir = os.path.abspath(os.getcwd()) | ||
118 | os.chdir(data.expand(dldir, localdata)) | ||
119 | |||
120 | svnroot = host + path | ||
121 | |||
122 | data.setVar('SVNROOT', svnroot, localdata) | ||
123 | data.setVar('SVNCOOPTS', " ".join(options), localdata) | ||
124 | data.setVar('SVNMODULE', module, localdata) | ||
125 | svncmd = data.getVar('FETCHCOMMAND', localdata, 1) | ||
126 | svncmd = "svn co -r {%s} %s://%s/%s" % (date, proto, svnroot, module) | ||
127 | |||
128 | if revision: | ||
129 | svncmd = "svn co -r %s %s://%s/%s" % (revision, proto, svnroot, module) | ||
130 | elif date == "now": | ||
131 | svncmd = "svn co %s://%s/%s" % (proto, svnroot, module) | ||
132 | |||
133 | if svn_rsh: | ||
134 | svncmd = "svn_RSH=\"%s\" %s" % (svn_rsh, svncmd) | ||
135 | |||
136 | # create temp directory | ||
137 | bb.debug(2, "Fetch: creating temporary directory") | ||
138 | bb.mkdirhier(data.expand('${WORKDIR}', localdata)) | ||
139 | data.setVar('TMPBASE', data.expand('${WORKDIR}/oesvn.XXXXXX', localdata), localdata) | ||
140 | tmppipe = os.popen(data.getVar('MKTEMPDIRCMD', localdata, 1) or "false") | ||
141 | tmpfile = tmppipe.readline().strip() | ||
142 | if not tmpfile: | ||
143 | bb.error("Fetch: unable to create temporary directory.. make sure 'mktemp' is in the PATH.") | ||
144 | raise FetchError(module) | ||
145 | |||
146 | # check out sources there | ||
147 | os.chdir(tmpfile) | ||
148 | bb.note("Fetch " + loc) | ||
149 | bb.debug(1, "Running %s" % svncmd) | ||
150 | myret = os.system(svncmd) | 119 | myret = os.system(svncmd) |
151 | if myret != 0: | 120 | |
152 | try: | 121 | if myret != 0: |
153 | os.rmdir(tmpfile) | 122 | raise FetchError(ud.module) |
154 | except OSError: | 123 | |
155 | pass | 124 | os.chdir(pkgdir) |
156 | raise FetchError(module) | 125 | # tar them up to a defined filename |
157 | 126 | myret = os.system("tar -czf %s %s" % (ud.localpath, os.path.basename(ud.module))) | |
158 | os.chdir(os.path.join(tmpfile, os.path.dirname(module))) | 127 | if myret != 0: |
159 | # tar them up to a defined filename | 128 | try: |
160 | myret = os.system("tar -czf %s %s" % (os.path.join(dldir,tarfn), os.path.basename(module))) | 129 | os.unlink(ud.localpath) |
161 | if myret != 0: | 130 | except OSError: |
162 | try: | 131 | pass |
163 | os.unlink(tarfn) | 132 | raise FetchError(ud.module) |
164 | except OSError: | ||
165 | pass | ||
166 | # cleanup | ||
167 | os.system('rm -rf %s' % tmpfile) | ||
168 | os.chdir(olddir) | ||
169 | del localdata | ||
diff --git a/bitbake/lib/bb/fetch/wget.py b/bitbake/lib/bb/fetch/wget.py index e47a8859be..9c9c1675a1 100644 --- a/bitbake/lib/bb/fetch/wget.py +++ b/bitbake/lib/bb/fetch/wget.py | |||
@@ -30,138 +30,70 @@ import bb | |||
30 | from bb import data | 30 | from bb import data |
31 | from bb.fetch import Fetch | 31 | from bb.fetch import Fetch |
32 | from bb.fetch import FetchError | 32 | from bb.fetch import FetchError |
33 | from bb.fetch import MD5SumError | ||
34 | from bb.fetch import uri_replace | 33 | from bb.fetch import uri_replace |
35 | 34 | ||
36 | class Wget(Fetch): | 35 | class Wget(Fetch): |
37 | """Class to fetch urls via 'wget'""" | 36 | """Class to fetch urls via 'wget'""" |
38 | def supports(url, d): | 37 | def supports(self, url, ud, d): |
39 | """Check to see if a given url can be fetched using wget. | ||
40 | Expects supplied url in list form, as outputted by bb.decodeurl(). | ||
41 | """ | 38 | """ |
42 | (type, host, path, user, pswd, parm) = bb.decodeurl(data.expand(url, d)) | 39 | Check to see if a given url can be fetched with cvs. |
43 | return type in ['http','https','ftp'] | 40 | """ |
44 | supports = staticmethod(supports) | 41 | return ud.type in ['http','https','ftp'] |
45 | 42 | ||
46 | def localpath(url, d): | 43 | def localpath(self, url, ud, d): |
47 | # strip off parameters | 44 | |
48 | (type, host, path, user, pswd, parm) = bb.decodeurl(data.expand(url, d)) | 45 | url = bb.encodeurl([ud.type, ud.host, ud.path, ud.user, ud.pswd, {}]) |
49 | if "localpath" in parm: | 46 | ud.basename = os.path.basename(ud.path) |
50 | # if user overrides local path, use it. | 47 | ud.localfile = data.expand(os.path.basename(url), d) |
51 | return parm["localpath"] | 48 | |
52 | url = bb.encodeurl([type, host, path, user, pswd, {}]) | 49 | return os.path.join(data.getVar("DL_DIR", d, True), ud.localfile) |
53 | 50 | ||
54 | return os.path.join(data.getVar("DL_DIR", d), os.path.basename(url)) | 51 | def go(self, uri, ud, d): |
55 | localpath = staticmethod(localpath) | ||
56 | |||
57 | def go(self, d, urls = []): | ||
58 | """Fetch urls""" | 52 | """Fetch urls""" |
59 | 53 | ||
60 | def md5_sum(parm, d): | 54 | def fetch_uri(uri, ud, d): |
61 | """ | 55 | if os.path.exists(ud.localpath): |
62 | Return the MD5SUM associated with the to be downloaded | 56 | # file exists, but we didnt complete it.. trying again.. |
63 | file. | ||
64 | It can return None if no md5sum is associated | ||
65 | """ | ||
66 | try: | ||
67 | return parm['md5sum'] | ||
68 | except: | ||
69 | return None | ||
70 | |||
71 | def verify_md5sum(wanted_sum, got_sum): | ||
72 | """ | ||
73 | Verify the md5sum we wanted with the one we got | ||
74 | """ | ||
75 | if not wanted_sum: | ||
76 | return True | ||
77 | |||
78 | return wanted_sum == got_sum | ||
79 | |||
80 | def fetch_uri(uri, basename, dl, md5, parm, d): | ||
81 | # the MD5 sum we want to verify | ||
82 | wanted_md5sum = md5_sum(parm, d) | ||
83 | if os.path.exists(dl): | ||
84 | # file exists, but we didnt complete it.. trying again.. | ||
85 | fetchcmd = data.getVar("RESUMECOMMAND", d, 1) | 57 | fetchcmd = data.getVar("RESUMECOMMAND", d, 1) |
86 | else: | 58 | else: |
87 | fetchcmd = data.getVar("FETCHCOMMAND", d, 1) | 59 | fetchcmd = data.getVar("FETCHCOMMAND", d, 1) |
88 | 60 | ||
89 | bb.note("fetch " + uri) | 61 | bb.msg.note(1, bb.msg.domain.Fetcher, "fetch " + uri) |
90 | fetchcmd = fetchcmd.replace("${URI}", uri) | 62 | fetchcmd = fetchcmd.replace("${URI}", uri) |
91 | fetchcmd = fetchcmd.replace("${FILE}", basename) | 63 | fetchcmd = fetchcmd.replace("${FILE}", ud.basename) |
92 | bb.debug(2, "executing " + fetchcmd) | 64 | bb.msg.debug(2, bb.msg.domain.Fetcher, "executing " + fetchcmd) |
93 | ret = os.system(fetchcmd) | 65 | ret = os.system(fetchcmd) |
94 | if ret != 0: | 66 | if ret != 0: |
95 | return False | 67 | return False |
96 | 68 | ||
97 | # check if sourceforge did send us to the mirror page | 69 | # check if sourceforge did send us to the mirror page |
98 | dl_dir = data.getVar("DL_DIR", d, True) | 70 | if not os.path.exists(ud.localpath): |
99 | if not os.path.exists(dl): | 71 | os.system("rm %s*" % ud.localpath) # FIXME shell quote it |
100 | os.system("rm %s*" % dl) # FIXME shell quote it | 72 | bb.msg.debug(2, bb.msg.domain.Fetcher, "sourceforge.net send us to the mirror on %s" % ud.basename) |
101 | bb.debug(2,"sourceforge.net send us to the mirror on %s" % basename) | ||
102 | return False | 73 | return False |
103 | 74 | ||
104 | # supposedly complete.. write out md5sum | ||
105 | if bb.which(data.getVar('PATH', d), 'md5sum'): | ||
106 | try: | ||
107 | md5pipe = os.popen('md5sum ' + dl) | ||
108 | md5data = (md5pipe.readline().split() or [ "" ])[0] | ||
109 | md5pipe.close() | ||
110 | except OSError: | ||
111 | md5data = "" | ||
112 | |||
113 | # verify the md5sum | ||
114 | if not verify_md5sum(wanted_md5sum, md5data): | ||
115 | raise MD5SumError(uri) | ||
116 | |||
117 | md5out = file(md5, 'w') | ||
118 | md5out.write(md5data) | ||
119 | md5out.close() | ||
120 | return True | 75 | return True |
121 | 76 | ||
122 | if not urls: | ||
123 | urls = self.urls | ||
124 | |||
125 | localdata = data.createCopy(d) | 77 | localdata = data.createCopy(d) |
126 | data.setVar('OVERRIDES', "wget:" + data.getVar('OVERRIDES', localdata), localdata) | 78 | data.setVar('OVERRIDES', "wget:" + data.getVar('OVERRIDES', localdata), localdata) |
127 | data.update_data(localdata) | 79 | data.update_data(localdata) |
128 | 80 | ||
129 | for uri in urls: | 81 | premirrors = [ i.split() for i in (data.getVar('PREMIRRORS', localdata, 1) or "").split('\n') if i ] |
130 | completed = 0 | 82 | for (find, replace) in premirrors: |
131 | (type, host, path, user, pswd, parm) = bb.decodeurl(data.expand(uri, localdata)) | 83 | newuri = uri_replace(uri, find, replace, d) |
132 | basename = os.path.basename(path) | 84 | if newuri != uri: |
133 | dl = self.localpath(uri, d) | 85 | if fetch_uri(newuri, ud, localdata): |
134 | dl = data.expand(dl, localdata) | 86 | return |
135 | md5 = dl + '.md5' | 87 | |
136 | 88 | if fetch_uri(uri, ud, localdata): | |
137 | if os.path.exists(md5): | 89 | return |
138 | # complete, nothing to see here.. | 90 | |
139 | continue | 91 | # try mirrors |
140 | 92 | mirrors = [ i.split() for i in (data.getVar('MIRRORS', localdata, 1) or "").split('\n') if i ] | |
141 | premirrors = [ i.split() for i in (data.getVar('PREMIRRORS', localdata, 1) or "").split('\n') if i ] | 93 | for (find, replace) in mirrors: |
142 | for (find, replace) in premirrors: | 94 | newuri = uri_replace(uri, find, replace, d) |
143 | newuri = uri_replace(uri, find, replace, d) | 95 | if newuri != uri: |
144 | if newuri != uri: | 96 | if fetch_uri(newuri, ud, localdata): |
145 | if fetch_uri(newuri, basename, dl, md5, parm, localdata): | 97 | return |
146 | completed = 1 | 98 | |
147 | break | 99 | raise FetchError(uri) |
148 | |||
149 | if completed: | ||
150 | continue | ||
151 | |||
152 | if fetch_uri(uri, basename, dl, md5, parm, localdata): | ||
153 | continue | ||
154 | |||
155 | # try mirrors | ||
156 | mirrors = [ i.split() for i in (data.getVar('MIRRORS', localdata, 1) or "").split('\n') if i ] | ||
157 | for (find, replace) in mirrors: | ||
158 | newuri = uri_replace(uri, find, replace, d) | ||
159 | if newuri != uri: | ||
160 | if fetch_uri(newuri, basename, dl, md5, parm, localdata): | ||
161 | completed = 1 | ||
162 | break | ||
163 | |||
164 | if not completed: | ||
165 | raise FetchError(uri) | ||
166 | |||
167 | del localdata | ||