From aa1076f4600a94494da355d641aa0a5773a67863 Mon Sep 17 00:00:00 2001 From: Xavier Besseron Date: Mon, 3 Sep 2012 10:45:05 +0200 Subject: [PATCH 1/7] cmCTestSVN: Add the new SVNInfo structure It represents information of an SVN repository. It can be the base repository or an external one. --- Source/CTest/cmCTestSVN.cxx | 26 ++++++++++++++++++++++++++ Source/CTest/cmCTestSVN.h | 25 +++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/Source/CTest/cmCTestSVN.cxx b/Source/CTest/cmCTestSVN.cxx index fab9a8cba..7ca87e2ed 100644 --- a/Source/CTest/cmCTestSVN.cxx +++ b/Source/CTest/cmCTestSVN.cxx @@ -448,3 +448,29 @@ void cmCTestSVN::WriteXMLGlobal(std::ostream& xml) xml << "\t" << this->Base << "\n"; } + +//---------------------------------------------------------------------------- +std::string cmCTestSVN::SVNInfo::BuildLocalPath(std::string const& path) const +{ + std::string local_path; + + // Add local path prefix if not empty + if (!this->LocalPath.empty()) + { + local_path += this->LocalPath; + local_path += "/"; + } + + // Add path with base prefix removed + if(path.size() > this->Base.size() && + strncmp(path.c_str(), this->Base.c_str(), this->Base.size()) == 0) + { + local_path += (path.c_str() + this->Base.size()); + } + else + { + local_path += path; + } + + return local_path; +} diff --git a/Source/CTest/cmCTestSVN.h b/Source/CTest/cmCTestSVN.h index f72c58fb0..97eeaf57e 100644 --- a/Source/CTest/cmCTestSVN.h +++ b/Source/CTest/cmCTestSVN.h @@ -42,6 +42,31 @@ private: // Directory under repository root checked out in working tree. std::string Base; + // Information about an SVN repository (root repository or external) + struct SVNInfo { + + SVNInfo(const char* path) : LocalPath(path) {} + // Remove base from the filename + std::string BuildLocalPath(std::string const& path) const; + + // LocalPath relative to the main source directory. + std::string LocalPath; + + // 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; + + // Old and new repository revisions. + std::string OldRevision; + std::string NewRevision; + + }; + std::string LoadInfo(); void LoadModifications(); void LoadRevisions(); From 2f204bc176e418e810de7034903974e7edb46b14 Mon Sep 17 00:00:00 2001 From: Xavier Besseron Date: Fri, 24 Aug 2012 10:30:09 +0200 Subject: [PATCH 2/7] cmCTestSVN: Extend Revision struct with SVN repo information Also rename DoRevision to DoRevisionSVN since the signature changes. --- Source/CTest/cmCTestSVN.cxx | 11 ++++++++--- Source/CTest/cmCTestSVN.h | 7 +++++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Source/CTest/cmCTestSVN.cxx b/Source/CTest/cmCTestSVN.cxx index 7ca87e2ed..15d9487be 100644 --- a/Source/CTest/cmCTestSVN.cxx +++ b/Source/CTest/cmCTestSVN.cxx @@ -18,6 +18,11 @@ #include +struct cmCTestSVN::Revision: public cmCTestVC::Revision +{ + cmCTestSVN::SVNInfo* SVNInfo; +}; + //---------------------------------------------------------------------------- cmCTestSVN::cmCTestSVN(cmCTest* ct, std::ostream& log): cmCTestGlobalVC(ct, log) @@ -325,7 +330,7 @@ private: { if(strcmp(name, "logentry") == 0) { - this->SVN->DoRevision(this->Rev, this->Changes); + this->SVN->DoRevisionSVN(this->Rev, this->Changes); } else if(strcmp(name, "path") == 0 && !this->CData.empty()) { @@ -378,8 +383,8 @@ void cmCTestSVN::LoadRevisions() } //---------------------------------------------------------------------------- -void cmCTestSVN::DoRevision(Revision const& revision, - std::vector const& changes) +void cmCTestSVN::DoRevisionSVN(Revision const& revision, + std::vector const& changes) { // Guess the base checkout path from the changes if necessary. if(this->Base.empty() && !changes.empty()) diff --git a/Source/CTest/cmCTestSVN.h b/Source/CTest/cmCTestSVN.h index 97eeaf57e..12feba934 100644 --- a/Source/CTest/cmCTestSVN.h +++ b/Source/CTest/cmCTestSVN.h @@ -67,6 +67,9 @@ private: }; + // Extended revision structure to include info about external it refers to. + struct Revision; + std::string LoadInfo(); void LoadModifications(); void LoadRevisions(); @@ -74,8 +77,8 @@ private: void GuessBase(std::vector const& changes); const char* LocalPath(std::string const& path); - void DoRevision(Revision const& revision, - std::vector const& changes); + void DoRevisionSVN(Revision const& revision, + std::vector const& changes); void WriteXMLGlobal(std::ostream& xml); From 8d1e10296ae852afd80c789efa73492f87543034 Mon Sep 17 00:00:00 2001 From: Xavier Besseron Date: Fri, 24 Aug 2012 10:47:59 +0200 Subject: [PATCH 3/7] cmCTestSVN: Add the Repositories list and the RootInfo pointer The Repository list will contain the SVNInfo of all the repositories (root and external ones). The RootInfo pointer will point to the SVNInfo structure of the root repository. --- Source/CTest/cmCTestSVN.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Source/CTest/cmCTestSVN.h b/Source/CTest/cmCTestSVN.h index 12feba934..a084d40bc 100644 --- a/Source/CTest/cmCTestSVN.h +++ b/Source/CTest/cmCTestSVN.h @@ -70,6 +70,12 @@ private: // Extended revision structure to include info about external it refers to. struct Revision; + // Info of all the repositories (root, externals and nested ones). + std::list Repositories; + + // Pointer to the infos of the root repository. + SVNInfo* RootInfo; + std::string LoadInfo(); void LoadModifications(); void LoadRevisions(); From fb6d5136926fc142fa893f853b62c5ca8df04d6c Mon Sep 17 00:00:00 2001 From: Xavier Besseron Date: Fri, 24 Aug 2012 10:48:57 +0200 Subject: [PATCH 4/7] cmCTestSVN: Create the SVNInfo for the root repository --- Source/CTest/cmCTestSVN.cxx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Source/CTest/cmCTestSVN.cxx b/Source/CTest/cmCTestSVN.cxx index 15d9487be..53dd20e3d 100644 --- a/Source/CTest/cmCTestSVN.cxx +++ b/Source/CTest/cmCTestSVN.cxx @@ -115,6 +115,9 @@ std::string cmCTestSVN::LoadInfo() //---------------------------------------------------------------------------- void cmCTestSVN::NoteOldRevision() { + // Info for root repository + this->Repositories.push_back( SVNInfo("") ); + this->RootInfo = &(this->Repositories.back()); this->OldRevision = this->LoadInfo(); this->Log << "Revision before update: " << this->OldRevision << "\n"; cmCTestLog(this->CTest, HANDLER_OUTPUT, " Old revision of repository is: " From 41f0f83542ce8d69e4d9a4512a6dc66327f20c8d Mon Sep 17 00:00:00 2001 From: Xavier Besseron Date: Mon, 3 Sep 2012 10:50:07 +0200 Subject: [PATCH 5/7] cmCTestSVN: Use the SVNInfo structure - Suppress the URL, Root, Base fields from the cmCTestSVN class - Update the code to use RootInfo instead - LoadInfo(), GuessBase(), and a new LoadRevision() functions work on a given SVNInfo - Use the implementation from the base class for LocalPath(), correct path is built by SVNInfo::BuildLocalPath() instead --- Source/CTest/cmCTestSVN.cxx | 150 +++++++++++++++++++++--------------- Source/CTest/cmCTestSVN.h | 15 +--- 2 files changed, 90 insertions(+), 75 deletions(-) diff --git a/Source/CTest/cmCTestSVN.cxx b/Source/CTest/cmCTestSVN.cxx index 53dd20e3d..32b1ef97a 100644 --- a/Source/CTest/cmCTestSVN.cxx +++ b/Source/CTest/cmCTestSVN.cxx @@ -49,8 +49,11 @@ void cmCTestSVN::CleanupImpl() class cmCTestSVN::InfoParser: public cmCTestVC::LineParser { public: - InfoParser(cmCTestSVN* svn, const char* prefix, std::string& rev): - SVN(svn), Rev(rev) + InfoParser(cmCTestSVN* svn, + const char* prefix, + std::string& rev, + SVNInfo& svninfo): + Rev(rev), SVNRepo(svninfo) { this->SetLog(&svn->Log, prefix); this->RegexRev.compile("^Revision: ([0-9]+)"); @@ -58,8 +61,8 @@ public: this->RegexRoot.compile("^Repository Root: +([^ ]+) *$"); } private: - cmCTestSVN* SVN; std::string& Rev; + cmCTestSVN::SVNInfo& SVNRepo; cmsys::RegularExpression RegexRev; cmsys::RegularExpression RegexURL; cmsys::RegularExpression RegexRoot; @@ -71,11 +74,11 @@ private: } else if(this->RegexURL.find(this->Line)) { - this->SVN->URL = this->RegexURL.match(1); + this->SVNRepo.URL = this->RegexURL.match(1); } else if(this->RegexRoot.find(this->Line)) { - this->SVN->Root = this->RegexRoot.match(1); + this->SVNRepo.Root = this->RegexRoot.match(1); } return true; } @@ -100,13 +103,13 @@ static bool cmCTestSVNPathStarts(std::string const& p1, std::string const& p2) } //---------------------------------------------------------------------------- -std::string cmCTestSVN::LoadInfo() +std::string cmCTestSVN::LoadInfo(SVNInfo& svninfo) { // 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}; + const char* svn_info[] = {svn, "info", svninfo.LocalPath.c_str(), 0}; std::string rev; - InfoParser out(this, "info-out> ", rev); + InfoParser out(this, "info-out> ", rev, svninfo); OutputLogger err(this->Log, "info-err> "); this->RunChild(svn_info, &out, &err); return rev; @@ -118,55 +121,78 @@ void cmCTestSVN::NoteOldRevision() // Info for root repository this->Repositories.push_back( SVNInfo("") ); this->RootInfo = &(this->Repositories.back()); - 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"); + + // Get info for the root repositiry + SVNInfo& svninfo = *RootInfo; + svninfo.OldRevision = this->LoadInfo(svninfo); + this->Log << "Revision for repository '" << svninfo.LocalPath + << "' before update: " << svninfo.OldRevision << "\n"; + cmCTestLog(this->CTest, HANDLER_OUTPUT, + " Old revision of external repository '" + << svninfo.LocalPath << "' is: " + << svninfo.OldRevision << "\n"); + + // Set the global old revision to the one of the root + this->OldRevision = this->RootInfo->OldRevision; this->PriorRev.Rev = this->OldRevision; } //---------------------------------------------------------------------------- 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"); + // Get info for the root repository + SVNInfo& svninfo = *RootInfo; + svninfo.NewRevision = this->LoadInfo(svninfo); + this->Log << "Revision for repository '" << svninfo.LocalPath + << "' after update: " << svninfo.NewRevision << "\n"; + cmCTestLog(this->CTest, HANDLER_OUTPUT, + " New revision of external repository '" + << svninfo.LocalPath << "' is: " + << svninfo.NewRevision << "\n"); - // this->Root = ""; // uncomment to test GuessBase - this->Log << "URL = " << this->URL << "\n"; - this->Log << "Root = " << this->Root << "\n"; + // svninfo.Root = ""; // uncomment to test GuessBase + this->Log << "Repository '" << svninfo.LocalPath + << "' URL = " << svninfo.URL << "\n"; + this->Log << "Repository '" << svninfo.LocalPath + << "' Root = " << svninfo.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"; + // Compute the base path the working tree has checked out under + // the repository root. + if(!svninfo.Root.empty() + && cmCTestSVNPathStarts(svninfo.URL, svninfo.Root)) + { + svninfo.Base = cmCTest::DecodeURL( + svninfo.URL.substr(svninfo.Root.size())); + svninfo.Base += "/"; + } + this->Log << "Repository '" << svninfo.LocalPath + << "' Base = " << svninfo.Base << "\n"; + + // Set the global new revision to the one of the root + this->NewRevision = this->RootInfo->NewRevision; } //---------------------------------------------------------------------------- -void cmCTestSVN::GuessBase(std::vector const& changes) +void cmCTestSVN::GuessBase(SVNInfo& svninfo, + std::vector const& changes) { // Subversion did not give us a good repository root so we need to // guess the base path from the URL and the paths in a revision with // changes under it. // Consider each possible URL suffix from longest to shortest. - for(std::string::size_type slash = this->URL.find('/'); - this->Base.empty() && slash != std::string::npos; - slash = this->URL.find('/', slash+1)) + for(std::string::size_type slash = svninfo.URL.find('/'); + svninfo.Base.empty() && slash != std::string::npos; + slash = svninfo.URL.find('/', slash+1)) { // If the URL suffix is a prefix of at least one path then it is the base. - std::string base = cmCTest::DecodeURL(this->URL.substr(slash)); + std::string base = cmCTest::DecodeURL(svninfo.URL.substr(slash)); for(std::vector::const_iterator ci = changes.begin(); - this->Base.empty() && ci != changes.end(); ++ci) + svninfo.Base.empty() && ci != changes.end(); ++ci) { if(cmCTestSVNPathStarts(ci->Path, base)) { - this->Base = base; + svninfo.Base = base; } } } @@ -175,25 +201,9 @@ void cmCTestSVN::GuessBase(std::vector const& changes) // base lie under its path. If no base was found then the working // tree must be a checkout of the entire repo and this will match // the leading slash in all paths. - this->Base += "/"; + svninfo.Base += "/"; - this->Log << "Guessed Base = " << this->Base << "\n"; -} - -//---------------------------------------------------------------------------- -const char* cmCTestSVN::LocalPath(std::string const& path) -{ - if(path.size() > this->Base.size() && - strncmp(path.c_str(), this->Base.c_str(), this->Base.size()) == 0) - { - // This path lies under the base, so return a relative path. - return path.c_str() + this->Base.size(); - } - else - { - // This path does not lie under the base, so ignore it. - return 0; - } + this->Log << "Guessed Base = " << svninfo.Base << "\n"; } //---------------------------------------------------------------------------- @@ -282,11 +292,13 @@ class cmCTestSVN::LogParser: public cmCTestVC::OutputLogger, private cmXMLParser { public: - LogParser(cmCTestSVN* svn, const char* prefix): - OutputLogger(svn->Log, prefix), SVN(svn) { this->InitializeParser(); } + LogParser(cmCTestSVN* svn, const char* prefix, SVNInfo& svninfo): + OutputLogger(svn->Log, prefix), SVN(svn), SVNRepo(svninfo) + { this->InitializeParser(); } ~LogParser() { this->CleanupParser(); } private: cmCTestSVN* SVN; + cmCTestSVN::SVNInfo& SVNRepo; typedef cmCTestSVN::Revision Revision; typedef cmCTestSVN::Change Change; @@ -308,6 +320,7 @@ private: if(strcmp(name, "logentry") == 0) { this->Rev = Revision(); + this->Rev.SVNInfo = &SVNRepo; if(const char* rev = this->FindAttribute(atts, "revision")) { this->Rev.Rev = rev; @@ -337,7 +350,9 @@ private: } else if(strcmp(name, "path") == 0 && !this->CData.empty()) { - this->CurChange.Path.assign(&this->CData[0], this->CData.size()); + std::string orig_path(&this->CData[0], this->CData.size()); + std::string new_path = SVNRepo.BuildLocalPath( orig_path ); + this->CurChange.Path.assign(new_path); this->Changes.push_back(this->CurChange); } else if(strcmp(name, "author") == 0 && !this->CData.empty()) @@ -363,23 +378,32 @@ private: //---------------------------------------------------------------------------- void cmCTestSVN::LoadRevisions() +{ + // Get revision of the root repository + SVNInfo& svninfo = *RootInfo; + LoadRevisions(svninfo); +} + +//---------------------------------------------------------------------------- +void cmCTestSVN::LoadRevisions(SVNInfo &svninfo) { // We are interested in every revision included in the update. std::string revs; - if(atoi(this->OldRevision.c_str()) < atoi(this->NewRevision.c_str())) + if(atoi(svninfo.OldRevision.c_str()) < atoi(svninfo.NewRevision.c_str())) { - revs = "-r" + this->OldRevision + ":" + this->NewRevision; + revs = "-r" + svninfo.OldRevision + ":" + svninfo.NewRevision; } else { - revs = "-r" + this->NewRevision; + revs = "-r" + svninfo.NewRevision; } // Run "svn log" to get all global revisions of interest. const char* svn = this->CommandLineTool.c_str(); - const char* svn_log[] = {svn, "log", "--xml", "-v", revs.c_str(), 0}; + const char* svn_log[] = {svn, "log", "--xml", "-v", revs.c_str(), + svninfo.LocalPath.c_str(), 0}; { - LogParser out(this, "log-out> "); + LogParser out(this, "log-out> ", svninfo); OutputLogger err(this->Log, "log-err> "); this->RunChild(svn_log, &out, &err); } @@ -390,9 +414,9 @@ void cmCTestSVN::DoRevisionSVN(Revision const& revision, std::vector const& changes) { // Guess the base checkout path from the changes if necessary. - if(this->Base.empty() && !changes.empty()) + if(this->RootInfo->Base.empty() && !changes.empty()) { - this->GuessBase(changes); + this->GuessBase(*this->RootInfo, changes); } this->cmCTestGlobalVC::DoRevision(revision, changes); } @@ -454,7 +478,7 @@ void cmCTestSVN::WriteXMLGlobal(std::ostream& xml) { this->cmCTestGlobalVC::WriteXMLGlobal(xml); - xml << "\t" << this->Base << "\n"; + xml << "\t" << this->RootInfo->Base << "\n"; } //---------------------------------------------------------------------------- diff --git a/Source/CTest/cmCTestSVN.h b/Source/CTest/cmCTestSVN.h index a084d40bc..4fb37a644 100644 --- a/Source/CTest/cmCTestSVN.h +++ b/Source/CTest/cmCTestSVN.h @@ -33,15 +33,6 @@ private: virtual void NoteNewRevision(); virtual bool UpdateImpl(); - // 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; - // Information about an SVN repository (root repository or external) struct SVNInfo { @@ -76,12 +67,12 @@ private: // Pointer to the infos of the root repository. SVNInfo* RootInfo; - std::string LoadInfo(); + std::string LoadInfo(SVNInfo& svninfo); void LoadModifications(); void LoadRevisions(); + void LoadRevisions(SVNInfo& svninfo); - void GuessBase(std::vector const& changes); - const char* LocalPath(std::string const& path); + void GuessBase(SVNInfo &svninfo, std::vector const& changes); void DoRevisionSVN(Revision const& revision, std::vector const& changes); From 3776690e62c631edd520f566b2ebcaffbad230b4 Mon Sep 17 00:00:00 2001 From: Xavier Besseron Date: Mon, 3 Sep 2012 11:03:43 +0200 Subject: [PATCH 6/7] cmCTestSVN: Add a LoadExternal() function and an ExternalParser class This call 'svn status' and parse the result to get the list of externals repositories. The external repositories found are added to the Repositories list. --- Source/CTest/cmCTestSVN.cxx | 50 +++++++++++++++++++++++++++++++++++++ Source/CTest/cmCTestSVN.h | 3 +++ 2 files changed, 53 insertions(+) diff --git a/Source/CTest/cmCTestSVN.cxx b/Source/CTest/cmCTestSVN.cxx index 32b1ef97a..b27c6338c 100644 --- a/Source/CTest/cmCTestSVN.cxx +++ b/Source/CTest/cmCTestSVN.cxx @@ -481,6 +481,56 @@ void cmCTestSVN::WriteXMLGlobal(std::ostream& xml) xml << "\t" << this->RootInfo->Base << "\n"; } +//---------------------------------------------------------------------------- +class cmCTestSVN::ExternalParser: public cmCTestVC::LineParser +{ +public: + ExternalParser(cmCTestSVN* svn, const char* prefix): SVN(svn) + { + this->SetLog(&svn->Log, prefix); + this->RegexExternal.compile("^X..... +(.+)$"); + } +private: + cmCTestSVN* SVN; + cmsys::RegularExpression RegexExternal; + bool ProcessLine() + { + if(this->RegexExternal.find(this->Line)) + { + this->DoPath(this->RegexExternal.match(1)); + } + return true; + } + + void DoPath(std::string const& path) + { + // Get local path relative to the source directory + std::string local_path; + if(path.size() > this->SVN->SourceDirectory.size() && + strncmp(path.c_str(), this->SVN->SourceDirectory.c_str(), + this->SVN->SourceDirectory.size()) == 0) + { + local_path = path.c_str() + this->SVN->SourceDirectory.size() + 1; + } + else + { + local_path = path; + } + this->SVN->Repositories.push_back( SVNInfo(local_path.c_str()) ); + } +}; + +//---------------------------------------------------------------------------- +void cmCTestSVN::LoadExternals() +{ + // Run "svn status" to get the list of external repositories + const char* svn = this->CommandLineTool.c_str(); + const char* svn_status[] = {svn, "status", 0}; + ExternalParser out(this, "external-out> "); + OutputLogger err(this->Log, "external-err> "); + this->RunChild(svn_status, &out, &err); +} + //---------------------------------------------------------------------------- std::string cmCTestSVN::SVNInfo::BuildLocalPath(std::string const& path) const { diff --git a/Source/CTest/cmCTestSVN.h b/Source/CTest/cmCTestSVN.h index 4fb37a644..56265d008 100644 --- a/Source/CTest/cmCTestSVN.h +++ b/Source/CTest/cmCTestSVN.h @@ -68,6 +68,7 @@ private: SVNInfo* RootInfo; std::string LoadInfo(SVNInfo& svninfo); + void LoadExternals(); void LoadModifications(); void LoadRevisions(); void LoadRevisions(SVNInfo& svninfo); @@ -84,10 +85,12 @@ private: class LogParser; class StatusParser; class UpdateParser; + class ExternalParser; friend class InfoParser; friend class LogParser; friend class StatusParser; friend class UpdateParser; + friend class ExternalParser; }; #endif From 57234dd10a091e676d9e3a9279029dadace757c3 Mon Sep 17 00:00:00 2001 From: Xavier Besseron Date: Mon, 3 Sep 2012 11:10:53 +0200 Subject: [PATCH 7/7] cmCTestSVN: Load and process information from externals Call LoadExternals() and perform operations on all elements of the Repositories list. --- Source/CTest/cmCTestSVN.cxx | 38 +++++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/Source/CTest/cmCTestSVN.cxx b/Source/CTest/cmCTestSVN.cxx index b27c6338c..49cea2e05 100644 --- a/Source/CTest/cmCTestSVN.cxx +++ b/Source/CTest/cmCTestSVN.cxx @@ -121,9 +121,15 @@ void cmCTestSVN::NoteOldRevision() // Info for root repository this->Repositories.push_back( SVNInfo("") ); this->RootInfo = &(this->Repositories.back()); + // Info for the external repositories + this->LoadExternals(); - // Get info for the root repositiry - SVNInfo& svninfo = *RootInfo; + // Get info for all the repositories + std::list::iterator itbeg = this->Repositories.begin(); + std::list::iterator itend = this->Repositories.end(); + for( ; itbeg != itend ; itbeg++) + { + SVNInfo& svninfo = *itbeg; svninfo.OldRevision = this->LoadInfo(svninfo); this->Log << "Revision for repository '" << svninfo.LocalPath << "' before update: " << svninfo.OldRevision << "\n"; @@ -131,6 +137,7 @@ void cmCTestSVN::NoteOldRevision() " Old revision of external repository '" << svninfo.LocalPath << "' is: " << svninfo.OldRevision << "\n"); + } // Set the global old revision to the one of the root this->OldRevision = this->RootInfo->OldRevision; @@ -140,8 +147,12 @@ void cmCTestSVN::NoteOldRevision() //---------------------------------------------------------------------------- void cmCTestSVN::NoteNewRevision() { - // Get info for the root repository - SVNInfo& svninfo = *RootInfo; + // Get info for the external repositories + std::list::iterator itbeg = this->Repositories.begin(); + std::list::iterator itend = this->Repositories.end(); + for( ; itbeg != itend ; itbeg++) + { + SVNInfo& svninfo = *itbeg; svninfo.NewRevision = this->LoadInfo(svninfo); this->Log << "Revision for repository '" << svninfo.LocalPath << "' after update: " << svninfo.NewRevision << "\n"; @@ -168,6 +179,8 @@ void cmCTestSVN::NoteNewRevision() this->Log << "Repository '" << svninfo.LocalPath << "' Base = " << svninfo.Base << "\n"; + } + // Set the global new revision to the one of the root this->NewRevision = this->RootInfo->NewRevision; } @@ -379,9 +392,14 @@ private: //---------------------------------------------------------------------------- void cmCTestSVN::LoadRevisions() { - // Get revision of the root repository - SVNInfo& svninfo = *RootInfo; + // Get revisions for all the external repositories + std::list::iterator itbeg = this->Repositories.begin(); + std::list::iterator itend = this->Repositories.end(); + for( ; itbeg != itend ; itbeg++) + { + SVNInfo& svninfo = *itbeg; LoadRevisions(svninfo); + } } //---------------------------------------------------------------------------- @@ -418,6 +436,14 @@ void cmCTestSVN::DoRevisionSVN(Revision const& revision, { this->GuessBase(*this->RootInfo, changes); } + + // Ignore changes in the old revision for external repositories + if(revision.Rev == revision.SVNInfo->OldRevision + && revision.SVNInfo->LocalPath != "") + { + return; + } + this->cmCTestGlobalVC::DoRevision(revision, changes); }