#ifndef LIBREPOMGR_BUILD_ACTION_META_H #define LIBREPOMGR_BUILD_ACTION_META_H #include "../global.h" #include "../../libpkg/data/lockable.h" #include #include #include #include #include #include namespace LibRepoMgr { enum class BuildActionStatus : std::uint64_t { Created, Enqueued, AwaitingConfirmation, Running, Finished, }; enum class BuildActionResult : std::uint64_t { None, Success, Failure, ConfirmationDeclined, Aborted, }; enum class BuildActionType : std::uint64_t { Invalid, RemovePackages, MovePackages, CheckForUpdates, ReloadDatabase, ReloadLibraryDependencies, PrepareBuild, ConductBuild, MakeLicenseInfo, ReloadConfiguration, CheckForProblems, CleanRepository, DummyBuildAction, CustomCommand, }; using BuildActionFlagType = std::uint64_t; static constexpr BuildActionFlagType noBuildActionFlags = 0; enum class CheckForUpdatesFlags : BuildActionFlagType { None, ConsiderRegularPackage = (1 << 0), // be consistent with LibPkg::UpdateCheckOptions here }; enum class ReloadLibraryDependenciesFlags : BuildActionFlagType { None, ForceReload = (1 << 0), SkipDependencies = (1 << 1), }; enum class PrepareBuildFlags : BuildActionFlagType { None, ForceBumpPkgRel = (1 << 0), CleanSrcDir = (1 << 1), KeepOrder = (1 << 2), KeepPkgRelAndEpoch = (1 << 3), }; enum class ConductBuildFlags : BuildActionFlagType { None, BuildAsFarAsPossible = (1 << 0), SaveChrootOfFailures = (1 << 1), UpdateChecksums = (1 << 2), AutoStaging = (1 << 3), }; enum class CleanRepositoryFlags : BuildActionFlagType { None, DryRun = (1 << 0), }; enum class CheckForProblemsSettings : std::size_t { IgnoreDeps, IgnoreLibDeps }; enum class PrepareBuildSettings : std::size_t { PKGBUILDsDirs }; enum class ConductBuildSettings : std::size_t { ChrootDir, ChrootDefaultUser, CCacheDir, PackageCacheDir, TestFilesDir }; enum class CustomCommandSettings : std::size_t { Command }; struct LIBREPOMGR_EXPORT BuildActionFlagMetaInfo : public ReflectiveRapidJSON::JsonSerializable { const BuildActionFlagType id = 0; const std::string_view name; const std::string_view desc; const std::string_view param; }; struct LIBREPOMGR_EXPORT BuildActionSettingMetaInfo : public ReflectiveRapidJSON::JsonSerializable { const std::string_view name; const std::string_view desc; const std::string_view param; }; struct LIBREPOMGR_EXPORT BuildActionTypeMetaInfo : public ReflectiveRapidJSON::JsonSerializable { const BuildActionType id = BuildActionType::Invalid; const std::string_view category; const std::string_view name; const std::string_view type; const std::vector flags; const std::vector settings; const bool directory = true; const bool sourceDb = true; const bool destinationDb = true; const bool packageNames = true; }; struct LIBREPOMGR_EXPORT BuildActionStatusMetaInfo : public ReflectiveRapidJSON::JsonSerializable { const BuildActionStatus id = BuildActionStatus::Created; const std::string_view name; }; struct LIBREPOMGR_EXPORT BuildActionResultMetaInfo : public ReflectiveRapidJSON::JsonSerializable { const BuildActionResult id = BuildActionResult::None; const std::string_view name; }; struct BuildActionMetaInfo; struct LIBREPOMGR_EXPORT BuildActionTypeMetaMapping { using FlagMap = std::unordered_map>; using SettingMap = std::unordered_map>; explicit BuildActionTypeMetaMapping(const BuildActionTypeMetaInfo &typeInfo); const FlagMap flagInfoByName; const SettingMap settingInfoByName; }; struct LIBREPOMGR_EXPORT BuildActionMetaInfo : public ReflectiveRapidJSON::JsonSerializable, public LibPkg::Lockable { using TypeInfoByName = std::unordered_map>; using MetaMappingsForTypes = std::vector; explicit BuildActionMetaInfo(); const TypeInfoByName &typeInfoByName() const; const MetaMappingsForTypes &mappings() const; bool isTypeIdValid(BuildActionType id) const; const BuildActionTypeMetaInfo &typeInfoForId(BuildActionType id) const; const BuildActionTypeMetaInfo &typeInfoForName(std::string_view name) const; const BuildActionTypeMetaMapping &mappingForId(BuildActionType id) const; const std::vector types; const std::vector states; const std::vector results; private: const TypeInfoByName m_typeInfoByName; const MetaMappingsForTypes m_mappings; }; inline const BuildActionMetaInfo::TypeInfoByName &BuildActionMetaInfo::typeInfoByName() const { return m_typeInfoByName; } inline const BuildActionMetaInfo::MetaMappingsForTypes &BuildActionMetaInfo::mappings() const { return m_mappings; } inline bool BuildActionMetaInfo::isTypeIdValid(BuildActionType id) const { return static_cast(id) < types.size(); } inline const BuildActionTypeMetaInfo &BuildActionMetaInfo::typeInfoForId(BuildActionType id) const { return types[static_cast(id)]; } inline const BuildActionTypeMetaMapping &BuildActionMetaInfo::mappingForId(BuildActionType id) const { return m_mappings[static_cast(id)]; } } // namespace LibRepoMgr CPP_UTILITIES_MARK_FLAG_ENUM_CLASS(LibRepoMgr, LibRepoMgr::ReloadLibraryDependenciesFlags) CPP_UTILITIES_MARK_FLAG_ENUM_CLASS(LibRepoMgr, LibRepoMgr::PrepareBuildFlags) CPP_UTILITIES_MARK_FLAG_ENUM_CLASS(LibRepoMgr, LibRepoMgr::ConductBuildFlags) CPP_UTILITIES_MARK_FLAG_ENUM_CLASS(LibRepoMgr, LibRepoMgr::CleanRepositoryFlags) #endif // LIBREPOMGR_BUILD_ACTION_META_H