diff options
author | Brad King <brad.king@kitware.com> | 2009-02-24 20:43:25 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2009-02-24 20:43:25 (GMT) |
commit | 506e745c3744acdc9cb53f0cd71f6be306ce70a1 (patch) | |
tree | d4496d3a898859dcd0454337c0d292bf87a924b5 | |
parent | 3f4064f7ac672a511937b0a8aba04f87eb831294 (diff) | |
download | CMake-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.cxx | 42 | ||||
-rw-r--r-- | Source/CTest/cmCTestSVN.h | 9 |
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. |