reworked to deal with stage.path as property

This version actually pulls the path through the package to deliver it
to each stage on creation when passed through the command.  This is
necessary due to the new StageComposite class that makes setting the
path directly on the stage impractical, it also takes the logic out of
package for the most part, which seems like an improvement.
This commit is contained in:
Tom Scogland 2016-03-31 10:20:55 -07:00
parent 63f824b218
commit 5d2151ed64
3 changed files with 14 additions and 13 deletions

View file

@ -54,6 +54,5 @@ def stage(parser, args):
for spec in specs: for spec in specs:
package = spack.repo.get(spec) package = spack.repo.get(spec)
if args.path: if args.path:
package.do_stage(path=args.path) package.path = args.path
else: package.do_stage()
package.do_stage()

View file

@ -335,6 +335,9 @@ def __init__(self, spec):
if '.' in self.name: if '.' in self.name:
self.name = self.name[self.name.rindex('.') + 1:] self.name = self.name[self.name.rindex('.') + 1:]
# Allow custom staging paths for packages
self.path=None
# Sanity check attributes required by Spack directives. # Sanity check attributes required by Spack directives.
spack.directives.ensure_dicts(type(self)) spack.directives.ensure_dicts(type(self))
@ -445,7 +448,8 @@ def _make_resource_stage(self, root_stage, fetcher, resource):
resource_stage_folder = self._resource_stage(resource) resource_stage_folder = self._resource_stage(resource)
resource_mirror = join_path(self.name, os.path.basename(fetcher.url)) resource_mirror = join_path(self.name, os.path.basename(fetcher.url))
stage = ResourceStage(resource.fetcher, root=root_stage, resource=resource, stage = ResourceStage(resource.fetcher, root=root_stage, resource=resource,
name=resource_stage_folder, mirror_path=resource_mirror) name=resource_stage_folder, mirror_path=resource_mirror,
path=self.path)
return stage return stage
def _make_root_stage(self, fetcher): def _make_root_stage(self, fetcher):
@ -455,7 +459,7 @@ def _make_root_stage(self, fetcher):
s = self.spec s = self.spec
stage_name = "%s-%s-%s" % (s.name, s.version, s.dag_hash()) stage_name = "%s-%s-%s" % (s.name, s.version, s.dag_hash())
# Build the composite stage # Build the composite stage
stage = Stage(fetcher, mirror_path=mp, name=stage_name) stage = Stage(fetcher, mirror_path=mp, name=stage_name, path=self.path)
return stage return stage
def _make_stage(self): def _make_stage(self):
@ -709,18 +713,13 @@ def do_fetch(self, mirror_only=False):
if spack.do_checksum and self.version in self.versions: if spack.do_checksum and self.version in self.versions:
self.stage.check() self.stage.check()
def do_stage(self, mirror_only=False, path=None): def do_stage(self, mirror_only=False):
"""Unpacks the fetched tarball, then changes into the expanded tarball """Unpacks the fetched tarball, then changes into the expanded tarball
directory.""" directory."""
if not self.spec.concrete: if not self.spec.concrete:
raise ValueError("Can only stage concrete packages.") raise ValueError("Can only stage concrete packages.")
self.do_fetch(mirror_only) self.do_fetch(mirror_only)
if path is not None:
self.stage.path = path
self.stage.expand_archive() self.stage.expand_archive()
self.stage.chdir_to_source() self.stage.chdir_to_source()

View file

@ -89,7 +89,7 @@ class Stage(object):
""" """
def __init__(self, url_or_fetch_strategy, def __init__(self, url_or_fetch_strategy,
name=None, mirror_path=None, keep=False): name=None, mirror_path=None, keep=False, path=None):
"""Create a stage object. """Create a stage object.
Parameters: Parameters:
url_or_fetch_strategy url_or_fetch_strategy
@ -135,7 +135,10 @@ def __init__(self, url_or_fetch_strategy,
# Try to construct here a temporary name for the stage directory # Try to construct here a temporary name for the stage directory
# If this is a named stage, then construct a named path. # If this is a named stage, then construct a named path.
self.path = join_path(spack.stage_path, self.name) if path is not None:
self.path = path
else:
self.path = join_path(spack.stage_path, self.name)
# Flag to decide whether to delete the stage folder on exit or not # Flag to decide whether to delete the stage folder on exit or not
self.keep = keep self.keep = keep