summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorPeter Scheibel <scheibel1@llnl.gov>2015-10-13 19:02:41 -0700
committerPeter Scheibel <scheibel1@llnl.gov>2015-10-13 19:02:41 -0700
commit71dcf8833c263a2f87b8bfcce6f2eaf7a14014a3 (patch)
tree4567489ef810b5210f74377273ba137f2cfbce5a /lib
parent1ce6d8b627fac204fc4a4500ea28b4733dd172dd (diff)
downloadspack-71dcf8833c263a2f87b8bfcce6f2eaf7a14014a3.tar.gz
spack-71dcf8833c263a2f87b8bfcce6f2eaf7a14014a3.tar.bz2
spack-71dcf8833c263a2f87b8bfcce6f2eaf7a14014a3.tar.xz
spack-71dcf8833c263a2f87b8bfcce6f2eaf7a14014a3.zip
Make sure to generate output for dependencies as if they were separate tests:
the original intent was to generate output as if each package was a unit test, but I noticed that I was only generating test output for top-level packages.
Diffstat (limited to 'lib')
-rw-r--r--lib/spack/spack/cmd/testinstall.py71
1 files changed, 51 insertions, 20 deletions
diff --git a/lib/spack/spack/cmd/testinstall.py b/lib/spack/spack/cmd/testinstall.py
index 3a9e1e14e1..6f3514bc34 100644
--- a/lib/spack/spack/cmd/testinstall.py
+++ b/lib/spack/spack/cmd/testinstall.py
@@ -24,6 +24,7 @@
##############################################################################
from external import argparse
import xml.etree.ElementTree as ET
+import itertools
import llnl.util.tty as tty
from llnl.util.filesystem import *
@@ -100,7 +101,37 @@ class BuildId(object):
def stringId(self):
return "-".join(str(x) for x in (self.name, self.version, self.hashId))
-
+
+def createTestOutput(spec, handled, output):
+ if spec in handled:
+ return handled[spec]
+
+ childSuccesses = list(createTestOutput(dep, handled, output)
+ for dep in spec.dependencies.itervalues())
+ package = spack.db.get(spec)
+ handled[spec] = package.installed
+
+ if all(childSuccesses):
+ bId = BuildId(spec.name, spec.version, spec.dag_hash())
+
+ if package.installed:
+ buildLogPath = spack.install_layout.build_log_path(spec)
+ else:
+ #TODO: search recursively under stage.path instead of only within
+ # stage.source_path
+ buildLogPath = join_path(package.stage.source_path, 'spack-build.out')
+
+ with open(buildLogPath, 'rb') as F:
+ buildLog = F.read() #TODO: this may not return all output
+ #TODO: add the whole build log? it could be several thousand
+ # lines. It may be better to look for errors.
+ output.addTest(bId, package.installed, buildLogPath + '\n' +
+ spec.to_yaml() + buildLog)
+ #TODO: create a failed test if a dependency didn't install?
+
+ return handled[spec]
+
+
def testinstall(parser, args):
if not args.packages:
tty.die("install requires at least one package argument")
@@ -113,12 +144,17 @@ def testinstall(parser, args):
spack.do_checksum = False # TODO: remove this global.
specs = spack.cmd.parse_specs(args.packages, concretize=True)
- newInstalls = list()
+ newInstalls = set()
+ for spec in itertools.chain.from_iterable(spec.traverse()
+ for spec in specs):
+ package = spack.db.get(spec)
+ if not package.installed:
+ newInstalls.add(spec)
+
try:
for spec in specs:
package = spack.db.get(spec)
if not package.installed:
- newInstalls.append(spec)
package.do_install(
keep_prefix=False,
keep_stage=False,
@@ -127,24 +163,19 @@ def testinstall(parser, args):
verbose=args.verbose,
fake=False)
finally:
+ #TODO: note if multiple packages are specified and a prior one fails,
+ # it will prevent any of the others from succeeding even if they
+ # don't share any dependencies. i.e. the results may be strange if
+ # you run testinstall with >1 top-level package
+
+ #Find all packages that are not a dependency of another package
+ topLevelNewInstalls = newInstalls - set(itertools.chain.from_iterable(
+ spec.dependencies for spec in newInstalls))
+
jrf = JunitResultFormat()
- for spec in newInstalls:
- package = spack.db.get(spec)
- bId = BuildId(spec.name, spec.version, spec.dag_hash())
-
- if package.installed:
- buildLogPath = spack.install_layout.build_log_path(spec)
- else:
- #TODO: search recursively under stage.path instead of only within
- # stage.source_path
- buildLogPath = join_path(package.stage.source_path, 'spack-build.out')
-
- with open(buildLogPath, 'rb') as F:
- buildLog = F.read() #TODO: this may not return all output
- #TODO: add the whole build log? it could be several thousand
- # lines. It may be better to look for errors.
- jrf.addTest(bId, package.installed, buildLogPath + '\n' +
- spec.to_yaml() + buildLog)
+ handled = {}
+ for spec in topLevelNewInstalls:
+ createTestOutput(spec, handled, jrf)
with open(args.output, 'wb') as F:
jrf.writeTo(F)