Explorar o código

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.
Ben Boeckel %!s(int64=9) %!d(string=hai) anos
pai
achega
7f5607439e
Modificáronse 1 ficheiros con 22 adicións e 0 borrados
  1. 22 0
      Source/CTest/cmCTestGIT.cxx

+ 22 - 0
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());