From 79c5dd095273dba5481580da242959b4417e680f Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sun, 13 Apr 2014 17:32:22 -0700 Subject: [PATCH] Fix SPACK-21: stage names are too long Stage names now hash dependencies like install prefixes. --- lib/spack/spack/directory_layout.py | 14 ++------------ lib/spack/spack/package.py | 2 +- lib/spack/spack/spec.py | 16 +++++++++++++--- var/spack/packages/stat/package.py | 18 +++++------------- 4 files changed, 21 insertions(+), 29 deletions(-) diff --git a/lib/spack/spack/directory_layout.py b/lib/spack/spack/directory_layout.py index 2e4b6f89c8..ad9f669f90 100644 --- a/lib/spack/spack/directory_layout.py +++ b/lib/spack/spack/directory_layout.py @@ -138,18 +138,8 @@ def __init__(self, root, **kwargs): def relative_path_for_spec(self, spec): _check_concrete(spec) - - path = join_path( - spec.architecture, - spec.compiler, - "%s@%s%s" % (spec.name, spec.version, spec.variants)) - - if spec.dependencies: - path += "-" - sha1 = spec.dependencies.sha1() - path += sha1[:self.prefix_size] - - return path + dir_name = spec.format('$_$@$+$#') + return join_path(spec.architecture, spec.compiler, dir_name) def write_spec(self, spec, path): diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index ff020fb44c..b3b1538b31 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -407,7 +407,7 @@ def stage(self): if self._stage is None: mirror_path = "%s/%s" % (self.name, os.path.basename(self.url)) self._stage = Stage( - self.url, mirror_path=mirror_path, name=str(self.spec)) + self.url, mirror_path=mirror_path, name=self.spec.short_spec) return self._stage diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index a4f585b28a..6ec66d1afa 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -465,6 +465,13 @@ def preorder_traversal(self, visited=None, d=0, **kwargs): yield elt + @property + def short_spec(self): + """Returns a version of the spec with the dependencies hashed + instead of completely enumerated.""" + return self.format('$_$@$%@$+$=$#') + + @property def prefix(self): return Prefix(spack.install_layout.path_for_spec(self)) @@ -998,15 +1005,18 @@ def format(self, format_string='$_$@$%@$+$=', **kwargs): $%@ Compiler & compiler version $+ Options $= Architecture - $# Dependencies' 6-char sha1 prefix + $# Dependencies' 8-char sha1 prefix $$ $ Anything else is copied verbatim into the output stream. *Example:* ``$_$@$+`` translates to the name, version, and options of the package, but no dependencies, arch, or compiler. + + TODO: allow, e.g., $6# to customize short hash length + TODO: allow, e.g., $## for full hash. """ - color = kwargs.get('color', False) + color = kwargs.get('color', False) length = len(format_string) out = StringIO() escape = compiler = False @@ -1037,7 +1047,7 @@ def write(s, c): write(c + str(self.architecture), c) elif c == '#': if self.dependencies: - out.write('-' + self.dependencies.sha1()[:6]) + out.write('-' + self.dependencies.sha1()[:8]) elif c == '$': out.write('$') escape = False diff --git a/var/spack/packages/stat/package.py b/var/spack/packages/stat/package.py index d621bcef01..71f3b086a0 100644 --- a/var/spack/packages/stat/package.py +++ b/var/spack/packages/stat/package.py @@ -10,26 +10,18 @@ class Stat(Package): depends_on('libdwarf') depends_on('dyninst') depends_on('graphlib') - #depends_on('launchmon') # TODO: when added, path gets too long (Jira SPACK-21)! + depends_on('launchmon') depends_on('mrnet') def install(self, spec, prefix): configure( "--enable-gui", "--prefix=%s" % prefix, - - # TODO: this uses the launchmon package, but path is - # too long (see depends_on above) (Jira SPACK-21) - # "--with-launchmon=%s" % spec['launchmon'].prefix, - - # TODO: launchmon line above is the proper one once - # SPACK-21 is fixed - "--with-launchmon=/collab/usr/global/tools/launchmon/chaos_5_x86_64_ib/launchmon-1.0.0-20140312", - - "--with-mrnet=%s" % spec['mrnet'].prefix, - "--with-graphlib=%s" % spec['graphlib'].prefix, + "--with-launchmon=%s" % spec['launchmon'].prefix, + "--with-mrnet=%s" % spec['mrnet'].prefix, + "--with-graphlib=%s" % spec['graphlib'].prefix, "--with-stackwalker=%s" % spec['dyninst'].prefix, - "--with-libdwarf=%s" % spec['libdwarf'].prefix) + "--with-libdwarf=%s" % spec['libdwarf'].prefix) # TODO: remove once SPACK-19 is fixed import shutil