diff options
author | Brad King <brad.king@kitware.com> | 2009-02-25 19:42:45 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2009-02-25 19:42:45 (GMT) |
commit | 80282b749fb138ea8bd188dd5b7623c7545ea927 (patch) | |
tree | a654e1b28bf2b2bec97de9ee7dad695d322598f1 /Source/CTest/cmCTestVC.h | |
parent | cb788e8f6dfeeb5a934679f671adc87116837834 (diff) | |
download | CMake-80282b749fb138ea8bd188dd5b7623c7545ea927.zip CMake-80282b749fb138ea8bd188dd5b7623c7545ea927.tar.gz CMake-80282b749fb138ea8bd188dd5b7623c7545ea927.tar.bz2 |
ENH: Rewrite CTest Update implementation
This adds a new VCS update implementation to the cmCTestVC hierarchy and
removes it from cmCTestUpdateHandler. The new implementation has the
following advantages:
- Factorized implementation instead of monolithic function
- Logs vcs tool output as it is parsed (less memory, inline messages)
- Uses one global svn log instead of one log per file
- Reports changes on cvs branches (instead of latest trunk change)
- Generates simpler Update.xml (only one Directory element per dir)
Shared components of the new implementation appear in cmCTestVC and may
be re-used by subclasses for other VCS tools in the future.
Diffstat (limited to 'Source/CTest/cmCTestVC.h')
-rw-r--r-- | Source/CTest/cmCTestVC.h | 58 |
1 files changed, 56 insertions, 2 deletions
diff --git a/Source/CTest/cmCTestVC.h b/Source/CTest/cmCTestVC.h index 4413193..3e24e2f 100644 --- a/Source/CTest/cmCTestVC.h +++ b/Source/CTest/cmCTestVC.h @@ -45,13 +45,49 @@ public: /** Perform cleanup operations on the work tree. */ void Cleanup(); - void MarkOldRevision() { this->NoteOldRevision(); } - void MarkNewRevision() { this->NoteNewRevision(); } + /** Update the working tree to the new revision. */ + bool Update(); + + /** Get the command line used by the Update method. */ + std::string const& GetUpdateCommandLine() const + { return this->UpdateCommandLine; } + + /** Write Update.xml entries for the updates found. */ + bool WriteXML(std::ostream& xml); + + /** Enumerate non-trivial working tree states during update. */ + enum PathStatus { PathUpdated, PathModified, PathConflicting }; + + /** Get the number of working tree paths in each state after update. */ + int GetPathCount(PathStatus s) const { return this->PathCount[s]; } + protected: // Internal API to be implemented by subclasses. virtual void CleanupImpl(); virtual void NoteOldRevision(); + virtual bool UpdateImpl(); virtual void NoteNewRevision(); + virtual bool WriteXMLUpdates(std::ostream& xml); + + /** Basic information about one revision of a tree or file. */ + struct Revision + { + std::string Rev; + std::string Date; + std::string Author; + std::string Log; + }; + + /** Represent change to one file. */ + struct File + { + PathStatus Status; + Revision const* Rev; + Revision const* PriorRev; + File(): Status(PathUpdated), Rev(0), PriorRev(0) {} + File(PathStatus status, Revision const* rev, Revision const* priorRev): + Status(status), Rev(rev), PriorRev(priorRev) {} + }; /** Convert a list of arguments to a human-readable command line. */ static std::string ComputeCommandLine(char const* const* cmd); @@ -60,6 +96,15 @@ protected: bool RunChild(char const* const* cmd, OutputParser* out, OutputParser* err, const char* workDir = 0); + /** Run VC update command line and send output to given parsers. */ + bool RunUpdateCommand(char const* const* cmd, + OutputParser* out, OutputParser* err = 0); + + /** Write xml element for one file. */ + void WriteXMLEntry(std::ostream& xml, std::string const& path, + std::string const& name, std::string const& full, + File const& f); + // Instance of cmCTest running the script. cmCTest* CTest; @@ -69,6 +114,15 @@ protected: // Basic information about the working tree. std::string CommandLineTool; std::string SourceDirectory; + + // Record update command info. + std::string UpdateCommandLine; + + // Placeholder for unknown revisions. + Revision Unknown; + + // Count paths reported with each PathStatus value. + int PathCount[3]; }; #endif |