Przeglądaj źródła

CTest: Update Git submodules with --recursive

Fail if submodules exist and the git version is less than 1.6.5.0.

Inspired-by: Johan Björk <[email protected]>
Brad King 14 lat temu
rodzic
commit
1173cc4ab2
2 zmienionych plików z 47 dodań i 1 usunięć
  1. 45 1
      Source/CTest/cmCTestGIT.cxx
  2. 2 0
      Source/CTest/cmCTestGIT.h

+ 45 - 1
Source/CTest/cmCTestGIT.cxx

@@ -23,11 +23,20 @@
 #include <time.h>
 #include <ctype.h>
 
+//----------------------------------------------------------------------------
+static unsigned int cmCTestGITVersion(unsigned int epic, unsigned int major,
+                                      unsigned int minor, unsigned int fix)
+{
+  // 1.6.5.0 maps to 10605000
+  return fix + minor*1000 + major*100000 + epic*10000000;
+}
+
 //----------------------------------------------------------------------------
 cmCTestGIT::cmCTestGIT(cmCTest* ct, std::ostream& log):
   cmCTestGlobalVC(ct, log)
 {
   this->PriorRev = this->Unknown;
+  this->CurrentGitVersion = 0;
 }
 
 //----------------------------------------------------------------------------
@@ -263,13 +272,48 @@ bool cmCTestGIT::UpdateImpl()
 
   std::string top_dir = this->FindTopDir();
   const char* git = this->CommandLineTool.c_str();
-  char const* git_submodule[] = {git, "submodule", "update", 0};
+  const char* recursive = "--recursive";
+
+  // Git < 1.6.5.0 did not support --recursive
+  if(this->GetGitVersion() < cmCTestGITVersion(1,6,5,0))
+    {
+    recursive = 0;
+    // No need to require >= 1.6.5.0 if there are no submodules.
+    if(cmSystemTools::FileExists((top_dir + "/.gitmodules").c_str()))
+      {
+      this->Log << "Git >= 1.6.5.0 required for submodule support\n";
+      return false;
+      }
+    }
+
+  char const* git_submodule[] = {git, "submodule", "update", recursive, 0};
   OutputLogger submodule_out(this->Log, "submodule-out> ");
   OutputLogger submodule_err(this->Log, "submodule-err> ");
   return this->RunChild(git_submodule, &submodule_out, &submodule_err,
                         top_dir.c_str());
 }
 
+//----------------------------------------------------------------------------
+unsigned int cmCTestGIT::GetGitVersion()
+{
+  if(!this->CurrentGitVersion)
+    {
+    const char* git = this->CommandLineTool.c_str();
+    char const* git_version[] = {git, "--version", 0};
+    std::string version;
+    OneLineParser version_out(this, "version-out> ", version);
+    OutputLogger version_err(this->Log, "version-err> ");
+    unsigned int v[4] = {0,0,0,0};
+    if(this->RunChild(git_version, &version_out, &version_err) &&
+       sscanf(version.c_str(), "git version %u.%u.%u.%u",
+              &v[0], &v[1], &v[2], &v[3]) >= 3)
+      {
+      this->CurrentGitVersion = cmCTestGITVersion(v[0], v[1], v[2], v[3]);
+      }
+    }
+  return this->CurrentGitVersion;
+}
+
 //----------------------------------------------------------------------------
 /* Diff format:
 

+ 2 - 0
Source/CTest/cmCTestGIT.h

@@ -27,6 +27,8 @@ public:
   virtual ~cmCTestGIT();
 
 private:
+  unsigned int CurrentGitVersion;
+  unsigned int GetGitVersion();
   std::string GetWorkingRevision();
   virtual void NoteOldRevision();
   virtual void NoteNewRevision();