diff options
author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2011-02-03 18:22:06 +0000 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2011-02-03 18:22:06 +0000 |
commit | fa9fda05e1d269446b51050195b891346482e8bb (patch) | |
tree | cca4e265a2726f89a652fe64c55b1b07487ed0a5 | |
parent | 7f99605562119a13a2510a3c990e3cf577ad764e (diff) | |
download | poky-fa9fda05e1d269446b51050195b891346482e8bb.tar.gz |
bitbake/fetch2: Ensure that mirror fetches are symlinked from the download directory
When files are fetched from a mirror source that happens to be local,
ensure links are created for the file since subsequent fetch calls
can then follow the links to find files.
Any other approach such as the existing manipulations of localpath
internally to the fetcher are prone to errors, races and other issues.
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r-- | bitbake/lib/bb/fetch2/__init__.py | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/bitbake/lib/bb/fetch2/__init__.py b/bitbake/lib/bb/fetch2/__init__.py index 43ba772dbf..2e8dab9f57 100644 --- a/bitbake/lib/bb/fetch2/__init__.py +++ b/bitbake/lib/bb/fetch2/__init__.py | |||
@@ -263,6 +263,15 @@ def subprocess_setup(): | |||
263 | # SIGPIPE errors are known issues with gzip/bash | 263 | # SIGPIPE errors are known issues with gzip/bash |
264 | signal.signal(signal.SIGPIPE, signal.SIG_DFL) | 264 | signal.signal(signal.SIGPIPE, signal.SIG_DFL) |
265 | 265 | ||
266 | def download_update(result, target): | ||
267 | if os.path.exists(target): | ||
268 | return | ||
269 | if not result or not os.path.exists(result): | ||
270 | return | ||
271 | if target != result: | ||
272 | os.symlink(result, target) | ||
273 | return | ||
274 | |||
266 | def download(d, urls = None): | 275 | def download(d, urls = None): |
267 | """ | 276 | """ |
268 | Fetch all urls | 277 | Fetch all urls |
@@ -289,6 +298,8 @@ def download(d, urls = None): | |||
289 | elif os.path.exists(ud.localfile): | 298 | elif os.path.exists(ud.localfile): |
290 | localpath = ud.localfile | 299 | localpath = ud.localfile |
291 | 300 | ||
301 | download_update(localpath, ud.localpath) | ||
302 | |||
292 | # Need to re-test forcefetch() which will return true if our copy is too old | 303 | # Need to re-test forcefetch() which will return true if our copy is too old |
293 | if m.forcefetch(u, ud, d) or not localpath: | 304 | if m.forcefetch(u, ud, d) or not localpath: |
294 | # Next try fetching from the original uri, u | 305 | # Next try fetching from the original uri, u |
@@ -297,16 +308,19 @@ def download(d, urls = None): | |||
297 | if hasattr(m, "build_mirror_data"): | 308 | if hasattr(m, "build_mirror_data"): |
298 | m.build_mirror_data(u, ud, d) | 309 | m.build_mirror_data(u, ud, d) |
299 | localpath = ud.localpath | 310 | localpath = ud.localpath |
311 | download_update(localpath, ud.localpath) | ||
312 | |||
300 | except FetchError: | 313 | except FetchError: |
301 | # Remove any incomplete file | 314 | # Remove any incomplete file |
302 | bb.utils.remove(ud.localpath) | 315 | bb.utils.remove(ud.localpath) |
303 | # Finally, try fetching uri, u, from MIRRORS | 316 | # Finally, try fetching uri, u, from MIRRORS |
304 | mirrors = mirror_from_string(bb.data.getVar('MIRRORS', d, True)) | 317 | mirrors = mirror_from_string(bb.data.getVar('MIRRORS', d, True)) |
305 | localpath = try_mirrors (d, u, mirrors) | 318 | localpath = try_mirrors (d, u, mirrors) |
306 | if not localpath or not os.path.exists(localpath): | ||
307 | raise FetchError("Unable to fetch URL %s from any source." % u) | ||
308 | 319 | ||
309 | ud.localpath = localpath | 320 | if not localpath or not os.path.exists(localpath): |
321 | raise FetchError("Unable to fetch URL %s from any source." % u) | ||
322 | |||
323 | download_update(localpath, ud.localpath) | ||
310 | 324 | ||
311 | if os.path.exists(ud.md5): | 325 | if os.path.exists(ud.md5): |
312 | # Touch the md5 file to show active use of the download | 326 | # Touch the md5 file to show active use of the download |