diff --git a/lib/spack/spack/cmd/install.py b/lib/spack/spack/cmd/install.py
index b0165c8c30..733f29361b 100644
--- a/lib/spack/spack/cmd/install.py
+++ b/lib/spack/spack/cmd/install.py
@@ -213,7 +213,7 @@ def install(parser, args, **kwargs):
if len(specs) == 0:
tty.die('The `spack install` command requires a spec to install.')
- if not args.log_file:
+ if not args.log_file and not reporter.filename:
reporter.filename = default_log_file(specs[0])
reporter.specs = specs
with reporter:
diff --git a/lib/spack/spack/report.py b/lib/spack/spack/report.py
index 0c54e75a46..74e5caf194 100644
--- a/lib/spack/spack/report.py
+++ b/lib/spack/spack/report.py
@@ -135,6 +135,7 @@ def wrapper(pkg, *args, **kwargs):
value = do_install(pkg, *args, **kwargs)
package['result'] = 'success'
+ package['stdout'] = fetch_package_log(pkg)
if installed_on_entry:
return
diff --git a/lib/spack/spack/reporters/cdash.py b/lib/spack/spack/reporters/cdash.py
index 16251ce7c7..e27d7e9728 100644
--- a/lib/spack/spack/reporters/cdash.py
+++ b/lib/spack/spack/reporters/cdash.py
@@ -81,6 +81,7 @@ def build_report(self, filename, report_data):
for package in spec['packages']:
if 'stdout' in package:
current_phase = ''
+ cdash_phase = ''
for line in package['stdout'].splitlines():
match = phase_regexp.search(line)
if match:
@@ -88,20 +89,24 @@ def build_report(self, filename, report_data):
if current_phase not in map_phases_to_cdash:
current_phase = ''
continue
- beginning_of_phase = True
- else:
- if beginning_of_phase:
- cdash_phase = \
- map_phases_to_cdash[current_phase]
- if cdash_phase not in phases_encountered:
- phases_encountered.append(cdash_phase)
- report_data[cdash_phase]['log'] += \
- text_type("{0} output for {1}:\n".format(
- cdash_phase, package['name']))
- beginning_of_phase = False
+ cdash_phase = \
+ map_phases_to_cdash[current_phase]
+ if cdash_phase not in phases_encountered:
+ phases_encountered.append(cdash_phase)
+ report_data[cdash_phase]['log'] += \
+ text_type("{0} output for {1}:\n".format(
+ cdash_phase, package['name']))
+ elif cdash_phase:
report_data[cdash_phase]['log'] += \
xml.sax.saxutils.escape(line) + "\n"
+ # Move the build phase to the front of the list if it occurred.
+ # This supports older versions of CDash that expect this phase
+ # to be reported before all others.
+ if "build" in phases_encountered:
+ build_pos = phases_encountered.index("build")
+ phases_encountered.insert(0, phases_encountered.pop(build_pos))
+
for phase in phases_encountered:
errors, warnings = parse_log_events(
report_data[phase]['log'].splitlines())
diff --git a/lib/spack/spack/test/cmd/install.py b/lib/spack/spack/test/cmd/install.py
index 3a3280ce4b..904472f243 100644
--- a/lib/spack/spack/test/cmd/install.py
+++ b/lib/spack/spack/test/cmd/install.py
@@ -412,6 +412,26 @@ def test_cdash_upload_build_error(tmpdir, mock_fetch, install_mockery,
assert 'configure: error: in /path/to/some/file:' in content
+@pytest.mark.disable_clean_stage_check
+def test_cdash_upload_clean_build(tmpdir, mock_fetch, install_mockery,
+ capfd):
+ # capfd interferes with Spack's capturing
+ with capfd.disabled():
+ with tmpdir.as_cwd():
+ with pytest.raises((HTTPError, URLError)):
+ install(
+ '--log-file=cdash_reports',
+ '--cdash-upload-url=http://localhost/fakeurl/submit.php?project=Spack',
+ 'a')
+ report_dir = tmpdir.join('cdash_reports')
+ assert report_dir in tmpdir.listdir()
+ report_file = report_dir.join('Build.xml')
+ assert report_file in report_dir.listdir()
+ content = report_file.open().read()
+ assert '' in content
+ assert '' not in content
+
+
@pytest.mark.disable_clean_stage_check
def test_build_error_output(tmpdir, mock_fetch, install_mockery, capfd):
with capfd.disabled():