/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file Copyright.txt or https://cmake.org/licensing for details.  */
#ifndef cmCTestUpdateHandler_h
#define cmCTestUpdateHandler_h

#include "cmConfigure.h"  // IWYU pragma: keep

#include "cmCTestGenericHandler.h"

#include <string>
#include <utility>
#include <vector>

/** \class cmCTestUpdateHandler
 * \brief A class that handles ctest -S invocations
 *
 */
class cmCTestUpdateHandler : public cmCTestGenericHandler
{
public:
    typedef cmCTestGenericHandler Superclass;

    /*
     * The main entry point for this class
     */
    int ProcessHandler() override;

    cmCTestUpdateHandler();

    enum
    {
        e_UNKNOWN = 0,
        e_CVS,
        e_SVN,
        e_BZR,
        e_GIT,
        e_HG,
        e_P4,
        e_LAST
    };

    /**
     * Initialize handler
     */
    void Initialize() override;

private:
    // Some structures needed for update
    struct StringPair : public std::pair<std::string, std::string>
    {};
    struct UpdateFiles : public std::vector<StringPair>
    {};

    // Determine the type of version control
    int DetermineType(const char* cmd, const char* type);

    // The VCS command to update the working tree.
    std::string UpdateCommand;
    int         UpdateType;

    int  DetectVCS(const char* dir);
    bool SelectVCS();
};

#endif
