From 39b5df2f3714c32d498fcb7c88f5bda456f75cb3 Mon Sep 17 00:00:00 2001 From: Bill Hoffman Date: Wed, 13 Aug 2014 13:45:08 -0400 Subject: [PATCH 1/2] ctest_update: Add CTEST_UPDATE_VERSION_ONLY option to only note the version This allows ctest_update to get the current version without actually changing the repository. This is useful when using Jenkins or an external project to update the source to a specific version, but you still want the current version to show up in CDash. --- Help/manual/cmake-variables.7.rst | 1 + Help/manual/ctest.1.rst | 9 ++++ Help/variable/CTEST_UPDATE_VERSION_ONLY.rst | 5 +++ Modules/DartConfiguration.tcl.in | 3 ++ Source/CTest/cmCTestUpdateCommand.cxx | 2 + Source/CTest/cmCTestVC.cxx | 15 +++++-- Tests/CTestUpdateCommon.cmake | 48 ++++++++++++++++++--- Tests/CTestUpdateGIT.cmake.in | 17 ++++++++ 8 files changed, 89 insertions(+), 11 deletions(-) create mode 100644 Help/variable/CTEST_UPDATE_VERSION_ONLY.rst diff --git a/Help/manual/cmake-variables.7.rst b/Help/manual/cmake-variables.7.rst index 05a7b334e1..43c2af3880 100644 --- a/Help/manual/cmake-variables.7.rst +++ b/Help/manual/cmake-variables.7.rst @@ -360,6 +360,7 @@ Variables for CTest /variable/CTEST_TRIGGER_SITE /variable/CTEST_UPDATE_COMMAND /variable/CTEST_UPDATE_OPTIONS + /variable/CTEST_UPDATE_VERSION_ONLY /variable/CTEST_USE_LAUNCHERS Variables for CPack diff --git a/Help/manual/ctest.1.rst b/Help/manual/ctest.1.rst index a57a8f0282..52e4beb2d6 100644 --- a/Help/manual/ctest.1.rst +++ b/Help/manual/ctest.1.rst @@ -668,6 +668,15 @@ Configuration settings to specify the version control tool include: * :module:`CTest` module variable: ``UPDATE_TYPE`` if set, else ``CTEST_UPDATE_TYPE`` +``UpdateVersionOnly`` + Specify that you want the version control update command to only + discover the current version that is checked out, and not to update + to a different version. + + * `CTest Script`_ variable: :variable:`CTEST_UPDATE_VERSION_ONLY` + + + Additional configuration settings include: ``NightlyStartTime`` diff --git a/Help/variable/CTEST_UPDATE_VERSION_ONLY.rst b/Help/variable/CTEST_UPDATE_VERSION_ONLY.rst new file mode 100644 index 0000000000..e646e6eeab --- /dev/null +++ b/Help/variable/CTEST_UPDATE_VERSION_ONLY.rst @@ -0,0 +1,5 @@ +CTEST_UPDATE_VERSION_ONLY +------------------------- + +Specify the CTest ``UpdateVersionOnly`` setting +in a :manual:`ctest(1)` dashboard client script. diff --git a/Modules/DartConfiguration.tcl.in b/Modules/DartConfiguration.tcl.in index 042088299e..86049d065d 100644 --- a/Modules/DartConfiguration.tcl.in +++ b/Modules/DartConfiguration.tcl.in @@ -37,6 +37,9 @@ ConfigureCommand: "@CMAKE_COMMAND@" "@PROJECT_SOURCE_DIR@" MakeCommand: @MAKECOMMAND@ DefaultCTestConfigurationType: @DEFAULT_CTEST_CONFIGURATION_TYPE@ +# version control +UpdateVersionOnly: @CTEST_UPDATE_VERSION_ONLY@ + # CVS options # Default is "-d -P -A" CVSCommand: @CVSCOMMAND@ diff --git a/Source/CTest/cmCTestUpdateCommand.cxx b/Source/CTest/cmCTestUpdateCommand.cxx index 5408a8a790..f87466d9c3 100644 --- a/Source/CTest/cmCTestUpdateCommand.cxx +++ b/Source/CTest/cmCTestUpdateCommand.cxx @@ -55,6 +55,8 @@ cmCTestGenericHandler* cmCTestUpdateCommand::InitializeHandler() "GITUpdateOptions", "CTEST_GIT_UPDATE_OPTIONS"); this->CTest->SetCTestConfigurationFromCMakeVariable(this->Makefile, "GITUpdateCustom", "CTEST_GIT_UPDATE_CUSTOM"); + this->CTest->SetCTestConfigurationFromCMakeVariable(this->Makefile, + "UpdateVersionOnly", "CTEST_UPDATE_VERSION_ONLY"); this->CTest->SetCTestConfigurationFromCMakeVariable(this->Makefile, "HGCommand", "CTEST_HG_COMMAND"); this->CTest->SetCTestConfigurationFromCMakeVariable(this->Makefile, diff --git a/Source/CTest/cmCTestVC.cxx b/Source/CTest/cmCTestVC.cxx index f89fa2ba5a..15f796f0ab 100644 --- a/Source/CTest/cmCTestVC.cxx +++ b/Source/CTest/cmCTestVC.cxx @@ -166,10 +166,17 @@ void cmCTestVC::CleanupImpl() //---------------------------------------------------------------------------- bool cmCTestVC::Update() { - this->NoteOldRevision(); - this->Log << "--- Begin Update ---\n"; - bool result = this->UpdateImpl(); - this->Log << "--- End Update ---\n"; + bool result = true; + // if update version only is on then do not actually update, + // just note the current version and finish + if(!cmSystemTools::IsOn( + this->CTest->GetCTestConfiguration("UpdateVersionOnly").c_str())) + { + this->NoteOldRevision(); + this->Log << "--- Begin Update ---\n"; + result = this->UpdateImpl(); + this->Log << "--- End Update ---\n"; + } this->NoteNewRevision(); return result; } diff --git a/Tests/CTestUpdateCommon.cmake b/Tests/CTestUpdateCommon.cmake index 857c6f5680..97153f0f94 100644 --- a/Tests/CTestUpdateCommon.cmake +++ b/Tests/CTestUpdateCommon.cmake @@ -218,6 +218,36 @@ function(run_dashboard_command_line bin_dir) ) endfunction() +#----------------------------------------------------------------------------- +# Function to find the Update.xml file and make sure +# it only has the Revision in it and no updates +function(check_no_update bin_dir) + set(PATTERN ${TOP}/${bin_dir}/Testing/*/Update.xml) + file(GLOB UPDATE_XML_FILE RELATIVE ${TOP} ${PATTERN}) + string(REGEX REPLACE "//Update.xml$" "/Update.xml" + UPDATE_XML_FILE "${UPDATE_XML_FILE}") + message(" found ${UPDATE_XML_FILE}") + set(rev_regex "Revision|PriorRevision") + file(STRINGS ${TOP}/${UPDATE_XML_FILE} UPDATE_XML_REVISIONS + REGEX "^\t<(${rev_regex})>[^<\n]+$" + ) + set(found_revisons FALSE) + foreach(r IN LISTS UPDATE_XML_REVISIONS) + if("${r}" MATCHES "PriorRevision") + message(FATAL_ERROR "Found PriorRevision in no update test") + endif() + if("${r}" MATCHES "") + set(found_revisons TRUE) + endif() + endforeach() + if(found_revisons) + message(" found in no update test") + else() + message(FATAL_ERROR " missing in no update test") + endif() +endfunction() + + #----------------------------------------------------------------------------- # Function to run the dashboard through a script function(run_dashboard_script bin_dir) @@ -228,13 +258,17 @@ function(run_dashboard_script bin_dir) # Verify the updates reported by CTest. list(APPEND UPDATE_MAYBE Updated{subdir} Updated{CTestConfig.cmake}) - check_updates(${bin_dir} - Updated{foo.txt} - Updated{bar.txt} - Updated{zot.txt} - Updated{subdir/foo.txt} - Updated{subdir/bar.txt} - ) + if(NO_UPDATE) + check_no_update(${bin_dir}) + else() + check_updates(${bin_dir} + Updated{foo.txt} + Updated{bar.txt} + Updated{zot.txt} + Updated{subdir/foo.txt} + Updated{subdir/bar.txt} + ) + endif() endfunction() #----------------------------------------------------------------------------- diff --git a/Tests/CTestUpdateGIT.cmake.in b/Tests/CTestUpdateGIT.cmake.in index f6939de9ae..41b732b751 100644 --- a/Tests/CTestUpdateGIT.cmake.in +++ b/Tests/CTestUpdateGIT.cmake.in @@ -317,3 +317,20 @@ set(CTEST_GIT_UPDATE_CUSTOM \${CTEST_GIT_COMMAND} pull origin master) # Run the dashboard script with CTest. run_dashboard_script(dash-binary-custom) + + +rewind_source(dash-source) + +#----------------------------------------------------------------------------- +# Test no update with a dashboard script. +message("Running CTest Dashboard Script (No update)...") + +create_dashboard_script(dash-binary-no-update + "# git command configuration +set(CTEST_GIT_COMMAND \"${GIT}\") +set(CTEST_UPDATE_VERSION_ONLY TRUE) +") + +# Run the dashboard script with CTest. +set(NO_UPDATE 1) +run_dashboard_script(dash-binary-no-update) From 653529ce55a9c33fa7378708793caac92a857794 Mon Sep 17 00:00:00 2001 From: Bill Hoffman Date: Wed, 13 Aug 2014 17:58:05 -0400 Subject: [PATCH 2/2] CTest: Allow / to be in the build name, and be consistent with the build name Prior to this change / was not allowed in the build name. This was tested with a CDash server and worked. In addition the safe build name was not used everywhere. This caused mismatched build names to be in the xml files going to CDash which caused different rows to be created for the same build. --- Source/CTest/cmCTestSubmitHandler.cxx | 4 +++- Source/CTest/cmCTestUpdateHandler.cxx | 5 +++-- Source/CTest/cmCTestUploadHandler.cxx | 5 +++-- Source/cmCTest.cxx | 14 +++++++++----- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/Source/CTest/cmCTestSubmitHandler.cxx b/Source/CTest/cmCTestSubmitHandler.cxx index 109905cbae..06fcb75260 100644 --- a/Source/CTest/cmCTestSubmitHandler.cxx +++ b/Source/CTest/cmCTestSubmitHandler.cxx @@ -1479,8 +1479,10 @@ int cmCTestSubmitHandler::ProcessHandler() //---------------------------------------------------------------------------- std::string cmCTestSubmitHandler::GetSubmitResultsPrefix() { + std::string buildname = cmCTest::SafeBuildIdField( + this->CTest->GetCTestConfiguration("BuildName")); std::string name = this->CTest->GetCTestConfiguration("Site") + - "___" + this->CTest->GetCTestConfiguration("BuildName") + + "___" + buildname + "___" + this->CTest->GetCurrentTag() + "-" + this->CTest->GetTestModelString() + "___XML___"; return name; diff --git a/Source/CTest/cmCTestUpdateHandler.cxx b/Source/CTest/cmCTestUpdateHandler.cxx index fda61ea497..68f5fe133e 100644 --- a/Source/CTest/cmCTestUpdateHandler.cxx +++ b/Source/CTest/cmCTestUpdateHandler.cxx @@ -258,12 +258,13 @@ int cmCTestUpdateHandler::ProcessHandler() double elapsed_time_start = cmSystemTools::GetTime(); bool updated = vc->Update(); - + std::string buildname = cmCTest::SafeBuildIdField( + this->CTest->GetCTestConfiguration("BuildName")); os << "\n" << "\n" << "\t" << this->CTest->GetCTestConfiguration("Site") << "\n" - << "\t" << this->CTest->GetCTestConfiguration("BuildName") + << "\t" << buildname << "\n" << "\t" << this->CTest->GetCurrentTag() << "-" << this->CTest->GetTestModelString() << "" << std::endl; diff --git a/Source/CTest/cmCTestUploadHandler.cxx b/Source/CTest/cmCTestUploadHandler.cxx index 4c3f81b11a..e33c3871aa 100644 --- a/Source/CTest/cmCTestUploadHandler.cxx +++ b/Source/CTest/cmCTestUploadHandler.cxx @@ -44,14 +44,15 @@ int cmCTestUploadHandler::ProcessHandler() "Cannot open Upload.xml file" << std::endl); return -1; } - + std::string buildname = cmCTest::SafeBuildIdField( + this->CTest->GetCTestConfiguration("BuildName")); cmCTest::SetOfStrings::const_iterator it; ofs << "\n" << " \"?>\n" << "CTest->GetCTestConfiguration("BuildName") + << buildname << "\" BuildStamp=\"" << this->CTest->GetCurrentTag() << "-" << this->CTest->GetTestModelString() << "\" Name=\"" diff --git a/Source/cmCTest.cxx b/Source/cmCTest.cxx index b28f3b5421..a7905a4e00 100644 --- a/Source/cmCTest.cxx +++ b/Source/cmCTest.cxx @@ -488,9 +488,11 @@ int cmCTest::Initialize(const char* binary_dir, cmCTestStartCommand* command) { cmCTestLog(this, DEBUG, "Here: " << __LINE__ << std::endl); cmCTestLog(this, OUTPUT, - " Site: " << this->GetCTestConfiguration("Site") << std::endl - << " Build name: " << this->GetCTestConfiguration("BuildName") - << std::endl); + " Site: " << this->GetCTestConfiguration("Site") << std::endl + << " Build name: " + << cmCTest::SafeBuildIdField( + this->GetCTestConfiguration("BuildName")) + << std::endl); cmCTestLog(this, DEBUG, "Produce XML is on" << std::endl); if ( this->TestModel == cmCTest::NIGHTLY && this->GetCTestConfiguration("NightlyStartTime").empty() ) @@ -1441,7 +1443,7 @@ std::string cmCTest::SafeBuildIdField(const std::string& value) // Disallow non-filename and non-space whitespace characters. // If they occur, replace them with "" // - const char *disallowed = "\\/:*?\"<>|\n\r\t\f\v"; + const char *disallowed = "\\:*?\"<>|\n\r\t\f\v"; if (safevalue.find_first_of(disallowed) != value.npos) { @@ -1582,12 +1584,14 @@ void cmCTest::EndXML(std::ostream& ostr) int cmCTest::GenerateCTestNotesOutput(std::ostream& os, const cmCTest::VectorOfStrings& files) { + std::string buildname = cmCTest::SafeBuildIdField( + this->GetCTestConfiguration("BuildName")); cmCTest::VectorOfStrings::const_iterator it; os << "\n" << " \"?>\n" - << "GetCTestConfiguration("BuildName") + << "CurrentTag << "-" << this->GetTestModelString() << "\" Name=\"" << this->GetCTestConfiguration("Site") << "\" Generator=\"ctest"