Explorar o código

Merge topic 'ctest-run-submodule-sync'

c18d91ad Help: add release notes for topic 'ctest-run-submodule-sync'
7f560743 cmCTestGIT: run `git submodule sync` before updating submodules
06b310b5 cmCTestGIT: add an option to initialize submodules on update
56c1ea40 cmCTestGIT: fix git version references
Brad King %!s(int64=9) %!d(string=hai) anos
pai
achega
fd40b0f875

+ 1 - 0
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

+ 6 - 0
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

+ 9 - 0
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.

+ 5 - 0
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.

+ 1 - 0
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@
 

+ 43 - 4
Source/CTest/cmCTestGIT.cxx

@@ -273,21 +273,60 @@ 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.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";
+      }
+    }
+
+  // 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";
       }
     }
 
-  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_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());
 }

+ 2 - 0
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,