#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 #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 StorageDistribution; 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 { using DatabaseVisitor = std::function; using PackageVisitorMove = std::function &&)>; // package is invalidated/reused unless moved from!!! using PackageVisitorConst = std::function &)>; using PackageVisitorByName = std::function &)>; explicit Config(); ~Config(); // load config and packages void loadPacmanConfig(const char *pacmanConfigPath); void loadAllPackages(bool withFiles, bool force); // storage and caching void initStorage(const char *path = "libpkg.db", std::uint32_t maxDbs = 0); std::size_t cachedPackages() const; void setPackageCacheLimit(std::size_t limit); std::unique_ptr &storage(); 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::shared_ptr &package, const std::unordered_set &relevantDbs, std::unordered_map> &runtimeDependencies, DependencySet &missingDependencies, std::unordered_set &visited); // database search/creation 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, bool keepLocalPaths = false); Database *findOrCreateDatabase(std::string_view name, std::string_view architecture, bool keepLocalPaths = false); Database *findOrCreateDatabaseFromDenotation(std::string_view databaseDenotation, bool keepLocalPaths = false); // packages search static std::pair parseDatabaseDenotation(std::string_view databaseDenotation); static std::tuple parsePackageDenotation(std::string_view packageDenotation); std::vector findPackages(std::string_view packageDenotation, std::size_t limit = std::numeric_limits::max()); std::vector findPackages( std::string_view dbName, std::string_view dbArch, std::string_view packageName, std::size_t limit = std::numeric_limits::max()); std::vector findPackages(std::tuple dbAndPackageName, std::size_t limit = std::numeric_limits::max()); PackageSearchResult findPackage(const Dependency &dependency); std::vector findPackages( const Dependency &dependency, bool reverse = false, std::size_t limit = std::numeric_limits::max()); std::vector findPackagesProvidingLibrary( const std::string &library, bool reverse, std::size_t limit = std::numeric_limits::max()); // package iteration void packages(std::string_view dbName, std::string_view dbArch, const std::string &packageName, const DatabaseVisitor &databaseVisitor, const PackageVisitorConst &visitor); void packagesByName(const DatabaseVisitor &databaseVisitor, const PackageVisitorByName &visitor); void providingPackages(const Dependency &dependency, bool reverse, const DatabaseVisitor &databaseVisitor, const PackageVisitorConst &visitor); void providingPackages(const std::string &libraryName, bool reverse, const DatabaseVisitor &databaseVisitor, const PackageVisitorConst &visitor); std::vector databases; Database aur = Database("aur"); std::set architectures; std::string pacmanDatabasePath; std::vector packageCacheDirs; SignatureLevelConfig signatureLevel; private: Database *createDatabase(std::string &&name); 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); std::unique_ptr m_storage; }; inline std::unique_ptr &Config::storage() { return m_storage; } 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, std::size_t limit) { return findPackages(std::make_tuple(dbName, dbArch, packageName), limit); } inline std::vector Config::findPackages(std::string_view packageDenotation, std::size_t limit) { return findPackages(parsePackageDenotation(packageDenotation), limit); } } // namespace LibPkg #endif // LIBPKG_DATA_CONFIG_H