ctest_update: Run 'git submodule' at top level
The git submodule porcelain must be executed from the top level of the work tree. Use 'git rev-parse --show-cdup' to find the top level relative to the source tree. This is better than searching up the tree for .git ourselves because it will always work the same way Git does and thus honors settings like GIT_DISCOVERY_ACROSS_FILESYSTEM.
This commit is contained in:
parent
7bf8dc1ac9
commit
a7319cf1c1
|
@ -132,6 +132,27 @@ std::string cmCTestGIT::FindGitDir()
|
||||||
return git_dir;
|
return git_dir;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
std::string cmCTestGIT::FindTopDir()
|
||||||
|
{
|
||||||
|
std::string top_dir = this->SourceDirectory;
|
||||||
|
|
||||||
|
// Run "git rev-parse --show-cdup" to locate the top of the tree.
|
||||||
|
const char* git = this->CommandLineTool.c_str();
|
||||||
|
char const* git_rev_parse[] = {git, "rev-parse", "--show-cdup", 0};
|
||||||
|
std::string cdup;
|
||||||
|
OneLineParser rev_parse_out(this, "rev-parse-out> ", cdup);
|
||||||
|
OutputLogger rev_parse_err(this->Log, "rev-parse-err> ");
|
||||||
|
if(this->RunChild(git_rev_parse, &rev_parse_out, &rev_parse_err) &&
|
||||||
|
!cdup.empty())
|
||||||
|
{
|
||||||
|
top_dir += "/";
|
||||||
|
top_dir += cdup;
|
||||||
|
top_dir = cmSystemTools::CollapseFullPath(top_dir.c_str());
|
||||||
|
}
|
||||||
|
return top_dir;
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
bool cmCTestGIT::UpdateByFetchAndReset()
|
bool cmCTestGIT::UpdateByFetchAndReset()
|
||||||
{
|
{
|
||||||
|
@ -240,11 +261,13 @@ bool cmCTestGIT::UpdateImpl()
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string top_dir = this->FindTopDir();
|
||||||
const char* git = this->CommandLineTool.c_str();
|
const char* git = this->CommandLineTool.c_str();
|
||||||
char const* git_submodule[] = {git, "submodule", "update", 0};
|
char const* git_submodule[] = {git, "submodule", "update", 0};
|
||||||
OutputLogger submodule_out(this->Log, "submodule-out> ");
|
OutputLogger submodule_out(this->Log, "submodule-out> ");
|
||||||
OutputLogger submodule_err(this->Log, "submodule-err> ");
|
OutputLogger submodule_err(this->Log, "submodule-err> ");
|
||||||
return this->RunChild(git_submodule, &submodule_out, &submodule_err);
|
return this->RunChild(git_submodule, &submodule_out, &submodule_err,
|
||||||
|
top_dir.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
|
|
|
@ -33,6 +33,7 @@ private:
|
||||||
virtual bool UpdateImpl();
|
virtual bool UpdateImpl();
|
||||||
|
|
||||||
std::string FindGitDir();
|
std::string FindGitDir();
|
||||||
|
std::string FindTopDir();
|
||||||
|
|
||||||
bool UpdateByFetchAndReset();
|
bool UpdateByFetchAndReset();
|
||||||
bool UpdateByCustom(std::string const& custom);
|
bool UpdateByCustom(std::string const& custom);
|
||||||
|
|
Loading…
Reference in New Issue