1 /* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2    file Copyright.txt or https://cmake.org/licensing for details.  */
3 #pragma once
4 
5 #include "cmConfigure.h" // IWYU pragma: keep
6 
7 #include <iosfwd>
8 #include <list>
9 #include <map>
10 #include <string>
11 #include <vector>
12 
13 #include "cmCTestVC.h"
14 
15 class cmCTest;
16 class cmXMLWriter;
17 
18 /** \class cmCTestGlobalVC
19  * \brief Base class for handling globally-versioned trees
20  *
21  */
22 class cmCTestGlobalVC : public cmCTestVC
23 {
24 public:
25   /** Construct with a CTest instance and update log stream.  */
26   cmCTestGlobalVC(cmCTest* ctest, std::ostream& log);
27 
28   ~cmCTestGlobalVC() override;
29 
30 protected:
31   // Implement cmCTestVC internal API.
32   bool WriteXMLUpdates(cmXMLWriter& xml) override;
33 
34   void SetNewRevision(std::string const& revision) override;
35 
36   /** Represent a vcs-reported action for one path in a revision.  */
37   struct Change
38   {
39     char Action;
40     std::string Path;
41     Change(char a = '?')
ActionChange42       : Action(a)
43     {
44     }
45   };
46 
47   // Update status for files in each directory.
48   class Directory : public std::map<std::string, File>
49   {
50   };
51   std::map<std::string, Directory> Dirs;
52 
53   // Old and new repository revisions.
54   std::string OldRevision;
55   std::string NewRevision;
56 
57   // Information known about old revision.
58   Revision PriorRev;
59 
60   // Information about revisions from a svn log.
61   std::list<Revision> Revisions;
62 
63   virtual const char* LocalPath(std::string const& path);
64 
65   virtual void DoRevision(Revision const& revision,
66                           std::vector<Change> const& changes);
67   virtual void DoModification(PathStatus status, std::string const& path);
68   virtual bool LoadModifications() = 0;
69   virtual bool LoadRevisions() = 0;
70 
71   virtual void WriteXMLGlobal(cmXMLWriter& xml);
72   void WriteXMLDirectory(cmXMLWriter& xml, std::string const& path,
73                          Directory const& dir);
74 };
75