#ifndef LIBPKG_DATA_CONFIG_H #define LIBPKG_DATA_CONFIG_H #include "./database.h" #include "./lockable.h" #include "./siglevel.h" #include "../global.h" #include #include #include #include #include #include namespace LibPkg { /*! * \brief The SigStatus enum specifies PGP signature verification status return codes. */ enum class SignatureStatus { Valid, KeyExpired, SigExpired, KeyUnknown, KeyDisabled, InvalidId }; struct Config; struct Database; struct LIBPKG_EXPORT DatabaseStatistics : public ReflectiveRapidJSON::JsonSerializable { DatabaseStatistics(const Database &config); const std::string &name; const std::size_t packageCount; const std::string &arch; const CppUtilities::DateTime lastUpdate; const std::string &localPkgDir; const std::string &mainMirror; const bool syncFromMirror; }; struct LIBPKG_EXPORT Status : public ReflectiveRapidJSON::JsonSerializable { Status(const Config &config); std::vector dbStats; const std::set &architectures; const std::string &pacmanDatabasePath; const std::vector &packageCacheDirs; }; struct TopoSortItem; struct LIBPKG_EXPORT BuildOrderResult : public ReflectiveRapidJSON::JsonSerializable { std::vector order; std::vector cycle; std::vector ignored; bool success = false; }; enum BuildOrderOptions { None = 0x0, /**< none of the other options enabled */ IncludeSourceOnlyDependencies = 0x2, /**< whether source-only dependencies should be added the list of resulting packages */ IncludeAllDependencies = 0x3, /**< whether *all* dependencies should be added the list of resulting packages (implies IncludeSourceOnlyDependencies) */ ConsiderBuildDependencies = 0x4, /**< whether build dependencies should be taken into account for the topo sort */ }; struct LicenseFile : public ReflectiveRapidJSON::JsonSerializable, public ReflectiveRapidJSON::BinarySerializable { LicenseFile() = default; LicenseFile(std::string &&filename, std::string &&content) : filename(filename) , content(content) { } std::string filename; std::string content; }; struct LIBPKG_EXPORT CommonLicense : public ReflectiveRapidJSON::JsonSerializable, public ReflectiveRapidJSON::BinarySerializable { std::set relevantPackages; std::vector files; }; struct LIBPKG_EXPORT LicenseResult : public ReflectiveRapidJSON::JsonSerializable, public ReflectiveRapidJSON::BinarySerializable { std::map commonLicenses; std::map> customLicences; std::vector consideredPackages; std::vector ignoredPackages; std::vector notes; std::string mainProject; std::set dependendProjects; std::string licenseSummary; bool success = true; }; constexpr BuildOrderOptions operator|(BuildOrderOptions lhs, BuildOrderOptions rhs) { return static_cast(static_cast(lhs) | static_cast(rhs)); } constexpr bool operator&(BuildOrderOptions lhs, BuildOrderOptions rhs) { return (static_cast(lhs) & static_cast(rhs)) != 0; } struct LIBPKG_EXPORT Config : public Lockable, public ReflectiveRapidJSON::BinarySerializable { // load config and packages void loadPacmanConfig(const char *pacmanConfigPath); void loadAllPackages(bool withFiles); // caching std::uint64_t restoreFromCache(); std::uint64_t dumpCacheFile(); void markAllDatabasesToBeDiscarded(); void discardDatabases(); // computions Status computeStatus() const; BuildOrderResult computeBuildOrder(const std::vector &dependencyDenotations, BuildOrderOptions options); LicenseResult computeLicenseInfo(const std::vector &dependencyDenotations); std::variant, std::string> computeDatabaseDependencyOrder(Database &database, bool addSelf = true); std::vector computeDatabasesRequiringDatabase(Database &database); void pullDependentPackages(const std::vector &dependencies, const std::shared_ptr &relevantPackage, const std::unordered_set &relevantDbs, std::unordered_set &runtimeDependencies, DependencySet &missingDependencies); void pullDependentPackages(const std::shared_ptr &package, const std::unordered_set &relevantDbs, std::unordered_set &runtimeDependencies, DependencySet &missingDependencies); // search for packages static std::pair parseDatabaseDenotation(std::string_view databaseDenotation); Database *findDatabase(std::string_view name, std::string_view architecture); Database *findDatabaseFromDenotation(std::string_view databaseDenotation); Database *findOrCreateDatabase(std::string &&name, std::string_view architecture); Database *findOrCreateDatabase(std::string_view name, std::string_view architecture); Database *findOrCreateDatabaseFromDenotation(std::string_view databaseDenotation); static std::tuple parsePackageDenotation(std::string_view packageDenotation); std::vector findPackages(std::string_view packageDenotation); std::vector findPackages(std::string_view dbName, std::string_view dbArch, std::string_view packageName); std::vector findPackages(std::tuple dbAndPackageName); PackageSearchResult findPackage(const Dependency &dependency); std::vector findPackages(const Dependency &dependency, bool reverse = false); std::vector findPackagesProvidingLibrary(const std::string &library, bool reverse = false); std::vector findPackages(const std::regex ®ex); std::vector findPackages(const Package &package); std::vector findPackages( const std::function &databasePred, const std::function &packagePred); std::vector findPackages(const std::function &pred); // utilities std::list forEachPackage(const std::function &processNextDatabase, const std::function &pkg, std::mutex &dbMutex)> &processNextPackage); std::vector databases; Database aur = Database("aur"); std::set architectures; std::string pacmanDatabasePath; std::vector packageCacheDirs; SignatureLevelConfig signatureLevel; private: bool addDepsRecursivelyInTopoOrder(std::vector> &allItems, std::vector &items, std::vector &ignored, std::vector &cycleTracking, const Dependency &dependency, BuildOrderOptions options, bool onlyDependency); bool addLicenseInfo(LicenseResult &result, const Dependency &dependency); std::string addLicenseInfo(LicenseResult &result, PackageSearchResult &searchResult, const std::shared_ptr &package); }; inline Status Config::computeStatus() const { return Status(*this); } inline std::vector Config::findPackages(std::string_view dbName, std::string_view dbArch, std::string_view packageName) { return findPackages(std::make_tuple(dbName, dbArch, packageName)); } inline std::vector Config::findPackages(std::string_view packageDenotation) { return findPackages(parsePackageDenotation(packageDenotation)); } } // namespace LibPkg #endif // LIBPKG_DATA_CONFIG_H