| 395 | self.download() |
| 396 | |
| 397 | def download(self): |
| 398 | if self.url is None: |
| 399 | info('Skipping {} download as no URL is set'.format(self.name)) |
| 400 | return |
| 401 | |
| 402 | url = self.versioned_url |
| 403 | expected_digests = {} |
| 404 | for alg in set(hashlib.algorithms_guaranteed) | set(('md5', 'sha512', 'blake2b')): |
| 405 | expected_digest = getattr(self, alg + 'sum') if hasattr(self, alg + 'sum') else None |
| 406 | ma = match(u'^(.+)#' + alg + u'=([0-9a-f]{32,})$', url) |
| 407 | if ma: # fragmented URL? |
| 408 | if expected_digest: |
| 409 | raise ValueError( |
| 410 | ('Received {}sum from both the {} recipe ' |
| 411 | 'and its url').format(alg, self.name)) |
| 412 | url = ma.group(1) |
| 413 | expected_digest = ma.group(2) |
| 414 | if expected_digest: |
| 415 | expected_digests[alg] = expected_digest |
| 416 | |
| 417 | ensure_dir(join(self.ctx.packages_path, self.name)) |
| 418 | |
| 419 | with current_directory(join(self.ctx.packages_path, self.name)): |
| 420 | filename = shprint(sh.basename, url).stdout[:-1].decode('utf-8') |
| 421 | |
| 422 | do_download = True |
| 423 | marker_filename = '.mark-{}'.format(filename) |
| 424 | if exists(filename) and isfile(filename): |
| 425 | if not exists(marker_filename): |
| 426 | shprint(sh.rm, filename) |
| 427 | else: |
| 428 | for alg, expected_digest in expected_digests.items(): |
| 429 | current_digest = algsum(alg, filename) |
| 430 | if current_digest != expected_digest: |
| 431 | debug('* Generated {}sum: {}'.format(alg, |
| 432 | current_digest)) |
| 433 | debug('* Expected {}sum: {}'.format(alg, |
| 434 | expected_digest)) |
| 435 | raise ValueError( |
| 436 | ('Generated {0}sum does not match expected {0}sum ' |
| 437 | 'for {1} recipe').format(alg, self.name)) |
| 438 | do_download = False |
| 439 | |
| 440 | # If we got this far, we will download |
| 441 | if do_download: |
| 442 | debug('Downloading {} from {}'.format(self.name, url)) |
| 443 | |
| 444 | shprint(sh.rm, '-f', marker_filename) |
| 445 | self.download_file(self.versioned_url, filename) |
| 446 | touch(marker_filename) |
| 447 | |
| 448 | if exists(filename) and isfile(filename): |
| 449 | for alg, expected_digest in expected_digests.items(): |
| 450 | current_digest = algsum(alg, filename) |
| 451 | if current_digest != expected_digest: |
| 452 | debug('* Generated {}sum: {}'.format(alg, |
| 453 | current_digest)) |
| 454 | debug('* Expected {}sum: {}'.format(alg, |