text: /* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
     file Copyright.txt or https://cmake.org/licensing for details.  */
  #ifndef cmCTestSVN_h
  #define cmCTestSVN_h
  
  #include "cmConfigure.h" // IWYU pragma: keep
  
  #include <iosfwd>
  #include <list>
  #include <string>
  #include <vector>
  
  #include "cmCTestGlobalVC.h"
  
  class cmCTest;
  class cmXMLWriter;
  
  /** \class cmCTestSVN
   * \brief Interaction with subversion command-line tool
   *
   */
  class cmCTestSVN : public cmCTestGlobalVC
  {
  public:
    /** Construct with a CTest instance and update log stream.  */
    cmCTestSVN(cmCTest* ctest, std::ostream& log);
  
    ~cmCTestSVN() override;
  
  private:
    // Implement cmCTestVC internal API.
    void CleanupImpl() override;
    bool NoteOldRevision() override;
    bool NoteNewRevision() override;
    bool UpdateImpl() override;
  
    bool RunSVNCommand(std::vector<char const*> const& parameters,
                       OutputParser* out, OutputParser* err);
  
    // Information about an SVN repository (root repository or external)
    struct SVNInfo
    {
  
      SVNInfo(std::string const& path = std::string())
        : 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;
    };
  
    // Extended revision structure to include info about external it refers to.
    struct Revision;
  
    friend struct Revision;
  
    // Info of all the repositories (root, externals and nested ones).
    // Use std::list so the elements don't move in memory.
    std::list<SVNInfo> Repositories;
  
    // Pointer to the infos of the root repository.
    SVNInfo* RootInfo;
  
    std::string LoadInfo(SVNInfo& svninfo);
    bool LoadRepositories();
    bool LoadModifications() override;
    bool LoadRevisions() override;
    bool LoadRevisions(SVNInfo& svninfo);
  
    void GuessBase(SVNInfo& svninfo, std::vector<Change> const& changes);
  
    void DoRevisionSVN(Revision const& revision,
                       std::vector<Change> const& changes);
  
    void WriteXMLGlobal(cmXMLWriter& xml) override;
  
    class ExternalParser;
    // Parsing helper classes.
    class InfoParser;
    class LogParser;
    class StatusParser;
    class UpdateParser;
  
    friend class InfoParser;
    friend class LogParser;
    friend class StatusParser;
    friend class UpdateParser;
    friend class ExternalParser;
  };
  
  #endif
  