From 56c1ea40c5e278155025f3823089e2d0fa34054a Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Thu, 31 Mar 2016 12:31:31 -0400 Subject: [PATCH 1/4] cmCTestGIT: fix git version references Git does not use a 4-component version number. --- Source/CTest/cmCTestGIT.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/CTest/cmCTestGIT.cxx b/Source/CTest/cmCTestGIT.cxx index bbb3b9d47..da086bedb 100644 --- a/Source/CTest/cmCTestGIT.cxx +++ b/Source/CTest/cmCTestGIT.cxx @@ -274,14 +274,14 @@ bool cmCTestGIT::UpdateImpl() const char* git = this->CommandLineTool.c_str(); const char* recursive = "--recursive"; - // Git < 1.6.5.0 did not support --recursive + // Git < 1.6.5 did not support submodule --recursive if(this->GetGitVersion() < cmCTestGITVersion(1,6,5,0)) { recursive = 0; - // No need to require >= 1.6.5.0 if there are no submodules. + // No need to require >= 1.6.5 if there are no submodules. if(cmSystemTools::FileExists((top_dir + "/.gitmodules").c_str())) { - this->Log << "Git < 1.6.5.0 cannot update submodules recursively\n"; + this->Log << "Git < 1.6.5 cannot update submodules recursively\n"; } } From 06b310b5d5d8a38fb17df02fee8df750904cfcd0 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Thu, 31 Mar 2016 12:28:46 -0400 Subject: [PATCH 2/4] cmCTestGIT: add an option to initialize submodules on update Currently, CTest will not initialize any submodules within the already checked out source tree. Add an option to do so. The use case for not doing so is that some submodules may not be necessary for the current test and keeping network usage down may be important. --- Help/manual/cmake-variables.7.rst | 1 + Help/manual/ctest.1.rst | 6 ++++++ Help/variable/CTEST_GIT_INIT_SUBMODULES.rst | 5 +++++ Modules/DartConfiguration.tcl.in | 1 + Source/CTest/cmCTestGIT.cxx | 19 ++++++++++++++++++- Source/CTest/cmCTestUpdateCommand.cxx | 2 ++ 6 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 Help/variable/CTEST_GIT_INIT_SUBMODULES.rst diff --git a/Help/manual/cmake-variables.7.rst b/Help/manual/cmake-variables.7.rst index 5fd5c5c05..3f73b32a1 100644 --- a/Help/manual/cmake-variables.7.rst +++ b/Help/manual/cmake-variables.7.rst @@ -407,6 +407,7 @@ Variables for CTest /variable/CTEST_DROP_SITE_USER /variable/CTEST_EXTRA_COVERAGE_GLOB /variable/CTEST_GIT_COMMAND + /variable/CTEST_GIT_INIT_SUBMODULES /variable/CTEST_GIT_UPDATE_CUSTOM /variable/CTEST_GIT_UPDATE_OPTIONS /variable/CTEST_HG_COMMAND diff --git a/Help/manual/ctest.1.rst b/Help/manual/ctest.1.rst index 2fdf7f329..1179f5665 100644 --- a/Help/manual/ctest.1.rst +++ b/Help/manual/ctest.1.rst @@ -589,6 +589,12 @@ Configuration settings to specify the version control tool include: * `CTest Script`_ variable: :variable:`CTEST_GIT_COMMAND` * :module:`CTest` module variable: ``GITCOMMAND`` +``GITInitSubmodules`` + If set, CTest will update the repository's submodules before updating. + + * `CTest Script`_ variable: :variable:`CTEST_GIT_INIT_SUBMODULES` + * :module:`CTest` module variable: ``CTEST_GIT_INIT_SUBMODULES`` + ``GITUpdateCustom`` Specify a custom command line (as a semicolon-separated list) to run in the source tree (Git work tree) to update it instead of running diff --git a/Help/variable/CTEST_GIT_INIT_SUBMODULES.rst b/Help/variable/CTEST_GIT_INIT_SUBMODULES.rst new file mode 100644 index 000000000..fd270030d --- /dev/null +++ b/Help/variable/CTEST_GIT_INIT_SUBMODULES.rst @@ -0,0 +1,5 @@ +CTEST_GIT_INIT_SUBMODULES +------------------------- + +Specify the CTest ``GITInitSubmodules`` setting +in a :manual:`ctest(1)` dashboard client script. diff --git a/Modules/DartConfiguration.tcl.in b/Modules/DartConfiguration.tcl.in index 2da835427..0ff2eed8b 100644 --- a/Modules/DartConfiguration.tcl.in +++ b/Modules/DartConfiguration.tcl.in @@ -52,6 +52,7 @@ SVNUpdateOptions: @SVN_UPDATE_OPTIONS@ # Git options GITCommand: @GITCOMMAND@ +GITInitSubmodules: @CTEST_GIT_INIT_SUBMODULES@ GITUpdateOptions: @GIT_UPDATE_OPTIONS@ GITUpdateCustom: @CTEST_GIT_UPDATE_CUSTOM@ diff --git a/Source/CTest/cmCTestGIT.cxx b/Source/CTest/cmCTestGIT.cxx index da086bedb..9ee18e602 100644 --- a/Source/CTest/cmCTestGIT.cxx +++ b/Source/CTest/cmCTestGIT.cxx @@ -285,9 +285,26 @@ bool cmCTestGIT::UpdateImpl() } } - char const* git_submodule[] = {git, "submodule", "update", recursive, 0}; OutputLogger submodule_out(this->Log, "submodule-out> "); OutputLogger submodule_err(this->Log, "submodule-err> "); + + bool ret; + + std::string init_submodules = + this->CTest->GetCTestConfiguration("GITInitSubmodules"); + if (cmSystemTools::IsOn(init_submodules.c_str())) + { + char const* git_submodule_init[] = {git, "submodule", "init", 0}; + ret = this->RunChild(git_submodule_init, &submodule_out, &submodule_err, + top_dir.c_str()); + + if (!ret) + { + return false; + } + } + + char const* git_submodule[] = {git, "submodule", "update", recursive, 0}; return this->RunChild(git_submodule, &submodule_out, &submodule_err, top_dir.c_str()); } diff --git a/Source/CTest/cmCTestUpdateCommand.cxx b/Source/CTest/cmCTestUpdateCommand.cxx index dfda9f1e9..1bf60fc73 100644 --- a/Source/CTest/cmCTestUpdateCommand.cxx +++ b/Source/CTest/cmCTestUpdateCommand.cxx @@ -54,6 +54,8 @@ cmCTestGenericHandler* cmCTestUpdateCommand::InitializeHandler() "GITCommand", "CTEST_GIT_COMMAND", this->Quiet); this->CTest->SetCTestConfigurationFromCMakeVariable(this->Makefile, "GITUpdateOptions", "CTEST_GIT_UPDATE_OPTIONS", this->Quiet); + this->CTest->SetCTestConfigurationFromCMakeVariable(this->Makefile, + "GITInitSubmodules", "CTEST_GIT_INIT_SUBMODULES", this->Quiet); this->CTest->SetCTestConfigurationFromCMakeVariable(this->Makefile, "GITUpdateCustom", "CTEST_GIT_UPDATE_CUSTOM", this->Quiet); this->CTest->SetCTestConfigurationFromCMakeVariable(this->Makefile, From 7f5607439ed0d1303265d3db0937e90683e698de Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Thu, 31 Mar 2016 12:30:42 -0400 Subject: [PATCH 3/4] cmCTestGIT: run `git submodule sync` before updating submodules If the URL of a submodule changes upstream, the commits referenced at the old URL may not be available and will cause an update failure. --- Source/CTest/cmCTestGIT.cxx | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/Source/CTest/cmCTestGIT.cxx b/Source/CTest/cmCTestGIT.cxx index 9ee18e602..1d6bdcea1 100644 --- a/Source/CTest/cmCTestGIT.cxx +++ b/Source/CTest/cmCTestGIT.cxx @@ -273,6 +273,7 @@ bool cmCTestGIT::UpdateImpl() std::string top_dir = this->FindTopDir(); const char* git = this->CommandLineTool.c_str(); const char* recursive = "--recursive"; + const char* sync_recursive = "--recursive"; // Git < 1.6.5 did not support submodule --recursive if(this->GetGitVersion() < cmCTestGITVersion(1,6,5,0)) @@ -285,6 +286,17 @@ bool cmCTestGIT::UpdateImpl() } } + // Git < 1.8.1 did not support sync --recursive + if(this->GetGitVersion() < cmCTestGITVersion(1,8,1,0)) + { + sync_recursive = 0; + // No need to require >= 1.8.1 if there are no submodules. + if(cmSystemTools::FileExists((top_dir + "/.gitmodules").c_str())) + { + this->Log << "Git < 1.8.1 cannot synchronize submodules recursively\n"; + } + } + OutputLogger submodule_out(this->Log, "submodule-out> "); OutputLogger submodule_err(this->Log, "submodule-err> "); @@ -304,6 +316,16 @@ bool cmCTestGIT::UpdateImpl() } } + char const* git_submodule_sync[] = {git, "submodule", "sync", + sync_recursive, 0}; + ret = this->RunChild(git_submodule_sync, &submodule_out, &submodule_err, + top_dir.c_str()); + + if (!ret) + { + return false; + } + char const* git_submodule[] = {git, "submodule", "update", recursive, 0}; return this->RunChild(git_submodule, &submodule_out, &submodule_err, top_dir.c_str()); From c18d91add836f7ce426fcb59b2c65235898f3979 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Thu, 31 Mar 2016 12:31:56 -0400 Subject: [PATCH 4/4] Help: add release notes for topic 'ctest-run-submodule-sync' --- Help/release/dev/ctest-run-submodule-sync.rst | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 Help/release/dev/ctest-run-submodule-sync.rst diff --git a/Help/release/dev/ctest-run-submodule-sync.rst b/Help/release/dev/ctest-run-submodule-sync.rst new file mode 100644 index 000000000..c41cc2f7e --- /dev/null +++ b/Help/release/dev/ctest-run-submodule-sync.rst @@ -0,0 +1,9 @@ +ctest-run-submodule-sync +------------------------ + +* The :command:`ctest_update` command now looks at the + :variable:`CTEST_GIT_INIT_SUBMODULES` variable to determine whether + submodules should be updated or not before updating. +* The :command:`ctest_update` command will now synchronize submodules on an + update. Updates which add submodules or change a submodule's URL will now be + pulled properly.