diff options
author | Brad King <brad.king@kitware.com> | 2009-02-24 17:52:36 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2009-02-24 17:52:36 (GMT) |
commit | de3dedb4ea68f96deda8f4f1c97ab4f134b89f82 (patch) | |
tree | 645508549bd1fa19dacdebb8e4bf64c2839974ed /Source | |
parent | d76bc78a1247d0ac5d151a510b8d6ba231daa043 (diff) | |
download | CMake-de3dedb4ea68f96deda8f4f1c97ab4f134b89f82.zip CMake-de3dedb4ea68f96deda8f4f1c97ab4f134b89f82.tar.gz CMake-de3dedb4ea68f96deda8f4f1c97ab4f134b89f82.tar.bz2 |
ENH: Factor out VCS work tree revision checks
This moves checks of the work tree revision before and after update from
cmCTestUpdateHandler::ProcessHandler into the cmCTestVC hierarchy.
Diffstat (limited to 'Source')
-rw-r--r-- | Source/CTest/cmCTestSVN.cxx | 59 | ||||
-rw-r--r-- | Source/CTest/cmCTestSVN.h | 14 | ||||
-rw-r--r-- | Source/CTest/cmCTestUpdateHandler.cxx | 94 | ||||
-rw-r--r-- | Source/CTest/cmCTestVC.cxx | 12 | ||||
-rw-r--r-- | Source/CTest/cmCTestVC.h | 4 |
5 files changed, 100 insertions, 83 deletions
diff --git a/Source/CTest/cmCTestSVN.cxx b/Source/CTest/cmCTestSVN.cxx index 9396404..c0e5ddc 100644 --- a/Source/CTest/cmCTestSVN.cxx +++ b/Source/CTest/cmCTestSVN.cxx @@ -16,6 +16,10 @@ =========================================================================*/ #include "cmCTestSVN.h" +#include "cmCTest.h" + +#include <cmsys/RegularExpression.hxx> + //---------------------------------------------------------------------------- cmCTestSVN::cmCTestSVN(cmCTest* ct, std::ostream& log): cmCTestVC(ct, log) { @@ -35,3 +39,58 @@ void cmCTestSVN::CleanupImpl() OutputLogger err(this->Log, "cleanup-err> "); this->RunChild(svn_cleanup, &out, &err); } + +//---------------------------------------------------------------------------- +class cmCTestSVN::InfoParser: public cmCTestVC::LineParser +{ +public: + InfoParser(cmCTestSVN* svn, const char* prefix, std::string& rev): + SVN(svn), Rev(rev) + { + this->SetLog(&svn->Log, prefix); + this->RegexRev.compile("^Revision: ([0-9]+)"); + } +private: + cmCTestSVN* SVN; + std::string& Rev; + cmsys::RegularExpression RegexRev; + virtual bool ProcessLine() + { + if(this->RegexRev.find(this->Line)) + { + this->Rev = this->RegexRev.match(1); + } + return true; + } +}; + +//---------------------------------------------------------------------------- +std::string cmCTestSVN::LoadInfo() +{ + // Run "svn info" to get the repository info from the work tree. + const char* svn = this->CommandLineTool.c_str(); + const char* svn_info[] = {svn, "info", 0}; + std::string rev; + InfoParser out(this, "info-out> ", rev); + OutputLogger err(this->Log, "info-err> "); + this->RunChild(svn_info, &out, &err); + return rev; +} + +//---------------------------------------------------------------------------- +void cmCTestSVN::NoteOldRevision() +{ + this->OldRevision = this->LoadInfo(); + this->Log << "Revision before update: " << this->OldRevision << "\n"; + cmCTestLog(this->CTest, HANDLER_OUTPUT, " Old revision of repository is: " + << this->OldRevision << "\n"); +} + +//---------------------------------------------------------------------------- +void cmCTestSVN::NoteNewRevision() +{ + this->NewRevision = this->LoadInfo(); + this->Log << "Revision after update: " << this->NewRevision << "\n"; + cmCTestLog(this->CTest, HANDLER_OUTPUT, " New revision of repository is: " + << this->NewRevision << "\n"); +} diff --git a/Source/CTest/cmCTestSVN.h b/Source/CTest/cmCTestSVN.h index c6723af..3df4e2c 100644 --- a/Source/CTest/cmCTestSVN.h +++ b/Source/CTest/cmCTestSVN.h @@ -31,9 +31,23 @@ public: virtual ~cmCTestSVN(); + int GetOldRevision() { return atoi(this->OldRevision.c_str()); } + int GetNewRevision() { return atoi(this->NewRevision.c_str()); } private: // Implement cmCTestVC internal API. virtual void CleanupImpl(); + virtual void NoteOldRevision(); + virtual void NoteNewRevision(); + + // Old and new repository revisions. + std::string OldRevision; + std::string NewRevision; + + std::string LoadInfo(); + + // Parsing helper classes. + class InfoParser; + friend class InfoParser; }; #endif diff --git a/Source/CTest/cmCTestUpdateHandler.cxx b/Source/CTest/cmCTestUpdateHandler.cxx index ff86882..b42ef5b 100644 --- a/Source/CTest/cmCTestUpdateHandler.cxx +++ b/Source/CTest/cmCTestUpdateHandler.cxx @@ -383,73 +383,18 @@ int cmCTestUpdateHandler::ProcessHandler() bool res = true; - // First, check what the current state of repository is - std::string command = ""; - switch( this->UpdateType ) - { - case cmCTestUpdateHandler::e_CVS: - // TODO: CVS - for now just leave empty - break; - case cmCTestUpdateHandler::e_SVN: - command = "\"" + this->UpdateCommand + "\" info"; - break; - } - // CVS variables // SVN variables int svn_current_revision = 0; int svn_latest_revision = 0; int svn_use_status = 0; - // - // Get initial repository information if that is possible. With subversion, - // this will check the current revision. - // - if ( !command.empty() ) + // Get initial repository information if that is possible. + vc->MarkOldRevision(); + if(this->UpdateType == e_SVN) { - cmCTestLog(this->CTest, HANDLER_VERBOSE_OUTPUT, - "* Get repository information: " << command.c_str() << std::endl); - if ( !this->CTest->GetShowOnly() ) - { - ofs << "* Get repository information" << std::endl; - ofs << " Command: " << command.c_str() << std::endl; - res = this->CTest->RunCommand(command.c_str(), &goutput, &errors, - &retVal, sourceDirectory, 0 /*this->TimeOut*/); - - ofs << " Output: " << goutput.c_str() << std::endl; - ofs << " Errors: " << errors.c_str() << std::endl; - if ( ofs ) - { - ofs << "--- Update information ---" << std::endl; - ofs << goutput << std::endl; - } - switch ( this->UpdateType ) - { - case cmCTestUpdateHandler::e_CVS: - // TODO: CVS - for now just leave empty - break; - case cmCTestUpdateHandler::e_SVN: - { - cmsys::RegularExpression current_revision_regex( - "Revision: ([0-9]+)"); - if ( current_revision_regex.find(goutput.c_str()) ) - { - std::string currentRevisionString - = current_revision_regex.match(1); - svn_current_revision = atoi(currentRevisionString.c_str()); - cmCTestLog(this->CTest, HANDLER_OUTPUT, - " Old revision of repository is: " << svn_current_revision - << std::endl); - } - } - break; - } - } - else - { - cmCTestLog(this->CTest, HANDLER_VERBOSE_OUTPUT, - "Get information with command: " << command << std::endl); - } + svn_current_revision = + static_cast<cmCTestSVN*>(vc.get())->GetOldRevision(); } @@ -468,6 +413,7 @@ int cmCTestUpdateHandler::ProcessHandler() static_cast<unsigned int>(cmSystemTools::GetTime()); double elapsed_time_start = cmSystemTools::GetTime(); + std::string command; cmCTestLog(this->CTest, HANDLER_VERBOSE_OUTPUT, "* Update repository: " << command.c_str() << std::endl); if ( !this->CTest->GetShowOnly() ) @@ -570,31 +516,13 @@ int cmCTestUpdateHandler::ProcessHandler() int numUpdated = 0; int numModified = 0; int numConflicting = 0; - // In subversion, get the latest revision + + // Get final repository information if that is possible. + vc->MarkNewRevision(); if ( this->UpdateType == cmCTestUpdateHandler::e_SVN ) { - for ( cc= 0; cc < lines.size(); cc ++ ) - { - const char* line = lines[cc].c_str(); - if ( svn_latest_revision_regex.find(line) ) - { - svn_latest_revision = atoi( - svn_latest_revision_regex.match(2).c_str()); - } - } - if ( svn_latest_revision <= 0 ) - { - cmCTestLog(this->CTest, ERROR_MESSAGE, - "Problem determining the current " - "revision of the repository from output:" << std::endl - << goutput.c_str() << std::endl); - } - else - { - cmCTestLog(this->CTest, HANDLER_OUTPUT, - " Current revision of repository is: " << svn_latest_revision - << std::endl); - } + svn_latest_revision = + static_cast<cmCTestSVN*>(vc.get())->GetNewRevision(); } cmCTestLog(this->CTest, HANDLER_OUTPUT, diff --git a/Source/CTest/cmCTestVC.cxx b/Source/CTest/cmCTestVC.cxx index 5946674..cb4aa2d 100644 --- a/Source/CTest/cmCTestVC.cxx +++ b/Source/CTest/cmCTestVC.cxx @@ -102,3 +102,15 @@ void cmCTestVC::CleanupImpl() { // We do no cleanup by default. } + +//---------------------------------------------------------------------------- +void cmCTestVC::NoteOldRevision() +{ + // We do nothing by default. +} + +//---------------------------------------------------------------------------- +void cmCTestVC::NoteNewRevision() +{ + // We do nothing by default. +} diff --git a/Source/CTest/cmCTestVC.h b/Source/CTest/cmCTestVC.h index e1228e0..4413193 100644 --- a/Source/CTest/cmCTestVC.h +++ b/Source/CTest/cmCTestVC.h @@ -45,9 +45,13 @@ public: /** Perform cleanup operations on the work tree. */ void Cleanup(); + void MarkOldRevision() { this->NoteOldRevision(); } + void MarkNewRevision() { this->NoteNewRevision(); } protected: // Internal API to be implemented by subclasses. virtual void CleanupImpl(); + virtual void NoteOldRevision(); + virtual void NoteNewRevision(); /** Convert a list of arguments to a human-readable command line. */ static std::string ComputeCommandLine(char const* const* cmd); |