From 506e745c3744acdc9cb53f0cd71f6be306ce70a1 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 24 Feb 2009 15:43:25 -0500 Subject: [PATCH] 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. --- Source/CTest/cmCTestSVN.cxx | 42 +++++++++++++++++++++++++++++++++++++ Source/CTest/cmCTestSVN.h | 9 ++++++++ 2 files changed, 51 insertions(+) diff --git a/Source/CTest/cmCTestSVN.cxx b/Source/CTest/cmCTestSVN.cxx index c0e5ddc6d..d6b830614 100644 --- a/Source/CTest/cmCTestSVN.cxx +++ b/Source/CTest/cmCTestSVN.cxx @@ -49,21 +49,51 @@ 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() { @@ -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 3df4e2c53..af14cf0c5 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.