diff options
author | Peter Josef Scheibel <scheibel1@llnl.gov> | 2019-11-26 19:35:58 -0800 |
---|---|---|
committer | Todd Gamblin <tgamblin@llnl.gov> | 2019-12-23 23:03:10 -0800 |
commit | d71428622bebc54db4a1903e2026067fc085cb1b (patch) | |
tree | 14fbed625df08e8b51cc284a76cf38e6e21c9f68 /lib | |
parent | a69b3c85b01075703dc480b490e894ee14d00125 (diff) | |
download | spack-d71428622bebc54db4a1903e2026067fc085cb1b.tar.gz spack-d71428622bebc54db4a1903e2026067fc085cb1b.tar.bz2 spack-d71428622bebc54db4a1903e2026067fc085cb1b.tar.xz spack-d71428622bebc54db4a1903e2026067fc085cb1b.zip |
Mirrors: avoid re-downloading patches
When updating a mirror, Spack was re-retrieving all patches (since the
fetch logic for patches is separate). This updates the patch logic to
allow the mirror logic to avoid this.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/spack/spack/mirror.py | 1 | ||||
-rw-r--r-- | lib/spack/spack/patch.py | 47 |
2 files changed, 28 insertions, 20 deletions
diff --git a/lib/spack/spack/mirror.py b/lib/spack/spack/mirror.py index db32ceb5a5..da9b20472a 100644 --- a/lib/spack/spack/mirror.py +++ b/lib/spack/spack/mirror.py @@ -502,7 +502,6 @@ def add_single_spec(spec, mirror_root, mirror_stats): with spec.package.stage as pkg_stage: pkg_stage.cache_mirror(mirror_stats) for patch in spec.package.all_patches(): - patch.fetch(pkg_stage) if patch.cache(): patch.cache().cache_mirror(mirror_stats) patch.clean() diff --git a/lib/spack/spack/patch.py b/lib/spack/spack/patch.py index ba8d4c5ef8..9e29dcc638 100644 --- a/lib/spack/spack/patch.py +++ b/lib/spack/spack/patch.py @@ -171,6 +171,7 @@ class UrlPatch(Patch): super(UrlPatch, self).__init__(pkg, url, level, working_dir) self.url = url + self._stage = None self.ordering_key = ordering_key @@ -191,25 +192,6 @@ class UrlPatch(Patch): Args: stage: stage for the package that needs to be patched """ - # use archive digest for compressed archives - fetch_digest = self.sha256 - if self.archive_sha256: - fetch_digest = self.archive_sha256 - - fetcher = fs.URLFetchStrategy(self.url, fetch_digest, - expand=bool(self.archive_sha256)) - - # The same package can have multiple patches with the same name but - # with different contents, therefore apply a subset of the hash. - name = '{0}-{1}'.format(os.path.basename(self.url), fetch_digest[:7]) - - per_package_ref = os.path.join(self.owner.split('.')[-1], name) - # Reference starting with "spack." is required to avoid cyclic imports - mirror_ref = spack.mirror.mirror_archive_paths( - fetcher, - per_package_ref) - - self.stage = spack.stage.Stage(fetcher, mirror_paths=mirror_ref) self.stage.create() self.stage.fetch() self.stage.check() @@ -243,6 +225,33 @@ class UrlPatch(Patch): "sha256 checksum failed for %s" % self.path, "Expected %s but got %s" % (self.sha256, checker.sum)) + @property + def stage(self): + if self._stage: + return self._stage + + # use archive digest for compressed archives + fetch_digest = self.sha256 + if self.archive_sha256: + fetch_digest = self.archive_sha256 + + fetcher = fs.URLFetchStrategy(self.url, fetch_digest, + expand=bool(self.archive_sha256)) + + # The same package can have multiple patches with the same name but + # with different contents, therefore apply a subset of the hash. + name = '{0}-{1}'.format(os.path.basename(self.url), fetch_digest[:7]) + + per_package_ref = os.path.join(self.owner.split('.')[-1], name) + # Reference starting with "spack." is required to avoid cyclic imports + mirror_ref = spack.mirror.mirror_archive_paths( + fetcher, + per_package_ref) + + self._stage = spack.stage.Stage(fetcher, mirror_paths=mirror_ref) + self._stage.create() + return self._stage + def cache(self): return self.stage |