From 601ff0ec55517bc2a80e9a8cc2340f1c18b93490 Mon Sep 17 00:00:00 2001 From: Zack Galbreath Date: Tue, 7 Jul 2015 21:50:32 -0400 Subject: [PATCH] CTest: Optionally add a ChangeId attribute on XML Site tags Add variable CTEST_CHANGE_ID to configure the setting. This allows CTest clients to give CDash information about what change is being tested so that CDash can take actions to report the results (e.g. to a pull request page). --- Help/manual/cmake-variables.7.rst | 1 + Help/variable/CTEST_CHANGE_ID.rst | 9 +++++++++ Source/CTest/cmCTestHandlerCommand.cxx | 6 ++++++ Source/cmCTest.cxx | 7 +++++++ Tests/RunCMake/ctest_build/BuildChangeId-check.cmake | 12 ++++++++++++ Tests/RunCMake/ctest_build/RunCMakeTest.cmake | 9 +++++++++ Tests/RunCMake/ctest_test/RunCMakeTest.cmake | 10 ++++++++++ Tests/RunCMake/ctest_test/TestChangeId-check.cmake | 12 ++++++++++++ Tests/RunCMake/ctest_test/test.cmake.in | 1 + 9 files changed, 67 insertions(+) create mode 100644 Help/variable/CTEST_CHANGE_ID.rst create mode 100644 Tests/RunCMake/ctest_build/BuildChangeId-check.cmake create mode 100644 Tests/RunCMake/ctest_test/TestChangeId-check.cmake diff --git a/Help/manual/cmake-variables.7.rst b/Help/manual/cmake-variables.7.rst index f54436a43..19d0c68e4 100644 --- a/Help/manual/cmake-variables.7.rst +++ b/Help/manual/cmake-variables.7.rst @@ -351,6 +351,7 @@ Variables for CTest /variable/CTEST_BUILD_NAME /variable/CTEST_BZR_COMMAND /variable/CTEST_BZR_UPDATE_OPTIONS + /variable/CTEST_CHANGE_ID /variable/CTEST_CHECKOUT_COMMAND /variable/CTEST_CONFIGURATION_TYPE /variable/CTEST_CONFIGURE_COMMAND diff --git a/Help/variable/CTEST_CHANGE_ID.rst b/Help/variable/CTEST_CHANGE_ID.rst new file mode 100644 index 000000000..a423f4900 --- /dev/null +++ b/Help/variable/CTEST_CHANGE_ID.rst @@ -0,0 +1,9 @@ +CTEST_CHANGE_ID +--------------- + +Specify the CTest ``ChangeId`` setting +in a :manual:`ctest(1)` dashboard client script. + +This setting allows CTest to pass arbitrary information about this +build up to CDash. One use of this feature is to allow CDash to +post comments on your pull request if anything goes wrong with your build. diff --git a/Source/CTest/cmCTestHandlerCommand.cxx b/Source/CTest/cmCTestHandlerCommand.cxx index 3003e8a1c..3579aee19 100644 --- a/Source/CTest/cmCTestHandlerCommand.cxx +++ b/Source/CTest/cmCTestHandlerCommand.cxx @@ -109,6 +109,12 @@ bool cmCTestHandlerCommand this->Quiet); } + if(const char* changeId = + this->Makefile->GetDefinition("CTEST_CHANGE_ID")) + { + this->CTest->SetCTestConfiguration("ChangeId", changeId, this->Quiet); + } + cmCTestLog(this->CTest, DEBUG, "Initialize handler" << std::endl;); cmCTestGenericHandler* handler = this->InitializeHandler(); if ( !handler ) diff --git a/Source/cmCTest.cxx b/Source/cmCTest.cxx index 5676dda7b..f65bd297f 100644 --- a/Source/cmCTest.cxx +++ b/Source/cmCTest.cxx @@ -1567,6 +1567,13 @@ void cmCTest::StartXML(cmXMLWriter& xml, bool append) xml.Attribute("LogicalProcessorsPerPhysical", info.GetLogicalProcessorsPerPhysical()); xml.Attribute("ProcessorClockFrequency", info.GetProcessorClockFrequency()); + + std::string changeId = this->GetCTestConfiguration("ChangeId"); + if(!changeId.empty()) + { + xml.Attribute("ChangeId", changeId); + } + this->AddSiteProperties(xml); } diff --git a/Tests/RunCMake/ctest_build/BuildChangeId-check.cmake b/Tests/RunCMake/ctest_build/BuildChangeId-check.cmake new file mode 100644 index 000000000..074801f88 --- /dev/null +++ b/Tests/RunCMake/ctest_build/BuildChangeId-check.cmake @@ -0,0 +1,12 @@ +file(GLOB build_xml_file "${RunCMake_TEST_BINARY_DIR}/Testing/*/Build.xml") +if(build_xml_file) + file(READ "${build_xml_file}" build_xml LIMIT 4096) + if(NOT build_xml MATCHES [[ChangeId="<>1"]]) + string(REPLACE "\n" "\n " build_xml " ${build_xml}") + set(RunCMake_TEST_FAILED + "Build.xml does not have expected ChangeId:\n${build_xml}" + ) + endif() +else() + set(RunCMake_TEST_FAILED "Build.xml not found") +endif() diff --git a/Tests/RunCMake/ctest_build/RunCMakeTest.cmake b/Tests/RunCMake/ctest_build/RunCMakeTest.cmake index c6f732c8d..324f25c50 100644 --- a/Tests/RunCMake/ctest_build/RunCMakeTest.cmake +++ b/Tests/RunCMake/ctest_build/RunCMakeTest.cmake @@ -31,3 +31,12 @@ endif() endif() endfunction() run_BuildFailure() + +function(run_BuildChangeId) + set(CASE_TEST_PREFIX_CODE [[ + set(CTEST_CHANGE_ID "<>1") + ]]) + + run_ctest(BuildChangeId) +endfunction() +run_BuildChangeId() diff --git a/Tests/RunCMake/ctest_test/RunCMakeTest.cmake b/Tests/RunCMake/ctest_test/RunCMakeTest.cmake index 21d0447e5..76dc143f3 100644 --- a/Tests/RunCMake/ctest_test/RunCMakeTest.cmake +++ b/Tests/RunCMake/ctest_test/RunCMakeTest.cmake @@ -49,3 +49,13 @@ set(CASE_CTEST_TEST_LOAD "ERR3") run_ctest_test(TestLoadOrder TEST_LOAD "ERR4") unset(ENV{__CTEST_FAKE_LOAD_AVERAGE_FOR_TESTING}) +unset(CASE_CTEST_TEST_LOAD) + +function(run_TestChangeId) + set(CASE_TEST_PREFIX_CODE [[ + set(CTEST_CHANGE_ID "<>1") + ]]) + + run_ctest(TestChangeId) +endfunction() +run_TestChangeId() diff --git a/Tests/RunCMake/ctest_test/TestChangeId-check.cmake b/Tests/RunCMake/ctest_test/TestChangeId-check.cmake new file mode 100644 index 000000000..b9884f1ec --- /dev/null +++ b/Tests/RunCMake/ctest_test/TestChangeId-check.cmake @@ -0,0 +1,12 @@ +file(GLOB test_xml_file "${RunCMake_TEST_BINARY_DIR}/Testing/*/Test.xml") +if(test_xml_file) + file(READ "${test_xml_file}" test_xml LIMIT 4096) + if(NOT test_xml MATCHES [[ChangeId="<>1"]]) + string(REPLACE "\n" "\n " test_xml " ${test_xml}") + set(RunCMake_TEST_FAILED + "Test.xml does not have expected ChangeId:\n${test_xml}" + ) + endif() +else() + set(RunCMake_TEST_FAILED "Test.xml not found") +endif() diff --git a/Tests/RunCMake/ctest_test/test.cmake.in b/Tests/RunCMake/ctest_test/test.cmake.in index a8de6a361..50b936d31 100644 --- a/Tests/RunCMake/ctest_test/test.cmake.in +++ b/Tests/RunCMake/ctest_test/test.cmake.in @@ -1,4 +1,5 @@ cmake_minimum_required(VERSION 3.1) +@CASE_TEST_PREFIX_CODE@ set(CTEST_SITE "test-site") set(CTEST_BUILD_NAME "test-build-name")