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 <phb@spotify.com>
This commit is contained in:
parent
62f816adde
commit
1173cc4ab2
|
@ -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:
|
||||
|
||||
|
|
|
@ -27,6 +27,8 @@ public:
|
|||
virtual ~cmCTestGIT();
|
||||
|
||||
private:
|
||||
unsigned int CurrentGitVersion;
|
||||
unsigned int GetGitVersion();
|
||||
std::string GetWorkingRevision();
|
||||
virtual void NoteOldRevision();
|
||||
virtual void NoteNewRevision();
|
||||
|
|
Loading…
Reference in New Issue