/* * Copyright (C) 2021 Riyyi * * SPDX-License-Identifier: MIT */ #ifndef DOTFILE_H #define DOTFILE_H #include // size_t #include #include // function #include #include class Dotfile { public: Dotfile(); virtual ~Dotfile(); enum class ExcludeType { File, Directory, EndsWith, }; struct ExcludePath { ExcludeType type; std::string path; }; void add(const std::vector& targets = {}); void list(const std::vector& targets = {}); void pull(const std::vector& targets = {}); void push(const std::vector& targets = {}); static void setWorkingDirectory(std::filesystem::path directory) { s_workingDirectory = directory; } static void setSystemDirectories(const std::vector& systemDirectories) { s_systemDirectories = systemDirectories; } static void setExcludePaths(const std::vector& excludePaths) { s_excludePaths = excludePaths; } private: void sync(const std::vector& paths, const std::vector& homeIndices, const std::vector& systemIndices, const std::function& generateHomePaths, const std::function& generateSystemPaths); void forEachDotfile(const std::vector& targets, const std::function& callback); bool filter(const std::filesystem::path& path); bool include(const std::filesystem::path& path, const std::vector& targets); bool isSystemTarget(const std::string& target); static std::vector s_excludePaths; static std::vector s_systemDirectories; static std::filesystem::path s_workingDirectory; }; #endif // DOTFILE_H