summaryrefslogtreecommitdiffstats
path: root/Source/CTest/cmCTestVC.h
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2009-02-25 19:42:45 (GMT)
committerBrad King <brad.king@kitware.com>2009-02-25 19:42:45 (GMT)
commit80282b749fb138ea8bd188dd5b7623c7545ea927 (patch)
treea654e1b28bf2b2bec97de9ee7dad695d322598f1 /Source/CTest/cmCTestVC.h
parentcb788e8f6dfeeb5a934679f671adc87116837834 (diff)
downloadCMake-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.h58
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