From 73868368120ceea97ada628a1aa42236fb42b89d Mon Sep 17 00:00:00 2001 From: Jaroslav Mracek Date: Mon, 23 Aug 2021 09:37:47 +0200 Subject: [PATCH] Add getLatestModules() It returns latest module packages for each module name, stream, and architecture. --- libdnf/module/ModulePackageContainer.cpp | 29 ++++++++++++++++++++++++ libdnf/module/ModulePackageContainer.hpp | 10 ++++++++ 2 files changed, 39 insertions(+) diff --git a/libdnf/module/ModulePackageContainer.cpp b/libdnf/module/ModulePackageContainer.cpp index fe029d4ca4..ccfa249d90 100644 --- a/libdnf/module/ModulePackageContainer.cpp +++ b/libdnf/module/ModulePackageContainer.cpp @@ -1101,6 +1101,35 @@ ModulePackageContainer::getLatestModulesPerRepo(ModuleState moduleFilter, return output; } +std::vector +ModulePackageContainer::getLatestModules(const std::vector modulePackages, bool activeOnly) +{ + // Because modular sovables uses as name combination of module $name:$stream:$context, we can use to get the lates + // Query + std::vector latestModules; + Query query(pImpl->moduleSack, Query::ExcludeFlags::IGNORE_EXCLUDES); + if (activeOnly) { + // When no active module return + if (!pImpl->activatedModules) { + return latestModules; + } + query.addFilter(HY_PKG, HY_EQ, pImpl->activatedModules.get()); + } + + PackageSet inputModulePackages(pImpl->moduleSack); + for (auto modulePackage : modulePackages) { + inputModulePackages.set(modulePackage->getId()); + } + query.addFilter(HY_PKG, HY_EQ, &inputModulePackages); + query.addFilter(HY_PKG_LATEST_PER_ARCH, HY_EQ, 1); + auto set = query.runSet(); + + Id moduleId = -1; + while ((moduleId = set->next(moduleId)) != -1) { + latestModules.push_back(pImpl->modules.at(moduleId).get()); + } + return latestModules; +} std::pair>, ModulePackageContainer::ModuleErrorType> ModulePackageContainer::resolveActiveModulePackages(bool debugSolver) diff --git a/libdnf/module/ModulePackageContainer.hpp b/libdnf/module/ModulePackageContainer.hpp index b13b3d2eb3..a949578c6e 100644 --- a/libdnf/module/ModulePackageContainer.hpp +++ b/libdnf/module/ModulePackageContainer.hpp @@ -134,6 +134,16 @@ struct ModulePackageContainer std::vector getModulePackages(); std::vector>> getLatestModulesPerRepo( ModuleState moduleFilter, std::vector modulePackages); + + /** + * @brief Return all latest ModulePackages for each module Name, stream, context and architecture. In case of + * multiple latest packages, all will be returned. When activeOnly is true, it returns only the latest active + * packages. + * + * @return std::vector + */ + std::vector getLatestModules(const std::vector modulePackages, bool activeOnly); + ModulePackage * getLatestModule(std::vector modulePackages, bool activeOnly); std::vector requiresModuleEnablement(const libdnf::PackageSet & packages);