summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Josef Scheibel <scheibel1@llnl.gov>2019-11-26 19:35:58 -0800
committerTodd Gamblin <tgamblin@llnl.gov>2019-12-23 23:03:10 -0800
commitd71428622bebc54db4a1903e2026067fc085cb1b (patch)
tree14fbed625df08e8b51cc284a76cf38e6e21c9f68
parenta69b3c85b01075703dc480b490e894ee14d00125 (diff)
downloadspack-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.
-rw-r--r--lib/spack/spack/mirror.py1
-rw-r--r--lib/spack/spack/patch.py47
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