diff options
Diffstat (limited to 'bitbake/lib')
| -rw-r--r-- | bitbake/lib/bb/fetch2/__init__.py | 313 |
1 files changed, 169 insertions, 144 deletions
diff --git a/bitbake/lib/bb/fetch2/__init__.py b/bitbake/lib/bb/fetch2/__init__.py index f1b87f9ee2..43ee1562cd 100644 --- a/bitbake/lib/bb/fetch2/__init__.py +++ b/bitbake/lib/bb/fetch2/__init__.py | |||
| @@ -60,6 +60,13 @@ class FetchError(BBFetchException): | |||
| 60 | self.url = url | 60 | self.url = url |
| 61 | Exception.__init__(self, self.msg) | 61 | Exception.__init__(self, self.msg) |
| 62 | 62 | ||
| 63 | class UnpackError(BBFetchException): | ||
| 64 | """General fetcher exception when something happens incorrectly when unpacking""" | ||
| 65 | def __init__(self, message, url): | ||
| 66 | self.msg = "Unpack failure for URL: '%s'. %s" % (url, message) | ||
| 67 | self.url = url | ||
| 68 | Exception.__init__(self, self.msg) | ||
| 69 | |||
| 63 | class NoMethodError(BBFetchException): | 70 | class NoMethodError(BBFetchException): |
| 64 | """Exception raised when there is no method to obtain a supplied url or set of urls""" | 71 | """Exception raised when there is no method to obtain a supplied url or set of urls""" |
| 65 | def __init__(self, url): | 72 | def __init__(self, url): |
| @@ -231,26 +238,6 @@ def fetcher_compare_revisions(d): | |||
| 231 | logger.debug(2, "%s did not change", key) | 238 | logger.debug(2, "%s did not change", key) |
| 232 | return False | 239 | return False |
| 233 | 240 | ||
| 234 | # Function call order is usually: | ||
| 235 | # 1. init | ||
| 236 | # 2. go | ||
| 237 | # 3. localpaths | ||
| 238 | # localpath can be called at any time | ||
| 239 | |||
| 240 | def init(urls, d): | ||
| 241 | urldata = {} | ||
| 242 | |||
| 243 | fn = bb.data.getVar('FILE', d, 1) | ||
| 244 | if fn in urldata_cache: | ||
| 245 | urldata = urldata_cache[fn] | ||
| 246 | |||
| 247 | for url in urls: | ||
| 248 | if url not in urldata: | ||
| 249 | urldata[url] = FetchData(url, d) | ||
| 250 | |||
| 251 | urldata_cache[fn] = urldata | ||
| 252 | return urldata | ||
| 253 | |||
| 254 | def mirror_from_string(data): | 241 | def mirror_from_string(data): |
| 255 | return [ i.split() for i in (data or "").replace('\\n','\n').split('\n') if i ] | 242 | return [ i.split() for i in (data or "").replace('\\n','\n').split('\n') if i ] |
| 256 | 243 | ||
| @@ -304,118 +291,6 @@ def download_update(result, target): | |||
| 304 | os.symlink(result, target) | 291 | os.symlink(result, target) |
| 305 | return | 292 | return |
| 306 | 293 | ||
| 307 | def download(d, urls = None): | ||
| 308 | """ | ||
| 309 | Fetch all urls | ||
| 310 | init must have previously been called | ||
| 311 | """ | ||
| 312 | if not urls: | ||
| 313 | urls = d.getVar("SRC_URI", 1).split() | ||
| 314 | urldata = init(urls, d) | ||
| 315 | |||
| 316 | for u in urls: | ||
| 317 | urldata[u].setup_localpath(d) | ||
| 318 | |||
| 319 | for u in urls: | ||
| 320 | ud = urldata[u] | ||
| 321 | m = ud.method | ||
| 322 | localpath = "" | ||
| 323 | |||
| 324 | if not ud.localfile: | ||
| 325 | continue | ||
| 326 | |||
| 327 | lf = bb.utils.lockfile(ud.lockfile) | ||
| 328 | |||
| 329 | if m.try_premirror(u, ud, d): | ||
| 330 | # First try fetching uri, u, from PREMIRRORS | ||
| 331 | mirrors = mirror_from_string(bb.data.getVar('PREMIRRORS', d, True)) | ||
| 332 | localpath = try_mirrors(d, u, mirrors, False, m.forcefetch(u, ud, d)) | ||
| 333 | elif os.path.exists(ud.localfile): | ||
| 334 | localpath = ud.localfile | ||
| 335 | |||
| 336 | download_update(localpath, ud.localpath) | ||
| 337 | |||
| 338 | # Need to re-test forcefetch() which will return true if our copy is too old | ||
| 339 | if m.forcefetch(u, ud, d) or not localpath: | ||
| 340 | # Next try fetching from the original uri, u | ||
| 341 | try: | ||
| 342 | m.download(u, ud, d) | ||
| 343 | if hasattr(m, "build_mirror_data"): | ||
| 344 | m.build_mirror_data(u, ud, d) | ||
| 345 | localpath = ud.localpath | ||
| 346 | download_update(localpath, ud.localpath) | ||
| 347 | |||
| 348 | except FetchError: | ||
| 349 | # Remove any incomplete file | ||
| 350 | bb.utils.remove(ud.localpath) | ||
| 351 | # Finally, try fetching uri, u, from MIRRORS | ||
| 352 | mirrors = mirror_from_string(bb.data.getVar('MIRRORS', d, True)) | ||
| 353 | localpath = try_mirrors (d, u, mirrors) | ||
| 354 | |||
| 355 | if not localpath or not os.path.exists(localpath): | ||
| 356 | raise FetchError("Unable to fetch URL %s from any source." % u, u) | ||
| 357 | |||
| 358 | download_update(localpath, ud.localpath) | ||
| 359 | |||
| 360 | if os.path.exists(ud.donestamp): | ||
| 361 | # Touch the done stamp file to show active use of the download | ||
| 362 | try: | ||
| 363 | os.utime(ud.donestamp, None) | ||
| 364 | except: | ||
| 365 | # Errors aren't fatal here | ||
| 366 | pass | ||
| 367 | else: | ||
| 368 | # Only check the checksums if we've not seen this item before, then create the stamp | ||
| 369 | verify_checksum(u, ud, d) | ||
| 370 | open(ud.donestamp, 'w').close() | ||
| 371 | |||
| 372 | |||
| 373 | bb.utils.unlockfile(lf) | ||
| 374 | |||
| 375 | def checkstatus(d, urls = None): | ||
| 376 | """ | ||
| 377 | Check all urls exist upstream | ||
| 378 | init must have previously been called | ||
| 379 | """ | ||
| 380 | urldata = init([], d) | ||
| 381 | |||
| 382 | if not urls: | ||
| 383 | urls = urldata | ||
| 384 | |||
| 385 | for u in urls: | ||
| 386 | ud = urldata[u] | ||
| 387 | ud.setup_localpath(d) | ||
| 388 | m = ud.method | ||
| 389 | logger.debug(1, "Testing URL %s", u) | ||
| 390 | # First try checking uri, u, from PREMIRRORS | ||
| 391 | mirrors = mirror_from_string(bb.data.getVar('PREMIRRORS', d, True)) | ||
| 392 | ret = try_mirrors(d, u, mirrors, True) | ||
| 393 | if not ret: | ||
| 394 | # Next try checking from the original uri, u | ||
| 395 | try: | ||
| 396 | ret = m.checkstatus(u, ud, d) | ||
| 397 | except: | ||
| 398 | # Finally, try checking uri, u, from MIRRORS | ||
| 399 | mirrors = mirror_from_string(bb.data.getVar('MIRRORS', d, True)) | ||
| 400 | ret = try_mirrors (d, u, mirrors, True) | ||
| 401 | |||
| 402 | if not ret: | ||
| 403 | raise FetchError("URL %s doesn't work" % u, u) | ||
| 404 | |||
| 405 | def localpaths(d): | ||
| 406 | """ | ||
| 407 | Return a list of the local filenames, assuming successful fetch | ||
| 408 | """ | ||
| 409 | local = [] | ||
| 410 | urldata = init([], d) | ||
| 411 | |||
| 412 | for u in urldata: | ||
| 413 | ud = urldata[u] | ||
| 414 | ud.setup_localpath(d) | ||
| 415 | local.append(ud.localpath) | ||
| 416 | |||
| 417 | return local | ||
| 418 | |||
| 419 | def get_autorev(d): | 294 | def get_autorev(d): |
| 420 | # only not cache src rev in autorev case | 295 | # only not cache src rev in autorev case |
| 421 | if bb.data.getVar('BB_SRCREV_POLICY', d, True) != "cache": | 296 | if bb.data.getVar('BB_SRCREV_POLICY', d, True) != "cache": |
| @@ -432,7 +307,8 @@ def get_srcrev(d): | |||
| 432 | """ | 307 | """ |
| 433 | 308 | ||
| 434 | scms = [] | 309 | scms = [] |
| 435 | urldata = init(bb.data.getVar('SRC_URI', d, 1).split(), d) | 310 | fetcher = Fetch(bb.data.getVar('SRC_URI', d, True).split(), d) |
| 311 | urldata = fetcher.ud | ||
| 436 | for u in urldata: | 312 | for u in urldata: |
| 437 | if urldata[u].method.supports_srcrev(): | 313 | if urldata[u].method.supports_srcrev(): |
| 438 | scms.append(u) | 314 | scms.append(u) |
| @@ -459,14 +335,8 @@ def get_srcrev(d): | |||
| 459 | return format | 335 | return format |
| 460 | 336 | ||
| 461 | def localpath(url, d): | 337 | def localpath(url, d): |
| 462 | """ | 338 | fetcher = bb.fetch2.Fetch([url], d) |
| 463 | Called from public code, e.g. classes in OE e.g. patch.bbclass | 339 | return fetcher.localpath(url) |
| 464 | """ | ||
| 465 | ud = init([url], d) | ||
| 466 | if ud[url].method: | ||
| 467 | ud[url].setup_localpath(d) | ||
| 468 | return ud[url].localpath | ||
| 469 | return url | ||
| 470 | 340 | ||
| 471 | def runfetchcmd(cmd, d, quiet = False, cleanup = []): | 341 | def runfetchcmd(cmd, d, quiet = False, cleanup = []): |
| 472 | """ | 342 | """ |
| @@ -796,12 +666,12 @@ class FetchMethod(object): | |||
| 796 | cmd = 'cp %s %s/%s/' % (file, rootdir, destdir) | 666 | cmd = 'cp %s %s/%s/' % (file, rootdir, destdir) |
| 797 | 667 | ||
| 798 | if not cmd: | 668 | if not cmd: |
| 799 | return True | 669 | return |
| 800 | 670 | ||
| 801 | dest = os.path.join(rootdir, os.path.basename(file)) | 671 | dest = os.path.join(rootdir, os.path.basename(file)) |
| 802 | if os.path.exists(dest): | 672 | if os.path.exists(dest): |
| 803 | if os.path.samefile(file, dest): | 673 | if os.path.samefile(file, dest): |
| 804 | return True | 674 | return |
| 805 | 675 | ||
| 806 | # Change to subdir before executing command | 676 | # Change to subdir before executing command |
| 807 | save_cwd = os.getcwd(); | 677 | save_cwd = os.getcwd(); |
| @@ -817,7 +687,10 @@ class FetchMethod(object): | |||
| 817 | 687 | ||
| 818 | os.chdir(save_cwd) | 688 | os.chdir(save_cwd) |
| 819 | 689 | ||
| 820 | return ret == 0 | 690 | if ret != 0: |
| 691 | raise UnpackError("Unpack command %s failed with return value %s" % (cmd, ret), urldata.url) | ||
| 692 | |||
| 693 | return | ||
| 821 | 694 | ||
| 822 | def try_premirror(self, url, urldata, d): | 695 | def try_premirror(self, url, urldata, d): |
| 823 | """ | 696 | """ |
| @@ -915,6 +788,158 @@ class FetchMethod(object): | |||
| 915 | key = self._revision_key(url, ud, d, name) | 788 | key = self._revision_key(url, ud, d, name) |
| 916 | return "%s-%s" % (key, bb.data.getVar("PN", d, True) or "") | 789 | return "%s-%s" % (key, bb.data.getVar("PN", d, True) or "") |
| 917 | 790 | ||
| 791 | class Fetch(object): | ||
| 792 | def __init__(self, urls, d): | ||
| 793 | if len(urls) == 0: | ||
| 794 | urls = d.getVar("SRC_URI", 1).split() | ||
| 795 | self.urls = urls | ||
| 796 | self.d = d | ||
| 797 | self.ud = {} | ||
| 798 | |||
| 799 | fn = bb.data.getVar('FILE', d, 1) | ||
| 800 | if fn in urldata_cache: | ||
| 801 | self.ud = urldata_cache[fn] | ||
| 802 | |||
| 803 | for url in urls: | ||
| 804 | if url not in self.ud: | ||
| 805 | self.ud[url] = FetchData(url, d) | ||
| 806 | |||
| 807 | urldata_cache[fn] = self.ud | ||
| 808 | |||
| 809 | def localpath(self, url): | ||
| 810 | if url not in self.urls: | ||
| 811 | self.ud[url] = FetchData(url, self.d) | ||
| 812 | |||
| 813 | self.ud[url].setup_localpath(self.d) | ||
| 814 | return bb.data.expand(self.ud[url].localpath, self.d) | ||
| 815 | |||
| 816 | def localpaths(self): | ||
| 817 | """ | ||
| 818 | Return a list of the local filenames, assuming successful fetch | ||
| 819 | """ | ||
| 820 | local = [] | ||
| 821 | |||
| 822 | for u in self.urls: | ||
| 823 | ud = self.ud[u] | ||
| 824 | ud.setup_localpath(self.d) | ||
| 825 | local.append(ud.localpath) | ||
| 826 | |||
| 827 | return local | ||
| 828 | |||
| 829 | def download(self, urls = []): | ||
| 830 | """ | ||
| 831 | Fetch all urls | ||
| 832 | """ | ||
| 833 | if len(urls) == 0: | ||
| 834 | urls = self.urls | ||
| 835 | |||
| 836 | for u in urls: | ||
| 837 | ud = self.ud[u] | ||
| 838 | ud.setup_localpath(self.d) | ||
| 839 | m = ud.method | ||
| 840 | localpath = "" | ||
| 841 | |||
| 842 | if not ud.localfile: | ||
| 843 | continue | ||
| 844 | |||
| 845 | lf = bb.utils.lockfile(ud.lockfile) | ||
| 846 | |||
| 847 | if m.try_premirror(u, ud, self.d): | ||
| 848 | # First try fetching uri, u, from PREMIRRORS | ||
| 849 | mirrors = mirror_from_string(bb.data.getVar('PREMIRRORS', self.d, True)) | ||
| 850 | localpath = try_mirrors(self.d, u, mirrors, False, m.forcefetch(u, ud, self.d)) | ||
| 851 | elif os.path.exists(ud.localfile): | ||
| 852 | localpath = ud.localfile | ||
| 853 | |||
| 854 | download_update(localpath, ud.localpath) | ||
| 855 | |||
| 856 | # Need to re-test forcefetch() which will return true if our copy is too old | ||
| 857 | if m.forcefetch(u, ud, self.d) or not localpath: | ||
| 858 | # Next try fetching from the original uri, u | ||
| 859 | try: | ||
| 860 | m.download(u, ud, self.d) | ||
| 861 | if hasattr(m, "build_mirror_data"): | ||
| 862 | m.build_mirror_data(u, ud, self.d) | ||
| 863 | localpath = ud.localpath | ||
| 864 | download_update(localpath, ud.localpath) | ||
| 865 | |||
| 866 | except FetchError: | ||
| 867 | # Remove any incomplete file | ||
| 868 | bb.utils.remove(ud.localpath) | ||
| 869 | # Finally, try fetching uri, u, from MIRRORS | ||
| 870 | mirrors = mirror_from_string(bb.data.getVar('MIRRORS', self.d, True)) | ||
| 871 | localpath = try_mirrors (self.d, u, mirrors) | ||
| 872 | |||
| 873 | if not localpath or not os.path.exists(localpath): | ||
| 874 | raise FetchError("Unable to fetch URL %s from any source." % u, u) | ||
| 875 | |||
| 876 | download_update(localpath, ud.localpath) | ||
| 877 | |||
| 878 | if os.path.exists(ud.donestamp): | ||
| 879 | # Touch the done stamp file to show active use of the download | ||
| 880 | try: | ||
| 881 | os.utime(ud.donestamp, None) | ||
| 882 | except: | ||
| 883 | # Errors aren't fatal here | ||
| 884 | pass | ||
| 885 | else: | ||
| 886 | # Only check the checksums if we've not seen this item before, then create the stamp | ||
| 887 | verify_checksum(u, ud, self.d) | ||
| 888 | open(ud.donestamp, 'w').close() | ||
| 889 | |||
| 890 | bb.utils.unlockfile(lf) | ||
| 891 | |||
| 892 | def checkstatus(self, urls = []): | ||
| 893 | """ | ||
| 894 | Check all urls exist upstream | ||
| 895 | """ | ||
| 896 | |||
| 897 | if len(urls) == 0: | ||
| 898 | urls = self.urls | ||
| 899 | |||
| 900 | for u in urls: | ||
| 901 | ud = self.ud[u] | ||
| 902 | ud.setup_localpath(self.d) | ||
| 903 | m = ud.method | ||
| 904 | logger.debug(1, "Testing URL %s", u) | ||
| 905 | # First try checking uri, u, from PREMIRRORS | ||
| 906 | mirrors = mirror_from_string(bb.data.getVar('PREMIRRORS', self.d, True)) | ||
| 907 | ret = try_mirrors(self.d, u, mirrors, True) | ||
| 908 | if not ret: | ||
| 909 | # Next try checking from the original uri, u | ||
| 910 | try: | ||
| 911 | ret = m.checkstatus(u, ud, self.d) | ||
| 912 | except: | ||
| 913 | # Finally, try checking uri, u, from MIRRORS | ||
| 914 | mirrors = mirror_from_string(bb.data.getVar('MIRRORS', self.d, True)) | ||
| 915 | ret = try_mirrors (self.d, u, mirrors, True) | ||
| 916 | |||
| 917 | if not ret: | ||
| 918 | raise FetchError("URL %s doesn't work" % u, u) | ||
| 919 | |||
| 920 | def unpack(self, root, urls = []): | ||
| 921 | """ | ||
| 922 | Check all urls exist upstream | ||
| 923 | """ | ||
| 924 | |||
| 925 | if len(urls) == 0: | ||
| 926 | urls = self.urls | ||
| 927 | |||
| 928 | for u in urls: | ||
| 929 | ud = self.ud[u] | ||
| 930 | ud.setup_localpath(self.d) | ||
| 931 | |||
| 932 | if bb.data.expand(self.localpath, self.d) is None: | ||
| 933 | continue | ||
| 934 | |||
| 935 | if ud.lockfile: | ||
| 936 | lf = bb.utils.lockfile(ud.lockfile) | ||
| 937 | |||
| 938 | ud.method.unpack(ud, root, self.d) | ||
| 939 | |||
| 940 | if ud.lockfile: | ||
| 941 | bb.utils.unlockfile(lf) | ||
| 942 | |||
| 918 | from . import cvs | 943 | from . import cvs |
| 919 | from . import git | 944 | from . import git |
| 920 | from . import local | 945 | from . import local |
