summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2009-02-24 20:43:25 (GMT)
committerBrad King <brad.king@kitware.com>2009-02-24 20:43:25 (GMT)
commit506e745c3744acdc9cb53f0cd71f6be306ce70a1 (patch)
treed4496d3a898859dcd0454337c0d292bf87a924b5
parent3f4064f7ac672a511937b0a8aba04f87eb831294 (diff)
downloadCMake-506e745c3744acdc9cb53f0cd71f6be306ce70a1.zip
CMake-506e745c3744acdc9cb53f0cd71f6be306ce70a1.tar.gz
CMake-506e745c3744acdc9cb53f0cd71f6be306ce70a1.tar.bz2
ENH: Teach cmCTestSVN to load repo/tree relation
This teaches cmCTestSVN::NoteNewRevision to save the repository URL checked out in the work tree, the repository root, and the path below the root to reach the full URL.
-rw-r--r--Source/CTest/cmCTestSVN.cxx42
-rw-r--r--Source/CTest/cmCTestSVN.h9
2 files changed, 51 insertions, 0 deletions
diff --git a/Source/CTest/cmCTestSVN.cxx b/Source/CTest/cmCTestSVN.cxx
index c0e5ddc..d6b8306 100644
--- a/Source/CTest/cmCTestSVN.cxx
+++ b/Source/CTest/cmCTestSVN.cxx
@@ -49,22 +49,52 @@ public:
{
this->SetLog(&svn->Log, prefix);
this->RegexRev.compile("^Revision: ([0-9]+)");
+ this->RegexURL.compile("^URL: +([^ ]+) *$");
+ this->RegexRoot.compile("^Repository Root: +([^ ]+) *$");
}
private:
cmCTestSVN* SVN;
std::string& Rev;
cmsys::RegularExpression RegexRev;
+ cmsys::RegularExpression RegexURL;
+ cmsys::RegularExpression RegexRoot;
virtual bool ProcessLine()
{
if(this->RegexRev.find(this->Line))
{
this->Rev = this->RegexRev.match(1);
}
+ else if(this->RegexURL.find(this->Line))
+ {
+ this->SVN->URL = this->RegexURL.match(1);
+ }
+ else if(this->RegexRoot.find(this->Line))
+ {
+ this->SVN->Root = this->RegexRoot.match(1);
+ }
return true;
}
};
//----------------------------------------------------------------------------
+static bool cmCTestSVNPathStarts(std::string const& p1, std::string const& p2)
+{
+ // Does path p1 start with path p2?
+ if(p1.size() == p2.size())
+ {
+ return p1 == p2;
+ }
+ else if(p1.size() > p2.size() && p1[p2.size()] == '/')
+ {
+ return strncmp(p1.c_str(), p2.c_str(), p2.size()) == 0;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+//----------------------------------------------------------------------------
std::string cmCTestSVN::LoadInfo()
{
// Run "svn info" to get the repository info from the work tree.
@@ -93,4 +123,16 @@ void cmCTestSVN::NoteNewRevision()
this->Log << "Revision after update: " << this->NewRevision << "\n";
cmCTestLog(this->CTest, HANDLER_OUTPUT, " New revision of repository is: "
<< this->NewRevision << "\n");
+
+ this->Log << "URL = " << this->URL << "\n";
+ this->Log << "Root = " << this->Root << "\n";
+
+ // Compute the base path the working tree has checked out under
+ // the repository root.
+ if(!this->Root.empty() && cmCTestSVNPathStarts(this->URL, this->Root))
+ {
+ this->Base = cmCTest::DecodeURL(this->URL.substr(this->Root.size()));
+ this->Base += "/";
+ }
+ this->Log << "Base = " << this->Base << "\n";
}
diff --git a/Source/CTest/cmCTestSVN.h b/Source/CTest/cmCTestSVN.h
index 3df4e2c..af14cf0 100644
--- a/Source/CTest/cmCTestSVN.h
+++ b/Source/CTest/cmCTestSVN.h
@@ -43,6 +43,15 @@ private:
std::string OldRevision;
std::string NewRevision;
+ // URL of repository directory checked out in the working tree.
+ std::string URL;
+
+ // URL of repository root directory.
+ std::string Root;
+
+ // Directory under repository root checked out in working tree.
+ std::string Base;
+
std::string LoadInfo();
// Parsing helper classes.