diff --git a/lib/spack/spack/cmd/install.py b/lib/spack/spack/cmd/install.py index 5524324094cb0d7eadf9267edc6ff82554250682..1570309a58246379fa527dc92acd1c5ebb3cac13 100644 --- a/lib/spack/spack/cmd/install.py +++ b/lib/spack/spack/cmd/install.py @@ -153,11 +153,20 @@ def setup_parser(subparser): help="""The site name that will be reported to CDash. Defaults to current system hostname.""" ) - subparser.add_argument( + cdash_subgroup = subparser.add_mutually_exclusive_group() + cdash_subgroup.add_argument( '--cdash-track', default='Experimental', help="""Results will be reported to this group on CDash. Defaults to Experimental.""" + ) + cdash_subgroup.add_argument( + '--cdash-buildstamp', + default=None, + help="""Instead of letting the CDash reporter prepare the +buildstamp which, when combined with build name, site and project, +uniquely identifies the build, provide this argument to identify +the build yourself. Format: %%Y%%m%%d-%%H%%M-[cdash-track]""" ) arguments.add_common_arguments(subparser, ['yes_to_all']) diff --git a/lib/spack/spack/reporters/cdash.py b/lib/spack/spack/reporters/cdash.py index 328863dfede81b0f70020bf2d4629036feddd93c..d9c7c9d6972d2e1ceced2527ae265943f285ea11 100644 --- a/lib/spack/spack/reporters/cdash.py +++ b/lib/spack/spack/reporters/cdash.py @@ -72,9 +72,12 @@ def __init__(self, args): self.site = args.cdash_site or socket.gethostname() self.osname = platform.system() self.endtime = int(time.time()) - buildstamp_format = "%Y%m%d-%H%M-{0}".format(args.cdash_track) - self.buildstamp = time.strftime(buildstamp_format, - time.localtime(self.endtime)) + if args.cdash_buildstamp: + self.buildstamp = args.cdash_buildstamp + else: + buildstamp_format = "%Y%m%d-%H%M-{0}".format(args.cdash_track) + self.buildstamp = time.strftime(buildstamp_format, + time.localtime(self.endtime)) self.buildId = None self.revision = '' git = which('git') diff --git a/lib/spack/spack/test/cmd/install.py b/lib/spack/spack/test/cmd/install.py index 1645cd4b0ed95d8cc5fc806cbc31e884fa629ed0..29172538bcf92998d372cb777649c1b66781ddc5 100644 --- a/lib/spack/spack/test/cmd/install.py +++ b/lib/spack/spack/test/cmd/install.py @@ -8,6 +8,7 @@ import filecmp import re from six.moves import builtins +import time import pytest @@ -505,6 +506,33 @@ def test_cdash_upload_extra_params(tmpdir, mock_fetch, install_mockery, capfd): assert '-my_custom_track' in content +@pytest.mark.disable_clean_stage_check +def test_cdash_buildstamp_param(tmpdir, mock_fetch, install_mockery, capfd): + # capfd interferes with Spack's capturing + with capfd.disabled(): + with tmpdir.as_cwd(): + cdash_track = 'some_mocked_track' + buildstamp_format = "%Y%m%d-%H%M-{0}".format(cdash_track) + buildstamp = time.strftime(buildstamp_format, + time.localtime(int(time.time()))) + with pytest.raises((HTTPError, URLError)): + install( + '--log-file=cdash_reports', + '--cdash-build=my_custom_build', + '--cdash-site=my_custom_site', + '--cdash-buildstamp={0}'.format(buildstamp), + '--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 'Site BuildName="my_custom_build"' in content + assert 'Name="my_custom_site"' in content + assert buildstamp in content + + @pytest.mark.disable_clean_stage_check def test_cdash_install_from_spec_yaml(tmpdir, mock_fetch, install_mockery, capfd, mock_packages, mock_archive,