ctest_update: Support ".git file" work trees
Commit c3781efb
(Support Git upstream branch rewrites, 2010-06-08)
assumed that ".git/FETCH_HEAD" exists inside the source tree. Fix the
implementation to handle a work tree using a ".git file" to link to its
repository. Use "git rev-parse --git-dir" to locate the real .git dir.
This commit is contained in:
parent
65cb72f758
commit
7bf8dc1ac9
|
@ -84,6 +84,54 @@ void cmCTestGIT::NoteNewRevision()
|
||||||
<< this->NewRevision << "\n");
|
<< this->NewRevision << "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
std::string cmCTestGIT::FindGitDir()
|
||||||
|
{
|
||||||
|
std::string git_dir;
|
||||||
|
|
||||||
|
// Run "git rev-parse --git-dir" to locate the real .git directory.
|
||||||
|
const char* git = this->CommandLineTool.c_str();
|
||||||
|
char const* git_rev_parse[] = {git, "rev-parse", "--git-dir", 0};
|
||||||
|
std::string git_dir_line;
|
||||||
|
OneLineParser rev_parse_out(this, "rev-parse-out> ", git_dir_line);
|
||||||
|
OutputLogger rev_parse_err(this->Log, "rev-parse-err> ");
|
||||||
|
if(this->RunChild(git_rev_parse, &rev_parse_out, &rev_parse_err))
|
||||||
|
{
|
||||||
|
git_dir = git_dir_line;
|
||||||
|
}
|
||||||
|
if(git_dir.empty())
|
||||||
|
{
|
||||||
|
git_dir = ".git";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Git reports a relative path only when the .git directory is in
|
||||||
|
// the current directory.
|
||||||
|
if(git_dir[0] == '.')
|
||||||
|
{
|
||||||
|
git_dir = this->SourceDirectory + "/" + git_dir;
|
||||||
|
}
|
||||||
|
#if defined(_WIN32) && !defined(__CYGWIN__)
|
||||||
|
else if(git_dir[0] == '/')
|
||||||
|
{
|
||||||
|
// Cygwin Git reports a full path that Cygwin understands, but we
|
||||||
|
// are a Windows application. Run "cygpath" to get Windows path.
|
||||||
|
std::string cygpath_exe = cmSystemTools::GetFilenamePath(git);
|
||||||
|
cygpath_exe += "/cygpath.exe";
|
||||||
|
if(cmSystemTools::FileExists(cygpath_exe.c_str()))
|
||||||
|
{
|
||||||
|
char const* cygpath[] = {cygpath_exe.c_str(), "-w", git_dir.c_str(), 0};
|
||||||
|
OneLineParser cygpath_out(this, "cygpath-out> ", git_dir_line);
|
||||||
|
OutputLogger cygpath_err(this->Log, "cygpath-err> ");
|
||||||
|
if(this->RunChild(cygpath, &cygpath_out, &cygpath_err))
|
||||||
|
{
|
||||||
|
git_dir = git_dir_line;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return git_dir;
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
bool cmCTestGIT::UpdateByFetchAndReset()
|
bool cmCTestGIT::UpdateByFetchAndReset()
|
||||||
{
|
{
|
||||||
|
@ -121,8 +169,13 @@ bool cmCTestGIT::UpdateByFetchAndReset()
|
||||||
// Identify the merge head that would be used by "git pull".
|
// Identify the merge head that would be used by "git pull".
|
||||||
std::string sha1;
|
std::string sha1;
|
||||||
{
|
{
|
||||||
std::string fetch_head = this->SourceDirectory + "/.git/FETCH_HEAD";
|
std::string fetch_head = this->FindGitDir() + "/FETCH_HEAD";
|
||||||
std::ifstream fin(fetch_head.c_str(), std::ios::in | std::ios::binary);
|
std::ifstream fin(fetch_head.c_str(), std::ios::in | std::ios::binary);
|
||||||
|
if(!fin)
|
||||||
|
{
|
||||||
|
this->Log << "Unable to open " << fetch_head << "\n";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
std::string line;
|
std::string line;
|
||||||
while(sha1.empty() && cmSystemTools::GetLineFromStream(fin, line))
|
while(sha1.empty() && cmSystemTools::GetLineFromStream(fin, line))
|
||||||
{
|
{
|
||||||
|
|
|
@ -32,6 +32,8 @@ private:
|
||||||
virtual void NoteNewRevision();
|
virtual void NoteNewRevision();
|
||||||
virtual bool UpdateImpl();
|
virtual bool UpdateImpl();
|
||||||
|
|
||||||
|
std::string FindGitDir();
|
||||||
|
|
||||||
bool UpdateByFetchAndReset();
|
bool UpdateByFetchAndReset();
|
||||||
bool UpdateByCustom(std::string const& custom);
|
bool UpdateByCustom(std::string const& custom);
|
||||||
bool UpdateInternal();
|
bool UpdateInternal();
|
||||||
|
|
|
@ -259,6 +259,11 @@ execute_process(
|
||||||
WORKING_DIRECTORY \"${TOP}\"
|
WORKING_DIRECTORY \"${TOP}\"
|
||||||
COMMAND \"${GIT}\" clone \"${REPO}\" dash-source
|
COMMAND \"${GIT}\" clone \"${REPO}\" dash-source
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Test .git file.
|
||||||
|
file(RENAME \"${TOP}/dash-source/.git\" \"${TOP}/dash-source/repo.git\")
|
||||||
|
file(WRITE \"${TOP}/dash-source/.git\" \"gitdir: repo.git\n\")
|
||||||
|
|
||||||
execute_process(
|
execute_process(
|
||||||
WORKING_DIRECTORY \"${TOP}/dash-source\"
|
WORKING_DIRECTORY \"${TOP}/dash-source\"
|
||||||
COMMAND \"${GIT}\" reset --hard master~2
|
COMMAND \"${GIT}\" reset --hard master~2
|
||||||
|
|
Loading…
Reference in New Issue