commit 0c346b823f80ad4d2dfdcfdc4a97e03354850042 Author: MSVSphere Packaging Team Date: Fri Mar 29 15:53:40 2024 +0300 import libdnf-0.63.0-19.el8 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..84049ca --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/libdnf-0.63.0.tar.gz diff --git a/.libdnf.metadata b/.libdnf.metadata new file mode 100644 index 0000000..c25c067 --- /dev/null +++ b/.libdnf.metadata @@ -0,0 +1 @@ +5bb88aae1c1b8c104e34916c7509b04fcf7b4de9 SOURCES/libdnf-0.63.0.tar.gz diff --git a/SOURCES/0001-Revert-Improve-performance-for-module-query.patch b/SOURCES/0001-Revert-Improve-performance-for-module-query.patch new file mode 100644 index 0000000..87252e8 --- /dev/null +++ b/SOURCES/0001-Revert-Improve-performance-for-module-query.patch @@ -0,0 +1,32 @@ +From 293e10c58dadc023070f959b08999b6bc2efb1b2 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Sun, 25 Apr 2021 19:47:51 +0200 +Subject: [PATCH 01/19] Revert "Improve performance for module query" + +This reverts commit 38942d42b6980216e5d5e2e5798664cd08deb3ba. +--- + libdnf/module/ModulePackageContainer.cpp | 8 +++----- + 1 file changed, 3 insertions(+), 5 deletions(-) + +diff --git a/libdnf/module/ModulePackageContainer.cpp b/libdnf/module/ModulePackageContainer.cpp +index 1d5070ca..edb7e9ec 100644 +--- a/libdnf/module/ModulePackageContainer.cpp ++++ b/libdnf/module/ModulePackageContainer.cpp +@@ -775,11 +775,9 @@ ModulePackageContainer::query(std::string name, std::string stream, std::string + Query query(pImpl->moduleSack, Query::ExcludeFlags::IGNORE_EXCLUDES); + // platform modules are installed and not in modules std::Map. + query.available(); +- if (!name.empty() || !stream.empty()) { +- std::ostringstream ss; +- ss << stringFormater(name) << ":" << stringFormater(stream); +- query.addFilter(HY_PKG_DESCRIPTION, HY_GLOB, ss.str().c_str()); +- } ++ std::ostringstream ss; ++ ss << stringFormater(name) << ":" << stringFormater(stream); ++ query.addFilter(HY_PKG_DESCRIPTION, HY_GLOB, ss.str().c_str()); + if (!context.empty()) { + query.addFilter(HY_PKG_SUMMARY, HY_GLOB, context.c_str()); + } +-- +2.31.1 + diff --git a/SOURCES/0002-Revert-Enhance-description-of-modular-solvables.patch b/SOURCES/0002-Revert-Enhance-description-of-modular-solvables.patch new file mode 100644 index 0000000..905ca45 --- /dev/null +++ b/SOURCES/0002-Revert-Enhance-description-of-modular-solvables.patch @@ -0,0 +1,26 @@ +From fe466856f54ed2cd261a863b2c929a064ae5e945 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Sun, 25 Apr 2021 19:47:51 +0200 +Subject: [PATCH 02/19] Revert "Enhance description of modular solvables" + +This reverts commit 943d9a1ba905f2e10975b16edff0684964c135b6. +--- + libdnf/module/ModulePackage.cpp | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/libdnf/module/ModulePackage.cpp b/libdnf/module/ModulePackage.cpp +index 3757f6ad..d0017877 100644 +--- a/libdnf/module/ModulePackage.cpp ++++ b/libdnf/module/ModulePackage.cpp +@@ -50,8 +50,6 @@ namespace libdnf { + * Arch: $arch (If arch is not defined, set "noarch") + * Provides: module($name) + * Provides: module($name:$stream) +- * Summary: original_context +- * Description: name:stream + */ + static void setSovable(Pool * pool, Solvable * solvable, const std::string & name, + const std::string & stream, const std::string & version, const std::string & context, const char * arch, const std::string & original_context) +-- +2.31.1 + diff --git a/SOURCES/0003-Revert-Fix-typo-lates-latest.patch b/SOURCES/0003-Revert-Fix-typo-lates-latest.patch new file mode 100644 index 0000000..6ec9672 --- /dev/null +++ b/SOURCES/0003-Revert-Fix-typo-lates-latest.patch @@ -0,0 +1,26 @@ +From adf159cce65fa5b15f81dd3ee319e551f01def1a Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Sun, 25 Apr 2021 19:47:51 +0200 +Subject: [PATCH 03/19] Revert "Fix typo: lates -> latest" + +This reverts commit 2a7a315cda61355d60fc0dd0fae9ccd48079a9c5. +--- + libdnf/dnf-context.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libdnf/dnf-context.cpp b/libdnf/dnf-context.cpp +index 926681c2..ccb6fe83 100644 +--- a/libdnf/dnf-context.cpp ++++ b/libdnf/dnf-context.cpp +@@ -3253,7 +3253,7 @@ report_problems(const std::vectorwarning(tfm::format(_("Modular dependency problem with Defaults: %s"), report.c_str())); + break; + case libdnf::ModulePackageContainer::ModuleErrorType::ERROR_IN_LATEST: +- logger->warning(tfm::format(_("Modular dependency problem with the latest modules: %s"), ++ logger->warning(tfm::format(_("Modular dependency problem with the lates modules: %s"), + report.c_str())); + break; + case libdnf::ModulePackageContainer::ModuleErrorType::ERROR: +-- +2.31.1 + diff --git a/SOURCES/0004-Revert-Remove-unused-code-bump-version.patch b/SOURCES/0004-Revert-Remove-unused-code-bump-version.patch new file mode 100644 index 0000000..a662d3d --- /dev/null +++ b/SOURCES/0004-Revert-Remove-unused-code-bump-version.patch @@ -0,0 +1,39 @@ +From 291f0393b54b31228c7a4c8c112003b64632967b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Sun, 25 Apr 2021 19:47:52 +0200 +Subject: [PATCH 04/19] Revert "Remove unused code bump version" + +This reverts commit f0fde46c42f2424135617b29fdfbcbf9e17fc79a. +--- + libdnf/module/ModulePackageContainer.cpp | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +diff --git a/libdnf/module/ModulePackageContainer.cpp b/libdnf/module/ModulePackageContainer.cpp +index edb7e9ec..1bfdd8c1 100644 +--- a/libdnf/module/ModulePackageContainer.cpp ++++ b/libdnf/module/ModulePackageContainer.cpp +@@ -1014,6 +1014,21 @@ modulePackageLatestPerRepoSorter(DnfSack * sack, const ModulePackage * first, co + return first->getVersionNum() > second->getVersionNum(); + } + ++static bool ++modulePackageLatestSorter(DnfSack * sack, const ModulePackage * first, const ModulePackage * second) ++{ ++ int cmp = g_strcmp0(first->getNameCStr(), second->getNameCStr()); ++ if (cmp != 0) ++ return cmp < 0; ++ cmp = dnf_sack_evr_cmp(sack, first->getStreamCStr(), second->getStreamCStr()); ++ if (cmp != 0) ++ return cmp < 0; ++ cmp = g_strcmp0(first->getArchCStr(), second->getArchCStr()); ++ if (cmp != 0) ++ return cmp < 0; ++ return first->getVersionNum() > second->getVersionNum(); ++} ++ + std::vector>> + ModulePackageContainer::getLatestModulesPerRepo(ModuleState moduleFilter, + std::vector modulePackages) +-- +2.31.1 + diff --git a/SOURCES/0005-Revert-Report-a-new-type-of-the-module-resolve-error.patch b/SOURCES/0005-Revert-Report-a-new-type-of-the-module-resolve-error.patch new file mode 100644 index 0000000..664ef01 --- /dev/null +++ b/SOURCES/0005-Revert-Report-a-new-type-of-the-module-resolve-error.patch @@ -0,0 +1,89 @@ +From ce301450c39ebbd9fc5ec0897af2df766015e1bd Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Sun, 25 Apr 2021 19:47:53 +0200 +Subject: [PATCH 05/19] Revert "Report a new type of the module resolve error" + +This reverts commit 9235436672fa413d5ac94f52a534b5abe90b5c7f. +--- + libdnf/dnf-context.cpp | 4 ---- + libdnf/module/ModulePackageContainer.cpp | 17 ++++++++++++----- + libdnf/module/ModulePackageContainer.hpp | 10 ++++------ + 3 files changed, 16 insertions(+), 15 deletions(-) + +diff --git a/libdnf/dnf-context.cpp b/libdnf/dnf-context.cpp +index ccb6fe83..55af2b26 100644 +--- a/libdnf/dnf-context.cpp ++++ b/libdnf/dnf-context.cpp +@@ -3252,10 +3252,6 @@ report_problems(const std::vectorwarning(tfm::format(_("Modular dependency problem with Defaults: %s"), report.c_str())); + break; +- case libdnf::ModulePackageContainer::ModuleErrorType::ERROR_IN_LATEST: +- logger->warning(tfm::format(_("Modular dependency problem with the lates modules: %s"), +- report.c_str())); +- break; + case libdnf::ModulePackageContainer::ModuleErrorType::ERROR: + logger->error(tfm::format(_("Modular dependency problem: %s"), report.c_str())); + return_error = true; +diff --git a/libdnf/module/ModulePackageContainer.cpp b/libdnf/module/ModulePackageContainer.cpp +index 1bfdd8c1..ee90056c 100644 +--- a/libdnf/module/ModulePackageContainer.cpp ++++ b/libdnf/module/ModulePackageContainer.cpp +@@ -725,16 +725,23 @@ ModulePackageContainer::Impl::moduleSolve(const std::vector & m + goal2name_query(goalWeak, query); + activatedModules.reset(new PackageSet(*query.runSet())); + } +- return make_pair(problems, problemType); ++ } else { ++ problemType = ModulePackageContainer::ModuleErrorType::ERROR_IN_DEFAULTS; ++ Query query(moduleSack, Query::ExcludeFlags::IGNORE_EXCLUDES); ++ goal2name_query(goal, query); ++ activatedModules.reset(new PackageSet(*query.runSet())); + } +- problemType = ModulePackageContainer::ModuleErrorType::ERROR_IN_LATEST; + } else { + problemType = ModulePackageContainer::ModuleErrorType::ERROR_IN_DEFAULTS; ++ Query query(moduleSack, Query::ExcludeFlags::IGNORE_EXCLUDES); ++ goal2name_query(goal, query); ++ activatedModules.reset(new PackageSet(*query.runSet())); + } ++ } else { ++ Query query(moduleSack, Query::ExcludeFlags::IGNORE_EXCLUDES); ++ goal2name_query(goal, query); ++ activatedModules.reset(new PackageSet(*query.runSet())); + } +- Query query(moduleSack, Query::ExcludeFlags::IGNORE_EXCLUDES); +- goal2name_query(goal, query); +- activatedModules.reset(new PackageSet(*query.runSet())); + return make_pair(problems, problemType); + } + +diff --git a/libdnf/module/ModulePackageContainer.hpp b/libdnf/module/ModulePackageContainer.hpp +index f19c60fd..99fc0677 100644 +--- a/libdnf/module/ModulePackageContainer.hpp ++++ b/libdnf/module/ModulePackageContainer.hpp +@@ -48,17 +48,15 @@ public: + enum class ModuleErrorType { + NO_ERROR = 0, + INFO, +- /// Error in module defaults detected during resolvement of module dependencies ++ /// Error in module defaults detected during resovement of module dependencies + ERROR_IN_DEFAULTS, +- /// Error detected during resolvement of module dependencies ++ /// Error detected during resovement of module dependencies + ERROR, +- /// Error detected during resolvement of module dependencies - Unexpected error!!! ++ /// Error detected during resovement of module dependencies - Unexpected error!!! + CANNOT_RESOLVE_MODULES, + CANNOT_RESOLVE_MODULE_SPEC, + CANNOT_ENABLE_MULTIPLE_STREAMS, +- CANNOT_MODIFY_MULTIPLE_TIMES_MODULE_STATE, +- /// Problem with latest modules during resolvement of module dependencies +- ERROR_IN_LATEST ++ CANNOT_MODIFY_MULTIPLE_TIMES_MODULE_STATE + }; + + struct Exception : public std::runtime_error +-- +2.31.1 + diff --git a/SOURCES/0006-Revert-Add-additional-fallback-for-module-resolve.patch b/SOURCES/0006-Revert-Add-additional-fallback-for-module-resolve.patch new file mode 100644 index 0000000..cecce8c --- /dev/null +++ b/SOURCES/0006-Revert-Add-additional-fallback-for-module-resolve.patch @@ -0,0 +1,62 @@ +From 15a06ef27466f42a8dc39823385f0ca655e80b12 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Sun, 25 Apr 2021 19:47:53 +0200 +Subject: [PATCH 06/19] Revert "Add additional fallback for module resolve" + +This reverts commit fc98ce725181a77bbe0ab157d40443467612c0c0. +--- + libdnf/module/ModulePackageContainer.cpp | 32 ++++++++---------------- + 1 file changed, 11 insertions(+), 21 deletions(-) + +diff --git a/libdnf/module/ModulePackageContainer.cpp b/libdnf/module/ModulePackageContainer.cpp +index ee90056c..e19db08b 100644 +--- a/libdnf/module/ModulePackageContainer.cpp ++++ b/libdnf/module/ModulePackageContainer.cpp +@@ -702,33 +702,23 @@ ModulePackageContainer::Impl::moduleSolve(const std::vector & m + std::vector> problems; + auto problemType = ModulePackageContainer::ModuleErrorType::NO_ERROR; + if (ret) { +- // Goal run ignor problem in defaults + problems = goal.describeAllProblemRules(false); + ret = goal.run(DNF_FORCE_BEST); + if (ret) { +- // Goal run ignor problem in defaults and in latest +- ret = goal.run(DNF_NONE); ++ // Conflicting modules has to be removed otherwice it could result than one of them will ++ // be active ++ auto conflictingPkgs = goal.listConflictPkgs(DNF_PACKAGE_STATE_AVAILABLE); ++ dnf_sack_add_excludes(moduleSack, conflictingPkgs.get()); ++ ret = goalWeak.run(DNF_NONE); + if (ret) { +- // Conflicting modules has to be removed otherwice it could result than one of them will +- // be active +- auto conflictingPkgs = goal.listConflictPkgs(DNF_PACKAGE_STATE_AVAILABLE); +- dnf_sack_add_excludes(moduleSack, conflictingPkgs.get()); +- ret = goalWeak.run(DNF_NONE); +- if (ret) { +- auto logger(Log::getLogger()); +- logger->critical("Modularity filtering totally broken\n"); +- problemType = ModulePackageContainer::ModuleErrorType::CANNOT_RESOLVE_MODULES; +- activatedModules.reset(); +- } else { +- problemType = ModulePackageContainer::ModuleErrorType::ERROR; +- Query query(moduleSack, Query::ExcludeFlags::IGNORE_EXCLUDES); +- goal2name_query(goalWeak, query); +- activatedModules.reset(new PackageSet(*query.runSet())); +- } ++ auto logger(Log::getLogger()); ++ logger->critical("Modularity filtering totally broken\n"); ++ problemType = ModulePackageContainer::ModuleErrorType::CANNOT_RESOLVE_MODULES; ++ activatedModules.reset(); + } else { +- problemType = ModulePackageContainer::ModuleErrorType::ERROR_IN_DEFAULTS; ++ problemType = ModulePackageContainer::ModuleErrorType::ERROR; + Query query(moduleSack, Query::ExcludeFlags::IGNORE_EXCLUDES); +- goal2name_query(goal, query); ++ goal2name_query(goalWeak, query); + activatedModules.reset(new PackageSet(*query.runSet())); + } + } else { +-- +2.31.1 + diff --git a/SOURCES/0007-Revert-Decide-how-to-handle-context-according-to-sta.patch b/SOURCES/0007-Revert-Decide-how-to-handle-context-according-to-sta.patch new file mode 100644 index 0000000..3b596fa --- /dev/null +++ b/SOURCES/0007-Revert-Decide-how-to-handle-context-according-to-sta.patch @@ -0,0 +1,27 @@ +From 0a92554dc2df3d2241b289bb796bc997c2959aaa Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Sun, 25 Apr 2021 19:47:53 +0200 +Subject: [PATCH 07/19] Revert "Decide how to handle context according to + static_context value" + +This reverts commit 66439ed5a57373dfd106379637a9400b107e160c. +--- + libdnf/module/modulemd/ModuleMetadata.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libdnf/module/modulemd/ModuleMetadata.cpp b/libdnf/module/modulemd/ModuleMetadata.cpp +index ee6834c6..07817ce1 100644 +--- a/libdnf/module/modulemd/ModuleMetadata.cpp ++++ b/libdnf/module/modulemd/ModuleMetadata.cpp +@@ -142,7 +142,7 @@ std::vector ModuleMetadata::getAllModulePackages(DnfSack * modu + //GPtrArray * streams = modulemd_module_index_search_streams_by_nsvca_glob(resultingModuleIndex, NULL); + for (unsigned int i = 0; i < streams->len; i++){ + ModulemdModuleStream * moduleMdStream = static_cast(g_ptr_array_index(streams, i)); +- if (modulemd_module_stream_v2_is_static_context((ModulemdModuleStreamV2 *) moduleMdStream)) { ++ if (modulemd_module_stream_get_mdversion(moduleMdStream) > 2) { + result.push_back(new ModulePackage(moduleSack, repo, moduleMdStream, repoID)); + } else { + g_object_ref(moduleMdStream); +-- +2.31.1 + diff --git a/SOURCES/0008-Revert-Fix-load-update-FailSafe.patch b/SOURCES/0008-Revert-Fix-load-update-FailSafe.patch new file mode 100644 index 0000000..f700d85 --- /dev/null +++ b/SOURCES/0008-Revert-Fix-load-update-FailSafe.patch @@ -0,0 +1,76 @@ +From 140168ce29d2425ebf2b4b5b25926611a189cd84 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Sun, 25 Apr 2021 19:47:53 +0200 +Subject: [PATCH 08/19] Revert "Fix load/update FailSafe" + +This reverts commit 244a37d772fcd5a5969085edab544fb1e7b68aad. +--- + libdnf/module/ModulePackageContainer.cpp | 38 ++++++++++++++++++------ + 1 file changed, 29 insertions(+), 9 deletions(-) + +diff --git a/libdnf/module/ModulePackageContainer.cpp b/libdnf/module/ModulePackageContainer.cpp +index e19db08b..97c84c01 100644 +--- a/libdnf/module/ModulePackageContainer.cpp ++++ b/libdnf/module/ModulePackageContainer.cpp +@@ -1641,7 +1641,6 @@ ModulePackageContainer::Impl::ModulePersistor::getRemovedProfiles() + + void ModulePackageContainer::loadFailSafeData() + { +- pImpl->addVersion2Modules(); + auto persistor = pImpl->persistor->configs; + + std::map> enabledStreams; +@@ -1696,21 +1695,42 @@ void ModulePackageContainer::loadFailSafeData() + + std::vector ModulePackageContainer::Impl::getLatestActiveEnabledModules() + { +- Query query(moduleSack, Query::ExcludeFlags::IGNORE_EXCLUDES); +- query.addFilter(HY_PKG, HY_EQ, activatedModules.get()); +- query.addFilter(HY_PKG_REPONAME, HY_NEQ, HY_SYSTEM_REPO_NAME); +- query.addFilter(HY_PKG_LATEST_PER_ARCH, HY_EQ, 1); +- auto set = query.runSet(); +- + std::vector activeModules; + Id moduleId = -1; +- while ((moduleId = set->next(moduleId)) != -1) { ++ while ((moduleId = activatedModules->next(moduleId)) != -1) { + auto modulePackage = modules.at(moduleId).get(); + if (isEnabled(modulePackage->getName(), modulePackage->getStream())) { + activeModules.push_back(modulePackage); + } + } +- return activeModules; ++ if (activeModules.empty()) { ++ return {}; ++ } ++ auto sack = moduleSack; ++ std::sort(activeModules.begin(), activeModules.end(), ++ [sack](const ModulePackage * first, const ModulePackage * second) ++ {return modulePackageLatestSorter(sack, first, second);}); ++ ++ auto packageFirst = activeModules[0]; ++ std::vector latest; ++ auto vectorSize = activeModules.size(); ++ latest.push_back(packageFirst); ++ auto name = packageFirst->getNameCStr(); ++ auto stream = packageFirst->getStreamCStr(); ++ auto arch = packageFirst->getArchCStr(); ++ ++ for (unsigned int index = 1; index < vectorSize; ++index) { ++ auto & package = activeModules[index]; ++ if (g_strcmp0(package->getNameCStr(), name) != 0 || ++ g_strcmp0(package->getStreamCStr(), stream) != 0 || ++ g_strcmp0(package->getArchCStr(), arch) != 0) { ++ name = package->getNameCStr(); ++ stream = package->getStreamCStr(); ++ arch = package->getArchCStr(); ++ latest.push_back(package); ++ } ++ } ++ return latest; + } + + void ModulePackageContainer::Impl::addVersion2Modules() +-- +2.31.1 + diff --git a/SOURCES/0009-Revert-Change-mechanism-of-module-conflicts.patch b/SOURCES/0009-Revert-Change-mechanism-of-module-conflicts.patch new file mode 100644 index 0000000..7b583b3 --- /dev/null +++ b/SOURCES/0009-Revert-Change-mechanism-of-module-conflicts.patch @@ -0,0 +1,78 @@ +From e43ef244e78d8563eb3cb7ff6a6074946f60c877 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Sun, 25 Apr 2021 19:47:53 +0200 +Subject: [PATCH 09/19] Revert "Change mechanism of module conflicts" + +This reverts commit 49600ba05b474bc29651aa122a9116b5ada69f4d. +--- + libdnf/dnf-sack.cpp | 1 + + libdnf/module/ModulePackage.cpp | 2 -- + libdnf/module/ModulePackage.hpp | 1 - + libdnf/module/ModulePackageContainer.cpp | 1 - + libdnf/module/ModulePackageContainer.hpp | 1 - + 5 files changed, 1 insertion(+), 5 deletions(-) + +diff --git a/libdnf/dnf-sack.cpp b/libdnf/dnf-sack.cpp +index b5c7edc0..b9baeaef 100644 +--- a/libdnf/dnf-sack.cpp ++++ b/libdnf/dnf-sack.cpp +@@ -2297,6 +2297,7 @@ void readModuleMetadataFromRepo(DnfSack * sack, libdnf::ModulePackageContainer * + modulePackages->add(sack); + modulePackages->loadFailSafeData(); + if (!modulePackages->empty()) { ++ modulePackages->createConflictsBetweenStreams(); + // TODO remove hard-coded path + try { + std::vector paths{"/etc/os-release", "/usr/lib/os-release"}; +diff --git a/libdnf/module/ModulePackage.cpp b/libdnf/module/ModulePackage.cpp +index d0017877..d644eca6 100644 +--- a/libdnf/module/ModulePackage.cpp ++++ b/libdnf/module/ModulePackage.cpp +@@ -75,8 +75,6 @@ static void setSovable(Pool * pool, Solvable * solvable, const std::string & nam + ss << "module(" << name << ")"; + auto depId = pool_str2id(pool, ss.str().c_str(), 1); + solvable_add_deparray(solvable, SOLVABLE_PROVIDES, depId, -1); +- // create Conflicts: module($name) +- solvable_add_deparray(solvable, SOLVABLE_CONFLICTS, depId, 0); + + // create Provide: module($name:$stream) + ss.str(std::string()); +diff --git a/libdnf/module/ModulePackage.hpp b/libdnf/module/ModulePackage.hpp +index b618df58..145c6d63 100644 +--- a/libdnf/module/ModulePackage.hpp ++++ b/libdnf/module/ModulePackage.hpp +@@ -71,7 +71,6 @@ public: + + std::vector getModuleDependencies() const; + +- ///DEPRECATED + void addStreamConflict(const ModulePackage * package); + + Id getId() const { return id; }; +diff --git a/libdnf/module/ModulePackageContainer.cpp b/libdnf/module/ModulePackageContainer.cpp +index 97c84c01..893b839a 100644 +--- a/libdnf/module/ModulePackageContainer.cpp ++++ b/libdnf/module/ModulePackageContainer.cpp +@@ -204,7 +204,6 @@ private: + /// solvable.arch = + /// solvable.summary = + /// solvable.description = : +- /// solvable.conflicts = module() + DnfSack * moduleSack; + std::unique_ptr activatedModules; + std::string installRoot; +diff --git a/libdnf/module/ModulePackageContainer.hpp b/libdnf/module/ModulePackageContainer.hpp +index 99fc0677..c1001fce 100644 +--- a/libdnf/module/ModulePackageContainer.hpp ++++ b/libdnf/module/ModulePackageContainer.hpp +@@ -115,7 +115,6 @@ public: + Id addPlatformPackage(const std::string &osReleasePath, const char * platformModule); + Id addPlatformPackage(DnfSack * sack, + const std::vector & osReleasePath, const char * platformModule); +- /// DEPRECATED + void createConflictsBetweenStreams(); + + /** +-- +2.31.1 + diff --git a/SOURCES/0010-Revert-Call-addVersion2Modules-as-late-as-possible.patch b/SOURCES/0010-Revert-Call-addVersion2Modules-as-late-as-possible.patch new file mode 100644 index 0000000..67c720e --- /dev/null +++ b/SOURCES/0010-Revert-Call-addVersion2Modules-as-late-as-possible.patch @@ -0,0 +1,214 @@ +From 058b6112374f5feb5ee57488ac3fdbc7666a2016 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Sun, 25 Apr 2021 19:47:53 +0200 +Subject: [PATCH 10/19] Revert "Call addVersion2Modules(); as late as possible" + +This reverts commit fe27dba67384e549a3be2a91c4a6cf1151113157. +--- + libdnf/module/ModulePackageContainer.cpp | 28 +++--------------------- + 1 file changed, 3 insertions(+), 25 deletions(-) + +diff --git a/libdnf/module/ModulePackageContainer.cpp b/libdnf/module/ModulePackageContainer.cpp +index 893b839a..6ee2b68f 100644 +--- a/libdnf/module/ModulePackageContainer.cpp ++++ b/libdnf/module/ModulePackageContainer.cpp +@@ -346,6 +346,7 @@ ModulePackageContainer::add(DnfSack * sack) + exception.what())); + } + } ++ pImpl->addVersion2Modules(); + } + + void ModulePackageContainer::addDefaultsFromDisk() +@@ -427,7 +428,6 @@ void ModulePackageContainer::createConflictsBetweenStreams() + + bool ModulePackageContainer::empty() const noexcept + { +- pImpl->addVersion2Modules(); + return pImpl->modules.empty(); + } + +@@ -521,13 +521,11 @@ bool ModulePackageContainer::isDisabled(const ModulePackage * module) + std::vector ModulePackageContainer::getDefaultProfiles(std::string moduleName, + std::string moduleStream) + { +- pImpl->addVersion2Modules(); + return pImpl->moduleMetadata.getDefaultProfiles(moduleName, moduleStream); + } + + const std::string & ModulePackageContainer::getDefaultStream(const std::string &name) const + { +- pImpl->addVersion2Modules(); + auto it = pImpl->moduleDefaults.find(name); + if (it == pImpl->moduleDefaults.end()) { + return EMPTY_RESULT; +@@ -537,7 +535,6 @@ const std::string & ModulePackageContainer::getDefaultStream(const std::string & + + const std::string & ModulePackageContainer::getEnabledStream(const std::string &name) + { +- pImpl->addVersion2Modules(); + return pImpl->persistor->getStream(name); + } + +@@ -547,7 +544,6 @@ const std::string & ModulePackageContainer::getEnabledStream(const std::string & + bool + ModulePackageContainer::enable(const std::string &name, const std::string & stream, const bool count) + { +- pImpl->addVersion2Modules(); + if (count) { + pImpl->persistor->getEntry(name).second.streamChangesNum++; + } +@@ -573,7 +569,6 @@ ModulePackageContainer::enable(const ModulePackage * module, const bool count) + */ + void ModulePackageContainer::disable(const std::string & name, const bool count) + { +- pImpl->addVersion2Modules(); + if (count) { + pImpl->persistor->getEntry(name).second.streamChangesNum++; + } +@@ -594,11 +589,11 @@ void ModulePackageContainer::disable(const ModulePackage * module, const bool co + */ + void ModulePackageContainer::reset(const std::string & name, const bool count) + { +- pImpl->addVersion2Modules(); + if (count) { + pImpl->persistor->getEntry(name).second.streamChangesNum++; + } + pImpl->persistor->changeState(name, ModuleState::UNKNOWN); ++ + pImpl->persistor->changeStream(name, ""); + auto & profiles = pImpl->persistor->getEntry(name).second.profiles; + profiles.clear(); +@@ -638,7 +633,6 @@ bool ModulePackageContainer::isChanged() + void ModulePackageContainer::install(const std::string &name, const std::string &stream, + const std::string &profile) + { +- pImpl->addVersion2Modules(); + for (const auto &iter : pImpl->modules) { + auto modulePackage = iter.second.get(); + if (modulePackage->getName() == name && modulePackage->getStream() == stream) { +@@ -656,7 +650,6 @@ void ModulePackageContainer::install(const ModulePackage * module, const std::st + void ModulePackageContainer::uninstall(const std::string &name, const std::string &stream, + const std::string &profile) + { +- pImpl->addVersion2Modules(); + for (const auto &iter : pImpl->modules) { + auto modulePackage = iter.second.get(); + if (modulePackage->getName() == name && modulePackage->getStream() == stream) { +@@ -744,7 +737,6 @@ ModulePackageContainer::query(Nsvcap& moduleNevra) + std::vector + ModulePackageContainer::query(std::string subject) + { +- pImpl->addVersion2Modules(); + // Alternatively a search using module provides could be performed + std::vector result; + Query query(pImpl->moduleSack, Query::ExcludeFlags::IGNORE_EXCLUDES); +@@ -765,7 +757,6 @@ std::vector + ModulePackageContainer::query(std::string name, std::string stream, std::string version, + std::string context, std::string arch) + { +- pImpl->addVersion2Modules(); + // Alternatively a search using module provides could be performed + std::vector result; + Query query(pImpl->moduleSack, Query::ExcludeFlags::IGNORE_EXCLUDES); +@@ -847,7 +838,6 @@ ModulePackageContainer::getModuleState(const std::string& name) + + std::set ModulePackageContainer::getInstalledPkgNames() + { +- pImpl->addVersion2Modules(); + auto moduleNames = pImpl->persistor->getAllModuleNames(); + std::set pkgNames; + for (auto & moduleName: moduleNames) { +@@ -1029,7 +1019,6 @@ std::vector>> + ModulePackageContainer::getLatestModulesPerRepo(ModuleState moduleFilter, + std::vector modulePackages) + { +- pImpl->addVersion2Modules(); + if (modulePackages.empty()) { + return {}; + } +@@ -1113,7 +1102,6 @@ ModulePackageContainer::getLatestModulesPerRepo(ModuleState moduleFilter, + std::pair>, ModulePackageContainer::ModuleErrorType> + ModulePackageContainer::resolveActiveModulePackages(bool debugSolver) + { +- pImpl->addVersion2Modules(); + dnf_sack_reset_excludes(pImpl->moduleSack); + std::vector packages; + +@@ -1164,7 +1152,6 @@ bool ModulePackageContainer::isModuleActive(const ModulePackage * modulePackage) + + std::vector ModulePackageContainer::getModulePackages() + { +- pImpl->addVersion2Modules(); + std::vector values; + const auto & modules = pImpl->modules; + std::transform( +@@ -1186,56 +1173,47 @@ void ModulePackageContainer::rollback() + + std::map ModulePackageContainer::getEnabledStreams() + { +- pImpl->addVersion2Modules(); + return pImpl->persistor->getEnabledStreams(); + } + + std::vector ModulePackageContainer::getDisabledModules() + { +- pImpl->addVersion2Modules(); + return pImpl->persistor->getDisabledModules(); + } + + std::map ModulePackageContainer::getDisabledStreams() + { +- pImpl->addVersion2Modules(); + return pImpl->persistor->getDisabledStreams(); + } + + std::vector ModulePackageContainer::getResetModules() + { +- pImpl->addVersion2Modules(); + return pImpl->persistor->getResetModules(); + } + + std::map ModulePackageContainer::getResetStreams() + { +- pImpl->addVersion2Modules(); + return pImpl->persistor->getResetStreams(); + } + + std::map> + ModulePackageContainer::getSwitchedStreams() + { +- pImpl->addVersion2Modules(); + return pImpl->persistor->getSwitchedStreams(); + } + + std::map> ModulePackageContainer::getInstalledProfiles() + { +- pImpl->addVersion2Modules(); + return pImpl->persistor->getInstalledProfiles(); + } + + std::vector ModulePackageContainer::getInstalledProfiles(std::string moduleName) + { +- pImpl->addVersion2Modules(); + return pImpl->persistor->getProfiles(moduleName); + } + + std::map> ModulePackageContainer::getRemovedProfiles() + { +- pImpl->addVersion2Modules(); + return pImpl->persistor->getRemovedProfiles(); + } + const std::string & +@@ -1641,7 +1619,7 @@ ModulePackageContainer::Impl::ModulePersistor::getRemovedProfiles() + void ModulePackageContainer::loadFailSafeData() + { + auto persistor = pImpl->persistor->configs; +- ++ + std::map> enabledStreams; + for (auto & nameConfig: persistor) { + if (nameConfig.second.second.state == ModuleState::ENABLED) { +-- +2.31.1 + diff --git a/SOURCES/0011-Revert-Fix-modular-queries-with-the-new-solver.patch b/SOURCES/0011-Revert-Fix-modular-queries-with-the-new-solver.patch new file mode 100644 index 0000000..261dbed --- /dev/null +++ b/SOURCES/0011-Revert-Fix-modular-queries-with-the-new-solver.patch @@ -0,0 +1,108 @@ +From 83703689de978cbb5e38f04fb1d9f554026de5ba Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Sun, 25 Apr 2021 19:47:53 +0200 +Subject: [PATCH 11/19] Revert "Fix modular queries with the new solver" + +This reverts commit a9f99a4969831f5d0e21d0f2b2b088ff6546604b. +--- + libdnf/module/ModulePackage.cpp | 17 ++++------------- + libdnf/module/ModulePackageContainer.cpp | 13 ++----------- + libdnf/module/ModulePackageContainer.hpp | 2 +- + 3 files changed, 7 insertions(+), 25 deletions(-) + +diff --git a/libdnf/module/ModulePackage.cpp b/libdnf/module/ModulePackage.cpp +index d644eca6..63ee1656 100644 +--- a/libdnf/module/ModulePackage.cpp ++++ b/libdnf/module/ModulePackage.cpp +@@ -52,7 +52,7 @@ namespace libdnf { + * Provides: module($name:$stream) + */ + static void setSovable(Pool * pool, Solvable * solvable, const std::string & name, +- const std::string & stream, const std::string & version, const std::string & context, const char * arch, const std::string & original_context) ++ const std::string & stream, const std::string & version, const std::string & context, const char * arch) + { + std::ostringstream ss; + // Name: $name:$stream:$context +@@ -62,14 +62,6 @@ static void setSovable(Pool * pool, Solvable * solvable, const std::string & nam + // TODO Test can be remove when modules will be always with arch + solvable_set_str(solvable, SOLVABLE_ARCH, arch ? arch : "noarch"); + +- // store original context in summary +- solvable_set_str(solvable, SOLVABLE_SUMMARY, original_context.c_str()); +- +- // store original name:stream in description +- ss.str(std::string()); +- ss << name << ":" << stream; +- solvable_set_str(solvable, SOLVABLE_DESCRIPTION, ss.str().c_str()); +- + // create Provide: module($name) + ss.str(std::string()); + ss << "module(" << name << ")"; +@@ -105,9 +97,8 @@ ModulePackage::ModulePackage(DnfSack * moduleSack, LibsolvRepo * repo, + Pool * pool = dnf_sack_get_pool(moduleSack); + id = repo_add_solvable(repo); + Solvable *solvable = pool_id2solvable(pool, id); +- std::string original_context = getContext(); +- setSovable(pool, solvable, getName(), getStream(), getVersion(), context.empty() ? original_context : context, +- getArchCStr(), original_context); ++ ++ setSovable(pool, solvable, getName(), getStream(), getVersion(), context.empty() ? getContext() : context, getArchCStr()); + createDependencies(solvable); + HyRepo hyRepo = static_cast(repo->appdata); + libdnf::repoGetImpl(hyRepo)->needs_internalizing = 1; +@@ -649,7 +640,7 @@ ModulePackage::createPlatformSolvable(DnfSack * sack, DnfSack * moduleSack, + repoImpl->needs_internalizing = 1; + Id id = repo_add_solvable(repo); + Solvable *solvable = pool_id2solvable(pool, id); +- setSovable(pool, solvable, name, stream, version, context, "noarch", context); ++ setSovable(pool, solvable, name, stream, version, context, "noarch"); + repoImpl->needs_internalizing = 1; + dnf_sack_set_provides_not_ready(moduleSack); + dnf_sack_set_considered_to_update(moduleSack); +diff --git a/libdnf/module/ModulePackageContainer.cpp b/libdnf/module/ModulePackageContainer.cpp +index 6ee2b68f..3f30037e 100644 +--- a/libdnf/module/ModulePackageContainer.cpp ++++ b/libdnf/module/ModulePackageContainer.cpp +@@ -197,13 +197,6 @@ private: + class ModulePersistor; + std::unique_ptr persistor; + std::map> modules; +- /// Internal sack with module solvables +- /// resolveContext = if moduleMdVersion > 2, else generated from requires +- /// solvable.name = :: +- /// solvable.evr = +- /// solvable.arch = +- /// solvable.summary = +- /// solvable.description = : + DnfSack * moduleSack; + std::unique_ptr activatedModules; + std::string installRoot; +@@ -764,10 +757,8 @@ ModulePackageContainer::query(std::string name, std::string stream, std::string + query.available(); + std::ostringstream ss; + ss << stringFormater(name) << ":" << stringFormater(stream); +- query.addFilter(HY_PKG_DESCRIPTION, HY_GLOB, ss.str().c_str()); +- if (!context.empty()) { +- query.addFilter(HY_PKG_SUMMARY, HY_GLOB, context.c_str()); +- } ++ ss << ":" << stringFormater(context); ++ query.addFilter(HY_PKG_NAME, HY_GLOB, ss.str().c_str()); + if (!arch.empty()) { + query.addFilter(HY_PKG_ARCH, HY_GLOB, arch.c_str()); + } +diff --git a/libdnf/module/ModulePackageContainer.hpp b/libdnf/module/ModulePackageContainer.hpp +index c1001fce..7e5071b2 100644 +--- a/libdnf/module/ModulePackageContainer.hpp ++++ b/libdnf/module/ModulePackageContainer.hpp +@@ -270,7 +270,7 @@ public: + */ + std::vector query(libdnf::Nsvcap & moduleNevra); + /** +- * @brief Requiers subject in format , :, or :: ++ * @brief Requiers subject in format , :, or :: + * + * @param subject p_subject:... + * @return std::vector +-- +2.31.1 + diff --git a/SOURCES/0012-Revert-Add-compatible-layer-for-MdDocuments-v2.patch b/SOURCES/0012-Revert-Add-compatible-layer-for-MdDocuments-v2.patch new file mode 100644 index 0000000..a214d34 --- /dev/null +++ b/SOURCES/0012-Revert-Add-compatible-layer-for-MdDocuments-v2.patch @@ -0,0 +1,171 @@ +From 833966d8a8a6c87a3d51447f2adf2aa76190ecd8 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Sun, 25 Apr 2021 19:47:53 +0200 +Subject: [PATCH 12/19] Revert "Add compatible layer for MdDocuments v2" + +This reverts commit 32ccf6743cb9ce1579ff88804855a94f30876860. +--- + libdnf/module/ModulePackageContainer.cpp | 68 +---------------------- + libdnf/module/modulemd/ModuleMetadata.cpp | 11 +--- + libdnf/module/modulemd/ModuleMetadata.hpp | 2 +- + 3 files changed, 4 insertions(+), 77 deletions(-) + +diff --git a/libdnf/module/ModulePackageContainer.cpp b/libdnf/module/ModulePackageContainer.cpp +index 3f30037e..6e6134d2 100644 +--- a/libdnf/module/ModulePackageContainer.cpp ++++ b/libdnf/module/ModulePackageContainer.cpp +@@ -69,23 +69,6 @@ void goal2name_query(libdnf::Goal & goal, libdnf::Query & query) + query.addFilter(HY_PKG_NAME, HY_EQ, module_names.data()); + } + +-/** +- * @brief In python => ";".join(list.sort()) +- */ +-std::string concentrateVectorString(std::vector & list) +-{ +- if (list.empty()) { +- return {}; +- } +- std::sort(list.begin(), list.end()); +- std::ostringstream ss; +- ss << *list.begin(); +- for (auto require = std::next(list.begin()); require != list.end(); ++require) { +- ss << ";" << *require; +- } +- return ss.str(); +-} +- + } + + namespace std { +@@ -189,8 +172,6 @@ public: + const std::vector & modules, bool debugSolver); + bool insert(const std::string &moduleName, const char *path); + std::vector getLatestActiveEnabledModules(); +- /// Required to call after all modules v3 are in metadata +- void addVersion2Modules(); + + private: + friend struct ModulePackageContainer; +@@ -204,8 +185,6 @@ private: + ModuleMetadata moduleMetadata; + + std::map moduleDefaults; +- std::vector> modulesV2; +- + bool isEnabled(const std::string &name, const std::string &stream); + }; + +@@ -339,7 +318,6 @@ ModulePackageContainer::add(DnfSack * sack) + exception.what())); + } + } +- pImpl->addVersion2Modules(); + } + + void ModulePackageContainer::addDefaultsFromDisk() +@@ -375,7 +353,7 @@ ModulePackageContainer::add(const std::string &fileContent, const std::string & + if (strcmp(r->name, "available") == 0) { + g_autofree gchar * path = g_build_filename(pImpl->installRoot.c_str(), + "/etc/dnf/modules.d", NULL); +- auto packages = md.getAllModulePackages(pImpl->moduleSack, r, repoID, pImpl->modulesV2); ++ std::vector packages = md.getAllModulePackages(pImpl->moduleSack, r, repoID); + for(auto const& modulePackagePtr: packages) { + std::unique_ptr modulePackage(modulePackagePtr); + pImpl->modules.insert(std::make_pair(modulePackage->getId(), std::move(modulePackage))); +@@ -1701,50 +1679,6 @@ std::vector ModulePackageContainer::Impl::getLatestActiveEnable + return latest; + } + +-void ModulePackageContainer::Impl::addVersion2Modules() +-{ +- if (modulesV2.empty()) { +- return; +- } +- std::map>> v3_context_map; +- for (auto const & module_pair : modules) { +- auto * module = module_pair.second.get(); +- auto requires = module->getRequires(true); +- auto concentratedRequires = concentrateVectorString(requires); +- v3_context_map[module->getNameStream()][concentratedRequires].push_back(module); +- } +- libdnf::LibsolvRepo * repo; +- ModulemdModuleStream * mdStream; +- std::string repoID; +- g_autofree gchar * path = g_build_filename(installRoot.c_str(), "/etc/dnf/modules.d", NULL); +- for (auto & module_tuple : modulesV2) { +- std::tie(repo, mdStream, repoID) = module_tuple; +- auto nameStream = ModulePackage::getNameStream(mdStream); +- auto requires = ModulePackage::getRequires(mdStream, true); +- auto concentratedRequires = concentrateVectorString(requires); +- auto streamIterator = v3_context_map.find(nameStream); +- if (streamIterator != v3_context_map.end()) { +- auto contextIterator = streamIterator->second.find(concentratedRequires); +- if (contextIterator != streamIterator->second.end()) { +- auto v3_context = contextIterator->second[0]->getContext(); +- std::unique_ptr modulePackage(new ModulePackage(moduleSack, repo, mdStream, repoID, v3_context)); +- persistor->insert(modulePackage->getName(), path); +- modules.insert(std::make_pair(modulePackage->getId(), std::move(modulePackage))); +- g_object_unref(mdStream); +- continue; +- } +- } +- if (concentratedRequires.empty()) { +- concentratedRequires.append("NoRequires"); +- } +- std::unique_ptr modulePackage(new ModulePackage(moduleSack, repo, mdStream, repoID, concentratedRequires)); +- persistor->insert(modulePackage->getName(), path); +- modules.insert(std::make_pair(modulePackage->getId(), std::move(modulePackage))); +- g_object_unref(mdStream); +- } +- modulesV2.clear(); +-} +- + void ModulePackageContainer::updateFailSafeData() + { + auto fileNames = getYamlFilenames(pImpl->persistDir.c_str()); +diff --git a/libdnf/module/modulemd/ModuleMetadata.cpp b/libdnf/module/modulemd/ModuleMetadata.cpp +index 07817ce1..fbdd8a13 100644 +--- a/libdnf/module/modulemd/ModuleMetadata.cpp ++++ b/libdnf/module/modulemd/ModuleMetadata.cpp +@@ -126,8 +126,7 @@ void ModuleMetadata::resolveAddedMetadata() + + std::vector ModuleMetadata::getAllModulePackages(DnfSack * moduleSack, + LibsolvRepo * repo, +- const std::string & repoID, +- std::vector> & modulesV2) ++ const std::string & repoID) + { + std::vector result; + if (!resultingModuleIndex) +@@ -141,13 +140,7 @@ std::vector ModuleMetadata::getAllModulePackages(DnfSack * modu + //TODO(amatej): replace with + //GPtrArray * streams = modulemd_module_index_search_streams_by_nsvca_glob(resultingModuleIndex, NULL); + for (unsigned int i = 0; i < streams->len; i++){ +- ModulemdModuleStream * moduleMdStream = static_cast(g_ptr_array_index(streams, i)); +- if (modulemd_module_stream_get_mdversion(moduleMdStream) > 2) { +- result.push_back(new ModulePackage(moduleSack, repo, moduleMdStream, repoID)); +- } else { +- g_object_ref(moduleMdStream); +- modulesV2.push_back(std::make_tuple(repo, moduleMdStream, repoID)); +- } ++ result.push_back(new ModulePackage(moduleSack, repo, (ModulemdModuleStream *) g_ptr_array_index(streams, i), repoID)); + } + } + +diff --git a/libdnf/module/modulemd/ModuleMetadata.hpp b/libdnf/module/modulemd/ModuleMetadata.hpp +index 901d7402..df753b11 100644 +--- a/libdnf/module/modulemd/ModuleMetadata.hpp ++++ b/libdnf/module/modulemd/ModuleMetadata.hpp +@@ -36,7 +36,7 @@ public: + ~ModuleMetadata(); + void addMetadataFromString(const std::string & yaml, int priority); + void resolveAddedMetadata(); +- std::vector getAllModulePackages(DnfSack * moduleSack, LibsolvRepo * repo, const std::string & repoID, std::vector> & modulesV2); ++ std::vector getAllModulePackages(DnfSack * moduleSack, LibsolvRepo * repo, const std::string & repoID); + std::map getDefaultStreams(); + std::vector getDefaultProfiles(std::string moduleName, std::string moduleStream); + ModulemdObsoletes * getNewestActiveObsolete(ModulePackage *p); +-- +2.31.1 + diff --git a/SOURCES/0013-Revert-Add-an-alternative-constructor-for-ModulePack.patch b/SOURCES/0013-Revert-Add-an-alternative-constructor-for-ModulePack.patch new file mode 100644 index 0000000..ce0d347 --- /dev/null +++ b/SOURCES/0013-Revert-Add-an-alternative-constructor-for-ModulePack.patch @@ -0,0 +1,77 @@ +From b1ed6e111ce05f8f1fe7b35afc1a3ef6f0731f7c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Sun, 25 Apr 2021 19:47:53 +0200 +Subject: [PATCH 13/19] Revert "Add an alternative constructor for + ModulePackage" + +This reverts commit d05bb263de6822c13ac4bd5cca3628318f5c7ce7. +--- + libdnf/module/ModulePackage.cpp | 24 ++++++++++++------------ + libdnf/module/ModulePackage.hpp | 2 +- + 2 files changed, 13 insertions(+), 13 deletions(-) + +diff --git a/libdnf/module/ModulePackage.cpp b/libdnf/module/ModulePackage.cpp +index 63ee1656..8126bcaa 100644 +--- a/libdnf/module/ModulePackage.cpp ++++ b/libdnf/module/ModulePackage.cpp +@@ -43,16 +43,16 @@ extern "C" { + + namespace libdnf { + +-/** +- * @brief create solvable with: +- * Name: $name:$stream:$context +- * Version: $version +- * Arch: $arch (If arch is not defined, set "noarch") +- * Provides: module($name) +- * Provides: module($name:$stream) +- */ +-static void setSovable(Pool * pool, Solvable * solvable, const std::string & name, +- const std::string & stream, const std::string & version, const std::string & context, const char * arch) ++ /** ++ * @brief create solvable with: ++ * Name: $name:$stream:$context ++ * Version: $version ++ * Arch: $arch (If arch is not defined, set "noarch") ++ * Provides: module($name) ++ * Provides: module($name:$stream) ++ */ ++ static void setSovable(Pool * pool, Solvable *solvable, std::string & name, ++ std::string & stream, std::string & version, std::string & context, const char * arch) + { + std::ostringstream ss; + // Name: $name:$stream:$context +@@ -86,7 +86,7 @@ static std::pair parsePlatform(const std::string & pla + } + + ModulePackage::ModulePackage(DnfSack * moduleSack, LibsolvRepo * repo, +- ModulemdModuleStream * mdStream, const std::string & repoID, const std::string & context) ++ ModulemdModuleStream * mdStream, const std::string & repoID) + : mdStream(mdStream) + , moduleSack(moduleSack) + , repoID(repoID) +@@ -98,7 +98,7 @@ ModulePackage::ModulePackage(DnfSack * moduleSack, LibsolvRepo * repo, + id = repo_add_solvable(repo); + Solvable *solvable = pool_id2solvable(pool, id); + +- setSovable(pool, solvable, getName(), getStream(), getVersion(), context.empty() ? getContext() : context, getArchCStr()); ++ setSovable(pool, solvable, getName(), getStream(), getVersion(), getContext(), getArchCStr()); + createDependencies(solvable); + HyRepo hyRepo = static_cast(repo->appdata); + libdnf::repoGetImpl(hyRepo)->needs_internalizing = 1; +diff --git a/libdnf/module/ModulePackage.hpp b/libdnf/module/ModulePackage.hpp +index 145c6d63..47cc995c 100644 +--- a/libdnf/module/ModulePackage.hpp ++++ b/libdnf/module/ModulePackage.hpp +@@ -95,7 +95,7 @@ private: + friend struct ModuleMetadata; + + ModulePackage(DnfSack * moduleSack, LibsolvRepo * repo, +- ModulemdModuleStream * mdStream, const std::string & repoID, const std::string & context = {}); ++ ModulemdModuleStream * mdStream, const std::string & repoID); + + ModulePackage(const ModulePackage & mpkg); + ModulePackage & operator=(const ModulePackage & mpkg); +-- +2.31.1 + diff --git a/SOURCES/0014-Revert-Adjust-modular-solver-to-new-context-type.patch b/SOURCES/0014-Revert-Adjust-modular-solver-to-new-context-type.patch new file mode 100644 index 0000000..99bed9d --- /dev/null +++ b/SOURCES/0014-Revert-Adjust-modular-solver-to-new-context-type.patch @@ -0,0 +1,113 @@ +From 6c9540be5ac3e3bc3f9a60133b402945705b934f Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Sun, 25 Apr 2021 19:47:53 +0200 +Subject: [PATCH 14/19] Revert "Adjust modular solver to new context type" + +This reverts commit 921d4db62cda41f7999aff67882ad0c01c766916. +--- + libdnf/module/ModulePackageContainer.cpp | 46 +++++------------------- + 1 file changed, 8 insertions(+), 38 deletions(-) + +diff --git a/libdnf/module/ModulePackageContainer.cpp b/libdnf/module/ModulePackageContainer.cpp +index 6e6134d2..c0ad1260 100644 +--- a/libdnf/module/ModulePackageContainer.cpp ++++ b/libdnf/module/ModulePackageContainer.cpp +@@ -49,28 +49,6 @@ extern "C" { + #include "modulemd/ModuleMetadata.hpp" + #include "modulemd/ModuleProfile.hpp" + +- +-namespace { +- +-/// Requires resolved goal +-/// Takes listInstalls() from goal and keep solvables with the solvable-name (::) in query +-void goal2name_query(libdnf::Goal & goal, libdnf::Query & query) +-{ +- auto pool = dnf_sack_get_pool(goal.getSack()); +- auto installList = goal.listInstalls(); +- std::vector module_names; +- Id id = -1; +- while ((id = installList.next(id)) != -1) { +- Solvable * s = pool_id2solvable(pool, id); +- const char * name = pool_id2str(pool, s->name); +- module_names.push_back(name); +- } +- module_names.push_back(nullptr); +- query.addFilter(HY_PKG_NAME, HY_EQ, module_names.data()); +-} +- +-} +- + namespace std { + + template<> +@@ -651,14 +629,14 @@ ModulePackageContainer::Impl::moduleSolve(const std::vector & m + for (const auto &module : modules) { + std::ostringstream ss; + auto name = module->getName(); +- ss << "module(" << name << ":" << module->getStream() << ")"; ++ ss << "module(" << name << ":" << module->getStream() << ":" << module->getVersion() << ")"; + Selector selector(moduleSack); + bool optional = persistor->getState(name) == ModuleState::DEFAULT; + selector.set(HY_PKG_PROVIDES, HY_EQ, ss.str().c_str()); + goal.install(&selector, optional); + goalWeak.install(&selector, true); + } +- auto ret = goal.run(static_cast(DNF_IGNORE_WEAK | DNF_FORCE_BEST)); ++ auto ret = goal.run(DNF_IGNORE_WEAK); + if (debugSolver) { + goal.writeDebugdata("debugdata/modules"); + } +@@ -666,7 +644,7 @@ ModulePackageContainer::Impl::moduleSolve(const std::vector & m + auto problemType = ModulePackageContainer::ModuleErrorType::NO_ERROR; + if (ret) { + problems = goal.describeAllProblemRules(false); +- ret = goal.run(DNF_FORCE_BEST); ++ ret = goal.run(DNF_NONE); + if (ret) { + // Conflicting modules has to be removed otherwice it could result than one of them will + // be active +@@ -680,20 +658,14 @@ ModulePackageContainer::Impl::moduleSolve(const std::vector & m + activatedModules.reset(); + } else { + problemType = ModulePackageContainer::ModuleErrorType::ERROR; +- Query query(moduleSack, Query::ExcludeFlags::IGNORE_EXCLUDES); +- goal2name_query(goalWeak, query); +- activatedModules.reset(new PackageSet(*query.runSet())); ++ activatedModules.reset(new PackageSet(std::move(goalWeak.listInstalls()))); + } + } else { + problemType = ModulePackageContainer::ModuleErrorType::ERROR_IN_DEFAULTS; +- Query query(moduleSack, Query::ExcludeFlags::IGNORE_EXCLUDES); +- goal2name_query(goal, query); +- activatedModules.reset(new PackageSet(*query.runSet())); ++ activatedModules.reset(new PackageSet(std::move(goal.listInstalls()))); + } + } else { +- Query query(moduleSack, Query::ExcludeFlags::IGNORE_EXCLUDES); +- goal2name_query(goal, query); +- activatedModules.reset(new PackageSet(*query.runSet())); ++ activatedModules.reset(new PackageSet(std::move(goal.listInstalls()))); + } + return make_pair(problems, problemType); + } +@@ -735,14 +707,12 @@ ModulePackageContainer::query(std::string name, std::string stream, std::string + query.available(); + std::ostringstream ss; + ss << stringFormater(name) << ":" << stringFormater(stream); +- ss << ":" << stringFormater(context); ++ ss << ":" << stringFormater(version) << ":"; ++ ss << stringFormater(context); + query.addFilter(HY_PKG_NAME, HY_GLOB, ss.str().c_str()); + if (!arch.empty()) { + query.addFilter(HY_PKG_ARCH, HY_GLOB, arch.c_str()); + } +- if (!version.empty()) { +- query.addFilter(HY_PKG_VERSION, HY_GLOB, version.c_str()); +- } + auto pset = query.runSet(); + Id moduleId = -1; + while ((moduleId = pset->next(moduleId)) != -1) { +-- +2.31.1 + diff --git a/SOURCES/0015-Revert-Change-usage-of-context-and-version-in-modula.patch b/SOURCES/0015-Revert-Change-usage-of-context-and-version-in-modula.patch new file mode 100644 index 0000000..6cfd63c --- /dev/null +++ b/SOURCES/0015-Revert-Change-usage-of-context-and-version-in-modula.patch @@ -0,0 +1,65 @@ +From 50aa9f29dbfc1523a3b6aea41c6caa37f30c1bf0 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Sun, 25 Apr 2021 19:47:53 +0200 +Subject: [PATCH 15/19] Revert "Change usage of context and version in modular + solver" + +This reverts commit 1f4c5b2a37ec333b23a12b882b046fac858155aa. +--- + libdnf/module/ModulePackage.cpp | 28 ++++++++++++++-------------- + 1 file changed, 14 insertions(+), 14 deletions(-) + +diff --git a/libdnf/module/ModulePackage.cpp b/libdnf/module/ModulePackage.cpp +index 8126bcaa..eea4a8b5 100644 +--- a/libdnf/module/ModulePackage.cpp ++++ b/libdnf/module/ModulePackage.cpp +@@ -43,25 +43,19 @@ extern "C" { + + namespace libdnf { + +- /** +- * @brief create solvable with: +- * Name: $name:$stream:$context +- * Version: $version +- * Arch: $arch (If arch is not defined, set "noarch") +- * Provides: module($name) +- * Provides: module($name:$stream) +- */ +- static void setSovable(Pool * pool, Solvable *solvable, std::string & name, +- std::string & stream, std::string & version, std::string & context, const char * arch) ++static void setSovable(Pool * pool, Solvable *solvable, std::string name, ++ std::string stream, std::string version, std::string context, const char * arch) + { + std::ostringstream ss; +- // Name: $name:$stream:$context +- ss << name << ":" << stream << ":" << context; ++ // create solvable with: ++ // Name: $name:$stream:$version:$context ++ // Version: 0 ++ // Arch: $arch ++ ss << name << ":" << stream << ":" << version << ":" << context; + solvable_set_str(solvable, SOLVABLE_NAME, ss.str().c_str()); +- solvable_set_str(solvable, SOLVABLE_EVR, version.c_str()); ++ solvable_set_str(solvable, SOLVABLE_EVR, "0"); + // TODO Test can be remove when modules will be always with arch + solvable_set_str(solvable, SOLVABLE_ARCH, arch ? arch : "noarch"); +- + // create Provide: module($name) + ss.str(std::string()); + ss << "module(" << name << ")"; +@@ -73,6 +67,12 @@ namespace libdnf { + ss << "module(" << name << ":" << stream << ")"; + depId = pool_str2id(pool, ss.str().c_str(), 1); + solvable_add_deparray(solvable, SOLVABLE_PROVIDES, depId, -1); ++ ++ // create Provide: module($name:$stream:$version) ++ ss.str(std::string()); ++ ss << "module(" << name << ":" << stream << ":" << version << ")"; ++ depId = pool_str2id(pool, ss.str().c_str(), 1); ++ solvable_add_deparray(solvable, SOLVABLE_PROVIDES, depId, -1); + } + + +-- +2.31.1 + diff --git a/SOURCES/0016-Fix-failing-unittest-caused-by-the-revert-of-new-mod.patch b/SOURCES/0016-Fix-failing-unittest-caused-by-the-revert-of-new-mod.patch new file mode 100644 index 0000000..6ea0adf --- /dev/null +++ b/SOURCES/0016-Fix-failing-unittest-caused-by-the-revert-of-new-mod.patch @@ -0,0 +1,34 @@ +From faaa64a51445b6edffe6f1e65c465dea63f11bf7 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Tue, 27 Apr 2021 10:24:53 +0200 +Subject: [PATCH 16/19] Fix failing unittest, caused by the revert of new + modular implementation + +The problem is not caused by advisory filtering which we are testing +here, the `query` is already created with just one package. +--- + tests/libdnf/sack/QueryTest.cpp | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +diff --git a/tests/libdnf/sack/QueryTest.cpp b/tests/libdnf/sack/QueryTest.cpp +index ee9eeaf4..7c3a22af 100644 +--- a/tests/libdnf/sack/QueryTest.cpp ++++ b/tests/libdnf/sack/QueryTest.cpp +@@ -139,13 +139,10 @@ void QueryTest::testQueryFilterAdvisory() + dnf_sack_filter_modules_v2(sack, modules, nullptr, tmpdir, nullptr, true, false, false); + query = new libdnf::Query(sack); + query->addFilter(HY_PKG_ADVISORY_TYPE, HY_EQ, "enhancement"); +- CPPUNIT_ASSERT(query->size() == 2); ++ CPPUNIT_ASSERT(query->size() == 1); + libdnf::PackageSet pset2 = *(query->getResultPset()); + pkg = dnf_package_new(sack, pset2[0]); + CPPUNIT_ASSERT(!g_strcmp0(dnf_package_get_name(pkg), "test-perl-DBI")); + g_object_unref(pkg); +- pkg = dnf_package_new(sack, pset2[1]); +- CPPUNIT_ASSERT(!g_strcmp0(dnf_package_get_name(pkg), "test-perl-DBI")); +- g_object_unref(pkg); + delete query; + } +-- +2.31.1 + diff --git a/SOURCES/0017-Modify-unit-test-after-change-of-handling-advisories.patch b/SOURCES/0017-Modify-unit-test-after-change-of-handling-advisories.patch new file mode 100644 index 0000000..e4e2f5b --- /dev/null +++ b/SOURCES/0017-Modify-unit-test-after-change-of-handling-advisories.patch @@ -0,0 +1,274 @@ +From a61b0105aafeea8487902463f789e6ed00021eb3 Mon Sep 17 00:00:00 2001 +From: Jaroslav Mracek +Date: Wed, 5 May 2021 15:55:43 +0200 +Subject: [PATCH 17/19] Modify unit test after change of handling advisories + +The patch modifies also yaml with multicollection situation by adding +module requires. +--- + data/tests/advisories/modules.yaml | 6 +++++ + .../tests/advisories/repodata/modules.yaml.gz | Bin 300 -> 332 bytes + data/tests/advisories/repodata/primary.xml.gz | Bin 743 -> 743 bytes + data/tests/advisories/repodata/repomd.xml | 24 +++++++++--------- + tests/libdnf/sack/AdvisoryTest.cpp | 22 ++++++---------- + tests/libdnf/sack/QueryTest.cpp | 24 ++++++++---------- + 6 files changed, 37 insertions(+), 39 deletions(-) + +diff --git a/data/tests/advisories/modules.yaml b/data/tests/advisories/modules.yaml +index 6db5053a..b5f23f7d 100644 +--- a/data/tests/advisories/modules.yaml ++++ b/data/tests/advisories/modules.yaml +@@ -32,6 +32,9 @@ data: + license: + module: + - MIT ++ dependencies: ++ - requires: ++ perl: ["5.23"] + profiles: + default: + rpms: ["test-perl-DBI"] +@@ -52,6 +55,9 @@ data: + license: + module: + - MIT ++ dependencies: ++ - requires: ++ perl: ["5.25"] + profiles: + default: + rpms: ["test-perl-DBI"] +diff --git a/data/tests/advisories/repodata/modules.yaml.gz b/data/tests/advisories/repodata/modules.yaml.gz +index 7158e6c515720c87373762d722e9c438ac7fd8d3..ed39532dfcdec084a661d51d86e07bd3e4246f69 100644 +GIT binary patch +literal 332 +zcmV-S0ki%eiwFP!000001I>{=Ps1<}hWGr6Q`gE7ag#Rnz<^jfATh8ZR2}w3Sc;us +zJE;77+&V2`Kt&yZ?cV$H`F$8;nd;nM^yJzo +zd~k$Dz^uyoVipspfg%do*+9Fv4>2lq@(K?>pbTUAvvJbK +zu0;G>$%;HZyrs6DS4GX|H7^S!#q;q?d7fwN0vp-w&1Pz)K_AF{F_TZte-Oh*%LY6kAnoBX$&YcfB`K@n8=wZ +zd~k$T!lo|xb`y=ag)#~?4uMWF4>2lq>L}qPnnP2)uFlq?dzNsYqBMEs`YD{ZuUT~9 +z(lWiG!IM0D>9$lexZ6L(YI0-O8}iB3)ZuJG5&&+p{!%jtJRu<{u0~wLmrQo^XRf(i|v3#j0ij4gLBfGuXuTfg`f!qg}d<~O7egSg{{0!*Q +y{uQW8_P4;s(FnI>d`-5gMVs$LyTi`ae@<5YXR>WoC$fRIYqBpd!@UUm0{{Tgm5(X_ + +diff --git a/data/tests/advisories/repodata/primary.xml.gz b/data/tests/advisories/repodata/primary.xml.gz +index da9ffaf08328659c47be8721a9c478ff64ba0a4d..96cbaa2a5a2361b1e5cd59ddb7de937339982c5f 100644 +GIT binary patch +literal 743 +zcmV~O9B%0I`ND2@%1#&3RBI%*0fTBhg +zVQr-(BktFi)Dqj>k`zsgpnzeM!#6X0Z#V;o=XYg+wxC*BR}prWHbzj1I+fKr!XIzm +zE_{3*pM)iJJmnon8eX*#&bzKTv#df^{oOL{H?V}Xw`PawgWJfhE3Q$FaSF&H&m +zZ1@^JihbYTbG8`urbz& +zAcCeAd4x4dZP9cwQc&n@%d$@U0&b!3PhIAFr-APUJW~u?gTKf@Y}&q@uF~e5FjwDq +zvzBRuKV4qqc$Eb!8hEKs2%}j*IQ0ebAY}{^!F=%3#H9{l`Y>@gB?&m5V>{r|AoIZ2 +zx1Ey=8TD_;)o$Ra)1ddG7NIpC7*GnWP_pSXwfN*Fmo3sCj%Hbqah^pDts}Jdo(@zT +zTK7w1?^U5q=G*K#Spv#rp=moVv3)HJ)zp(-7Mi-ld=@yAIAl_)m0w^^8DZDL#=f4SUEIsm& +ZqioMV;M}JUxcmQi@mJ$x7+z@#006pgY0dxu + +literal 743 +zcmVek{?a7SKDFTPz(qXk^D&NBSj*?`CVC{EvPoHs}Pf=jS*C`PV#CU;*U3P +z7al&3PJ$9Tk%&$p4X@e|XI$0pXJfhE3Q$FaSF&H&M +zZp0dNe2R6_NkrYQfe;%+bb?S&i4vj?+HTQ+Di&`pt^#Y&8KY1#i|#z<)?tA)2u3>* +zM9|bS3$Z4tHJUC)3JRTVS=LEkz%3Nsslz?@)c0Ipq>5u}@Ru3LP1~2#RoYBY?&$k& +z)_D@*PnXv?TBZJq`EKG-%311D!8}P_NH~XBau2*Db{L^t8)G6Eje)qtCg3nXb-~lO +zos$e1^=~QEZs4iYp!Z`f0&6xHPy($~dDCfX(aBAgw@7~kn#+QW^IX)xIznsj$)KXZ +zx<49yuL`X)-$v^45>T2Knl^C=^<0m+ntI&lg{Drp$9=*mp;M*W{0qz}L+scd!zi!X +zP80JialftRZ^QW90+^sTGf3MUGLfsN_1Imb5&O*RGoDpS{Qvs$lhfrPFA;F +zWSAA^Gy?aAJ-DrVB|)E}C-82SG^EF<`w07}8HfbbLWxQbkS@RKLd>|$%y=iJG0Yw- +zHsKppZ*%=ZM%AR$EY%K~+4`m_7^Q_+>p8vrfPZ(W9?tSgcX#2i*MBD4SgT{6Lw*IH +z`&>PS`mZj+m-BO;Qys<)todQy58J<6a4zFxbvjr*e!&Uh5hqUVSOTQnr7=q=lO*+p +z4>7SNb+`^p#EPffcUCdj5`2%Qv6H$!WzLIUaJIAhYYXnMJ^#~!JL3J~7Totk^_&at +ZN7 + +- 1612879414 ++ 1620890113 + +- b69e4467719314fdb155872cf9c8e895d5b169c0506c5180c512d693c48f0f4b +- 8606d1f777859f167f7bd0bf8a1d532abedcb4db143b719e631e1040800fd1f0 ++ f2f306a22a157730d2f13f09fc36c425b9bedfc0ecaf74d8b60d98222ebb3274 ++ ef20a9175429f9f223c4bdcd634fc218bdd85799095438d349efea159cfd2bdf + +- 1612879414 ++ 1620890113 + 743 + 2665 + +@@ -13,7 +13,7 @@ + efbf7f021163a3c7698a257351e327102c60bb39a7bdceee77c421f064205e99 + ca5620e2734574d04d3c01ae5a72f865313369954698d71776076b9cbd831bbd + +- 1612879414 ++ 1620890113 + 311 + 511 + +@@ -21,23 +21,23 @@ + 6673953e1f28f55b9d4c3f38a9e3c0e0ff88ad06fb693b7f15eb241a81b80d71 + 0997c242bf1b96372d7a625a73de23dced68cae9375baff0c73215a07693b3f4 + +- 1612879414 ++ 1620890113 + 310 + 507 + + +- a815d0669b15b97dd6260713405c79045eeda10aedb6460a0f742b86cc236cca +- 0d1063b74e3a7cb4c7cdc3b2080b1901c347693140765534f8c5c3d8b964778a ++ df1abc1ab7dacc6ea2bc16c2b14abeb32d0ec9d9ed01378488cec22540f9607b ++ f088c4096bfc4acad99a20e06d0d4381872c10f0f27ff8bbfe1bada658ff7afd + +- 1612879414 +- 300 +- 1019 ++ 1620890113 ++ 332 ++ 1117 + + + 9d791d16c2adc2d7d4c85b45f2a704edac62a926b09fc20df73207f4190acd49 + 3cf7df860860ac7a4a8e64a1a2d71c1ec43225dacbfe09a0cff80f28be3825da + +- 1612879414 ++ 1620890113 + 708 + 2414 + +diff --git a/tests/libdnf/sack/AdvisoryTest.cpp b/tests/libdnf/sack/AdvisoryTest.cpp +index 805c35da..1abf1a95 100644 +--- a/tests/libdnf/sack/AdvisoryTest.cpp ++++ b/tests/libdnf/sack/AdvisoryTest.cpp +@@ -97,11 +97,9 @@ void AdvisoryTest::testGetApplicablePackagesModulesNotSetup() + + // When modules are not setup all advisory collections are applicable and we get all packages + advisory->getApplicablePackages(pkgsvector); +- CPPUNIT_ASSERT(pkgsvector.size() == 4); ++ CPPUNIT_ASSERT_EQUAL(2, static_cast(pkgsvector.size())); + CPPUNIT_ASSERT(!g_strcmp0(pkgsvector[0].getNameString(), "test-perl-DBI")); +- CPPUNIT_ASSERT(!g_strcmp0(pkgsvector[1].getNameString(), "test-perl-DBI-new-collection-override")); +- CPPUNIT_ASSERT(!g_strcmp0(pkgsvector[2].getNameString(), "test-perl-DBI")); +- CPPUNIT_ASSERT(!g_strcmp0(pkgsvector[3].getNameString(), "not-present")); ++ CPPUNIT_ASSERT(!g_strcmp0(pkgsvector[1].getNameString(), "not-present")); + } + + void AdvisoryTest::testGetApplicablePackagesModulesSetupNoneEnabled() +@@ -122,16 +120,14 @@ void AdvisoryTest::testGetApplicablePackagesOneApplicableCollection() + { + std::vector pkgsvector; + +- // When I keep enabled only perl-DBI module I get packages from all collections that contain that module ++ // When I keep enabled only perl module I get packages from all collections that contain that module + libdnf::ModulePackageContainer * modules = dnf_sack_get_module_container(sack); +- modules->reset("perl"); ++ modules->reset("perl-DBI"); + dnf_sack_filter_modules_v2(sack, modules, nullptr, tmpdir, nullptr, true, false, false); + + advisory->getApplicablePackages(pkgsvector); +- CPPUNIT_ASSERT(pkgsvector.size() == 3); +- CPPUNIT_ASSERT(!g_strcmp0(pkgsvector[0].getNameString(), "test-perl-DBI")); +- CPPUNIT_ASSERT(!g_strcmp0(pkgsvector[1].getNameString(), "test-perl-DBI-new-collection-override")); +- CPPUNIT_ASSERT(!g_strcmp0(pkgsvector[2].getNameString(), "test-perl-DBI")); ++ CPPUNIT_ASSERT(pkgsvector.size() == 1); ++ CPPUNIT_ASSERT(!g_strcmp0(pkgsvector[0].getNameString(), "not-present")); + } + + void AdvisoryTest::testGetApplicablePackagesMultipleApplicableCollections() +@@ -141,11 +137,9 @@ void AdvisoryTest::testGetApplicablePackagesMultipleApplicableCollections() + // When I enable modules from multiple collections -> I get packages from all applicable collections + // Enabled - "perl-DBI:master", "perl:5.23" + advisory->getApplicablePackages(pkgsvector); +- CPPUNIT_ASSERT(pkgsvector.size() == 4); ++ CPPUNIT_ASSERT(pkgsvector.size() == 2); + CPPUNIT_ASSERT(!g_strcmp0(pkgsvector[0].getNameString(), "test-perl-DBI")); +- CPPUNIT_ASSERT(!g_strcmp0(pkgsvector[1].getNameString(), "test-perl-DBI-new-collection-override")); +- CPPUNIT_ASSERT(!g_strcmp0(pkgsvector[2].getNameString(), "test-perl-DBI")); +- CPPUNIT_ASSERT(!g_strcmp0(pkgsvector[3].getNameString(), "not-present")); ++ CPPUNIT_ASSERT(!g_strcmp0(pkgsvector[1].getNameString(), "not-present")); + } + + void AdvisoryTest::testGetModules() +diff --git a/tests/libdnf/sack/QueryTest.cpp b/tests/libdnf/sack/QueryTest.cpp +index 7c3a22af..d4cc28c2 100644 +--- a/tests/libdnf/sack/QueryTest.cpp ++++ b/tests/libdnf/sack/QueryTest.cpp +@@ -59,12 +59,13 @@ void QueryTest::testQueryGetAdvisoryPkgs() + HyQuery query = new libdnf::Query(sack); + std::vector advisoryPkgs; + +- // When modules are not setup all advisory collections are applicable ++ // Apply advisory only from active context - receave advisory package only from releted collection + query->getAdvisoryPkgs(HY_EQ, advisoryPkgs); +- CPPUNIT_ASSERT(advisoryPkgs.size() == 2); +- // We get test-perl-DBI twice because its in two collections +- CPPUNIT_ASSERT(!g_strcmp0(advisoryPkgs[0].getNameString(), "test-perl-DBI")); +- CPPUNIT_ASSERT(!g_strcmp0(advisoryPkgs[1].getNameString(), "test-perl-DBI")); ++ CPPUNIT_ASSERT(advisoryPkgs.size() == 1); ++ ++ CPPUNIT_ASSERT_EQUAL(std::string("test-perl-DBI"), std::string(advisoryPkgs[0].getNameString())); ++ CPPUNIT_ASSERT_EQUAL(std::string("1-2.module_el8+6587+9879afr5"), std::string(advisoryPkgs[0].getEVRString())); ++ //CPPUNIT_ASSERT(!g_strcmp0(advisoryPkgs[1].getNameString(), "test-perl-DBI")); + + // When modules are setup but none are enabled all collections are not applicable - no enabled module + libdnf::ModulePackageContainer * modules = dnf_sack_get_module_container(sack); +@@ -84,15 +85,15 @@ void QueryTest::testQueryGetAdvisoryPkgs() + query->getAdvisoryPkgs(HY_EQ, advisoryPkgs); + CPPUNIT_ASSERT(advisoryPkgs.size() == 0); + +- // When I enable a module from multiple collections that contain a present package I get them ++ // When I enable a module with multiple collections I will receave advisory packages only for active context + CPPUNIT_ASSERT(modules->enable("perl-DBI", "master", false)); + dnf_sack_filter_modules_v2(sack, modules, nullptr, tmpdir, nullptr, true, false, false); + + advisoryPkgs.clear(); + query->getAdvisoryPkgs(HY_EQ, advisoryPkgs); +- CPPUNIT_ASSERT(advisoryPkgs.size() == 2); +- CPPUNIT_ASSERT(!g_strcmp0(advisoryPkgs[0].getNameString(), "test-perl-DBI")); +- CPPUNIT_ASSERT(!g_strcmp0(advisoryPkgs[1].getNameString(), "test-perl-DBI")); ++ CPPUNIT_ASSERT(advisoryPkgs.size() == 1); ++ CPPUNIT_ASSERT_EQUAL(std::string("test-perl-DBI"), std::string(advisoryPkgs[0].getNameString())); ++ CPPUNIT_ASSERT_EQUAL(std::string("1-2.module_el8+6587+9879afr5"), std::string(advisoryPkgs[0].getEVRString())); + + delete query; + } +@@ -102,16 +103,13 @@ void QueryTest::testQueryFilterAdvisory() + // When modules are not setup all advisory collections are applicable and there is no modular filtering + HyQuery query = new libdnf::Query(sack); + query->addFilter(HY_PKG_ADVISORY_TYPE, HY_EQ, "enhancement"); +- CPPUNIT_ASSERT(query->size() == 2); ++ CPPUNIT_ASSERT(query->size() == 1); + + // We get test-perl-DBI twice because its in two collections + libdnf::PackageSet pset = *(query->getResultPset()); + DnfPackage *pkg = dnf_package_new(sack, pset[0]); + CPPUNIT_ASSERT(!g_strcmp0(dnf_package_get_name(pkg), "test-perl-DBI")); + g_object_unref(pkg); +- pkg = dnf_package_new(sack, pset[1]); +- CPPUNIT_ASSERT(!g_strcmp0(dnf_package_get_name(pkg), "test-perl-DBI")); +- g_object_unref(pkg); + delete query; + + // When module are setup but none are enabled all collections are not applicable - no enabled module +-- +2.31.1 + diff --git a/SOURCES/0018-Adjust-module-error-formatting-function-for-original.patch b/SOURCES/0018-Adjust-module-error-formatting-function-for-original.patch new file mode 100644 index 0000000..17ad066 --- /dev/null +++ b/SOURCES/0018-Adjust-module-error-formatting-function-for-original.patch @@ -0,0 +1,34 @@ +From c7f0b13bf32cfba63a2db6257c50ae1ba5c8f9ba Mon Sep 17 00:00:00 2001 +From: Jaroslav Mracek +Date: Thu, 6 May 2021 11:18:20 +0200 +Subject: [PATCH 18/19] Adjust module error formatting function for original + modular solver + +The new solver uses libsolv solvable by another way. The revert requires +also change in formatting function. +--- + libdnf/goal/Goal.cpp | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +diff --git a/libdnf/goal/Goal.cpp b/libdnf/goal/Goal.cpp +index a6f11a4f..6b2f91a2 100644 +--- a/libdnf/goal/Goal.cpp ++++ b/libdnf/goal/Goal.cpp +@@ -58,12 +58,8 @@ std::string moduleSolvid2str(Pool * pool, Id source) + { + std::ostringstream ss; + auto * solvable = pool_id2solvable(pool, source); +- // Add name:stream +- ss << solvable_lookup_str(solvable, SOLVABLE_DESCRIPTION); +- //Add version +- ss << ":" << pool_id2str(pool, solvable->evr); +- // Add original context +- ss << ":" << solvable_lookup_str(solvable, SOLVABLE_SUMMARY); ++ // Add name:stream:version:context ++ ss << pool_id2str(pool, solvable->name); + ss << "." << pool_id2str(pool, solvable->arch); + return ss.str(); + } +-- +2.31.1 + diff --git a/SOURCES/0019-Remove-redundant-test.patch b/SOURCES/0019-Remove-redundant-test.patch new file mode 100644 index 0000000..0b2441c --- /dev/null +++ b/SOURCES/0019-Remove-redundant-test.patch @@ -0,0 +1,57 @@ +From eb7217d0a71b92ac0d8c3773caa1a2d3a2c20071 Mon Sep 17 00:00:00 2001 +From: Jaroslav Mracek +Date: Thu, 13 May 2021 09:10:42 +0200 +Subject: [PATCH 19/19] Remove redundant test + +The test is identical to +testGetApplicablePackagesMultipleApplicableCollections(). +--- + tests/libdnf/sack/AdvisoryTest.cpp | 11 ----------- + tests/libdnf/sack/AdvisoryTest.hpp | 2 -- + 2 files changed, 13 deletions(-) + +diff --git a/tests/libdnf/sack/AdvisoryTest.cpp b/tests/libdnf/sack/AdvisoryTest.cpp +index 1abf1a95..f5892634 100644 +--- a/tests/libdnf/sack/AdvisoryTest.cpp ++++ b/tests/libdnf/sack/AdvisoryTest.cpp +@@ -91,17 +91,6 @@ void AdvisoryTest::testGetPackages() + CPPUNIT_ASSERT(pkgsvector.size() == 4); + } + +-void AdvisoryTest::testGetApplicablePackagesModulesNotSetup() +-{ +- std::vector pkgsvector; +- +- // When modules are not setup all advisory collections are applicable and we get all packages +- advisory->getApplicablePackages(pkgsvector); +- CPPUNIT_ASSERT_EQUAL(2, static_cast(pkgsvector.size())); +- CPPUNIT_ASSERT(!g_strcmp0(pkgsvector[0].getNameString(), "test-perl-DBI")); +- CPPUNIT_ASSERT(!g_strcmp0(pkgsvector[1].getNameString(), "not-present")); +-} +- + void AdvisoryTest::testGetApplicablePackagesModulesSetupNoneEnabled() + { + std::vector pkgsvector; +diff --git a/tests/libdnf/sack/AdvisoryTest.hpp b/tests/libdnf/sack/AdvisoryTest.hpp +index 6eb25a57..cb0d8c05 100644 +--- a/tests/libdnf/sack/AdvisoryTest.hpp ++++ b/tests/libdnf/sack/AdvisoryTest.hpp +@@ -19,7 +19,6 @@ class AdvisoryTest : public CppUnit::TestCase + CPPUNIT_TEST(testGetSeverity); + CPPUNIT_TEST(testGetTitle); + CPPUNIT_TEST(testGetPackages); +- CPPUNIT_TEST(testGetApplicablePackagesModulesNotSetup); + CPPUNIT_TEST(testGetApplicablePackagesModulesSetupNoneEnabled); + CPPUNIT_TEST(testGetApplicablePackagesOneApplicableCollection); + CPPUNIT_TEST(testGetApplicablePackagesMultipleApplicableCollections); +@@ -38,7 +37,6 @@ public: + void testGetSeverity(); + void testGetTitle(); + void testGetPackages(); +- void testGetApplicablePackagesModulesNotSetup(); + void testGetApplicablePackagesModulesSetupNoneEnabled(); + void testGetApplicablePackagesOneApplicableCollection(); + void testGetApplicablePackagesMultipleApplicableCollections(); +-- +2.31.1 + diff --git a/SOURCES/0020-Fix-dnf_context_module_install-memory-leaks.patch b/SOURCES/0020-Fix-dnf_context_module_install-memory-leaks.patch new file mode 100644 index 0000000..ea8bcf0 --- /dev/null +++ b/SOURCES/0020-Fix-dnf_context_module_install-memory-leaks.patch @@ -0,0 +1,28 @@ +From 4a8a3f410552c58dfafb384bb361c6e40bebff1d Mon Sep 17 00:00:00 2001 +From: Jaroslav Rohel +Date: Wed, 21 Jul 2021 11:01:32 +0200 +Subject: [PATCH] Fix: dnf_context_module_install: memory leaks + +--- + libdnf/dnf-context.cpp | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/libdnf/dnf-context.cpp b/libdnf/dnf-context.cpp +index 55af2b2..6cb0011 100644 +--- a/libdnf/dnf-context.cpp ++++ b/libdnf/dnf-context.cpp +@@ -3486,7 +3486,10 @@ dnf_context_module_install(DnfContext * context, const char ** module_specs, GEr + } + for (const auto &nevra : modpkg->getArtifacts()) { + int epoch; +- char *name, *version, *release, *arch; ++ g_autofree char *name = nullptr; ++ g_autofree char *version = nullptr; ++ g_autofree char *release = nullptr; ++ g_autofree char *arch = nullptr; + if (hy_split_nevra(nevra.c_str(), &name, &epoch, &version, &release, &arch)) { + // this really should never happen; unless the modular repodata is corrupted + g_autofree char *errmsg = g_strdup_printf (_("Failed to parse module artifact NEVRA '%s'"), nevra.c_str()); +-- +libgit2 1.0.1 + diff --git a/SOURCES/0021-covscan-remove-unused-vars-mark-private-func-static-return-values.patch b/SOURCES/0021-covscan-remove-unused-vars-mark-private-func-static-return-values.patch new file mode 100644 index 0000000..6dca417 --- /dev/null +++ b/SOURCES/0021-covscan-remove-unused-vars-mark-private-func-static-return-values.patch @@ -0,0 +1,91 @@ +From 07416268889f95e1495fb3d7b856de1c502870ba Mon Sep 17 00:00:00 2001 +From: Jaroslav Rohel +Date: Wed, 21 Jul 2021 11:15:50 +0200 +Subject: [PATCH] covscan: remove unused vars, mark private func static, return values + +The `begin` and `end` variables were not used +in `ModulePackageContainer::updateFailSafeData`. Removed. + +The `checksum` in "utils.cpp" is a private (static) function. + +Added check of return value of `dnf_copy_recursive` function in unit test. + +In the `install` in the "goal-py.cpp" file: +Explicitly ignores the return values of `hy_goal_install` and +`hy_goal_install_optional`. The functions always return zero. +Explicitly ignores the return values of `hy_goal_install_selector` and +`hy_goal_install_selector_optional`. The `error` argument is used instead. +--- + libdnf/module/ModulePackageContainer.cpp | 2 -- + libdnf/utils/utils.cpp | 2 +- + python/hawkey/goal-py.cpp | 8 ++++---- + tests/libdnf/module/ModulePackageContainerTest.cpp | 3 ++- + 4 files changed, 7 insertions(+), 8 deletions(-) + +diff --git a/libdnf/module/ModulePackageContainer.cpp b/libdnf/module/ModulePackageContainer.cpp +index c0ad126..efab497 100644 +--- a/libdnf/module/ModulePackageContainer.cpp ++++ b/libdnf/module/ModulePackageContainer.cpp +@@ -1656,8 +1656,6 @@ void ModulePackageContainer::updateFailSafeData() + if (pImpl->activatedModules) { + std::vector latest = pImpl->getLatestActiveEnabledModules(); + +- auto begin = fileNames.begin(); +- auto end = fileNames.end(); + if (g_mkdir_with_parents(pImpl->persistDir.c_str(), 0755) == -1) { + const char * errTxt = strerror(errno); + auto logger(Log::getLogger()); +diff --git a/libdnf/utils/utils.cpp b/libdnf/utils/utils.cpp +index 450718d..15f5275 100644 +--- a/libdnf/utils/utils.cpp ++++ b/libdnf/utils/utils.cpp +@@ -301,7 +301,7 @@ void decompress(const char * inPath, const char * outPath, mode_t outMode, const + fclose(inFile); + } + +-void checksum(const char * type, const char * inPath, const char * checksum_valid, bool * valid_out, gchar ** calculated_out) ++static void checksum(const char * type, const char * inPath, const char * checksum_valid, bool * valid_out, gchar ** calculated_out) + { + GError * errP{nullptr}; + gboolean valid; +diff --git a/python/hawkey/goal-py.cpp b/python/hawkey/goal-py.cpp +index 2641a1d..5bbb959 100644 +--- a/python/hawkey/goal-py.cpp ++++ b/python/hawkey/goal-py.cpp +@@ -281,15 +281,15 @@ install(_GoalObject *self, PyObject *args, PyObject *kwds) try + + if (flags & HY_WEAK_SOLV) { + if (pkg) { +- hy_goal_install_optional(self->goal, pkg); ++ (void)hy_goal_install_optional(self->goal, pkg); + } else { +- hy_goal_install_selector_optional(self->goal, sltr, &error); ++ (void)hy_goal_install_selector_optional(self->goal, sltr, &error); + } + } else { + if (pkg) { +- hy_goal_install(self->goal, pkg); ++ (void)hy_goal_install(self->goal, pkg); + } else { +- hy_goal_install_selector(self->goal, sltr, &error); ++ (void)hy_goal_install_selector(self->goal, sltr, &error); + } + } + return op_error2exc(error); +diff --git a/tests/libdnf/module/ModulePackageContainerTest.cpp b/tests/libdnf/module/ModulePackageContainerTest.cpp +index b2cf170..6360a0c 100644 +--- a/tests/libdnf/module/ModulePackageContainerTest.cpp ++++ b/tests/libdnf/module/ModulePackageContainerTest.cpp +@@ -17,7 +17,8 @@ void ModulePackageContainerTest::setUp() + char *retptr = mkdtemp(tmpdir); + CPPUNIT_ASSERT(retptr); + char * etc_target = g_strjoin(NULL, tmpdir, "/etc", NULL); +- dnf_copy_recursive(TESTDATADIR "/modules/etc", etc_target, &error); ++ auto ret = dnf_copy_recursive(TESTDATADIR "/modules/etc", etc_target, &error); ++ g_assert_true(ret); + g_assert_no_error(error); + g_free(etc_target); + +-- +libgit2 1.0.1 + diff --git a/SOURCES/0022-hawkey-surrogateescape-error-handler-to-decode-UTF-8-strings-RhBug1893176.patch b/SOURCES/0022-hawkey-surrogateescape-error-handler-to-decode-UTF-8-strings-RhBug1893176.patch new file mode 100644 index 0000000..8918c27 --- /dev/null +++ b/SOURCES/0022-hawkey-surrogateescape-error-handler-to-decode-UTF-8-strings-RhBug1893176.patch @@ -0,0 +1,32 @@ +From 263eee36afc0ae5c8f342f4b61038e91ee942b21 Mon Sep 17 00:00:00 2001 +From: Marek Blaha +Date: Thu, 22 Apr 2021 15:19:26 +0200 +Subject: [PATCH] hawkey: surrogateescape error handler to decode UTF-8 strings (RhBug:1893176) + +This ensures that libdnf does not raise UnicodeDecodeError when +accessing package with non UTF-8 file names. + += changelog = +msg: DNF does not fail on non UTF-8 file names in a package +type: bugfix +resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1893176 +--- + python/hawkey/iutil-py.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/python/hawkey/iutil-py.cpp b/python/hawkey/iutil-py.cpp +index 56ccafd..57bef57 100644 +--- a/python/hawkey/iutil-py.cpp ++++ b/python/hawkey/iutil-py.cpp +@@ -285,7 +285,7 @@ strlist_to_pylist(const char **slist) + return NULL; + + for (const char **iter = slist; *iter; ++iter) { +- UniquePtrPyObject str(PyUnicode_FromString(*iter)); ++ UniquePtrPyObject str(PyUnicode_DecodeUTF8(*iter, strlen(*iter), "surrogateescape")); + if (!str) + return NULL; + int rc = PyList_Append(list.get(), str.get()); +-- +libgit2 1.0.1 + diff --git a/SOURCES/0023-Turn-off-strict-validation-of-modulemd-documents-RhBug200485320071662007167.patch b/SOURCES/0023-Turn-off-strict-validation-of-modulemd-documents-RhBug200485320071662007167.patch new file mode 100644 index 0000000..d725378 --- /dev/null +++ b/SOURCES/0023-Turn-off-strict-validation-of-modulemd-documents-RhBug200485320071662007167.patch @@ -0,0 +1,28 @@ +From 6eb68174565ce0402cead9e45053b560e819e982 Mon Sep 17 00:00:00 2001 +From: Aleš Matěj +Date: Tue, 21 Sep 2021 12:10:49 +0200 +Subject: [PATCH] Turn off strict validation of modulemd documents (RhBug:2004853,2007166,2007167) + +https://bugzilla.redhat.com/show_bug.cgi?id=2004853 +https://bugzilla.redhat.com/show_bug.cgi?id=2007166 +https://bugzilla.redhat.com/show_bug.cgi?id=2007167 +--- + libdnf/module/modulemd/ModuleMetadata.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libdnf/module/modulemd/ModuleMetadata.cpp b/libdnf/module/modulemd/ModuleMetadata.cpp +index fbdd8a1..9dcd661 100644 +--- a/libdnf/module/modulemd/ModuleMetadata.cpp ++++ b/libdnf/module/modulemd/ModuleMetadata.cpp +@@ -78,7 +78,7 @@ void ModuleMetadata::addMetadataFromString(const std::string & yaml, int priorit + g_autoptr(GPtrArray) failures = NULL; + + ModulemdModuleIndex * mi = modulemd_module_index_new(); +- gboolean success = modulemd_module_index_update_from_string(mi, yaml.c_str(), TRUE, &failures, &error); ++ gboolean success = modulemd_module_index_update_from_string(mi, yaml.c_str(), FALSE, &failures, &error); + if(!success){ + ModuleMetadata::reportFailures(failures); + } +-- +libgit2 1.0.1 + diff --git a/SOURCES/0024-Add-unittest-for-setting-up-repo-with-empty-keyfile-RhBug1994614.patch b/SOURCES/0024-Add-unittest-for-setting-up-repo-with-empty-keyfile-RhBug1994614.patch new file mode 100644 index 0000000..38ed66b --- /dev/null +++ b/SOURCES/0024-Add-unittest-for-setting-up-repo-with-empty-keyfile-RhBug1994614.patch @@ -0,0 +1,58 @@ +From 551a83052ff92fa975f1015e2fc25b174f85b0e6 Mon Sep 17 00:00:00 2001 +From: Aleš Matěj +Date: Tue, 26 Oct 2021 09:33:51 +0200 +Subject: [PATCH] Add unittest for setting up repo with empty keyfile (RhBug:1994614) + +The test ensures we don't crash when the keyfile is empty/not loaded. +Test for: https://github.com/rpm-software-management/libdnf/commit/be66d0908d939ddaf3022c5489012bd1dbdb0075 + +RHEL bug: +https://bugzilla.redhat.com/show_bug.cgi?id=1994614 +Fedora bug: +https://bugzilla.redhat.com/show_bug.cgi?id=1946024 +--- + tests/libdnf/dnf-self-test.c | 21 +++++++++++++++++++++ + 1 file changed, 21 insertions(+) + +diff --git a/tests/libdnf/dnf-self-test.c b/tests/libdnf/dnf-self-test.c +index 32a21e6..5295837 100644 +--- a/tests/libdnf/dnf-self-test.c ++++ b/tests/libdnf/dnf-self-test.c +@@ -199,6 +199,26 @@ ch_test_repo_func(void) + g_object_unref(context); + } + ++static void ++dnf_repo_setup_with_empty_keyfile(void) ++{ ++ DnfContext *context = dnf_context_new(); ++ dnf_context_set_release_ver(context, "33"); ++ DnfRepo *repo = dnf_repo_new(context); ++ GKeyFile *empty_key_file = g_key_file_new(); ++ ++ dnf_repo_set_keyfile(repo, empty_key_file); ++ ++ GError *error = NULL; ++ // Empty key file is not an errror, there is just no configuration to be loaded. ++ g_assert(dnf_repo_setup(repo, &error)); ++ g_assert_no_error(error); ++ ++ g_object_unref(repo); ++ g_object_unref(context); ++ g_key_file_free(empty_key_file); ++} ++ + static guint _allow_cancel_updates = 0; + static guint _action_updates = 0; + static guint _package_progress_updates = 0; +@@ -1217,6 +1237,7 @@ main(int argc, char **argv) + g_test_add_func("/libdnf/lock", dnf_lock_func); + g_test_add_func("/libdnf/lock[threads]", dnf_lock_threads_func); + g_test_add_func("/libdnf/repo", ch_test_repo_func); ++ g_test_add_func("/libdnf/repo_empty_keyfile", dnf_repo_setup_with_empty_keyfile); + g_test_add_func("/libdnf/state", dnf_state_func); + g_test_add_func("/libdnf/state[child]", dnf_state_child_func); + g_test_add_func("/libdnf/state[parent-1-step]", dnf_state_parent_one_step_proxy_func); +-- +libgit2 1.1.0 + diff --git a/SOURCES/0025-Add-getLatestModules.patch b/SOURCES/0025-Add-getLatestModules.patch new file mode 100644 index 0000000..b008d6a --- /dev/null +++ b/SOURCES/0025-Add-getLatestModules.patch @@ -0,0 +1,90 @@ +From e83ff88f8e4604024e4d5f4fd9f2fa4e5d4f03f9 Mon Sep 17 00:00:00 2001 +From: Jaroslav Mracek +Date: Tue, 23 Nov 2021 14:14:23 +0100 +Subject: [PATCH] Add getLatestModules() + +It returns latest module packages for each module name, stream, and +architecture. + +It is an alternative implementation to code base with +the old modular solver. + +Alternative to 73868368120ceea97ada628a1aa42236fb42b89d +--- + libdnf/module/ModulePackageContainer.cpp | 39 +++++++++++++++++++++++++++++++++++++++ + libdnf/module/ModulePackageContainer.hpp | 9 +++++++++ + 2 files changed, 48 insertions(+) + +diff --git a/libdnf/module/ModulePackageContainer.cpp b/libdnf/module/ModulePackageContainer.cpp +index efab497..f9f861c 100644 +--- a/libdnf/module/ModulePackageContainer.cpp ++++ b/libdnf/module/ModulePackageContainer.cpp +@@ -1037,6 +1037,45 @@ ModulePackageContainer::getLatestModulesPerRepo(ModuleState moduleFilter, + return output; + } + ++std::vector ++ModulePackageContainer::getLatestModules(const std::vector modulePackages, bool activeOnly) ++{ ++ std::vector latestModules; ++ if (activeOnly) { ++ // When no active module return ++ if (!pImpl->activatedModules) { ++ return latestModules; ++ } ++ } ++ std::map> latest; ++ ++ for (auto modulePackage : modulePackages) { ++ if (activeOnly && !isModuleActive(modulePackage)) { ++ continue; ++ } ++ auto nameStreamArch = modulePackage->getNameStream(); ++ nameStreamArch.append(":"); ++ nameStreamArch.append(modulePackage->getArchCStr()); ++ auto & entries = latest[nameStreamArch]; ++ if (entries.empty()) { ++ entries.push_back(modulePackage); ++ } else { ++ auto version = (*entries.begin())->getVersionNum(); ++ if (version < modulePackage->getVersionNum()) { ++ entries.clear(); ++ entries.push_back(modulePackage); ++ } else if (version == modulePackage->getVersionNum()) { ++ entries.push_back(modulePackage); ++ } ++ } ++ } ++ for (auto & entries : latest) { ++ for (auto modulePackage : entries.second) { ++ latestModules.push_back(modulePackage); ++ } ++ } ++ return latestModules; ++} + + std::pair>, ModulePackageContainer::ModuleErrorType> + ModulePackageContainer::resolveActiveModulePackages(bool debugSolver) +diff --git a/libdnf/module/ModulePackageContainer.hpp b/libdnf/module/ModulePackageContainer.hpp +index 7e5071b..42d5a9e 100644 +--- a/libdnf/module/ModulePackageContainer.hpp ++++ b/libdnf/module/ModulePackageContainer.hpp +@@ -132,6 +132,15 @@ public: + std::vector>> getLatestModulesPerRepo( + ModuleState moduleFilter, std::vector modulePackages); + ++ /** ++ * @brief Return all latest ModulePackages for each module Name, stream 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); ++ + std::vector requiresModuleEnablement(const libdnf::PackageSet & packages); + + /** +-- +libgit2 1.1.0 + diff --git a/SOURCES/0026-context-Substitute-all-repository-config-options-RhB.patch b/SOURCES/0026-context-Substitute-all-repository-config-options-RhB.patch new file mode 100644 index 0000000..340d2c5 --- /dev/null +++ b/SOURCES/0026-context-Substitute-all-repository-config-options-RhB.patch @@ -0,0 +1,107 @@ +From 7d8f9cfcdf7725fef2c99ecb2dedcdff1e9506d7 Mon Sep 17 00:00:00 2001 +From: Jaroslav Rohel +Date: Wed, 13 Apr 2022 12:26:10 +0200 +Subject: [PATCH 26/34] context: Substitute all repository config options + (RhBug:2076853) + +It also solves the problem: Substitution of variables in `baseurl` +does not work in microdnf and PackageKit unless `metalink` or `mirrorlist` +is set at the same time. +--- + libdnf/dnf-repo.cpp | 34 +++++++++++++++++++++++++--------- + 1 file changed, 25 insertions(+), 9 deletions(-) + +diff --git a/libdnf/dnf-repo.cpp b/libdnf/dnf-repo.cpp +index 710045fb..9d42e3e3 100644 +--- a/libdnf/dnf-repo.cpp ++++ b/libdnf/dnf-repo.cpp +@@ -83,6 +83,7 @@ typedef struct + LrHandle *repo_handle; + LrResult *repo_result; + LrUrlVars *urlvars; ++ bool unit_test_mode; /* ugly hack for unit tests */ + } DnfRepoPrivate; + + G_DEFINE_TYPE_WITH_PRIVATE(DnfRepo, dnf_repo, G_TYPE_OBJECT) +@@ -847,8 +848,11 @@ dnf_repo_conf_reset(libdnf::ConfigRepo &config) + + /* Loads repository configuration from GKeyFile */ + static void +-dnf_repo_conf_from_gkeyfile(libdnf::ConfigRepo &config, const char *repoId, GKeyFile *gkeyFile) ++dnf_repo_conf_from_gkeyfile(DnfRepo *repo, const char *repoId, GKeyFile *gkeyFile) + { ++ DnfRepoPrivate *priv = GET_PRIVATE(repo); ++ auto & config = *priv->repo->getConfig(); ++ + // Reset to the initial state before reloading the configuration. + dnf_repo_conf_reset(config); + +@@ -883,20 +887,31 @@ dnf_repo_conf_from_gkeyfile(libdnf::ConfigRepo &config, const char *repoId, GKey + // list can be ['value1', 'value2, value3'] therefore we first join + // to have 'value1, value2, value3' + g_autofree gchar * tmp_strval = g_strjoinv(",", list); ++ ++ // Substitute vars. ++ g_autofree gchar *subst_value = dnf_repo_substitute(repo, tmp_strval); ++ ++ if (strcmp(key, "baseurl") == 0 && strstr(tmp_strval, "file://$testdatadir") != NULL) { ++ priv->unit_test_mode = true; ++ } ++ + try { +- optionItem.newString(libdnf::Option::Priority::REPOCONFIG, tmp_strval); ++ optionItem.newString(libdnf::Option::Priority::REPOCONFIG, subst_value); + } catch (const std::exception & ex) { +- g_debug("Invalid configuration value: %s = %s in %s; %s", key, value.c_str(), repoId, ex.what()); ++ g_debug("Invalid configuration value: %s = %s in %s; %s", key, subst_value, repoId, ex.what()); + } + } + + } else { +- + // process other (non list) options ++ ++ // Substitute vars. ++ g_autofree gchar *subst_value = dnf_repo_substitute(repo, value.c_str()); ++ + try { +- optionItem.newString(libdnf::Option::Priority::REPOCONFIG, value); ++ optionItem.newString(libdnf::Option::Priority::REPOCONFIG, subst_value); + } catch (const std::exception & ex) { +- g_debug("Invalid configuration value: %s = %s in %s; %s", key, value.c_str(), repoId, ex.what()); ++ g_debug("Invalid configuration value: %s = %s in %s; %s", key, subst_value, repoId, ex.what()); + } + + } +@@ -950,7 +965,7 @@ dnf_repo_set_keyfile_data(DnfRepo *repo, gboolean reloadFromGKeyFile, GError **e + + // Reload repository configuration from keyfile. + if (reloadFromGKeyFile) { +- dnf_repo_conf_from_gkeyfile(*conf, repoId, priv->keyfile); ++ dnf_repo_conf_from_gkeyfile(repo, repoId, priv->keyfile); + dnf_repo_apply_setopts(*conf, repoId); + } + +@@ -996,8 +1011,9 @@ dnf_repo_set_keyfile_data(DnfRepo *repo, gboolean reloadFromGKeyFile, GError **e + g_autofree gchar *url = NULL; + url = lr_prepend_url_protocol(baseurls[0]); + if (url != NULL && strncasecmp(url, "file://", 7) == 0) { +- if (g_strstr_len(url, -1, "$testdatadir") == NULL) ++ if (!priv->unit_test_mode) { + priv->kind = DNF_REPO_KIND_LOCAL; ++ } + g_free(priv->location); + g_free(priv->keyring); + priv->location = dnf_repo_substitute(repo, url + 7); +@@ -1224,7 +1240,7 @@ dnf_repo_setup(DnfRepo *repo, GError **error) try + auto repoId = priv->repo->getId().c_str(); + + auto conf = priv->repo->getConfig(); +- dnf_repo_conf_from_gkeyfile(*conf, repoId, priv->keyfile); ++ dnf_repo_conf_from_gkeyfile(repo, repoId, priv->keyfile); + dnf_repo_apply_setopts(*conf, repoId); + + auto sslverify = conf->sslverify().getValue(); +-- +2.31.1 + diff --git a/SOURCES/0027-Use-environment-variable-in-unittest-instead-of-ugly.patch b/SOURCES/0027-Use-environment-variable-in-unittest-instead-of-ugly.patch new file mode 100644 index 0000000..31fb712 --- /dev/null +++ b/SOURCES/0027-Use-environment-variable-in-unittest-instead-of-ugly.patch @@ -0,0 +1,50 @@ +From 074ca4cf643c79b8ec3db89a7fd5580ba387eb4d Mon Sep 17 00:00:00 2001 +From: Jaroslav Rohel +Date: Wed, 20 Apr 2022 08:22:30 +0200 +Subject: [PATCH 27/34] Use environment variable in unittest instead of ugly + hack in libdnf + +Libdnf contains hacks for unit tests. This removes one hack. +--- + libdnf/dnf-repo.cpp | 3 --- + tests/libdnf/dnf-self-test.c | 3 +++ + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/libdnf/dnf-repo.cpp b/libdnf/dnf-repo.cpp +index 9d42e3e3..c015d7fd 100644 +--- a/libdnf/dnf-repo.cpp ++++ b/libdnf/dnf-repo.cpp +@@ -1191,7 +1191,6 @@ dnf_repo_setup(DnfRepo *repo, GError **error) try + DnfRepoEnabled enabled = DNF_REPO_ENABLED_NONE; + g_autofree gchar *basearch = NULL; + g_autofree gchar *release = NULL; +- g_autofree gchar *testdatadir = NULL; + + basearch = g_key_file_get_string(priv->keyfile, "general", "arch", NULL); + if (basearch == NULL) +@@ -1230,8 +1229,6 @@ dnf_repo_setup(DnfRepo *repo, GError **error) try + for (const auto & item : libdnf::dnf_context_get_vars(priv->context)) + priv->urlvars = lr_urlvars_set(priv->urlvars, item.first.c_str(), item.second.c_str()); + +- testdatadir = dnf_realpath(TESTDATADIR); +- priv->urlvars = lr_urlvars_set(priv->urlvars, "testdatadir", testdatadir); + if (!lr_handle_setopt(priv->repo_handle, error, LRO_VARSUB, priv->urlvars)) + return FALSE; + if (!lr_handle_setopt(priv->repo_handle, error, LRO_GNUPGHOMEDIR, priv->keyring)) +diff --git a/tests/libdnf/dnf-self-test.c b/tests/libdnf/dnf-self-test.c +index 52958371..906f0e21 100644 +--- a/tests/libdnf/dnf-self-test.c ++++ b/tests/libdnf/dnf-self-test.c +@@ -1225,6 +1225,9 @@ main(int argc, char **argv) + g_log_set_fatal_mask(NULL, G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL); + g_log_set_always_fatal (G_LOG_FATAL_MASK); + ++ /* Sets a variable to replace in repository configurations. */ ++ g_setenv("DNF_VAR_testdatadir", TESTDATADIR, TRUE); ++ + /* tests go here */ + g_test_add_func("/libdnf/repo_loader{gpg-asc}", dnf_repo_loader_gpg_asc_func); + g_test_add_func("/libdnf/repo_loader{gpg-wrong-asc}", dnf_repo_loader_gpg_wrong_asc_func); +-- +2.31.1 + diff --git a/SOURCES/0028-Add-private-API-for-filling-reading-and-verifying-ne.patch b/SOURCES/0028-Add-private-API-for-filling-reading-and-verifying-ne.patch new file mode 100644 index 0000000..dfbfcbd --- /dev/null +++ b/SOURCES/0028-Add-private-API-for-filling-reading-and-verifying-ne.patch @@ -0,0 +1,169 @@ +From 983aeea57d75494fd4ea2ff2903f966136278c15 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Wed, 9 Feb 2022 13:17:00 +0100 +Subject: [PATCH 28/34] Add private API for filling, reading and verifying new + dnf solv userdata + +--- + libdnf/hy-iutil-private.hpp | 24 +++++++++ + libdnf/hy-iutil.cpp | 102 ++++++++++++++++++++++++++++++++++++ + 2 files changed, 126 insertions(+) + +diff --git a/libdnf/hy-iutil-private.hpp b/libdnf/hy-iutil-private.hpp +index e07b1b51..d498c032 100644 +--- a/libdnf/hy-iutil-private.hpp ++++ b/libdnf/hy-iutil-private.hpp +@@ -24,6 +24,30 @@ + #include "hy-iutil.h" + #include "hy-types.h" + #include "sack/packageset.hpp" ++#include ++#include ++ ++// Use 8 bytes for libsolv version (API: solv_toolversion) ++// to be future proof even though it currently is "1.2" ++static constexpr const size_t solv_userdata_solv_toolversion_size{8}; ++static constexpr const std::array solv_userdata_magic{'\0', 'd', 'n', 'f'}; ++static constexpr const std::array solv_userdata_dnf_version{'\0', '1', '.', '0'}; ++ ++static constexpr const int solv_userdata_size = solv_userdata_solv_toolversion_size + \ ++ solv_userdata_magic.size() + \ ++ solv_userdata_dnf_version.size() + \ ++ CHKSUM_BYTES; ++ ++struct SolvUserdata { ++ char dnf_magic[solv_userdata_magic.size()]; ++ char dnf_version[solv_userdata_dnf_version.size()]; ++ char libsolv_version[solv_userdata_solv_toolversion_size]; ++ unsigned char checksum[CHKSUM_BYTES]; ++}__attribute__((packed)); ; ++ ++int solv_userdata_fill(SolvUserdata *solv_userdata, const unsigned char *checksum, GError** error); ++std::unique_ptr solv_userdata_read(FILE *fp); ++int solv_userdata_verify(const SolvUserdata *solv_userdata, const unsigned char *checksum); + + /* crypto utils */ + int checksum_cmp(const unsigned char *cs1, const unsigned char *cs2); +diff --git a/libdnf/hy-iutil.cpp b/libdnf/hy-iutil.cpp +index 2af13197..f81ca52f 100644 +--- a/libdnf/hy-iutil.cpp ++++ b/libdnf/hy-iutil.cpp +@@ -43,6 +43,7 @@ extern "C" { + #include + #include + #include ++#include + #include + #include + } +@@ -182,6 +183,107 @@ int checksum_write(const unsigned char *cs, FILE *fp) + return 0; + } + ++static std::array ++get_padded_solv_toolversion() ++{ ++ std::array padded_solv_toolversion{}; ++ std::string solv_ver_str{solv_toolversion}; ++ std::copy(solv_ver_str.rbegin(), solv_ver_str.rend(), padded_solv_toolversion.rbegin()); ++ ++ return padded_solv_toolversion; ++} ++ ++int ++solv_userdata_fill(SolvUserdata *solv_userdata, const unsigned char *checksum, GError** error) ++{ ++ if (strlen(solv_toolversion) > solv_userdata_solv_toolversion_size) { ++ g_set_error(error, DNF_ERROR, DNF_ERROR_INTERNAL_ERROR, ++ _("Libsolv's solv_toolversion is: %zu long but we expect max of: %zu"), ++ strlen(solv_toolversion), solv_userdata_solv_toolversion_size); ++ return 1; ++ } ++ ++ // copy dnf solv file magic ++ memcpy(solv_userdata->dnf_magic, solv_userdata_magic.data(), solv_userdata_magic.size()); ++ ++ // copy dnf solv file version ++ memcpy(solv_userdata->dnf_version, solv_userdata_dnf_version.data(), solv_userdata_dnf_version.size()); ++ ++ // copy libsolv solv file version ++ memcpy(solv_userdata->libsolv_version, get_padded_solv_toolversion().data(), solv_userdata_solv_toolversion_size); ++ ++ // copy checksum ++ memcpy(solv_userdata->checksum, checksum, CHKSUM_BYTES); ++ ++ return 0; ++} ++ ++ ++std::unique_ptr ++solv_userdata_read(FILE *fp) ++{ ++ unsigned char *dnf_solvfile_userdata_read = NULL; ++ int dnf_solvfile_userdata_len_read; ++ if (!fp) { ++ return nullptr; ++ } ++ ++ int ret_code = solv_read_userdata(fp, &dnf_solvfile_userdata_read, &dnf_solvfile_userdata_len_read); ++ // The userdata layout has to match our struct exactly so we can just cast the memory ++ // allocated by libsolv ++ std::unique_ptr uniq_userdata(reinterpret_cast(dnf_solvfile_userdata_read)); ++ if(ret_code) { ++ g_warning("Failed to read solv userdata: solv_read_userdata returned: %i", ret_code); ++ return nullptr; ++ } ++ ++ if (dnf_solvfile_userdata_len_read != solv_userdata_size) { ++ g_warning("Solv userdata length mismatch, read: %i vs expected: %i", ++ dnf_solvfile_userdata_len_read, solv_userdata_size); ++ return nullptr; ++ } ++ ++ return uniq_userdata; ++} ++ ++gboolean ++solv_userdata_verify(const SolvUserdata *solv_userdata, const unsigned char *checksum) ++{ ++ // check dnf solvfile magic bytes ++ if (memcmp(solv_userdata->dnf_magic, solv_userdata_magic.data(), solv_userdata_magic.size()) != 0) { ++ // This is not dnf header do not read after it ++ g_warning("magic bytes don't match, read: %s vs. dnf solvfile magic: %s", ++ solv_userdata->dnf_magic, solv_userdata_magic.data()); ++ return FALSE; ++ } ++ ++ // check dnf solvfile version ++ if (memcmp(solv_userdata->dnf_version, solv_userdata_dnf_version.data(), solv_userdata_dnf_version.size()) != 0) { ++ // Mismatching dnf solvfile version -> we need to regenerate ++ g_warning("dnf solvfile version doesn't match, read: %s vs. dnf solvfile version: %s", ++ solv_userdata->dnf_version, solv_userdata_dnf_version.data()); ++ return FALSE; ++ } ++ ++ // check libsolv solvfile version ++ if (memcmp(solv_userdata->libsolv_version, get_padded_solv_toolversion().data(), solv_userdata_solv_toolversion_size) != 0) { ++ // Mismatching libsolv solvfile version -> we need to regenerate ++ g_warning("libsolv solvfile version doesn't match, read: %s vs. libsolv version: %s", ++ solv_userdata->libsolv_version, solv_toolversion); ++ return FALSE; ++ } ++ ++ // check solvfile checksum ++ if (checksum_cmp(solv_userdata->checksum, checksum)) { ++ // Mismatching solvfile checksum -> we need to regenerate ++ g_debug("solvfile checksum doesn't match, read: %s vs. repomd checksum: %s", ++ solv_userdata->checksum, checksum); ++ return FALSE; ++ } ++ ++ return TRUE; ++} ++ + int + checksum_type2length(int type) + { +-- +2.31.1 + diff --git a/SOURCES/0029-Use-dnf-solv-userdata-to-check-versions-and-checksum.patch b/SOURCES/0029-Use-dnf-solv-userdata-to-check-versions-and-checksum.patch new file mode 100644 index 0000000..fd7feff --- /dev/null +++ b/SOURCES/0029-Use-dnf-solv-userdata-to-check-versions-and-checksum.patch @@ -0,0 +1,417 @@ +From 465a6a59279bd7fa2680c626ca0f10c059276668 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Wed, 9 Feb 2022 13:18:41 +0100 +Subject: [PATCH 29/34] Use dnf solv userdata to check versions and checksum + (RhBug:2027445) + +Remove unused functions for checksums + += changelog = +msg: Write and check versions and checksums for solvfile cache by using new dnf solvfile userdata (RhBug:2027445) + It is not possible to use old cache files, therefore cache regeneration is triggered automatically. +type: bugfix +resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2027445 +--- + libdnf/dnf-sack.cpp | 254 ++++++++++++++++++++++-------------- + libdnf/hy-iutil-private.hpp | 2 - + libdnf/hy-iutil.cpp | 20 --- + 3 files changed, 156 insertions(+), 120 deletions(-) + +diff --git a/libdnf/dnf-sack.cpp b/libdnf/dnf-sack.cpp +index b9baeaef..61f4807c 100644 +--- a/libdnf/dnf-sack.cpp ++++ b/libdnf/dnf-sack.cpp +@@ -225,17 +225,39 @@ dnf_sack_new(void) + return DNF_SACK(g_object_new(DNF_TYPE_SACK, NULL)); + } + +-static int +-can_use_repomd_cache(FILE *fp_solv, unsigned char cs_repomd[CHKSUM_BYTES]) +-{ +- unsigned char cs_cache[CHKSUM_BYTES]; +- +- if (fp_solv && +- !checksum_read(cs_cache, fp_solv) && +- !checksum_cmp(cs_cache, cs_repomd)) +- return 1; ++// Try to load cached solv file into repo otherwise return FALSE ++static gboolean ++try_to_use_cached_solvfile(const char *path, Repo *repo, int flags, const unsigned char *checksum, GError **err){ ++ FILE *fp_cache = fopen(path, "r"); ++ if (!fp_cache) { ++ // Missing cache files (ENOENT) are not an error and can even be expected in some cases ++ // (such as when repo doesn't have updateinfo/prestodelta metadata). ++ // Use g_debug in order not to pollute the log by default with such entries. ++ if (errno == ENOENT) { ++ g_debug("Failed to open solvfile cache: %s: %s", path, strerror(errno)); ++ } else { ++ g_warning("Failed to open solvfile cache: %s: %s", path, strerror(errno)); ++ } ++ return FALSE; ++ } ++ std::unique_ptr solv_userdata = solv_userdata_read(fp_cache); ++ gboolean ret = TRUE; ++ if (solv_userdata && solv_userdata_verify(solv_userdata.get(), checksum)) { ++ // after reading the header rewind to the begining ++ fseek(fp_cache, 0, SEEK_SET); ++ if (repo_add_solv(repo, fp_cache, flags)) { ++ g_set_error (err, ++ DNF_ERROR, ++ DNF_ERROR_INTERNAL_ERROR, ++ _("repo_add_solv() has failed.")); ++ ret = FALSE; ++ } ++ } else { ++ ret = FALSE; ++ } + +- return 0; ++ fclose(fp_cache); ++ return ret; + } + + void +@@ -375,33 +397,27 @@ load_ext(DnfSack *sack, HyRepo hrepo, _hy_repo_repodata which_repodata, + gboolean done = FALSE; + + char *fn_cache = dnf_sack_give_cache_fn(sack, name, suffix); +- fp = fopen(fn_cache, "r"); + assert(libdnf::repoGetImpl(hrepo)->checksum); +- if (can_use_repomd_cache(fp, libdnf::repoGetImpl(hrepo)->checksum)) { +- int flags = 0; +- /* the updateinfo is not a real extension */ +- if (which_repodata != _HY_REPODATA_UPDATEINFO) +- flags |= REPO_EXTEND_SOLVABLES; +- /* do not pollute the main pool with directory component ids */ +- if (which_repodata == _HY_REPODATA_FILENAMES || which_repodata == _HY_REPODATA_OTHER) +- flags |= REPO_LOCALPOOL; +- done = TRUE; ++ ++ int flags = 0; ++ /* the updateinfo is not a real extension */ ++ if (which_repodata != _HY_REPODATA_UPDATEINFO) ++ flags |= REPO_EXTEND_SOLVABLES; ++ /* do not pollute the main pool with directory component ids */ ++ if (which_repodata == _HY_REPODATA_FILENAMES || which_repodata == _HY_REPODATA_OTHER) ++ flags |= REPO_LOCALPOOL; ++ if (try_to_use_cached_solvfile(fn_cache, repo, flags, libdnf::repoGetImpl(hrepo)->checksum, error)) { + g_debug("%s: using cache file: %s", __func__, fn_cache); +- ret = repo_add_solv(repo, fp, flags); +- if (ret) { +- g_set_error_literal (error, +- DNF_ERROR, +- DNF_ERROR_INTERNAL_ERROR, +- _("failed to add solv")); +- return FALSE; +- } else { +- repo_update_state(hrepo, which_repodata, _HY_LOADED_CACHE); +- repo_set_repodata(hrepo, which_repodata, repo->nrepodata - 1); +- } ++ done = TRUE; ++ repo_update_state(hrepo, which_repodata, _HY_LOADED_CACHE); ++ repo_set_repodata(hrepo, which_repodata, repo->nrepodata - 1); + } ++ if (error && *error) { ++ g_prefix_error(error, _("Loading extension cache %s (%d) failed: "), fn_cache, which_repodata); ++ return FALSE; ++ } ++ + g_free(fn_cache); +- if (fp) +- fclose(fp); + if (done) + return TRUE; + +@@ -514,35 +530,53 @@ write_main(DnfSack *sack, HyRepo hrepo, int switchtosolv, GError **error) + strerror(errno)); + goto done; + } +- rc = repo_write(repo, fp); +- rc |= checksum_write(repoImpl->checksum, fp); +- rc |= fclose(fp); ++ ++ SolvUserdata solv_userdata; ++ if (solv_userdata_fill(&solv_userdata, repoImpl->checksum, error)) { ++ ret = FALSE; ++ fclose(fp); ++ goto done; ++ } ++ ++ Repowriter *writer = repowriter_create(repo); ++ repowriter_set_userdata(writer, &solv_userdata, solv_userdata_size); ++ rc = repowriter_write(writer, fp); ++ repowriter_free(writer); + if (rc) { ++ ret = FALSE; ++ fclose(fp); ++ g_set_error(error, ++ DNF_ERROR, ++ DNF_ERROR_INTERNAL_ERROR, ++ _("While writing primary cache %s repowriter write failed: %i, error: %s"), ++ tmp_fn_templ, rc, pool_errstr(repo->pool)); ++ goto done; ++ } ++ ++ if (fclose(fp)) { + ret = FALSE; + g_set_error (error, + DNF_ERROR, + DNF_ERROR_FILE_INVALID, +- _("write_main() failed writing data: %i"), rc); ++ _("Failed closing tmp file %s: %s"), ++ tmp_fn_templ, strerror(errno)); + goto done; + } + } + if (switchtosolv && repo_is_one_piece(repo)) { ++ repo_empty(repo, 1); + /* switch over to written solv file activate paging */ +- FILE *fp = fopen(tmp_fn_templ, "r"); +- if (fp) { +- repo_empty(repo, 1); +- rc = repo_add_solv(repo, fp, 0); +- fclose(fp); +- if (rc) { +- /* this is pretty fatal */ +- ret = FALSE; +- g_set_error_literal (error, +- DNF_ERROR, +- DNF_ERROR_FILE_INVALID, +- _("write_main() failed to re-load " +- "written solv file")); +- goto done; +- } ++ gboolean loaded = try_to_use_cached_solvfile(tmp_fn_templ, repo, 0, repoImpl->checksum, error); ++ if (error && *error) { ++ g_prefix_error(error, _("Failed to use newly written primary cache: %s: "), tmp_fn_templ); ++ ret = FALSE; ++ goto done; ++ } ++ if (!loaded) { ++ g_set_error(error, DNF_ERROR, DNF_ERROR_INTERNAL_ERROR, ++ _("Failed to use newly written primary cache: %s"), tmp_fn_templ); ++ ret = FALSE; ++ goto done; + } + } + +@@ -569,20 +603,6 @@ write_ext_updateinfo_filter(Repo *repo, Repokey *key, void *kfdata) + return repo_write_stdkeyfilter(repo, key, 0); + } + +-static int +-write_ext_updateinfo(HyRepo hrepo, Repodata *data, FILE *fp) +-{ +- auto repoImpl = libdnf::repoGetImpl(hrepo); +- Repo *repo = repoImpl->libsolvRepo; +- int oldstart = repo->start; +- repo->start = repoImpl->main_end; +- repo->nsolvables -= repoImpl->main_nsolvables; +- int res = repo_write_filtered(repo, fp, write_ext_updateinfo_filter, data, 0); +- repo->start = oldstart; +- repo->nsolvables += repoImpl->main_nsolvables; +- return res; +-} +- + static gboolean + write_ext(DnfSack *sack, HyRepo hrepo, _hy_repo_repodata which_repodata, + const char *suffix, GError **error) +@@ -611,37 +631,78 @@ write_ext(DnfSack *sack, HyRepo hrepo, _hy_repo_repodata which_repodata, + FILE *fp = fdopen(tmp_fd, "w+"); + + g_debug("%s: storing %s to: %s", __func__, repo->name, tmp_fn_templ); +- if (which_repodata != _HY_REPODATA_UPDATEINFO) +- ret |= repodata_write(data, fp); +- else +- ret |= write_ext_updateinfo(hrepo, data, fp); +- ret |= checksum_write(repoImpl->checksum, fp); +- ret |= fclose(fp); ++ ++ SolvUserdata solv_userdata; ++ if (solv_userdata_fill(&solv_userdata, repoImpl->checksum, error)) { ++ fclose(fp); ++ success = FALSE; ++ goto done; ++ } ++ ++ Repowriter *writer = repowriter_create(repo); ++ repowriter_set_userdata(writer, &solv_userdata, solv_userdata_size); ++ if (which_repodata != _HY_REPODATA_UPDATEINFO) { ++ repowriter_set_repodatarange(writer, data->repodataid, data->repodataid + 1); ++ repowriter_set_flags(writer, REPOWRITER_NO_STORAGE_SOLVABLE); ++ ret = repowriter_write(writer, fp); ++ } else { ++ // write only updateinfo repodata ++ int oldstart = repo->start; ++ repo->start = repoImpl->main_end; ++ repo->nsolvables -= repoImpl->main_nsolvables; ++ repowriter_set_flags(writer, REPOWRITER_LEGACY); ++ repowriter_set_keyfilter(writer, write_ext_updateinfo_filter, data); ++ repowriter_set_keyqueue(writer, 0); ++ ret = repowriter_write(writer, fp); ++ repo->start = oldstart; ++ repo->nsolvables += repoImpl->main_nsolvables; ++ } ++ repowriter_free(writer); + if (ret) { ++ success = FALSE; ++ fclose(fp); ++ g_set_error (error, ++ DNF_ERROR, ++ DNF_ERROR_INTERNAL_ERROR, ++ _("While writing extension cache %s (%d): repowriter write failed: %i, error: %s"), ++ tmp_fn_templ, which_repodata, ret, pool_errstr(repo->pool)); ++ goto done; ++ } ++ ++ if (fclose(fp)) { + success = FALSE; + g_set_error (error, + DNF_ERROR, +- DNF_ERROR_FAILED, +- _("write_ext(%1$d) has failed: %2$d"), +- which_repodata, ret); ++ DNF_ERROR_FILE_INVALID, ++ _("While writing extension cache (%d): cannot close temporary file: %s"), ++ which_repodata, tmp_fn_templ); + goto done; + } + } + + if (repo_is_one_piece(repo) && which_repodata != _HY_REPODATA_UPDATEINFO) { + /* switch over to written solv file activate paging */ +- FILE *fp = fopen(tmp_fn_templ, "r"); +- if (fp) { +- int flags = REPO_USE_LOADING | REPO_EXTEND_SOLVABLES; +- /* do not pollute the main pool with directory component ids */ +- if (which_repodata == _HY_REPODATA_FILENAMES || which_repodata == _HY_REPODATA_OTHER) +- flags |= REPO_LOCALPOOL; +- repodata_extend_block(data, repo->start, repo->end - repo->start); +- data->state = REPODATA_LOADING; +- repo_add_solv(repo, fp, flags); +- data->state = REPODATA_AVAILABLE; +- fclose(fp); ++ int flags = REPO_USE_LOADING | REPO_EXTEND_SOLVABLES; ++ /* do not pollute the main pool with directory component ids */ ++ if (which_repodata == _HY_REPODATA_FILENAMES || which_repodata == _HY_REPODATA_OTHER) ++ flags |= REPO_LOCALPOOL; ++ repodata_extend_block(data, repo->start, repo->end - repo->start); ++ data->state = REPODATA_LOADING; ++ int loaded = try_to_use_cached_solvfile(tmp_fn_templ, repo, flags, repoImpl->checksum, error); ++ if (error && *error) { ++ g_prefix_error(error, _("Failed to use newly written extension cache: %s (%d): "), ++ tmp_fn_templ, which_repodata); ++ success = FALSE; ++ goto done; ++ } ++ if (!loaded) { ++ g_set_error(error, DNF_ERROR, DNF_ERROR_INTERNAL_ERROR, ++ _("Failed to use newly written extension cache: %s (%d)"), tmp_fn_templ, which_repodata); ++ success = FALSE; ++ goto done; + } ++ ++ data->state = REPODATA_AVAILABLE; + } + + if (!mv(tmp_fn_templ, fn, error)) { +@@ -672,7 +733,7 @@ load_yum_repo(DnfSack *sack, HyRepo hrepo, GError **error) + + FILE *fp_primary = NULL; + FILE *fp_repomd = NULL; +- FILE *fp_cache = fopen(fn_cache, "r"); ++ + if (!fn_repomd) { + g_set_error (error, + DNF_ERROR, +@@ -693,18 +754,17 @@ load_yum_repo(DnfSack *sack, HyRepo hrepo, GError **error) + } + checksum_fp(repoImpl->checksum, fp_repomd); + +- if (can_use_repomd_cache(fp_cache, repoImpl->checksum)) { ++ if (try_to_use_cached_solvfile(fn_cache, repo, 0, repoImpl->checksum, error)) { + const char *chksum = pool_checksum_str(pool, repoImpl->checksum); + g_debug("using cached %s (0x%s)", name, chksum); +- if (repo_add_solv(repo, fp_cache, 0)) { +- g_set_error (error, +- DNF_ERROR, +- DNF_ERROR_INTERNAL_ERROR, +- _("repo_add_solv() has failed.")); +- retval = FALSE; +- goto out; +- } + repoImpl->state_main = _HY_LOADED_CACHE; ++ goto out; ++ } ++ ++ if (error && *error) { ++ g_prefix_error(error, _("While loading repository failed to use %s: "), fn_cache); ++ retval = FALSE; ++ goto out; + } else { + auto primary = hrepo->getMetadataPath(MD_TYPE_PRIMARY); + if (primary.empty()) { +@@ -733,8 +793,6 @@ load_yum_repo(DnfSack *sack, HyRepo hrepo, GError **error) + repoImpl->state_main = _HY_LOADED_FETCH; + } + out: +- if (fp_cache) +- fclose(fp_cache); + if (fp_repomd) + fclose(fp_repomd); + if (fp_primary) +diff --git a/libdnf/hy-iutil-private.hpp b/libdnf/hy-iutil-private.hpp +index d498c032..efc91c63 100644 +--- a/libdnf/hy-iutil-private.hpp ++++ b/libdnf/hy-iutil-private.hpp +@@ -52,9 +52,7 @@ int solv_userdata_verify(const SolvUserdata *solv_userdata, const unsigned char + /* crypto utils */ + int checksum_cmp(const unsigned char *cs1, const unsigned char *cs2); + int checksum_fp(unsigned char *out, FILE *fp); +-int checksum_read(unsigned char *csout, FILE *fp); + int checksum_stat(unsigned char *out, FILE *fp); +-int checksum_write(const unsigned char *cs, FILE *fp); + int checksumt_l2h(int type); + const char *pool_checksum_str(Pool *pool, const unsigned char *chksum); + +diff --git a/libdnf/hy-iutil.cpp b/libdnf/hy-iutil.cpp +index f81ca52f..c409a10a 100644 +--- a/libdnf/hy-iutil.cpp ++++ b/libdnf/hy-iutil.cpp +@@ -142,17 +142,6 @@ checksum_fp(unsigned char *out, FILE *fp) + return 0; + } + +-/* calls rewind(fp) before returning */ +-int +-checksum_read(unsigned char *csout, FILE *fp) +-{ +- if (fseek(fp, -32, SEEK_END) || +- fread(csout, CHKSUM_BYTES, 1, fp) != 1) +- return 1; +- rewind(fp); +- return 0; +-} +- + /* does not move the fp position */ + int + checksum_stat(unsigned char *out, FILE *fp) +@@ -174,15 +163,6 @@ checksum_stat(unsigned char *out, FILE *fp) + return 0; + } + +-/* moves fp to the end of file */ +-int checksum_write(const unsigned char *cs, FILE *fp) +-{ +- if (fseek(fp, 0, SEEK_END) || +- fwrite(cs, CHKSUM_BYTES, 1, fp) != 1) +- return 1; +- return 0; +-} +- + static std::array + get_padded_solv_toolversion() + { +-- +2.31.1 + diff --git a/SOURCES/0030-Update-unittest-to-test-the-new-private-dnf-solvfile.patch b/SOURCES/0030-Update-unittest-to-test-the-new-private-dnf-solvfile.patch new file mode 100644 index 0000000..56c96c5 --- /dev/null +++ b/SOURCES/0030-Update-unittest-to-test-the-new-private-dnf-solvfile.patch @@ -0,0 +1,83 @@ +From 1e0f8f66f6ff30e177c41be7d72330d5eccf2ff8 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Wed, 9 Feb 2022 13:24:06 +0100 +Subject: [PATCH 30/34] Update unittest to test the new private dnf solvfile + API + +--- + tests/hawkey/test_iutil.cpp | 34 ++++++++++++++++++++++------------ + 1 file changed, 22 insertions(+), 12 deletions(-) + +diff --git a/tests/hawkey/test_iutil.cpp b/tests/hawkey/test_iutil.cpp +index 8d00cc94..f3c04782 100644 +--- a/tests/hawkey/test_iutil.cpp ++++ b/tests/hawkey/test_iutil.cpp +@@ -24,6 +24,8 @@ + + + #include ++#include ++#include + + + #include "libdnf/hy-util.h" +@@ -97,28 +99,36 @@ START_TEST(test_checksum) + } + END_TEST + +-START_TEST(test_checksum_write_read) ++START_TEST(test_dnf_solvfile_userdata) + { + char *new_file = solv_dupjoin(test_globals.tmpdir, +- "/test_checksum_write_read", NULL); ++ "/test_dnf_solvfile_userdata", NULL); + build_test_file(new_file); + + unsigned char cs_computed[CHKSUM_BYTES]; +- unsigned char cs_read[CHKSUM_BYTES]; +- FILE *fp = fopen(new_file, "r"); ++ FILE *fp = fopen(new_file, "r+"); + checksum_fp(cs_computed, fp); +- // fails, file opened read-only: +- fail_unless(checksum_write(cs_computed, fp) == 1); +- fclose(fp); +- fp = fopen(new_file, "r+"); +- fail_if(checksum_write(cs_computed, fp)); ++ ++ SolvUserdata solv_userdata; ++ fail_if(solv_userdata_fill(&solv_userdata, cs_computed, NULL)); ++ ++ Pool *pool = pool_create(); ++ Repo *repo = repo_create(pool, "test_repo"); ++ Repowriter *writer = repowriter_create(repo); ++ repowriter_set_userdata(writer, &solv_userdata, solv_userdata_size); ++ fail_if(repowriter_write(writer, fp)); ++ repowriter_free(writer); + fclose(fp); ++ + fp = fopen(new_file, "r"); +- fail_if(checksum_read(cs_read, fp)); +- fail_if(checksum_cmp(cs_computed, cs_read)); ++ std::unique_ptr dnf_solvfile = solv_userdata_read(fp); ++ fail_unless(dnf_solvfile); ++ fail_unless(solv_userdata_verify(dnf_solvfile.get(), cs_computed)); + fclose(fp); + + g_free(new_file); ++ repo_free(repo, 0); ++ pool_free(pool); + } + END_TEST + +@@ -181,7 +191,7 @@ iutil_suite(void) + TCase *tc = tcase_create("Main"); + tcase_add_test(tc, test_abspath); + tcase_add_test(tc, test_checksum); +- tcase_add_test(tc, test_checksum_write_read); ++ tcase_add_test(tc, test_dnf_solvfile_userdata); + tcase_add_test(tc, test_mkcachedir); + tcase_add_test(tc, test_version_split); + suite_add_tcase(s, tc); +-- +2.31.1 + diff --git a/SOURCES/0031-Increase-required-libsolv-version-for-cache-versioni.patch b/SOURCES/0031-Increase-required-libsolv-version-for-cache-versioni.patch new file mode 100644 index 0000000..37b9497 --- /dev/null +++ b/SOURCES/0031-Increase-required-libsolv-version-for-cache-versioni.patch @@ -0,0 +1,38 @@ +From 893eb087e56588d62e81e91e5d283003bd80552a Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Tue, 8 Mar 2022 11:43:38 +0100 +Subject: [PATCH 31/34] Increase required libsolv version for cache versioning + +--- + CMakeLists.txt | 2 +- + libdnf.spec | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 60cf1b8c..d895b2bf 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -51,7 +51,7 @@ endif() + + # build dependencies + find_package(Gpgme REQUIRED) +-find_package(LibSolv 0.6.30 REQUIRED COMPONENTS ext) ++find_package(LibSolv 0.7.20 REQUIRED COMPONENTS ext) + find_package(OpenSSL REQUIRED) + + +diff --git a/libdnf.spec b/libdnf.spec +index a849cdea..aa51dd28 100644 +--- a/libdnf.spec ++++ b/libdnf.spec +@@ -1,5 +1,5 @@ +-%global libsolv_version 0.7.17 +-%global libmodulemd_version 2.11.2-2 ++%global libsolv_version 0.7.21 ++%global libmodulemd_version 2.13.0 + %global librepo_version 1.13.1 + %global dnf_conflict 4.3.0 + %global swig_version 3.0.12 +-- +2.31.1 + diff --git a/SOURCES/0032-Add-more-specific-error-handling-for-loading-repomd-.patch b/SOURCES/0032-Add-more-specific-error-handling-for-loading-repomd-.patch new file mode 100644 index 0000000..1f0303c --- /dev/null +++ b/SOURCES/0032-Add-more-specific-error-handling-for-loading-repomd-.patch @@ -0,0 +1,46 @@ +From b636af779fcdab326eef7bbb74912254c2fa2b0c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Thu, 17 Mar 2022 10:34:24 +0100 +Subject: [PATCH 32/34] Add more specific error handling for loading repomd and + primary + +--- + libdnf/dnf-sack.cpp | 19 +++++++++++++++---- + 1 file changed, 15 insertions(+), 4 deletions(-) + +diff --git a/libdnf/dnf-sack.cpp b/libdnf/dnf-sack.cpp +index 61f4807c..8e11b8f8 100644 +--- a/libdnf/dnf-sack.cpp ++++ b/libdnf/dnf-sack.cpp +@@ -780,13 +780,24 @@ load_yum_repo(DnfSack *sack, HyRepo hrepo, GError **error) + fp_primary = solv_xfopen(primary.c_str(), "r"); + assert(fp_primary); + +- g_debug("fetching %s", name); +- if (repo_add_repomdxml(repo, fp_repomd, 0) || \ +- repo_add_rpmmd(repo, fp_primary, 0, 0)) { ++ g_debug("Loading repomd: %s", fn_repomd); ++ if (repo_add_repomdxml(repo, fp_repomd, 0)) { + g_set_error (error, + DNF_ERROR, + DNF_ERROR_INTERNAL_ERROR, +- _("repo_add_repomdxml/rpmmd() has failed.")); ++ _("Loading repomd has failed: %s"), ++ pool_errstr(repo->pool)); ++ retval = FALSE; ++ goto out; ++ } ++ ++ g_debug("Loading primary: %s", primary.c_str()); ++ if (repo_add_rpmmd(repo, fp_primary, 0, 0)) { ++ g_set_error (error, ++ DNF_ERROR, ++ DNF_ERROR_INTERNAL_ERROR, ++ _("Loading primary has failed: %s"), ++ pool_errstr(repo->pool)); + retval = FALSE; + goto out; + } +-- +2.31.1 + diff --git a/SOURCES/0033-libdnf-transaction-RPMItem-Fix-handling-transaction-.patch b/SOURCES/0033-libdnf-transaction-RPMItem-Fix-handling-transaction-.patch new file mode 100644 index 0000000..7398fc8 --- /dev/null +++ b/SOURCES/0033-libdnf-transaction-RPMItem-Fix-handling-transaction-.patch @@ -0,0 +1,74 @@ +From c5919efe898294420ec8e91e4eed5b9081e681c5 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hr=C3=A1zk=C3=BD?= +Date: Thu, 17 Feb 2022 18:18:16 +0100 +Subject: [PATCH 33/34] libdnf/transaction/RPMItem: Fix handling transaction id + in resolveTransactionItemReason + +The maxTransactionId argument was ignored, the method was always returning the +reason from the last transaction. This is the correct result for +maxTransactionId = -1. In a couple of places the method is called with +maxTransactionId = -2. Fixing this would mean nontrivial changes to the +logic which could potentially break something else, so I'm leaving this +behavior unchanged. + +For non-negative values of maxTransactionId (with which it's not being called +anywhere in dnf codebase), the commit adds a condition to SELECT only +transaction ids less than or equal to maxTransactionId. + += changelog = +msg: Fix handling transaction id in resolveTransactionItemReason +type: bugfix +resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2053014 +resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2010259 +--- + libdnf/transaction/RPMItem.cpp | 21 ++++++++++++++++++--- + 1 file changed, 18 insertions(+), 3 deletions(-) + +diff --git a/libdnf/transaction/RPMItem.cpp b/libdnf/transaction/RPMItem.cpp +index 5f667ab9..ecce789d 100644 +--- a/libdnf/transaction/RPMItem.cpp ++++ b/libdnf/transaction/RPMItem.cpp +@@ -255,7 +255,11 @@ RPMItem::resolveTransactionItemReason(SQLite3Ptr conn, + const std::string &arch, + int64_t maxTransactionId) + { +- const char *sql = R"**( ++ // NOTE: All negative maxTransactionId values are treated the same. The ++ // method is called with maxTransactionId = -2 in a couple of places, the ++ // semantics here have been the same as with -1 for a long time. If it ++ // ain't broke... ++ std::string sql = R"**( + SELECT + ti.action as action, + ti.reason as reason +@@ -271,14 +275,25 @@ RPMItem::resolveTransactionItemReason(SQLite3Ptr conn, + AND ti.action not in (3, 5, 7, 10) + AND i.name = ? + AND i.arch = ? ++ )**"; ++ ++ if (maxTransactionId >= 0) { ++ sql.append(" AND ti.trans_id <= ?"); ++ } ++ ++ sql.append(R"**( + ORDER BY + ti.trans_id DESC + LIMIT 1 +- )**"; ++ )**"); + + if (arch != "") { + SQLite3::Query query(*conn, sql); +- query.bindv(name, arch); ++ if (maxTransactionId >= 0) { ++ query.bindv(name, arch, maxTransactionId); ++ } else { ++ query.bindv(name, arch); ++ } + + if (query.step() == SQLite3::Statement::StepResult::ROW) { + auto action = static_cast< TransactionItemAction >(query.get< int64_t >("action")); +-- +2.31.1 + diff --git a/SOURCES/0034-libdnf-transaction-TransactionItem-Set-short-action-.patch b/SOURCES/0034-libdnf-transaction-TransactionItem-Set-short-action-.patch new file mode 100644 index 0000000..c7290c1 --- /dev/null +++ b/SOURCES/0034-libdnf-transaction-TransactionItem-Set-short-action-.patch @@ -0,0 +1,33 @@ +From c303b7c3723f3e9fbc43963a62237ea17516fc6b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hr=C3=A1zk=C3=BD?= +Date: Thu, 17 Feb 2022 18:30:14 +0100 +Subject: [PATCH 34/34] libdnf/transaction/TransactionItem: Set short action + for Reason Change + +Sets the "short" (one letter) representation of the Reason Change action +to "C". + +This was likely not ever used before as the only way to create a +transaction with a reason change and something else is rolling back +multiple transactions, which was broken. +--- + libdnf/transaction/TransactionItem.cpp | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/libdnf/transaction/TransactionItem.cpp b/libdnf/transaction/TransactionItem.cpp +index 3b43d1f1..4358038e 100644 +--- a/libdnf/transaction/TransactionItem.cpp ++++ b/libdnf/transaction/TransactionItem.cpp +@@ -51,8 +51,7 @@ static const std::map< TransactionItemAction, std::string > transactionItemActio + {TransactionItemAction::REMOVE, "E"}, + {TransactionItemAction::REINSTALL, "R"}, + {TransactionItemAction::REINSTALLED, "R"}, +- // TODO: replace "?" with something better +- {TransactionItemAction::REASON_CHANGE, "?"}, ++ {TransactionItemAction::REASON_CHANGE, "C"}, + }; + + /* +-- +2.31.1 + diff --git a/SOURCES/0035-Do-not-print-errors-on-failovermethod-repo-option-Rh.patch b/SOURCES/0035-Do-not-print-errors-on-failovermethod-repo-option-Rh.patch new file mode 100644 index 0000000..b9ff0c3 --- /dev/null +++ b/SOURCES/0035-Do-not-print-errors-on-failovermethod-repo-option-Rh.patch @@ -0,0 +1,45 @@ +From c4ee580c73375060b6eb5b3414636688e3d601c3 Mon Sep 17 00:00:00 2001 +From: Marek Blaha +Date: Fri, 10 Jun 2022 15:29:56 +0200 +Subject: [PATCH] Do not print errors on failovermethod repo option + (RhBug:2039906) + += changelog = +msg: Do not print errors if repository config contains failovermethod option +type: bugfix +resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2039906 +--- + libdnf/conf/ConfigRepo.cpp | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/libdnf/conf/ConfigRepo.cpp b/libdnf/conf/ConfigRepo.cpp +index e98ac0af..0cb52f58 100644 +--- a/libdnf/conf/ConfigRepo.cpp ++++ b/libdnf/conf/ConfigRepo.cpp +@@ -22,6 +22,8 @@ + #include "Const.hpp" + #include "Config-private.hpp" + ++#include "bgettext/bgettext-lib.h" ++ + namespace libdnf { + + class ConfigRepo::Impl { +@@ -174,6 +176,14 @@ ConfigRepo::Impl::Impl(Config & owner, ConfigMain & mainConfig) + owner.optBinds().add("enabled_metadata", enabled_metadata); + owner.optBinds().add("user_agent", user_agent); + owner.optBinds().add("countme", countme); ++ owner.optBinds().add("failovermethod", failovermethod, ++ [&](Option::Priority priority, const std::string & value){ ++ if (value != "priority") { ++ throw Option::InvalidValue(_("only the value 'priority' is supported.")); ++ } ++ failovermethod.set(priority, value); ++ }, nullptr, false ++ ); + owner.optBinds().add("sslverifystatus", sslverifystatus); + } + +-- +2.36.1 + diff --git a/SOURCES/0036-sack-query.hpp-Add-a-missing-include.patch b/SOURCES/0036-sack-query.hpp-Add-a-missing-include.patch new file mode 100644 index 0000000..1e3c5c0 --- /dev/null +++ b/SOURCES/0036-sack-query.hpp-Add-a-missing-include.patch @@ -0,0 +1,24 @@ +From 9dbd5f8f0ac3d6d3fab9147a3208623cba698682 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hr=C3=A1zk=C3=BD?= +Date: Tue, 14 Jun 2022 17:26:44 +0200 +Subject: [PATCH] sack/query.hpp: Add a missing include + +--- + libdnf/sack/query.hpp | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/libdnf/sack/query.hpp b/libdnf/sack/query.hpp +index 9e49761c..306b24e3 100644 +--- a/libdnf/sack/query.hpp ++++ b/libdnf/sack/query.hpp +@@ -26,6 +26,7 @@ + #include "../hy-types.h" + #include "../hy-query.h" + #include "../hy-subject.h" ++#include "../nevra.hpp" + #include "../repo/solvable/Dependency.hpp" + #include "../repo/solvable/DependencyContainer.hpp" + #include "../transaction/Swdb.hpp" +-- +2.36.1 + diff --git a/SOURCES/0037-context-dnf_context_remove-accepts-package-spec-as-d.patch b/SOURCES/0037-context-dnf_context_remove-accepts-package-spec-as-d.patch new file mode 100644 index 0000000..5c67e98 --- /dev/null +++ b/SOURCES/0037-context-dnf_context_remove-accepts-package-spec-as-d.patch @@ -0,0 +1,128 @@ +From 876393d5d0cd5f806415dcdc90168e58e66da916 Mon Sep 17 00:00:00 2001 +From: Jaroslav Rohel +Date: Mon, 28 Mar 2022 07:29:48 +0200 +Subject: [PATCH] context: dnf_context_remove accepts `` as dnf, + unify code + +Prior to change, the `dnf_context_remove` function only accepted +the package name (without globs). It was not possible to enter more detailed +specifications and thus, for example, select a specific version of the package +to uninstall - for example, which kernel we want to uninstall. +This patch adds full `` support as in dnf, including support +for globs (wildcards) and searching against 'provides' and 'file provides'. + +Better error handling for `hy_goal_upgrade_selector` in` dnf_context_update`. + +Unification of the function code `dnf_context_install`, `dnf_context_remove`, +`dnf_context_update`. + += changelog = +msg: context: Support (NEVRA forms, provides, file provides) including globs in the dnf_context_remove func +type: enhancement +resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2084602 +--- + libdnf/dnf-context.cpp | 46 ++++++++++++++++++++++++------------------ + 1 file changed, 26 insertions(+), 20 deletions(-) + +diff --git a/libdnf/dnf-context.cpp b/libdnf/dnf-context.cpp +index 6cb0011b..4b055f03 100644 +--- a/libdnf/dnf-context.cpp ++++ b/libdnf/dnf-context.cpp +@@ -2391,10 +2391,9 @@ dnf_context_run(DnfContext *context, GCancellable *cancellable, GError **error) + * Since: 0.1.0 + **/ + gboolean +-dnf_context_install (DnfContext *context, const gchar *name, GError **error) try ++dnf_context_install(DnfContext *context, const gchar *name, GError **error) try + { + DnfContextPrivate *priv = GET_PRIVATE (context); +- g_autoptr(GPtrArray) selector_matches = NULL; + + /* create sack and add sources */ + if (priv->sack == NULL) { +@@ -2405,7 +2404,7 @@ dnf_context_install (DnfContext *context, const gchar *name, GError **error) try + + g_auto(HySubject) subject = hy_subject_create(name); + g_auto(HySelector) selector = hy_subject_get_best_selector(subject, priv->sack, NULL, FALSE, NULL); +- selector_matches = hy_selector_matches(selector); ++ g_autoptr(GPtrArray) selector_matches = hy_selector_matches(selector); + if (selector_matches->len == 0) { + g_set_error(error, + DNF_ERROR, +@@ -2438,31 +2437,33 @@ gboolean + dnf_context_remove(DnfContext *context, const gchar *name, GError **error) try + { + DnfContextPrivate *priv = GET_PRIVATE(context); +- GPtrArray *pkglist; +- hy_autoquery HyQuery query = NULL; +- gboolean ret = TRUE; +- guint i; + + /* create sack and add repos */ + if (priv->sack == NULL) { + dnf_state_reset(priv->state); +- ret = dnf_context_setup_sack(context, priv->state, error); +- if (!ret) ++ if (!dnf_context_setup_sack(context, priv->state, error)) + return FALSE; + } + +- /* find installed packages to remove */ +- query = hy_query_create(priv->sack); +- query->installed(); +- hy_query_filter(query, HY_PKG_NAME, HY_EQ, name); +- pkglist = hy_query_run(query); ++ libdnf::Query query(priv->sack, libdnf::Query::ExcludeFlags::APPLY_EXCLUDES); ++ query.installed(); ++ auto ret = query.filterSubject(name, nullptr, false, true, true, true); ++ if (!ret.first) { ++ g_set_error(error, ++ DNF_ERROR, ++ DNF_ERROR_PACKAGE_NOT_FOUND, ++ "No installed package matches '%s'", name); ++ return FALSE; ++ } ++ ++ g_autoptr(GPtrArray) packages = query.run(); + + /* add each package */ +- for (i = 0; i < pkglist->len; i++) { +- auto pkg = static_cast(g_ptr_array_index(pkglist, i)); ++ for (guint i = 0; i < packages->len; i++) { ++ auto pkg = static_cast(g_ptr_array_index(packages, i)); + hy_goal_erase(priv->goal, pkg); + } +- g_ptr_array_unref(pkglist); ++ + return TRUE; + } CATCH_TO_GERROR(FALSE) + +@@ -2493,8 +2494,7 @@ dnf_context_update(DnfContext *context, const gchar *name, GError **error) try + } + + g_auto(HySubject) subject = hy_subject_create(name); +- g_auto(HySelector) selector = hy_subject_get_best_selector(subject, priv->sack, NULL, FALSE, +- NULL); ++ g_auto(HySelector) selector = hy_subject_get_best_selector(subject, priv->sack, NULL, FALSE, NULL); + g_autoptr(GPtrArray) selector_matches = hy_selector_matches(selector); + if (selector_matches->len == 0) { + g_set_error(error, +@@ -2504,8 +2504,14 @@ dnf_context_update(DnfContext *context, const gchar *name, GError **error) try + return FALSE; + } + +- if (hy_goal_upgrade_selector(priv->goal, selector)) ++ int ret = hy_goal_upgrade_selector(priv->goal, selector); ++ if (ret != 0) { ++ g_set_error(error, ++ DNF_ERROR, ++ ret, ++ "Ill-formed Selector '%s'", name); + return FALSE; ++ } + + return TRUE; + } CATCH_TO_GERROR(FALSE) +-- +2.36.1 + diff --git a/SOURCES/0038-context-Fix-doc-dnf_context_install-remove-update-di.patch b/SOURCES/0038-context-Fix-doc-dnf_context_install-remove-update-di.patch new file mode 100644 index 0000000..379a770 --- /dev/null +++ b/SOURCES/0038-context-Fix-doc-dnf_context_install-remove-update-di.patch @@ -0,0 +1,62 @@ +From 44d75a36d7c8a933119e5b63f180a8c23715ec51 Mon Sep 17 00:00:00 2001 +From: Jaroslav Rohel +Date: Mon, 28 Mar 2022 07:51:45 +0200 +Subject: [PATCH] context: Fix doc dnf_context_install/remove/update/distrosync + +Functions do not support groups - only packages are supported. + +The `dnf_context_remove` function marks all matching packages for removal +- not just the oldest one. +--- + libdnf/dnf-context.cpp | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/libdnf/dnf-context.cpp b/libdnf/dnf-context.cpp +index 4b055f03..fe005430 100644 +--- a/libdnf/dnf-context.cpp ++++ b/libdnf/dnf-context.cpp +@@ -2379,7 +2379,7 @@ dnf_context_run(DnfContext *context, GCancellable *cancellable, GError **error) + /** + * dnf_context_install: + * @context: a #DnfContext instance. +- * @name: A package or group name, e.g. "firefox" or "@gnome-desktop" ++ * @name: A package specification (NEVRA forms, provide, file provide, globs supported) e.g. "firefox" + * @error: A #GError or %NULL + * + * Finds a remote package and marks it to be installed. +@@ -2422,12 +2422,12 @@ dnf_context_install(DnfContext *context, const gchar *name, GError **error) try + /** + * dnf_context_remove: + * @context: a #DnfContext instance. +- * @name: A package or group name, e.g. "firefox" or "@gnome-desktop" ++ * @name: A package specification (NEVRA forms, provide, file provide, globs supported) e.g. "firefox" + * @error: A #GError or %NULL + * + * Finds an installed package and marks it to be removed. + * +- * If multiple packages are available then only the oldest package is removed. ++ * If multiple packages are available, all of them will be removed. + * + * Returns: %TRUE for success, %FALSE otherwise + * +@@ -2470,7 +2470,7 @@ dnf_context_remove(DnfContext *context, const gchar *name, GError **error) try + /** + * dnf_context_update: + * @context: a #DnfContext instance. +- * @name: A package or group name, e.g. "firefox" or "@gnome-desktop" ++ * @name: A package specification (NEVRA forms, provide, file provide, globs supported) e.g. "firefox" + * @error: A #GError or %NULL + * + * Finds an installed and remote package and marks it to be updated. +@@ -2548,7 +2548,7 @@ dnf_context_update_all (DnfContext *context, + /** + * dnf_context_distrosync: + * @context: a #DnfContext instance. +- * @name: A package or group name, e.g. "firefox" or "@gnome-desktop" ++ * @name: A package specification (NEVRA forms, provide, file provide, globs supported) e.g. "firefox" + * @error: A #GError or %NULL + * + * Finds an installed and remote package and marks it to be synchronized with remote version. +-- +2.36.1 + diff --git a/SOURCES/0039-advisory-upgrade-filter-out-advPkgs-with-different-a.patch b/SOURCES/0039-advisory-upgrade-filter-out-advPkgs-with-different-a.patch new file mode 100644 index 0000000..ad93526 --- /dev/null +++ b/SOURCES/0039-advisory-upgrade-filter-out-advPkgs-with-different-a.patch @@ -0,0 +1,100 @@ +From cf4893a0128c567ed1fdd1b02c9cf2b43bfb02f7 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Mon, 30 May 2022 08:59:41 +0200 +Subject: [PATCH] advisory upgrade: filter out advPkgs with different arch + +This prevents a situation in security upgrades where libsolv cannot +upgrade dependent pkgs because we ask for an upgrade of different arch: + +We can get the following testcase if libdnf has filtered out +json-c-2-2.el8.x86_64@rhel-8-for-x86_64-baseos-rpms +(because there is an advisory for already installed json-c-1-1.el8.x86_64) but +json-c-2-2.el8.i686@rhel-8-for-x86_64-baseos-rpms is not filtered out because +it has different architecture. The resulting transaction doesn't work. + +``` +repo @System -99.-1000 testtags +#>=Pkg: bind-libs-lite 1 1.el8 x86_64 +#>=Pkg: json-c 1 1.el8 x86_64 + +repo rhel-8-for-x86_64-baseos-rpms -99.-1000 testtags +#>=Pkg: json-c 2 2.el8 x86_64 +#>=Prv: libjson-c.so.4()(64bit) +#> +#>=Pkg: json-c 2 2.el8 i686 +#>=Prv: libjson-c.so.4() +#> +#>=Pkg: bind-libs-lite 2 2.el8 x86_64 +#>=Req: libjson-c.so.4()(64bit) +system x86_64 rpm @System +job update oneof json-c-1-1.el8.x86_64@@System json-c-2-2.el8.i686@rhel-8-for-x86_64-baseos-rpms bind-libs-lite-2-2.el8.x86_64@rhel-8-for-x86_64-baseos-rpms [forcebest,targeted,setevr,setarch] +result transaction,problems +#>problem f06d81a4 info package bind-libs-lite-2-2.el8.x86_64 requires libjson-c.so.4()(64bit), but none of the providers can be installed +#>problem f06d81a4 solution 96f9031b allow bind-libs-lite-1-1.el8.x86_64@@System +#>problem f06d81a4 solution c8daf94f allow json-c-2-2.el8.x86_64@rhel-8-for-x86_64-baseos-rpms +#>upgrade bind-libs-lite-1-1.el8.x86_64@@System bind-libs-lite-2-2.el8.x86_64@rhel-8-for-x86_64-baseos-rpms +#>upgrade json-c-1-1.el8.x86_64@@System json-c-2-2.el8.x86_64@rhel-8-for-x86_64-baseos-rpms``` +``` + += changelog = +msg: Filter out advisory pkgs with different arch during advisory upgrade, fixes possible problems in dependency resulution. +type: bugfix +resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2088149 +--- + libdnf/sack/query.cpp | 25 +++++++++++++++++++------ + 1 file changed, 19 insertions(+), 6 deletions(-) + +diff --git a/libdnf/sack/query.cpp b/libdnf/sack/query.cpp +index ac2736b5..03d39659 100644 +--- a/libdnf/sack/query.cpp ++++ b/libdnf/sack/query.cpp +@@ -1877,12 +1877,6 @@ Query::Impl::filterAdvisory(const Filter & f, Map *m, int keyname) + std::vector candidates; + std::vector installed_solvables; + +- Id id = -1; +- while ((id = resultPset->next(id)) != -1) { +- candidates.push_back(pool_id2solvable(pool, id)); +- } +- NameArchEVRComparator cmp_key(pool); +- + if (cmp_type & HY_UPGRADE) { + Query installed(sack, ExcludeFlags::IGNORE_EXCLUDES); + installed.installed(); +@@ -1893,6 +1887,18 @@ Query::Impl::filterAdvisory(const Filter & f, Map *m, int keyname) + installed_solvables.push_back(pool_id2solvable(pool, installed_id)); + } + std::sort(installed_solvables.begin(), installed_solvables.end(), NameArchSolvableComparator); ++ Id id = -1; ++ while ((id = resultPset->next(id)) != -1) { ++ Solvable * s = pool_id2solvable(pool, id); ++ // When doing HY_UPGRADE consider only candidate pkgs that have matching Name and Arch ++ // with some already installed pkg (in other words: some other version of the pkg is already installed). ++ // Otherwise a pkg with different Arch than installed can end up in upgrade set which is wrong. ++ // It can result in dependency issues, reported as: RhBug:2088149. ++ auto low = std::lower_bound(installed_solvables.begin(), installed_solvables.end(), s, NameArchSolvableComparator); ++ if (low != installed_solvables.end() && s->name == (*low)->name && s->arch == (*low)->arch) { ++ candidates.push_back(s); ++ } ++ } + + // Apply security filters only to packages with lower priority - to unify behaviour upgrade + // and upgrade-minimal +@@ -1915,7 +1921,14 @@ Query::Impl::filterAdvisory(const Filter & f, Map *m, int keyname) + } + } + std::swap(candidates, priority_candidates); ++ } else { ++ Id id = -1; ++ while ((id = resultPset->next(id)) != -1) { ++ candidates.push_back(pool_id2solvable(pool, id)); ++ } + } ++ ++ NameArchEVRComparator cmp_key(pool); + std::sort(candidates.begin(), candidates.end(), cmp_key); + for (auto & advisoryPkg : pkgs) { + if (cmp_type & HY_UPGRADE) { +-- +2.36.1 + diff --git a/SOURCES/0040-Add-obsoletes-to-filtering-for-advisory-candidates.patch b/SOURCES/0040-Add-obsoletes-to-filtering-for-advisory-candidates.patch new file mode 100644 index 0000000..e3f7167 --- /dev/null +++ b/SOURCES/0040-Add-obsoletes-to-filtering-for-advisory-candidates.patch @@ -0,0 +1,71 @@ +From 652977360c4253faff9e95d35c603b2f585671fe Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Tue, 5 Jul 2022 09:02:22 +0200 +Subject: [PATCH] Add obsoletes to filtering for advisory candidates + +Patch https://github.com/rpm-software-management/libdnf/pull/1526 +introduced a regression where we no longer do a security upgrade if a +package A is installed and package B obsoletes A and B is available in two +versions while there is an advisory for the second version. + +Test: https://github.com/rpm-software-management/ci-dnf-stack/pull/1130 +--- + libdnf/sack/query.cpp | 32 ++++++++++++++++++++++++++++---- + 1 file changed, 28 insertions(+), 4 deletions(-) + +diff --git a/libdnf/sack/query.cpp b/libdnf/sack/query.cpp +index 03d39659..5355f9f7 100644 +--- a/libdnf/sack/query.cpp ++++ b/libdnf/sack/query.cpp +@@ -1878,6 +1878,13 @@ Query::Impl::filterAdvisory(const Filter & f, Map *m, int keyname) + std::vector installed_solvables; + + if (cmp_type & HY_UPGRADE) { ++ // When doing HY_UPGRADE consider only candidate pkgs that have matching Name and Arch with: ++ // * some already installed pkg (in other words: some other version of the pkg is already installed) ++ // or ++ // * with pkg that obsoletes some already installed (or to be installed in this transaction) pkg ++ // Otherwise a pkg with different Arch than installed can end up in upgrade set which is wrong. ++ // It can result in dependency issues, reported as: RhBug:2088149. ++ + Query installed(sack, ExcludeFlags::IGNORE_EXCLUDES); + installed.installed(); + installed.addFilter(HY_PKG_LATEST_PER_ARCH, HY_EQ, 1); +@@ -1887,13 +1894,30 @@ Query::Impl::filterAdvisory(const Filter & f, Map *m, int keyname) + installed_solvables.push_back(pool_id2solvable(pool, installed_id)); + } + std::sort(installed_solvables.begin(), installed_solvables.end(), NameArchSolvableComparator); ++ ++ Query obsoletes(sack, ExcludeFlags::IGNORE_EXCLUDES); ++ obsoletes.addFilter(HY_PKG, HY_EQ, resultPset); ++ obsoletes.available(); ++ ++ Query possibly_obsoleted(sack, ExcludeFlags::IGNORE_EXCLUDES); ++ possibly_obsoleted.addFilter(HY_PKG, HY_EQ, resultPset); ++ possibly_obsoleted.addFilter(HY_PKG_UPGRADES, HY_EQ, 1); ++ possibly_obsoleted.queryUnion(installed); ++ possibly_obsoleted.apply(); ++ ++ obsoletes.addFilter(HY_PKG_OBSOLETES, HY_EQ, possibly_obsoleted.runSet()); ++ obsoletes.apply(); ++ Id obsoleted_id = -1; ++ // Add to candidates resultPset pkgs that obsolete some installed (or to be installed in this transaction) pkg ++ while ((obsoleted_id = obsoletes.pImpl->result->next(obsoleted_id)) != -1) { ++ Solvable * s = pool_id2solvable(pool, obsoleted_id); ++ candidates.push_back(s); ++ } ++ + Id id = -1; ++ // Add to candidates resultPset pkgs that match name and arch with some already installed pkg + while ((id = resultPset->next(id)) != -1) { + Solvable * s = pool_id2solvable(pool, id); +- // When doing HY_UPGRADE consider only candidate pkgs that have matching Name and Arch +- // with some already installed pkg (in other words: some other version of the pkg is already installed). +- // Otherwise a pkg with different Arch than installed can end up in upgrade set which is wrong. +- // It can result in dependency issues, reported as: RhBug:2088149. + auto low = std::lower_bound(installed_solvables.begin(), installed_solvables.end(), s, NameArchSolvableComparator); + if (low != installed_solvables.end() && s->name == (*low)->name && s->arch == (*low)->arch) { + candidates.push_back(s); +-- +2.36.1 + diff --git a/SOURCES/0041-Fix-listing-a-repository-without-cpeid-RhBug-2066334.patch b/SOURCES/0041-Fix-listing-a-repository-without-cpeid-RhBug-2066334.patch new file mode 100644 index 0000000..bd49822 --- /dev/null +++ b/SOURCES/0041-Fix-listing-a-repository-without-cpeid-RhBug-2066334.patch @@ -0,0 +1,35 @@ +From 3a3929a27734aa77c980610a43039cb6b2b6d658 Mon Sep 17 00:00:00 2001 +From: Jan Kolarik +Date: Wed, 10 Aug 2022 05:21:38 +0000 +Subject: [PATCH] Fix listing a repository without cpeid (RhBug:2066334) + += changelog = +type: bugfix +resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2066334 +--- + libdnf/repo/Repo.cpp | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +diff --git a/libdnf/repo/Repo.cpp b/libdnf/repo/Repo.cpp +index e3a574fb..d61a24a5 100644 +--- a/libdnf/repo/Repo.cpp ++++ b/libdnf/repo/Repo.cpp +@@ -1021,8 +1021,13 @@ bool Repo::Impl::loadCache(bool throwExcept, bool ignoreMissing) + for (auto elem = yum_repomd->distro_tags; elem; elem = g_slist_next(elem)) { + if (elem->data) { + auto distroTag = static_cast(elem->data); +- if (distroTag->tag) +- distro_tags.emplace_back(distroTag->cpeid, distroTag->tag); ++ if (distroTag->tag) { ++ std::string cpeid_str; ++ if (distroTag->cpeid) { ++ cpeid_str = distroTag->cpeid; ++ } ++ distro_tags.emplace_back(std::move(cpeid_str), distroTag->tag); ++ } + } + } + +-- +2.37.1 + diff --git a/SOURCES/0042-Allow-change-of-arch-during-security-updates-with-no.patch b/SOURCES/0042-Allow-change-of-arch-during-security-updates-with-no.patch new file mode 100644 index 0000000..842b3eb --- /dev/null +++ b/SOURCES/0042-Allow-change-of-arch-during-security-updates-with-no.patch @@ -0,0 +1,89 @@ +From af5493156ecb1af3aedd5559a9a60b5df54a17ac Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Wed, 7 Sep 2022 09:07:04 +0200 +Subject: [PATCH] Allow change of arch during security updates with noarch + (RhBug:2124483) + +This matches upgrade behaviour where upgrading from/to noarch is a +special case and architecture change of a package is allowed +automatically. + += changelog = +msg: Allow change of architecture for packages during security updates with noarch involved +type: security +resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2124483 +--- + libdnf/sack/query.cpp | 34 ++++++++++++++++++++++++---------- + 1 file changed, 24 insertions(+), 10 deletions(-) + +diff --git a/libdnf/sack/query.cpp b/libdnf/sack/query.cpp +index 5355f9f7..b7b1560e 100644 +--- a/libdnf/sack/query.cpp ++++ b/libdnf/sack/query.cpp +@@ -189,6 +189,13 @@ NameArchSolvableComparator(const Solvable * first, const Solvable * second) + return first->arch < second->arch; + } + ++static bool ++NameSolvableComparator(const Solvable * first, const Solvable * second) ++{ ++ return first->name < second->name; ++} ++ ++ + static bool + NamePrioritySolvableKey(const Solvable * first, const Solvable * second) + { +@@ -1878,11 +1885,14 @@ Query::Impl::filterAdvisory(const Filter & f, Map *m, int keyname) + std::vector installed_solvables; + + if (cmp_type & HY_UPGRADE) { +- // When doing HY_UPGRADE consider only candidate pkgs that have matching Name and Arch with: +- // * some already installed pkg (in other words: some other version of the pkg is already installed) +- // or +- // * with pkg that obsoletes some already installed (or to be installed in this transaction) pkg +- // Otherwise a pkg with different Arch than installed can end up in upgrade set which is wrong. ++ // When doing HY_UPGRADE consider only candidate pkgs that: ++ // * have matching Name and Arch with some already installed pkg ++ // (in other words: some other version of the pkg is already installed) ++ // * have matching Name with some already installed pkg and either the candidate or the installed pkg is noarch. ++ // This matches upgrade behavior where we allow architecture change only when noarch is involved. ++ // Details: RhBug:2124483, RhBug:2101398 and RhBug:1171543 ++ // * obsoletes some already installed (or to be installed in this transaction) pkg ++ // Otherwise a pkg with different Arch than installed (and than noarch) can end up in upgrade set which is wrong. + // It can result in dependency issues, reported as: RhBug:2088149. + + Query installed(sack, ExcludeFlags::IGNORE_EXCLUDES); +@@ -1893,7 +1903,7 @@ Query::Impl::filterAdvisory(const Filter & f, Map *m, int keyname) + while ((installed_id = installed.pImpl->result->next(installed_id)) != -1) { + installed_solvables.push_back(pool_id2solvable(pool, installed_id)); + } +- std::sort(installed_solvables.begin(), installed_solvables.end(), NameArchSolvableComparator); ++ std::sort(installed_solvables.begin(), installed_solvables.end(), NameSolvableComparator); + + Query obsoletes(sack, ExcludeFlags::IGNORE_EXCLUDES); + obsoletes.addFilter(HY_PKG, HY_EQ, resultPset); +@@ -1915,12 +1925,16 @@ Query::Impl::filterAdvisory(const Filter & f, Map *m, int keyname) + } + + Id id = -1; +- // Add to candidates resultPset pkgs that match name and arch with some already installed pkg ++ // Add to candidates resultPset pkgs that match name and arch with some already installed pkg or match name and either the installed or candidate are NOARCH + while ((id = resultPset->next(id)) != -1) { + Solvable * s = pool_id2solvable(pool, id); +- auto low = std::lower_bound(installed_solvables.begin(), installed_solvables.end(), s, NameArchSolvableComparator); +- if (low != installed_solvables.end() && s->name == (*low)->name && s->arch == (*low)->arch) { +- candidates.push_back(s); ++ auto low = std::lower_bound(installed_solvables.begin(), installed_solvables.end(), s, NameSolvableComparator); ++ while (low != installed_solvables.end() && (*low)->name == s->name) { ++ if (s->arch == (*low)->arch || s->arch == ARCH_NOARCH || (*low)->arch == ARCH_NOARCH) { ++ candidates.push_back(s); ++ break; ++ } ++ ++low; + } + } + +-- +2.37.3 + diff --git a/SOURCES/0043-Update-translations.patch b/SOURCES/0043-Update-translations.patch new file mode 100644 index 0000000..fbaa36e --- /dev/null +++ b/SOURCES/0043-Update-translations.patch @@ -0,0 +1,6115 @@ +From f589ca81e55711e6824b8d4b043c5b48b304585a Mon Sep 17 00:00:00 2001 +From: Marek Blaha +Date: Wed, 8 Mar 2023 10:41:40 +0100 +Subject: [PATCH] Update translations + +--- + po/fr.po | 596 +++++++++++++++++++++++++----------- + po/ja.po | 645 ++++++++++++++++++++++++++++----------- + po/ko.po | 828 ++++++++++++++++++++++++++++++++------------------ + po/libdnf.pot | 504 +++++++++++++++++++++--------- + po/zh_CN.po | 752 +++++++++++++++++++++++++++++---------------- + 5 files changed, 2284 insertions(+), 1041 deletions(-) + +diff --git a/po/fr.po b/po/fr.po +index 055cdaff..c1aa4199 100644 +--- a/po/fr.po ++++ b/po/fr.po +@@ -2,23 +2,27 @@ + # José Fournier , 2016. #zanata + # José Fournier , 2017. #zanata + # Jérôme Fenal , 2017. #zanata +-# Ludek Janda , 2018. #zanata ++# Ludek Janda , 2018. #zanata, 2021, 2022. + # Jean-Baptiste Holcroft , 2019. #zanata + # Julien Humbert , 2020. ++# Sundeep Anand , 2021. ++# Titouan Bénard , 2021. ++# blutch112 , 2022. + msgid "" + msgstr "" + "Project-Id-Version: PACKAGE VERSION\n" + "Report-Msgid-Bugs-To: \n" +-"POT-Creation-Date: 2020-10-05 09:18-0400\n" +-"PO-Revision-Date: 2020-06-29 02:40+0000\n" +-"Last-Translator: Julien Humbert \n" +-"Language-Team: French \n" ++"POT-Creation-Date: 2023-02-28 09:11+0100\n" ++"PO-Revision-Date: 2022-11-06 17:19+0000\n" ++"Last-Translator: blutch112 \n" ++"Language-Team: French \n" + "Language: fr\n" + "MIME-Version: 1.0\n" + "Content-Type: text/plain; charset=UTF-8\n" + "Content-Transfer-Encoding: 8bit\n" + "Plural-Forms: nplurals=2; plural=n > 1;\n" +-"X-Generator: Weblate 4.1.1\n" ++"X-Generator: Weblate 4.14.2\n" + + #: libdnf/conf/ConfigMain.cpp:62 libdnf/conf/OptionSeconds.cpp:40 + msgid "no value specified" +@@ -39,17 +43,34 @@ msgstr "n’a pu convertir « %s » en octets" + msgid "unknown unit '%s'" + msgstr "unité « %s » inconnue" + +-#: libdnf/conf/ConfigMain.cpp:332 ++#: libdnf/conf/ConfigMain.cpp:204 libdnf/conf/OptionEnum.cpp:83 ++#: libdnf/conf/OptionNumber.cpp:88 ++msgid "invalid value" ++msgstr "valeur non valide" ++ ++#: libdnf/conf/ConfigMain.cpp:207 ++msgid "value 1 is not allowed" ++msgstr "la valeur 1 n’est pas autorisée" ++ ++#: libdnf/conf/ConfigMain.cpp:209 ++msgid "negative value is not allowed" ++msgstr "la valeur négative n'est pas autorisée" ++ ++#: libdnf/conf/ConfigMain.cpp:341 + #, c-format + msgid "percentage '%s' is out of range" + msgstr "le pourcentage « %s » est en dehors des limites" + +-#: libdnf/conf/OptionBinds.cpp:76 ++#: libdnf/conf/ConfigRepo.cpp:182 ++msgid "only the value 'priority' is supported." ++msgstr "seule la valeur 'priority' est prise en charge." ++ ++#: libdnf/conf/OptionBinds.cpp:85 + #, c-format + msgid "Configuration: OptionBinding with id \"%s\" does not exist" + msgstr "Configuration : OptionBinding ayant pour id « %s » n’existe pas" + +-#: libdnf/conf/OptionBinds.cpp:88 ++#: libdnf/conf/OptionBinds.cpp:97 + #, c-format + msgid "Configuration: OptionBinding with id \"%s\" already exists" + msgstr "Configuration : OptionBinding ayant pour « %s » n’existe pas" +@@ -60,15 +81,11 @@ msgid "invalid boolean value '%s'" + msgstr "valeur booléenne invalide : « %s »" + + #: libdnf/conf/OptionEnum.cpp:72 libdnf/conf/OptionEnum.cpp:158 +-#: libdnf/conf/OptionString.cpp:59 libdnf/conf/OptionStringList.cpp:59 ++#: libdnf/conf/OptionString.cpp:64 libdnf/conf/OptionStringList.cpp:59 + #, c-format + msgid "'%s' is not an allowed value" + msgstr "la valeur « %s » n’est pas autorisée" + +-#: libdnf/conf/OptionEnum.cpp:83 libdnf/conf/OptionNumber.cpp:88 +-msgid "invalid value" +-msgstr "valeur non valide" +- + #: libdnf/conf/OptionNumber.cpp:73 + #, c-format + msgid "given value [%d] should be less than allowed value [%d]." +@@ -94,27 +111,141 @@ msgstr "le chemin fourni « %s » n’existe pas." + msgid "could not convert '%s' to seconds" + msgstr "n’a pu convertir « %s » en secondes" + +-#: libdnf/conf/OptionString.cpp:74 ++#: libdnf/conf/OptionString.cpp:79 + msgid "GetValue(): Value not set" + msgstr "GetValue() : valeur non définie" + +-#: libdnf/dnf-goal.cpp:68 ++#: libdnf/dnf-context.cpp:3176 libdnf/dnf-context.cpp:3185 ++#, c-format ++msgid "Cannot enable more streams from module '%s' at the same time" ++msgstr "Ne peut pas activer plus de flux du module '%s' en même temps" ++ ++#: libdnf/dnf-context.cpp:3194 libdnf/dnf-context.cpp:3212 ++#, c-format ++msgid "" ++"Cannot enable module '%1$s' stream '%2$s': State of module already modified" ++msgstr "" ++"Impossible d'activer le flux de module '%1$s' stream '%2$s' : état du module " ++"déjà modifié" ++ ++#: libdnf/dnf-context.cpp:3259 ++#, c-format ++msgid "Modular dependency problem with Defaults: %s" ++msgstr "Problème de dépendance modulaire avec les valeurs par défaut : %s" ++ ++#: libdnf/dnf-context.cpp:3262 ++#, c-format ++msgid "Modular dependency problem: %s" ++msgstr "Problème de dépendance modulaire : %s" ++ ++#: libdnf/dnf-context.cpp:3296 libdnf/dnf-context.cpp:3320 ++#: libdnf/dnf-context.cpp:3331 libdnf/dnf-context.cpp:3370 ++#: libdnf/dnf-context.cpp:3386 libdnf/dnf-context.cpp:3418 ++#: libdnf/dnf-context.cpp:3462 libdnf/dnf-context.cpp:3472 ++#, c-format ++msgid "Unable to resolve argument '%s'" ++msgstr "Impossible de résoudre le paramètre ’%s’" ++ ++#: libdnf/dnf-context.cpp:3303 ++#, c-format ++msgid "" ++"Only module name is required. Ignoring unneeded information in argument: '%s'" ++msgstr "" ++"Seul le nom du module est nécessaire. Les paramètres inutiles ont été " ++"ignorés : ’%s’" ++ ++#: libdnf/dnf-context.cpp:3317 ++#, c-format ++msgid "Cannot reset module '%s': State of module already modified" ++msgstr "" ++"Impossible de réinitialiser le module '%s' : État du module déjà modifié" ++ ++#: libdnf/dnf-context.cpp:3328 ++#, c-format ++msgid "Cannot disable module '%s': State of module already modified" ++msgstr "Impossible de désactiver le module '%s' : État du module déjà modifié" ++ ++#: libdnf/dnf-context.cpp:3359 libdnf/dnf-context.cpp:3451 ++#: libdnf/dnf-context.cpp:3564 ++msgid "No modular data available" ++msgstr "Aucune donnée modulaire disponible" ++ ++#: libdnf/dnf-context.cpp:3376 ++#, c-format ++msgid "Ignoring unneeded information in argument: '%s'" ++msgstr "Ignorer les informations inutiles dans l'argumentation : '%s'" ++ ++#: libdnf/dnf-context.cpp:3414 ++#, c-format ++msgid "" ++"Problem during enablement of dependency tree for module '%1$s' stream " ++"'%2$s': %3$s" ++msgstr "" ++"Problème lors de l'activation de l'arbre des dépendances pour le module " ++"'%1$s' flux '%2$s' : %3$s" ++ ++#: libdnf/dnf-context.cpp:3426 ++msgid "Problems appeared for module enable request" ++msgstr "Des problèmes sont apparus pour la demande d'activation du module" ++ ++#. this really should never happen; unless the modular repodata is corrupted ++#: libdnf/dnf-context.cpp:3501 ++#, c-format ++msgid "Failed to parse module artifact NEVRA '%s'" ++msgstr "Échec de l'analyse de l'artefact de module '%s'" ++ ++#: libdnf/dnf-context.cpp:3535 ++msgid "Problems appeared for module install request" ++msgstr "Des problèmes sont apparus pour la demande d'installation du module" ++ ++#: libdnf/dnf-context.cpp:3595 ++msgid "Problems appeared for module reset request" ++msgstr "" ++"Des problèmes sont apparus pour la demande de réinitialisation des modules" ++ ++#: libdnf/dnf-context.cpp:3597 ++msgid "Problems appeared for module disable request" ++msgstr "Des problèmes sont apparus pour la demande de désactivation du module" ++ ++#: libdnf/dnf-context.cpp:3633 ++#, c-format ++msgid "" ++"The operation would result in switching of module '%s' stream '%s' to stream " ++"'%s'" ++msgstr "" ++"Le résultat de l’opération sera le basculement du flux « %s » du module « %s " ++"» vers le flux « %s »" ++ ++#: libdnf/dnf-context.cpp:3637 ++msgid "" ++"It is not possible to switch enabled streams of a module.\n" ++"It is recommended to remove all installed content from the module, and reset " ++"the module using 'microdnf module reset ' command. After you " ++"reset the module, you can install the other stream." ++msgstr "" ++"Il n’est pas possible de basculer les flux actifs d’un module. \n" ++"Il est recommandé de retirer tout contenu installé par le module, et de " ++"réinitialiser le mode en utilisant la commande 'microdnf module reset " ++"’. Après la réinitialisation du module, vous pouvez installer " ++"les autres flux." ++ ++#: libdnf/dnf-goal.cpp:85 + msgid "Could not depsolve transaction; " + msgstr "Impossible de depsolve la transaction ; " + +-#: libdnf/dnf-goal.cpp:70 ++#: libdnf/dnf-goal.cpp:87 + #, c-format + msgid "%i problem detected:\n" + msgid_plural "%i problems detected:\n" + msgstr[0] "%i problème détecté :\n" + msgstr[1] "%i problèmes détectés :\n" + +-#: libdnf/dnf-goal.cpp:78 ++#: libdnf/dnf-goal.cpp:95 + #, c-format + msgid " Problem %1$i: %2$s\n" + msgstr " Problème %1$i : %2$s\n" + +-#: libdnf/dnf-goal.cpp:80 ++#: libdnf/dnf-goal.cpp:97 + #, c-format + msgid " Problem: %s\n" + msgstr " Problème : %s\n" +@@ -181,84 +312,129 @@ msgstr "n’a pas pu trouver le package %s" + msgid "could not add erase element %1$s(%2$i)" + msgstr "n’a pas pu ajouter d’élément pour effacer %1$s(%2$i)" + +-#: libdnf/dnf-sack.cpp:381 ++#: libdnf/dnf-sack.cpp:252 ++msgid "repo_add_solv() has failed." ++msgstr "repo_add_solv() a échoué." ++ ++#: libdnf/dnf-sack.cpp:416 ++#, c-format ++msgid "Loading extension cache %s (%d) failed: " ++msgstr "Le chargement du cache d'extension %s (%d) a échoué : " ++ ++#: libdnf/dnf-sack.cpp:430 + #, c-format + msgid "no %1$s string for %2$s" + msgstr "aucune chaine %1$s pour %2$s" + +-#: libdnf/dnf-sack.cpp:404 +-msgid "failed to add solv" +-msgstr "n’a pu ajouter solv" +- +-#: libdnf/dnf-sack.cpp:422 ++#: libdnf/dnf-sack.cpp:440 + #, c-format + msgid "failed to open: %s" + msgstr "n’a pas pu ouvrir : %s" + +-#: libdnf/dnf-sack.cpp:501 ++#: libdnf/dnf-sack.cpp:519 + #, c-format + msgid "cannot create temporary file: %s" + msgstr "n’a pas pu créer le fichier temporaire : %s" + +-#: libdnf/dnf-sack.cpp:511 ++#: libdnf/dnf-sack.cpp:529 + #, c-format + msgid "failed opening tmp file: %s" + msgstr "n’a pas pu ouvrir le fichier tmp : %s" + +-#: libdnf/dnf-sack.cpp:523 ++#: libdnf/dnf-sack.cpp:551 ++#, c-format ++msgid "While writing primary cache %s repowriter write failed: %i, error: %s" ++msgstr "" ++"Lors de l'écriture dans le cache primaire %s, l'écriture dans le repowriter " ++"a échoué : %i, erreur : %s" ++ ++#: libdnf/dnf-sack.cpp:561 ++#, c-format ++msgid "Failed closing tmp file %s: %s" ++msgstr "Échec de la fermeture du fichier tmp %s : %s" ++ ++#: libdnf/dnf-sack.cpp:571 + #, c-format +-msgid "write_main() failed writing data: %i" +-msgstr "write_main() n’a pu écrire les données : %i" ++msgid "Failed to use newly written primary cache: %s: " ++msgstr "Échec de l'utilisation du cache primaire nouvellement écrit : %s : " + +-#: libdnf/dnf-sack.cpp:540 +-msgid "write_main() failed to re-load written solv file" +-msgstr "write_main() n’a pas pu charger à nouveau le fichier solv" ++#: libdnf/dnf-sack.cpp:577 ++#, c-format ++msgid "Failed to use newly written primary cache: %s" ++msgstr "Échec de l'utilisation du cache primaire nouvellement écrit : %s" + +-#: libdnf/dnf-sack.cpp:605 ++#: libdnf/dnf-sack.cpp:627 + #, c-format + msgid "can not create temporary file %s" + msgstr "n’a pas pu créer le fichier temporaire %s" + +-#: libdnf/dnf-sack.cpp:623 ++#: libdnf/dnf-sack.cpp:667 ++#, c-format ++msgid "" ++"While writing extension cache %s (%d): repowriter write failed: %i, error: %s" ++msgstr "" ++"Lors de l'écriture du cache d'extension %s (%d) : écriture repowriter ayant " ++"échoué : %i, erreur : %s" ++ ++#: libdnf/dnf-sack.cpp:677 + #, c-format +-msgid "write_ext(%1$d) has failed: %2$d" +-msgstr "write_ext(%1$d) a échoué : %2$d" ++msgid "While writing extension cache (%d): cannot close temporary file: %s" ++msgstr "" ++"Lors de l'écriture du cache d'extension (%d) : impossible de fermer le " ++"fichier temporaire : %s" + +-#: libdnf/dnf-sack.cpp:678 ++#: libdnf/dnf-sack.cpp:693 ++#, c-format ++msgid "Failed to use newly written extension cache: %s (%d): " ++msgstr "Impossible d'utiliser le nouveau cache d'extension écrit : %s (%d) : " ++ ++#: libdnf/dnf-sack.cpp:700 ++#, c-format ++msgid "Failed to use newly written extension cache: %s (%d)" ++msgstr "Impossible d'utiliser le nouveau cache d'extension écrit : %s (%d)" ++ ++#: libdnf/dnf-sack.cpp:741 + msgid "null repo md file" +-msgstr "null repo md file" ++msgstr "fichier md de dépôt nul" + +-#: libdnf/dnf-sack.cpp:687 ++#: libdnf/dnf-sack.cpp:750 + #, c-format + msgid "can not read file %1$s: %2$s" + msgstr "n’a pu lire le fichier %1$s : %2$s" + +-#: libdnf/dnf-sack.cpp:701 +-msgid "repo_add_solv() has failed." +-msgstr "repo_add_solv() a échoué." ++#: libdnf/dnf-sack.cpp:765 ++#, c-format ++msgid "While loading repository failed to use %s: " ++msgstr "Lors du chargement du référentiel, l'utilisation de %s a échoué : " + +-#: libdnf/dnf-sack.cpp:714 ++#: libdnf/dnf-sack.cpp:776 + msgid "loading of MD_TYPE_PRIMARY has failed." + msgstr "échec du chargement du MD_TYPE_PRIMARY." + +-#: libdnf/dnf-sack.cpp:727 +-msgid "repo_add_repomdxml/rpmmd() has failed." +-msgstr "repo_add_repomdxml/rpmmd() a échoué." ++#: libdnf/dnf-sack.cpp:788 ++#, c-format ++msgid "Loading repomd has failed: %s" ++msgstr "Le chargement de repomd a échoué : %s" ++ ++#: libdnf/dnf-sack.cpp:799 ++#, c-format ++msgid "Loading primary has failed: %s" ++msgstr "Le chargement du primaire a échoué : %s" + +-#: libdnf/dnf-sack.cpp:794 ++#: libdnf/dnf-sack.cpp:865 + msgid "failed to auto-detect architecture" + msgstr "n’a pu auto-détecter l’architecture" + +-#: libdnf/dnf-sack.cpp:919 ++#: libdnf/dnf-sack.cpp:1030 + #, c-format + msgid "failed creating cachedir %s" + msgstr "n’a pu créer le cachedir %s" + +-#: libdnf/dnf-sack.cpp:1696 ++#: libdnf/dnf-sack.cpp:1807 + msgid "failed loading RPMDB" + msgstr "n’a pu télécharger RPMDB" + +-#: libdnf/dnf-sack.cpp:2403 ++#: libdnf/dnf-sack.cpp:2532 + #, c-format + msgid "No module defaults found: %s" + msgstr "Aucun module par défaut n’a été trouvé : %s" +@@ -331,31 +507,30 @@ msgstr "N’a pas pu obtenir la taille libre du système de fichiers pour %s" + #, c-format + msgid "Not enough free space in %1$s: needed %2$s, available %3$s" + msgstr "" +-"Pas suffisamment d’espace libre dans %1$s : a besoin de %2$s, disponible " +-"%3$s" ++"Pas suffisamment d’espace libre dans %1$s : a besoin de %2$s, disponible %3$s" + +-#: libdnf/dnf-transaction.cpp:1196 ++#: libdnf/dnf-transaction.cpp:1195 + msgid "failed to set root" + msgstr "n’a pu réussi à définir root" + +-#: libdnf/dnf-transaction.cpp:1418 ++#: libdnf/dnf-transaction.cpp:1416 + #, c-format + msgid "Error %i running transaction test" + msgstr "Erreur %i lors du test transactionnel" + +-#: libdnf/dnf-transaction.cpp:1458 ++#: libdnf/dnf-transaction.cpp:1456 + #, c-format + msgid "Error %i running transaction" + msgstr "Erreur %i pendant la transaction" + +-#: libdnf/dnf-transaction.cpp:1473 ++#: libdnf/dnf-transaction.cpp:1472 + #, c-format + msgid "Transaction did not go to writing phase, but returned no error(%i)" + msgstr "" + "La transaction n’a pas pu opérer en phase d’écriture, mais a renvoyé « no " + "error(%i) »" + +-#: libdnf/dnf-utils.cpp:111 libdnf/hy-iutil.cpp:399 ++#: libdnf/dnf-utils.cpp:111 libdnf/hy-iutil.cpp:485 + #, c-format + msgid "cannot open directory %1$s: %2$s" + msgstr "impossible d’ouvrir le dossier %1$s : %2$s" +@@ -365,283 +540,298 @@ msgstr "impossible d’ouvrir le dossier %1$s : %2$s" + msgid "failed to remove %s" + msgstr "n’a pas pu supprimer %s" + +-#: libdnf/goal/Goal.cpp:55 ++#: libdnf/goal/Goal.cpp:74 + msgid "Ill-formed Selector, presence of multiple match objects in the filter" + msgstr "" + "Sélecteur Ill-formed, présence de plusieurs objets correspondants dans le " + "filtre" + +-#: libdnf/goal/Goal.cpp:56 ++#: libdnf/goal/Goal.cpp:75 + msgid "Ill-formed Selector used for the operation, incorrect comparison type" + msgstr "" +-"Sélecteur Ill-formed utilisé pour l’opération, type de comparaison " +-"incorrecte" ++"Sélecteur Ill-formed utilisé pour l’opération, type de comparaison incorrecte" + +-#: libdnf/goal/Goal.cpp:67 libdnf/goal/Goal.cpp:94 ++#: libdnf/goal/Goal.cpp:86 libdnf/goal/Goal.cpp:113 + msgid " does not belong to a distupgrade repository" + msgstr " n’appartient pas à un dépôt distupgrade" + +-#: libdnf/goal/Goal.cpp:68 libdnf/goal/Goal.cpp:95 ++#: libdnf/goal/Goal.cpp:87 libdnf/goal/Goal.cpp:114 + msgid " has inferior architecture" + msgstr " a une architecture inférieure" + +-#: libdnf/goal/Goal.cpp:69 ++#: libdnf/goal/Goal.cpp:88 + msgid "problem with installed package " + msgstr "problème avec le paquet installé " + +-#: libdnf/goal/Goal.cpp:70 libdnf/goal/Goal.cpp:97 ++#: libdnf/goal/Goal.cpp:89 libdnf/goal/Goal.cpp:116 + msgid "conflicting requests" + msgstr "requêtes conflictuelles" + +-#: libdnf/goal/Goal.cpp:71 libdnf/goal/Goal.cpp:98 ++#: libdnf/goal/Goal.cpp:90 libdnf/goal/Goal.cpp:117 + msgid "unsupported request" + msgstr "requête non prise en charge" + +-#: libdnf/goal/Goal.cpp:72 libdnf/goal/Goal.cpp:99 ++#: libdnf/goal/Goal.cpp:91 libdnf/goal/Goal.cpp:118 + msgid "nothing provides requested " + msgstr "rien ne fourni ce qui a été demandé " + +-#: libdnf/goal/Goal.cpp:73 ++#: libdnf/goal/Goal.cpp:92 + #, c-format + msgid "package %s does not exist" + msgstr "le paquet %s n’existe pas" + +-#: libdnf/goal/Goal.cpp:74 libdnf/goal/Goal.cpp:101 ++#: libdnf/goal/Goal.cpp:93 libdnf/goal/Goal.cpp:120 + msgid " is provided by the system" + msgstr " est fourni par le système" + +-#: libdnf/goal/Goal.cpp:75 libdnf/goal/Goal.cpp:102 ++#: libdnf/goal/Goal.cpp:94 libdnf/goal/Goal.cpp:121 + msgid "some dependency problem" + msgstr "quelques problèmes de dépendances" + +-#: libdnf/goal/Goal.cpp:76 ++#: libdnf/goal/Goal.cpp:95 + msgid "cannot install the best update candidate for package " + msgstr "installation impossible du meilleur candidat pour le paquet " + +-#: libdnf/goal/Goal.cpp:77 libdnf/goal/Goal.cpp:104 ++#: libdnf/goal/Goal.cpp:96 libdnf/goal/Goal.cpp:123 + msgid "cannot install the best candidate for the job" + msgstr "installation impossible du meilleur candidat pour la tâche" + +-#: libdnf/goal/Goal.cpp:78 ++#: libdnf/goal/Goal.cpp:97 + #, c-format + msgid "package %s is filtered out by modular filtering" + msgstr "le paquet %s a été filtré par filtrage modulaire" + +-#: libdnf/goal/Goal.cpp:79 ++#: libdnf/goal/Goal.cpp:98 + #, c-format + msgid "package %s does not have a compatible architecture" + msgstr "le paquet %s n’a pas d’architecture compatible" + +-#: libdnf/goal/Goal.cpp:80 ++#: libdnf/goal/Goal.cpp:99 + #, c-format + msgid "package %s is not installable" + msgstr "le paquet %s n’est pas installable" + +-#: libdnf/goal/Goal.cpp:81 ++#: libdnf/goal/Goal.cpp:100 + #, c-format + msgid "package %s is filtered out by exclude filtering" + msgstr "le paquet %s a été filtré en excluant le filtrage" + +-#: libdnf/goal/Goal.cpp:82 ++#: libdnf/goal/Goal.cpp:101 + #, c-format + msgid "nothing provides %s needed by %s" + msgstr "rien de fournit %s rendu nécessaire par %s" + +-#: libdnf/goal/Goal.cpp:83 ++#: libdnf/goal/Goal.cpp:102 + #, c-format + msgid "cannot install both %s and %s" + msgstr "installation impossible à la fois de %s et %s" + +-#: libdnf/goal/Goal.cpp:84 ++#: libdnf/goal/Goal.cpp:103 + #, c-format + msgid "package %s conflicts with %s provided by %s" + msgstr "le paquet %s est en conflit avec %s fourni par %s" + +-#: libdnf/goal/Goal.cpp:85 ++#: libdnf/goal/Goal.cpp:104 + #, c-format + msgid "package %s obsoletes %s provided by %s" + msgstr "le paquet %s rend obsolète %s fourni par %s" + +-#: libdnf/goal/Goal.cpp:86 ++#: libdnf/goal/Goal.cpp:105 + #, c-format + msgid "installed package %s obsoletes %s provided by %s" + msgstr "le paquet installé %s rend obsolète %s fourni par %s" + +-#: libdnf/goal/Goal.cpp:87 ++#: libdnf/goal/Goal.cpp:106 + #, c-format + msgid "package %s implicitly obsoletes %s provided by %s" + msgstr "le paquet %s rend implicitement obsolète %s fourni par %s" + +-#: libdnf/goal/Goal.cpp:88 ++#: libdnf/goal/Goal.cpp:107 + #, c-format + msgid "package %s requires %s, but none of the providers can be installed" + msgstr "" + "le paquet %s nécessite %s, mais aucun fournisseur ne peut être installé" + +-#: libdnf/goal/Goal.cpp:89 ++#: libdnf/goal/Goal.cpp:108 + #, c-format + msgid "package %s conflicts with %s provided by itself" + msgstr "le paquet %s est en conflit avec %s fourni par lui-même" + +-#: libdnf/goal/Goal.cpp:90 ++#: libdnf/goal/Goal.cpp:109 + #, c-format + msgid "both package %s and %s obsolete %s" + msgstr "à la fois le paquet %s et %s rendent obsolète %s" + +-#: libdnf/goal/Goal.cpp:96 ++#: libdnf/goal/Goal.cpp:115 + msgid "problem with installed module " + msgstr "problème avec le module installé " + +-#: libdnf/goal/Goal.cpp:100 ++#: libdnf/goal/Goal.cpp:119 + #, c-format + msgid "module %s does not exist" + msgstr "le module %s n’existe pas" + +-#: libdnf/goal/Goal.cpp:103 ++#: libdnf/goal/Goal.cpp:122 + msgid "cannot install the best update candidate for module " + msgstr "" + "installation impossible du meilleur candidat de mise à jour pour le module " + +-#: libdnf/goal/Goal.cpp:105 libdnf/goal/Goal.cpp:108 ++#: libdnf/goal/Goal.cpp:124 libdnf/goal/Goal.cpp:127 + #, c-format + msgid "module %s is disabled" + msgstr "le module %s est désactivé" + +-#: libdnf/goal/Goal.cpp:106 ++#: libdnf/goal/Goal.cpp:125 + #, c-format + msgid "module %s does not have a compatible architecture" + msgstr "le module %s n’a pas d’architecture compatible" + +-#: libdnf/goal/Goal.cpp:107 ++#: libdnf/goal/Goal.cpp:126 + #, c-format + msgid "module %s is not installable" + msgstr "le module %s n’est pas installable" + +-#: libdnf/goal/Goal.cpp:109 ++#: libdnf/goal/Goal.cpp:128 + #, c-format + msgid "nothing provides %s needed by module %s" + msgstr "rien de fournit %s rendu nécessaire par le module %s" + +-#: libdnf/goal/Goal.cpp:110 ++#: libdnf/goal/Goal.cpp:129 + #, c-format + msgid "cannot install both modules %s and %s" + msgstr "installation impossible à la fois des modules %s et %s" + +-#: libdnf/goal/Goal.cpp:111 ++#: libdnf/goal/Goal.cpp:130 + #, c-format + msgid "module %s conflicts with %s provided by %s" + msgstr "le module %s est en conflit avec %s fourni par %s" + +-#: libdnf/goal/Goal.cpp:112 ++#: libdnf/goal/Goal.cpp:131 + #, c-format + msgid "module %s obsoletes %s provided by %s" + msgstr "le module %s rend obsolète %s fourni par %s" + +-#: libdnf/goal/Goal.cpp:113 ++#: libdnf/goal/Goal.cpp:132 + #, c-format + msgid "installed module %s obsoletes %s provided by %s" + msgstr "le module installé %s rend obsolète %s fourni par %s" + +-#: libdnf/goal/Goal.cpp:114 ++#: libdnf/goal/Goal.cpp:133 + #, c-format + msgid "module %s implicitly obsoletes %s provided by %s" + msgstr "le module %s rend implicitement obsolète %s fourni par %s" + +-#: libdnf/goal/Goal.cpp:115 ++#: libdnf/goal/Goal.cpp:134 + #, c-format + msgid "module %s requires %s, but none of the providers can be installed" + msgstr "" + "le module %s nécessite %s, mais aucun fournisseur ne peut être installé" + +-#: libdnf/goal/Goal.cpp:116 ++#: libdnf/goal/Goal.cpp:135 + #, c-format + msgid "module %s conflicts with %s provided by itself" + msgstr "le module %s est en conflit avec %s fourni par lui-même" + +-#: libdnf/goal/Goal.cpp:117 ++#: libdnf/goal/Goal.cpp:136 + #, c-format + msgid "both module %s and %s obsolete %s" + msgstr "à la fois le module %s et %s rendent obsolète %s" + +-#: libdnf/goal/Goal.cpp:1038 ++#: libdnf/goal/Goal.cpp:1051 + msgid "no solver set" + msgstr "aucun solveur défini" + +-#: libdnf/goal/Goal.cpp:1043 ++#: libdnf/goal/Goal.cpp:1056 + #, c-format + msgid "failed to make %s absolute" + msgstr "n’a pas pu rendre %s absolu" + +-#: libdnf/goal/Goal.cpp:1050 ++#: libdnf/goal/Goal.cpp:1063 + #, c-format + msgid "failed writing debugdata to %1$s: %2$s" + msgstr "échec de l’écriture des debugdata dans %1$s : %2$s" + +-#: libdnf/goal/Goal.cpp:1062 ++#: libdnf/goal/Goal.cpp:1075 + msgid "no solv in the goal" + msgstr "pas de solv dans l’objectif" + +-#: libdnf/goal/Goal.cpp:1064 ++#: libdnf/goal/Goal.cpp:1077 + msgid "no solution, cannot remove protected package" + msgstr "aucune solution, n’a pas pu supprimer le package protégé" + +-#: libdnf/goal/Goal.cpp:1067 ++#: libdnf/goal/Goal.cpp:1080 + msgid "no solution possible" + msgstr "aucune solution n’est possible" + +-#: libdnf/goal/Goal.cpp:1479 ++#: libdnf/goal/Goal.cpp:1206 ++msgid "Problem: " ++msgstr "Problème : " ++ ++#: libdnf/goal/Goal.cpp:1211 ++#, c-format ++msgid "Problem %d: " ++msgstr "Probléme %d : " ++ ++#: libdnf/goal/Goal.cpp:1538 + msgid "" + "The operation would result in removing the following protected packages: " + msgstr "" + "L’opération résulterait en la suppression des packages protégés suivants : " + +-#: libdnf/hy-iutil.cpp:322 ++#: libdnf/hy-iutil.cpp:181 ++#, c-format ++msgid "Libsolv's solv_toolversion is: %zu long but we expect max of: %zu" ++msgstr "" ++"La solv_toolversion de Libsolv est : %zu long mais nous attendons un maximum " ++"de : %zu" ++ ++#: libdnf/hy-iutil.cpp:408 + #, c-format + msgid "Failed renaming %1$s to %2$s: %3$s" + msgstr "N’a pas pu renommer %1$s en %2$s : %3$s" + +-#: libdnf/hy-iutil.cpp:330 ++#: libdnf/hy-iutil.cpp:416 + #, c-format + msgid "Failed setting perms on %1$s: %2$s" + msgstr "N’a pas pu définir les permissions sur %1$s : %2$s" + +-#: libdnf/hy-iutil.cpp:376 ++#: libdnf/hy-iutil.cpp:462 + #, c-format + msgid "cannot create directory %1$s: %2$s" + msgstr "impossible de créer le dossier %1$s : %2$s" + +-#: libdnf/hy-iutil.cpp:411 ++#: libdnf/hy-iutil.cpp:497 + #, c-format + msgid "cannot stat path %1$s: %2$s" + msgstr "impossible de stat le chemin %1$s : %2$s" + +-#: libdnf/module/ModulePackage.cpp:499 ++#: libdnf/module/ModulePackage.cpp:560 + #, c-format + msgid "Invalid format of Platform module: %s" + msgstr "Format invalide du module de plateforme : %s" + +-#: libdnf/module/ModulePackage.cpp:514 ++#: libdnf/module/ModulePackage.cpp:575 + msgid "Multiple module platforms provided by available packages\n" + msgstr "" + "De multiples modules de plateformes sont fournis par les paquets " + "disponibles\n" + +-#: libdnf/module/ModulePackage.cpp:527 ++#: libdnf/module/ModulePackage.cpp:588 + msgid "Multiple module platforms provided by installed packages\n" + msgstr "" + "De multiples modules de plateformes sont fournis par les paquets installés\n" + +-#: libdnf/module/ModulePackage.cpp:554 ++#: libdnf/module/ModulePackage.cpp:615 + #, c-format + msgid "Detection of Platform Module in %s failed: %s" + msgstr "La détection des modules de plateformes dans %s a échoué : %s" + +-#: libdnf/module/ModulePackage.cpp:563 ++#: libdnf/module/ModulePackage.cpp:624 + #, c-format + msgid "Missing PLATFORM_ID in %s" + msgstr "L'identifiant de la platforme est manquant dans %s" + +-#: libdnf/module/ModulePackage.cpp:568 ++#: libdnf/module/ModulePackage.cpp:629 + msgid "No valid Platform ID detected" + msgstr "Aucun identifiant de plateforme n'a été détecté" + +@@ -650,41 +840,73 @@ msgstr "Aucun identifiant de plateforme n'a été détecté" + msgid "Cannot enable multiple streams for module '%s'" + msgstr "Impossible d’activer les flux pour le module « %s »" + +-#: libdnf/module/ModulePackageContainer.cpp:294 ++#: libdnf/module/ModulePackageContainer.cpp:295 + #, c-format + msgid "Conflicting defaults with repo '%s': %s" + msgstr "Valeurs par défaut en conflit avec le dépôt « %s » : %s" + +-#: libdnf/module/ModulePackageContainer.cpp:1569 ++#: libdnf/module/ModulePackageContainer.cpp:841 ++msgid "Installing module profiles:\n" ++msgstr "Installation des profils de module :\n" ++ ++#: libdnf/module/ModulePackageContainer.cpp:856 ++msgid "Disabling module profiles:\n" ++msgstr "Désactivation des profils de module :\n" ++ ++#: libdnf/module/ModulePackageContainer.cpp:871 ++msgid "Enabling module streams:\n" ++msgstr "Activation des flux de modules :\n" ++ ++#: libdnf/module/ModulePackageContainer.cpp:885 ++msgid "Switching module streams:\n" ++msgstr "Basculement des flux de modules :\n" ++ ++#: libdnf/module/ModulePackageContainer.cpp:903 ++msgid "Disabling modules:\n" ++msgstr "Désactivation des modules :\n" ++ ++#: libdnf/module/ModulePackageContainer.cpp:914 ++msgid "Resetting modules:\n" ++msgstr "Réinitialisation des modules :\n" ++ ++#: libdnf/module/ModulePackageContainer.cpp:1638 + #, c-format + msgid "Unable to load modular Fail-Safe data at '%s'" + msgstr "Impossible de charger les données de sécurité à « %s »" + +-#: libdnf/module/ModulePackageContainer.cpp:1575 ++#: libdnf/module/ModulePackageContainer.cpp:1644 + #, c-format + msgid "Unable to load modular Fail-Safe data for module '%s:%s'" + msgstr "" + "Impossible de charger les données de sécurité modulaires pour le module " + "« %s : %s »" + +-#: libdnf/module/ModulePackageContainer.cpp:1639 ++#: libdnf/module/ModulePackageContainer.cpp:1702 + #, c-format + msgid "Unable to create directory \"%s\" for modular Fail Safe data: %s" + msgstr "" + "Impossible de créer le dossier « %s » pour les données de sécurité " + "modulaires : %s" + +-#: libdnf/module/ModulePackageContainer.cpp:1661 ++#: libdnf/module/ModulePackageContainer.cpp:1718 + #, c-format + msgid "Unable to save a modular Fail Safe data to '%s'" + msgstr "" + "Impossible d’enregistrer les données de sécurité modulaires vers « %s »" + +-#: libdnf/module/ModulePackageContainer.cpp:1686 ++#: libdnf/module/ModulePackageContainer.cpp:1741 + #, c-format + msgid "Unable to remove a modular Fail Safe data in '%s'" ++msgstr "Impossible de supprimer les données de sécurité modulaires dans « %s »" ++ ++#: libdnf/module/ModulePackageContainer.cpp:1773 ++#, c-format ++msgid "" ++"Unable to apply modular obsoletes to '%s:%s' because target module '%s' is " ++"disabled" + msgstr "" +-"Impossible de supprimer les données de sécurité modulaires dans « %s »" ++"Impossible d'appliquer les obsolètes modulaires à '%s:%s' car le module " ++"cible '%s' est désactivé" + + #: libdnf/module/modulemd/ModuleMetadata.cpp:86 + #, c-format +@@ -712,6 +934,13 @@ msgstr "Échec de la mise à jour des paramètres par défaut : %s" + msgid "Failed to upgrade streams: %s" + msgstr "Échec de la mise à jour des flux : %s" + ++#: libdnf/module/modulemd/ModuleMetadata.cpp:212 ++#, c-format ++msgid "Cannot retrieve module obsoletes because no stream matching %s: %s" ++msgstr "" ++"Impossible de récupérer les modules obsolètes car aucune correspondance de " ++"flux %s : %s" ++ + #: libdnf/plugin/plugin.cpp:46 + #, c-format + msgid "Can't load shared library \"%s\": %s" +@@ -755,8 +984,8 @@ msgid "" + "operator instead." + msgstr "" + "L’utilisation de l’opérateur « == » dans reldeps peut entraîner un " +-"comportement indéfini. Il est déprécié et le support sera abandonné dans les" +-" prochaines versions. Utilisez plutôt l’opérateur « = »." ++"comportement indéfini. Il est déprécié et le support sera abandonné dans les " ++"prochaines versions. Utilisez plutôt l’opérateur « = »." + + #: libdnf/repo/Repo.cpp:321 + #, c-format +@@ -769,152 +998,169 @@ msgid "Repository '%s' has unsupported type: 'type=%s', skipping." + msgstr "" + "Le dépôt « %s » n’a pas de type pris en charge : « type=%s », passer outre." + +-#: libdnf/repo/Repo.cpp:546 ++#: libdnf/repo/Repo.cpp:489 libdnf/repo/Repo.cpp:610 libdnf/repo/Repo.cpp:641 ++#: libdnf/repo/Repo.cpp:1387 + #, c-format +-msgid "Cannot find a valid baseurl for repo: %s" +-msgstr "Impossible de trouver une adresse de base pour le dépôt : %s" ++msgid "repo '%s': 'basecachedir' is not set" ++msgstr "repo '%s' : 'basecachedir' n'est pas fixé" + +-#: libdnf/repo/Repo.cpp:583 libdnf/repo/Repo.cpp:1672 ++#: libdnf/repo/Repo.cpp:512 + msgid "" +-"Maximum download speed is lower than minimum. Please change configuration of" +-" minrate or throttle" ++"Maximum download speed is lower than minimum. Please change configuration of " ++"minrate or throttle" + msgstr "" + "La vitesse de téléchargement maximale est plus basse que le minimum. " + "Veuillez modifier les paramètres minrate ou throttle" + +-#: libdnf/repo/Repo.cpp:633 libdnf/repo/Repo.cpp:655 ++#: libdnf/repo/Repo.cpp:546 ++#, c-format ++msgid "repo '%s': 'proxy_username' is set but not 'proxy_password'" ++msgstr "repo '%s' : 'proxy_username' est défini mais pas 'proxy_password'" ++ ++#: libdnf/repo/Repo.cpp:548 ++msgid "'proxy_username' is set but not 'proxy_password'" ++msgstr "" ++"Le nom d'utilisateur \"proxy_username\" est défini mais pas le mot de passe " ++"\"proxy_password\"" ++ ++#: libdnf/repo/Repo.cpp:629 ++#, c-format ++msgid "Cannot find a valid baseurl for repo: %s" ++msgstr "Impossible de trouver une adresse de base pour le dépôt : %s" ++ ++#: libdnf/repo/Repo.cpp:660 libdnf/repo/Repo.cpp:682 + #, c-format + msgid "%s: gpgme_data_new_from_fd(): %s" + msgstr "%s : gpgme_data_new_from_fd() : %s" + +-#: libdnf/repo/Repo.cpp:641 libdnf/repo/Repo.cpp:663 ++#: libdnf/repo/Repo.cpp:668 libdnf/repo/Repo.cpp:690 + #, c-format + msgid "%s: gpgme_op_import(): %s" + msgstr "%s : gpgme_op_import() : %s" + +-#: libdnf/repo/Repo.cpp:686 libdnf/repo/Repo.cpp:752 libdnf/repo/Repo.cpp:880 ++#: libdnf/repo/Repo.cpp:713 libdnf/repo/Repo.cpp:779 libdnf/repo/Repo.cpp:907 + #, c-format + msgid "%s: gpgme_ctx_set_engine_info(): %s" + msgstr "%s : gpgme_ctx_set_engine_info() : %s" + +-#: libdnf/repo/Repo.cpp:713 libdnf/repo/Repo.cpp:777 ++#: libdnf/repo/Repo.cpp:740 libdnf/repo/Repo.cpp:804 + #, c-format + msgid "can not list keys: %s" + msgstr "n’a pas pu lister les clés : %s" + +-#: libdnf/repo/Repo.cpp:806 ++#: libdnf/repo/Repo.cpp:833 + #, c-format + msgid "Failed to retrieve GPG key for repo '%s': %s" + msgstr "Impossible de récupérer la clé GPG pour le dépôt « %s » : %s" + +-#: libdnf/repo/Repo.cpp:859 ++#: libdnf/repo/Repo.cpp:886 + #, c-format + msgid "repo %s: 0x%s already imported" + msgstr "dépôt %s : 0x%s déjà importé" + +-#: libdnf/repo/Repo.cpp:887 ++#: libdnf/repo/Repo.cpp:914 + #, c-format + msgid "repo %s: imported key 0x%s." + msgstr "dépôt %s : clé importée 0x%s." + +-#: libdnf/repo/Repo.cpp:1131 ++#: libdnf/repo/Repo.cpp:1167 + #, c-format + msgid "reviving: repo '%s' skipped, no metalink." + msgstr "relance : dépôt « %s » ignoré, pas de méta-lien." + +-#: libdnf/repo/Repo.cpp:1150 ++#: libdnf/repo/Repo.cpp:1186 + #, c-format + msgid "reviving: repo '%s' skipped, no usable hash." + msgstr "relance : dépôt « %s » ignoré, pas de hachage utilisable." + +-#: libdnf/repo/Repo.cpp:1173 ++#: libdnf/repo/Repo.cpp:1209 + #, c-format + msgid "reviving: failed for '%s', mismatched %s sum." + msgstr "relance : échec pour « %s », la somme de %s ne correspond pas." + +-#: libdnf/repo/Repo.cpp:1179 ++#: libdnf/repo/Repo.cpp:1215 + #, c-format + msgid "reviving: '%s' can be revived - metalink checksums match." + msgstr "" + "relance : « %s » peut être relancé - la somme de contrôle du méta-lien " + "correspond." + +-#: libdnf/repo/Repo.cpp:1204 ++#: libdnf/repo/Repo.cpp:1240 + #, c-format + msgid "reviving: '%s' can be revived - repomd matches." + msgstr "relance : « %s » peut être relancé - le repomd correspond." + +-#: libdnf/repo/Repo.cpp:1206 ++#: libdnf/repo/Repo.cpp:1242 + #, c-format + msgid "reviving: failed for '%s', mismatched repomd." + msgstr "relance : échec pour « %s », le repomd ne correspond pas." + +-#: libdnf/repo/Repo.cpp:1224 ++#: libdnf/repo/Repo.cpp:1260 + #, c-format + msgid "Cannot create repo destination directory \"%s\": %s" + msgstr "Impossible de créer le répertoire de destination du dépôt « %s » : %s" + +-#: libdnf/repo/Repo.cpp:1230 ++#: libdnf/repo/Repo.cpp:1266 + #, c-format + msgid "Cannot create repo temporary directory \"%s\": %s" + msgstr "Impossible de créer le répertoire temporaire du dépôt « %s » : %s" + +-#: libdnf/repo/Repo.cpp:1244 ++#: libdnf/repo/Repo.cpp:1280 + #, c-format + msgid "Cannot create directory \"%s\": %s" + msgstr "Impossible de créer le répertoire « %s » : %s" + +-#: libdnf/repo/Repo.cpp:1267 ++#: libdnf/repo/Repo.cpp:1303 + #, c-format + msgid "Cannot rename directory \"%s\" to \"%s\": %s" + msgstr "Impossible de renommer le répertoire « %s » en « %s » : %s" + +-#: libdnf/repo/Repo.cpp:1290 ++#: libdnf/repo/Repo.cpp:1326 + #, c-format + msgid "repo: using cache for: %s" + msgstr "dépôt : utilisation du cache pour : %s" + +-#: libdnf/repo/Repo.cpp:1302 ++#: libdnf/repo/Repo.cpp:1338 + #, c-format + msgid "Cache-only enabled but no cache for '%s'" + msgstr "« cache uniquement » activé, mais pas de cache pour « %s »" + +-#: libdnf/repo/Repo.cpp:1306 ++#: libdnf/repo/Repo.cpp:1342 + #, c-format + msgid "repo: downloading from remote: %s" + msgstr "dépôt : téléchargement à distance en provenance de : %s" + +-#: libdnf/repo/Repo.cpp:1312 ++#: libdnf/repo/Repo.cpp:1349 + #, c-format + msgid "Failed to download metadata for repo '%s': %s" + msgstr "Échec du téléchargement des métadonnées pour le dépôt « %s » : %s" + +-#: libdnf/repo/Repo.cpp:1338 ++#: libdnf/repo/Repo.cpp:1375 + msgid "getCachedir(): Computation of SHA256 failed" + msgstr "getCachedir() : échec du calcul de SHA256" + +-#: libdnf/repo/Repo.cpp:1363 ++#: libdnf/repo/Repo.cpp:1403 + #, c-format + msgid "Cannot create persistdir \"%s\": %s" + msgstr "Impossible de créer le dossier persistant « %s » : %s" + +-#: libdnf/repo/Repo.cpp:1763 ++#: libdnf/repo/Repo.cpp:1780 + msgid "resume cannot be used simultaneously with the byterangestart param" + msgstr "" + "« resume » (reprise) ne peut pas être utilisé avec le paramètre " + "byterangestart" + +-#: libdnf/repo/Repo.cpp:1780 ++#: libdnf/repo/Repo.cpp:1797 + #, c-format + msgid "PackageTarget initialization failed: %s" + msgstr "L’initialisation de Package Target a échoué : %s" + +-#: libdnf/repo/Repo.cpp:1886 ++#: libdnf/repo/Repo.cpp:1903 + #, c-format + msgid "Cannot open %s: %s" + msgstr "impossible d’ouvrir %s : %s" + +-#: libdnf/repo/Repo.cpp:1930 ++#: libdnf/repo/Repo.cpp:1947 + #, c-format + msgid "Log handler with id %ld doesn't exist" + msgstr "Log handler ayant pour id %ld n’existe pas" +@@ -923,22 +1169,22 @@ msgstr "Log handler ayant pour id %ld n’existe pas" + msgid "In progress" + msgstr "En cours" + +-#: libdnf/transaction/Swdb.cpp:188 libdnf/transaction/Swdb.cpp:216 +-#: libdnf/transaction/Swdb.cpp:228 libdnf/transaction/Swdb.cpp:245 +-#: libdnf/transaction/Swdb.cpp:384 libdnf/transaction/Swdb.cpp:394 ++#: libdnf/transaction/Swdb.cpp:187 libdnf/transaction/Swdb.cpp:215 ++#: libdnf/transaction/Swdb.cpp:227 libdnf/transaction/Swdb.cpp:244 ++#: libdnf/transaction/Swdb.cpp:383 libdnf/transaction/Swdb.cpp:393 + msgid "Not in progress" + msgstr "Pas en cours" + +-#: libdnf/transaction/Swdb.cpp:255 ++#: libdnf/transaction/Swdb.cpp:254 + msgid "No transaction in progress" + msgstr "Aucune transaction n’est en cours" + +-#: libdnf/transaction/TransactionItem.cpp:147 ++#: libdnf/transaction/TransactionItem.cpp:146 + msgid "Attempt to insert transaction item into completed transaction" + msgstr "" + "Tentative d’insérer un élément de transaction dans une transaction achevée" + +-#: libdnf/transaction/TransactionItem.cpp:218 ++#: libdnf/transaction/TransactionItem.cpp:217 + msgid "Attempt to update transaction item in completed transaction" + msgstr "" + "Tentative de mettre à jour un élément de transaction dans une transaction " +@@ -973,8 +1219,20 @@ msgid "Can't add console output to unsaved transaction" + msgstr "" + "Ne peut pas ajouter une sortie de console à une transaction non enregistrée" + ++#~ msgid "failed to add solv" ++#~ msgstr "n’a pu ajouter solv" ++ ++#~ msgid "write_main() failed writing data: %i" ++#~ msgstr "write_main() n’a pu écrire les données : %i" ++ ++#~ msgid "write_main() failed to re-load written solv file" ++#~ msgstr "write_main() n’a pas pu charger à nouveau le fichier solv" ++ ++#~ msgid "write_ext(%1$d) has failed: %2$d" ++#~ msgstr "write_ext(%1$d) a échoué : %2$d" ++ ++#~ msgid "repo_add_repomdxml/rpmmd() has failed." ++#~ msgstr "repo_add_repomdxml/rpmmd() a échoué." ++ + #~ msgid "Bad id for repo: %s, byte = %s %d" + #~ msgstr "ID erroné pour le dépôt : %s, byte = %s %d" +- +-#~ msgid "failed calculating RPMDB checksum" +-#~ msgstr "n’a pu calculer la somme de contrôle RPMDB" +diff --git a/po/ja.po b/po/ja.po +index b9064ee6..1aa5dd09 100644 +--- a/po/ja.po ++++ b/po/ja.po +@@ -1,20 +1,23 @@ + # Casey Jones , 2018. #zanata +-# Ludek Janda , 2018. #zanata ++# Ludek Janda , 2018. #zanata, 2021. + # Casey Jones , 2020. ++# Sundeep Anand , 2021. ++# Transtats , 2022. + msgid "" + msgstr "" + "Project-Id-Version: PACKAGE VERSION\n" + "Report-Msgid-Bugs-To: \n" +-"POT-Creation-Date: 2020-10-05 09:18-0400\n" +-"PO-Revision-Date: 2020-05-05 09:40+0000\n" +-"Last-Translator: Casey Jones \n" +-"Language-Team: Japanese \n" ++"POT-Creation-Date: 2023-02-28 09:11+0100\n" ++"PO-Revision-Date: 2022-09-06 07:19+0000\n" ++"Last-Translator: Transtats \n" ++"Language-Team: Japanese \n" + "Language: ja\n" + "MIME-Version: 1.0\n" + "Content-Type: text/plain; charset=UTF-8\n" + "Content-Transfer-Encoding: 8bit\n" + "Plural-Forms: nplurals=1; plural=0;\n" +-"X-Generator: Weblate 4.0.3\n" ++"X-Generator: Weblate 4.14\n" + + #: libdnf/conf/ConfigMain.cpp:62 libdnf/conf/OptionSeconds.cpp:40 + msgid "no value specified" +@@ -23,7 +26,7 @@ msgstr "値が指定されていません" + #: libdnf/conf/ConfigMain.cpp:67 libdnf/conf/OptionSeconds.cpp:48 + #, c-format + msgid "seconds value '%s' must not be negative" +-msgstr "2個目の値 '%s' は負の数にしないでください" ++msgstr "2 個目の値 '%s' は負の数にしないでください" + + #: libdnf/conf/ConfigMain.cpp:71 + #, c-format +@@ -35,17 +38,34 @@ msgstr "'%s' を バイトへ変換できませんでした" + msgid "unknown unit '%s'" + msgstr "不明な単位 '%s'" + +-#: libdnf/conf/ConfigMain.cpp:332 ++#: libdnf/conf/ConfigMain.cpp:204 libdnf/conf/OptionEnum.cpp:83 ++#: libdnf/conf/OptionNumber.cpp:88 ++msgid "invalid value" ++msgstr "無効な値" ++ ++#: libdnf/conf/ConfigMain.cpp:207 ++msgid "value 1 is not allowed" ++msgstr "値 1 は許可されません" ++ ++#: libdnf/conf/ConfigMain.cpp:209 ++msgid "negative value is not allowed" ++msgstr "負の値は許可されていません" ++ ++#: libdnf/conf/ConfigMain.cpp:341 + #, c-format + msgid "percentage '%s' is out of range" + msgstr "パーセンテージ '%s' が範囲外にあります" + +-#: libdnf/conf/OptionBinds.cpp:76 ++#: libdnf/conf/ConfigRepo.cpp:182 ++msgid "only the value 'priority' is supported." ++msgstr "「priority」の値のみがサポートされます。" ++ ++#: libdnf/conf/OptionBinds.cpp:85 + #, c-format + msgid "Configuration: OptionBinding with id \"%s\" does not exist" + msgstr "設定: id \"%s\" を伴う OptionBinding は存在しません" + +-#: libdnf/conf/OptionBinds.cpp:88 ++#: libdnf/conf/OptionBinds.cpp:97 + #, c-format + msgid "Configuration: OptionBinding with id \"%s\" already exists" + msgstr "設定: id \"%s\" を伴う OptionBinding はすでに存在します" +@@ -56,24 +76,20 @@ msgid "invalid boolean value '%s'" + msgstr "無効な boolean 値 '%s'" + + #: libdnf/conf/OptionEnum.cpp:72 libdnf/conf/OptionEnum.cpp:158 +-#: libdnf/conf/OptionString.cpp:59 libdnf/conf/OptionStringList.cpp:59 ++#: libdnf/conf/OptionString.cpp:64 libdnf/conf/OptionStringList.cpp:59 + #, c-format + msgid "'%s' is not an allowed value" + msgstr "'%s' 値は許可されていない値です" + +-#: libdnf/conf/OptionEnum.cpp:83 libdnf/conf/OptionNumber.cpp:88 +-msgid "invalid value" +-msgstr "無効な値" +- + #: libdnf/conf/OptionNumber.cpp:73 + #, c-format + msgid "given value [%d] should be less than allowed value [%d]." +-msgstr "指定された値 [%d] は許可された値 [%d]より小さくしてください" ++msgstr "指定された値 [%d] は許可された値 [%d]より小さくしてください。" + + #: libdnf/conf/OptionNumber.cpp:76 + #, c-format + msgid "given value [%d] should be greater than allowed value [%d]." +-msgstr "指定された値 [%d] は許可された値 [%d]より大きくしてください" ++msgstr "指定された値 [%d] は許可された値 [%d]より大きくしてください。" + + #: libdnf/conf/OptionPath.cpp:78 + #, c-format +@@ -90,26 +106,137 @@ msgstr "指定されたパス '%s' が存在しません。" + msgid "could not convert '%s' to seconds" + msgstr "'%s' を 秒に変換できません" + +-#: libdnf/conf/OptionString.cpp:74 ++#: libdnf/conf/OptionString.cpp:79 + msgid "GetValue(): Value not set" + msgstr "GetValue(): 値は設定されていません" + +-#: libdnf/dnf-goal.cpp:68 ++#: libdnf/dnf-context.cpp:3176 libdnf/dnf-context.cpp:3185 ++#, c-format ++msgid "Cannot enable more streams from module '%s' at the same time" ++msgstr "モジュール '%s' から、さらにストリームを同時に有効にできません" ++ ++#: libdnf/dnf-context.cpp:3194 libdnf/dnf-context.cpp:3212 ++#, c-format ++msgid "" ++"Cannot enable module '%1$s' stream '%2$s': State of module already modified" ++msgstr "" ++"モジュール '%1$s' ストリーム '%2$s' を有効にできません。モジュールの状態はす" ++"でに変更されています" ++ ++#: libdnf/dnf-context.cpp:3259 ++#, c-format ++msgid "Modular dependency problem with Defaults: %s" ++msgstr "デフォルトのモジュラー依存問題: %s" ++ ++#: libdnf/dnf-context.cpp:3262 ++#, c-format ++msgid "Modular dependency problem: %s" ++msgstr "モジュラーの依存に関する問題: %s" ++ ++#: libdnf/dnf-context.cpp:3296 libdnf/dnf-context.cpp:3320 ++#: libdnf/dnf-context.cpp:3331 libdnf/dnf-context.cpp:3370 ++#: libdnf/dnf-context.cpp:3386 libdnf/dnf-context.cpp:3418 ++#: libdnf/dnf-context.cpp:3462 libdnf/dnf-context.cpp:3472 ++#, c-format ++msgid "Unable to resolve argument '%s'" ++msgstr "引数 '%s' を解決できません" ++ ++#: libdnf/dnf-context.cpp:3303 ++#, c-format ++msgid "" ++"Only module name is required. Ignoring unneeded information in argument: '%s'" ++msgstr "モジュール名のみが必要です。引数の不必要な情報は無視します: '%s'" ++ ++#: libdnf/dnf-context.cpp:3317 ++#, c-format ++msgid "Cannot reset module '%s': State of module already modified" ++msgstr "" ++"モジュール '%s' をリセットできません。モジュールの状態はすでに変更されていま" ++"す" ++ ++#: libdnf/dnf-context.cpp:3328 ++#, c-format ++msgid "Cannot disable module '%s': State of module already modified" ++msgstr "" ++"モジュール '%s' を無効にできません。モジュールの状態はすでに変更されています" ++ ++#: libdnf/dnf-context.cpp:3359 libdnf/dnf-context.cpp:3451 ++#: libdnf/dnf-context.cpp:3564 ++msgid "No modular data available" ++msgstr "モジュールデータは利用できません" ++ ++#: libdnf/dnf-context.cpp:3376 ++#, c-format ++msgid "Ignoring unneeded information in argument: '%s'" ++msgstr "引数の不要な情報は無視します: '%s'" ++ ++#: libdnf/dnf-context.cpp:3414 ++#, c-format ++msgid "" ++"Problem during enablement of dependency tree for module '%1$s' stream " ++"'%2$s': %3$s" ++msgstr "" ++"モジュール '%1$s' ストリーム '%2$s' の依存関係ツリーの有効化中に問題: %3$s" ++ ++#: libdnf/dnf-context.cpp:3426 ++msgid "Problems appeared for module enable request" ++msgstr "モジュール有効リクエストに発生する問題" ++ ++#. this really should never happen; unless the modular repodata is corrupted ++#: libdnf/dnf-context.cpp:3501 ++#, c-format ++msgid "Failed to parse module artifact NEVRA '%s'" ++msgstr "モジュールアーティファクト NEVRA '%s' の解析に失敗しました" ++ ++#: libdnf/dnf-context.cpp:3535 ++msgid "Problems appeared for module install request" ++msgstr "モジュールインストールリクエストに発生する問題" ++ ++#: libdnf/dnf-context.cpp:3595 ++msgid "Problems appeared for module reset request" ++msgstr "モジュールリセットリクエストに発生する問題" ++ ++#: libdnf/dnf-context.cpp:3597 ++msgid "Problems appeared for module disable request" ++msgstr "モジュール無効化リクエストに発生する問題" ++ ++#: libdnf/dnf-context.cpp:3633 ++#, c-format ++msgid "" ++"The operation would result in switching of module '%s' stream '%s' to stream " ++"'%s'" ++msgstr "" ++"オペレーションは、モジュール '%s' ストリーム '%s' を ストリーム '%s' へと切り" ++"替える結果となります" ++ ++#: libdnf/dnf-context.cpp:3637 ++msgid "" ++"It is not possible to switch enabled streams of a module.\n" ++"It is recommended to remove all installed content from the module, and reset " ++"the module using 'microdnf module reset ' command. After you " ++"reset the module, you can install the other stream." ++msgstr "" ++"有効化されたモジュールのストリームの切り替えはできません。\n" ++"モジュールからすべてのインストールされたコンテンツを削除し、'microdnf module " ++"reset ' コマンドを使用してモジュールをリセットすることを推奨しま" ++"す。モジュールのリセット後に、別のストリームをインストールできます。" ++ ++#: libdnf/dnf-goal.cpp:85 + msgid "Could not depsolve transaction; " + msgstr "トランザクションを depsolve できませんでした; " + +-#: libdnf/dnf-goal.cpp:70 ++#: libdnf/dnf-goal.cpp:87 + #, c-format + msgid "%i problem detected:\n" + msgid_plural "%i problems detected:\n" + msgstr[0] "%i 問題を検出:\n" + +-#: libdnf/dnf-goal.cpp:78 ++#: libdnf/dnf-goal.cpp:95 + #, c-format + msgid " Problem %1$i: %2$s\n" + msgstr " 問題 %1$i: %2$s\n" + +-#: libdnf/dnf-goal.cpp:80 ++#: libdnf/dnf-goal.cpp:97 + #, c-format + msgid " Problem: %s\n" + msgstr " 問題: %s\n" +@@ -119,7 +246,9 @@ msgstr " 問題: %s\n" + msgid "" + "No available modular metadata for modular package '%s'; cannot be installed " + "on the system" +-msgstr "モジュラーパッケージ '%s' のモジュラーメタデータは利用不可です; システムにインストールはできません" ++msgstr "" ++"モジュラーパッケージ '%s' のモジュラーメタデータは利用不可です; システムにイ" ++"ンストールはできません" + + #: libdnf/dnf-rpmts.cpp:121 libdnf/dnf-rpmts.cpp:166 + #, c-format +@@ -158,7 +287,8 @@ msgstr "トランザクションの実行中にエラーが発生しました: % + + #: libdnf/dnf-rpmts.cpp:283 + msgid "Error running transaction and no problems were reported!" +-msgstr "トランザクションの実行中にエラーが発生しましたが、問題は報告されませんでした!" ++msgstr "" ++"トランザクションの実行中にエラーが発生しましたが、問題は報告されませんでした!" + + #: libdnf/dnf-rpmts.cpp:346 + msgid "Fatal error, run database recovery" +@@ -174,87 +304,130 @@ msgstr "パッケージ %s を見つけることができませんでした" + msgid "could not add erase element %1$s(%2$i)" + msgstr "erase 要素 %1$s(%2$i) を追加することができません" + +-#: libdnf/dnf-sack.cpp:381 ++#: libdnf/dnf-sack.cpp:252 ++msgid "repo_add_solv() has failed." ++msgstr "repo_add_solv() は失敗しました。" ++ ++#: libdnf/dnf-sack.cpp:416 ++#, c-format ++msgid "Loading extension cache %s (%d) failed: " ++msgstr "拡張キャッシュの %s (%d) の読み込みに失敗しました: " ++ ++#: libdnf/dnf-sack.cpp:430 + #, c-format + msgid "no %1$s string for %2$s" + msgstr "%2$s の %1$s 文字列はありません" + +-#: libdnf/dnf-sack.cpp:404 +-msgid "failed to add solv" +-msgstr "solv の追加に失敗しました" +- +-#: libdnf/dnf-sack.cpp:422 ++#: libdnf/dnf-sack.cpp:440 + #, c-format + msgid "failed to open: %s" + msgstr "開くことに失敗しました: %s" + +-#: libdnf/dnf-sack.cpp:501 ++#: libdnf/dnf-sack.cpp:519 + #, c-format + msgid "cannot create temporary file: %s" + msgstr "一時ファイルを作成できません: %s" + +-#: libdnf/dnf-sack.cpp:511 ++#: libdnf/dnf-sack.cpp:529 + #, c-format + msgid "failed opening tmp file: %s" + msgstr "tmp ファイルを開くことに失敗しました: %s" + +-#: libdnf/dnf-sack.cpp:523 ++#: libdnf/dnf-sack.cpp:551 + #, c-format +-msgid "write_main() failed writing data: %i" +-msgstr "write_main() はデータの書き込みに失敗しました: %i" ++msgid "While writing primary cache %s repowriter write failed: %i, error: %s" ++msgstr "" ++"プライマリーキャッシュの %s repowriter 書き込み中に %i エラーが発生しました。" ++"エラー: %s" + +-#: libdnf/dnf-sack.cpp:540 +-msgid "write_main() failed to re-load written solv file" +-msgstr "write_main() は、書き込みされた solv ファイルの再ロードに失敗しました" ++#: libdnf/dnf-sack.cpp:561 ++#, c-format ++msgid "Failed closing tmp file %s: %s" ++msgstr "tmp ファイル %s の終了に失敗しました: %s" ++ ++#: libdnf/dnf-sack.cpp:571 ++#, c-format ++msgid "Failed to use newly written primary cache: %s: " ++msgstr "新たに書き込まれたプライマリーキャッシュを使用できません: %s: " ++ ++#: libdnf/dnf-sack.cpp:577 ++#, c-format ++msgid "Failed to use newly written primary cache: %s" ++msgstr "新たに書き込まれたプライマリーキャッシュを使用できません: %s" + +-#: libdnf/dnf-sack.cpp:605 ++#: libdnf/dnf-sack.cpp:627 + #, c-format + msgid "can not create temporary file %s" + msgstr "一時ファイル %s を作成できません" + +-#: libdnf/dnf-sack.cpp:623 ++#: libdnf/dnf-sack.cpp:667 + #, c-format +-msgid "write_ext(%1$d) has failed: %2$d" +-msgstr "write_ext(%1$d) は失敗しました: %2$d" ++msgid "" ++"While writing extension cache %s (%d): repowriter write failed: %i, error: %s" ++msgstr "" ++"拡張キャッシュ %s (%d) の書き込み中: repowriter の書き込みに失敗: %i、エ" ++"ラー: %s" + +-#: libdnf/dnf-sack.cpp:678 ++#: libdnf/dnf-sack.cpp:677 ++#, c-format ++msgid "While writing extension cache (%d): cannot close temporary file: %s" ++msgstr "拡張キャッシュの書き込み中 (%d): 一時ファイルを終了できません: %s" ++ ++#: libdnf/dnf-sack.cpp:693 ++#, c-format ++msgid "Failed to use newly written extension cache: %s (%d): " ++msgstr "新たに書き込まれた拡張キャッシュを使用できませんでした: %s (%d): " ++ ++#: libdnf/dnf-sack.cpp:700 ++#, c-format ++msgid "Failed to use newly written extension cache: %s (%d)" ++msgstr "新たに書き込まれた拡張キャッシュを使用できませんでした: %s (%d)" ++ ++#: libdnf/dnf-sack.cpp:741 + msgid "null repo md file" + msgstr "null repo md ファイル" + +-#: libdnf/dnf-sack.cpp:687 ++#: libdnf/dnf-sack.cpp:750 + #, c-format + msgid "can not read file %1$s: %2$s" + msgstr "ファイル %1$s を読み込みできません: %2$s" + +-#: libdnf/dnf-sack.cpp:701 +-msgid "repo_add_solv() has failed." +-msgstr "repo_add_solv() は失敗しました。" ++#: libdnf/dnf-sack.cpp:765 ++#, c-format ++msgid "While loading repository failed to use %s: " ++msgstr "リポジトリーのロード中に %s が使用できませんでした: " + +-#: libdnf/dnf-sack.cpp:714 ++#: libdnf/dnf-sack.cpp:776 + msgid "loading of MD_TYPE_PRIMARY has failed." + msgstr "MD_TYPE_PRIMARY のロードに失敗しました。" + +-#: libdnf/dnf-sack.cpp:727 +-msgid "repo_add_repomdxml/rpmmd() has failed." +-msgstr "repo_add_repomdxml/rpmmd() は失敗しました。" ++#: libdnf/dnf-sack.cpp:788 ++#, c-format ++msgid "Loading repomd has failed: %s" ++msgstr "repomd の読み込みに失敗しました: %s" ++ ++#: libdnf/dnf-sack.cpp:799 ++#, c-format ++msgid "Loading primary has failed: %s" ++msgstr "プライマリーの読み込みに失敗しました: %s" + +-#: libdnf/dnf-sack.cpp:794 ++#: libdnf/dnf-sack.cpp:865 + msgid "failed to auto-detect architecture" + msgstr "アーキテクチャーの自動検出に失敗しました" + +-#: libdnf/dnf-sack.cpp:919 ++#: libdnf/dnf-sack.cpp:1030 + #, c-format + msgid "failed creating cachedir %s" + msgstr "cachedir %s の作成に失敗しました" + +-#: libdnf/dnf-sack.cpp:1696 ++#: libdnf/dnf-sack.cpp:1807 + msgid "failed loading RPMDB" + msgstr "RPMDB のロードに失敗しました" + +-#: libdnf/dnf-sack.cpp:2403 ++#: libdnf/dnf-sack.cpp:2532 + #, c-format + msgid "No module defaults found: %s" +-msgstr "" ++msgstr "モジュールのデフォルトは見つかりませんでした: %s" + + #: libdnf/dnf-state.cpp:1184 + #, c-format +@@ -288,7 +461,9 @@ msgstr "パッケージ %s を確実にしようとする場合、ソースは + #: libdnf/dnf-transaction.cpp:326 + #, c-format + msgid "Failed to ensure %1$s as repo %2$s not found(%3$i repos loaded)" +-msgstr "repo %2$s が見つからないため、%1$s を確実にすることに失敗しました (%3$i repo はロード済み)" ++msgstr "" ++"repo %2$s が見つからないため、%1$s を確実にすることに失敗しました (%3$i repo " ++"はロード済み)" + + #: libdnf/dnf-transaction.cpp:367 + msgid "Failed to check untrusted: " +@@ -302,7 +477,8 @@ msgstr "%s にダウンロードしたファイルが見つかりませんでし + #: libdnf/dnf-transaction.cpp:397 + #, c-format + msgid "package %1$s cannot be verified and repo %2$s is GPG enabled: %3$s" +-msgstr "パッケージ %1$s は確認できず、repo %2$s は GPG が有効になっています: %3$s" ++msgstr "" ++"パッケージ %1$s は確認できず、repo %2$s は GPG が有効になっています: %3$s" + + #: libdnf/dnf-transaction.cpp:831 libdnf/dnf-transaction.cpp:903 + msgid "Failed to get value for CacheDir" +@@ -321,28 +497,31 @@ msgstr "%s に filesystem をフリーサイズで取得することに失敗し + #: libdnf/dnf-transaction.cpp:935 + #, c-format + msgid "Not enough free space in %1$s: needed %2$s, available %3$s" +-msgstr "%1$s に十分なスペースがありません: %2$s 必要で、利用可能なのは %3$s です" ++msgstr "" ++"%1$s に十分なスペースがありません: %2$s 必要で、利用可能なのは %3$s です" + +-#: libdnf/dnf-transaction.cpp:1196 ++#: libdnf/dnf-transaction.cpp:1195 + msgid "failed to set root" + msgstr "root の設定に失敗しました" + +-#: libdnf/dnf-transaction.cpp:1418 ++#: libdnf/dnf-transaction.cpp:1416 + #, c-format + msgid "Error %i running transaction test" + msgstr "トランザクションテストの実行中にエラー %i" + +-#: libdnf/dnf-transaction.cpp:1458 ++#: libdnf/dnf-transaction.cpp:1456 + #, c-format + msgid "Error %i running transaction" + msgstr "トランザクションの実行中にエラー %i" + +-#: libdnf/dnf-transaction.cpp:1473 ++#: libdnf/dnf-transaction.cpp:1472 + #, c-format + msgid "Transaction did not go to writing phase, but returned no error(%i)" +-msgstr "トランザクションは書き込みフェーズまで行きませんでしたが、エラー(%i) は返しませんでした" ++msgstr "" ++"トランザクションは書き込みフェーズまで行きませんでしたが、エラー(%i) は返しま" ++"せんでした" + +-#: libdnf/dnf-utils.cpp:111 libdnf/hy-iutil.cpp:399 ++#: libdnf/dnf-utils.cpp:111 libdnf/hy-iutil.cpp:485 + #, c-format + msgid "cannot open directory %1$s: %2$s" + msgstr "ディレクトリー %1$s を開くことができません: %2$s" +@@ -352,272 +531,294 @@ msgstr "ディレクトリー %1$s を開くことができません: %2$s" + msgid "failed to remove %s" + msgstr "%s の削除に失敗しました" + +-#: libdnf/goal/Goal.cpp:55 ++#: libdnf/goal/Goal.cpp:74 + msgid "Ill-formed Selector, presence of multiple match objects in the filter" + msgstr "不適格な Selector、フィルター内に複数の一致するオブジェクトが存在" + +-#: libdnf/goal/Goal.cpp:56 ++#: libdnf/goal/Goal.cpp:75 + msgid "Ill-formed Selector used for the operation, incorrect comparison type" + msgstr "操作に使用される不適格な Selector、間違った比較タイプ" + +-#: libdnf/goal/Goal.cpp:67 libdnf/goal/Goal.cpp:94 ++#: libdnf/goal/Goal.cpp:86 libdnf/goal/Goal.cpp:113 + msgid " does not belong to a distupgrade repository" + msgstr " はdistupgradeレポジトリーに属していません" + +-#: libdnf/goal/Goal.cpp:68 libdnf/goal/Goal.cpp:95 ++#: libdnf/goal/Goal.cpp:87 libdnf/goal/Goal.cpp:114 + msgid " has inferior architecture" + msgstr " は下位アーキテクチャがあります" + +-#: libdnf/goal/Goal.cpp:69 ++#: libdnf/goal/Goal.cpp:88 + msgid "problem with installed package " + msgstr "インストール済パッケージの問題 " + +-#: libdnf/goal/Goal.cpp:70 libdnf/goal/Goal.cpp:97 ++#: libdnf/goal/Goal.cpp:89 libdnf/goal/Goal.cpp:116 + msgid "conflicting requests" + msgstr "競合するリクエスト" + +-#: libdnf/goal/Goal.cpp:71 libdnf/goal/Goal.cpp:98 ++#: libdnf/goal/Goal.cpp:90 libdnf/goal/Goal.cpp:117 + msgid "unsupported request" + msgstr "非サポートのリクエスト" + +-#: libdnf/goal/Goal.cpp:72 libdnf/goal/Goal.cpp:99 ++#: libdnf/goal/Goal.cpp:91 libdnf/goal/Goal.cpp:118 + msgid "nothing provides requested " + msgstr "何もリクエストされていません " + +-#: libdnf/goal/Goal.cpp:73 ++#: libdnf/goal/Goal.cpp:92 + #, c-format + msgid "package %s does not exist" + msgstr "パッケージ %s は存在しません" + +-#: libdnf/goal/Goal.cpp:74 libdnf/goal/Goal.cpp:101 ++#: libdnf/goal/Goal.cpp:93 libdnf/goal/Goal.cpp:120 + msgid " is provided by the system" + msgstr " はシステムから提供されます" + +-#: libdnf/goal/Goal.cpp:75 libdnf/goal/Goal.cpp:102 ++#: libdnf/goal/Goal.cpp:94 libdnf/goal/Goal.cpp:121 + msgid "some dependency problem" + msgstr "いくつかの依存問題" + +-#: libdnf/goal/Goal.cpp:76 ++#: libdnf/goal/Goal.cpp:95 + msgid "cannot install the best update candidate for package " + msgstr "パッケージの最良アップデート候補をインストールできません " + +-#: libdnf/goal/Goal.cpp:77 libdnf/goal/Goal.cpp:104 ++#: libdnf/goal/Goal.cpp:96 libdnf/goal/Goal.cpp:123 + msgid "cannot install the best candidate for the job" + msgstr "ジョブの最良アップデート候補をインストールできません" + +-#: libdnf/goal/Goal.cpp:78 ++#: libdnf/goal/Goal.cpp:97 + #, c-format + msgid "package %s is filtered out by modular filtering" + msgstr "パッケージ %s はモジュラーフィルタリングに一致しません" + +-#: libdnf/goal/Goal.cpp:79 ++#: libdnf/goal/Goal.cpp:98 + #, c-format + msgid "package %s does not have a compatible architecture" + msgstr "パッケージ %s は互換性のあるアーキテクチャーがありません" + +-#: libdnf/goal/Goal.cpp:80 ++#: libdnf/goal/Goal.cpp:99 + #, c-format + msgid "package %s is not installable" + msgstr "パッケージ %s はインストール不可です" + +-#: libdnf/goal/Goal.cpp:81 ++#: libdnf/goal/Goal.cpp:100 + #, c-format + msgid "package %s is filtered out by exclude filtering" + msgstr "パッケージ %s は除外フィルタリングに一致しません" + +-#: libdnf/goal/Goal.cpp:82 ++#: libdnf/goal/Goal.cpp:101 + #, c-format + msgid "nothing provides %s needed by %s" + msgstr "%s が提供されません %s に必要です" + +-#: libdnf/goal/Goal.cpp:83 ++#: libdnf/goal/Goal.cpp:102 + #, c-format + msgid "cannot install both %s and %s" + msgstr "%s と %s どちらもインストールできません" + +-#: libdnf/goal/Goal.cpp:84 ++#: libdnf/goal/Goal.cpp:103 + #, c-format + msgid "package %s conflicts with %s provided by %s" + msgstr "パッケージ %s は %s と競合しています。これは %s により提供されます" + +-#: libdnf/goal/Goal.cpp:85 ++#: libdnf/goal/Goal.cpp:104 + #, c-format + msgid "package %s obsoletes %s provided by %s" + msgstr "パッケージ %s は %s を廃止しました。これは %s により提供されます" + +-#: libdnf/goal/Goal.cpp:86 ++#: libdnf/goal/Goal.cpp:105 + #, c-format + msgid "installed package %s obsoletes %s provided by %s" +-msgstr "インストール済パッケージ %s は %s を廃止しました。これは %s により提供されます" ++msgstr "" ++"インストール済パッケージ %s は %s を廃止しました。これは %s により提供されま" ++"す" + +-#: libdnf/goal/Goal.cpp:87 ++#: libdnf/goal/Goal.cpp:106 + #, c-format + msgid "package %s implicitly obsoletes %s provided by %s" + msgstr "パッケージ %s は %s を暗に廃止しました。これは %s により提供されます" + +-#: libdnf/goal/Goal.cpp:88 ++#: libdnf/goal/Goal.cpp:107 + #, c-format + msgid "package %s requires %s, but none of the providers can be installed" +-msgstr "パッケージ %s には %s が必要ですが、どのプロバイダーからもインストールできません" ++msgstr "" ++"パッケージ %s には %s が必要ですが、どのプロバイダーからもインストールできま" ++"せん" + +-#: libdnf/goal/Goal.cpp:89 ++#: libdnf/goal/Goal.cpp:108 + #, c-format + msgid "package %s conflicts with %s provided by itself" + msgstr "パッケージ %s は自己提供される %s と競合しています" + +-#: libdnf/goal/Goal.cpp:90 ++#: libdnf/goal/Goal.cpp:109 + #, c-format + msgid "both package %s and %s obsolete %s" + msgstr "パッケージ %s と %s 両方は %s を廃止しました" + +-#: libdnf/goal/Goal.cpp:96 ++#: libdnf/goal/Goal.cpp:115 + msgid "problem with installed module " + msgstr "インストール済モジュールの問題 " + +-#: libdnf/goal/Goal.cpp:100 ++#: libdnf/goal/Goal.cpp:119 + #, c-format + msgid "module %s does not exist" + msgstr "モジュール %s は存在しません" + +-#: libdnf/goal/Goal.cpp:103 ++#: libdnf/goal/Goal.cpp:122 + msgid "cannot install the best update candidate for module " + msgstr "モジュールの最良アップデート候補をインストールできません " + +-#: libdnf/goal/Goal.cpp:105 libdnf/goal/Goal.cpp:108 ++#: libdnf/goal/Goal.cpp:124 libdnf/goal/Goal.cpp:127 + #, c-format + msgid "module %s is disabled" + msgstr "モジュール %s は無効です" + +-#: libdnf/goal/Goal.cpp:106 ++#: libdnf/goal/Goal.cpp:125 + #, c-format + msgid "module %s does not have a compatible architecture" + msgstr "モジュール %s は互換性のあるアーキテクチャーがありません" + +-#: libdnf/goal/Goal.cpp:107 ++#: libdnf/goal/Goal.cpp:126 + #, c-format + msgid "module %s is not installable" + msgstr "モジュール %s はインストール不可です" + +-#: libdnf/goal/Goal.cpp:109 ++#: libdnf/goal/Goal.cpp:128 + #, c-format + msgid "nothing provides %s needed by module %s" + msgstr "%s が提供されませんモジュール %s に必要です" + +-#: libdnf/goal/Goal.cpp:110 ++#: libdnf/goal/Goal.cpp:129 + #, c-format + msgid "cannot install both modules %s and %s" + msgstr "モジュール %s と %s どちらもインストールできません" + +-#: libdnf/goal/Goal.cpp:111 ++#: libdnf/goal/Goal.cpp:130 + #, c-format + msgid "module %s conflicts with %s provided by %s" + msgstr "モジュール %s は %s と競合しています。これは %s により提供されます" + +-#: libdnf/goal/Goal.cpp:112 ++#: libdnf/goal/Goal.cpp:131 + #, c-format + msgid "module %s obsoletes %s provided by %s" + msgstr "モジュール %s は %s を廃止しました。これは %s により提供されます" + +-#: libdnf/goal/Goal.cpp:113 ++#: libdnf/goal/Goal.cpp:132 + #, c-format + msgid "installed module %s obsoletes %s provided by %s" +-msgstr "インストール済モジュール %s は %s を廃止しました。これは %s により提供されます" ++msgstr "" ++"インストール済モジュール %s は %s を廃止しました。これは %s により提供されま" ++"す" + +-#: libdnf/goal/Goal.cpp:114 ++#: libdnf/goal/Goal.cpp:133 + #, c-format + msgid "module %s implicitly obsoletes %s provided by %s" + msgstr "モジュール %s は %s を暗に廃止しました。これは %s により提供されます" + +-#: libdnf/goal/Goal.cpp:115 ++#: libdnf/goal/Goal.cpp:134 + #, c-format + msgid "module %s requires %s, but none of the providers can be installed" +-msgstr "モジュール %s には %s が必要ですが、どのプロバイダーからもインストールできません" ++msgstr "" ++"モジュール %s には %s が必要ですが、どのプロバイダーからもインストールできま" ++"せん" + +-#: libdnf/goal/Goal.cpp:116 ++#: libdnf/goal/Goal.cpp:135 + #, c-format + msgid "module %s conflicts with %s provided by itself" + msgstr "モジュール %s は自己提供される %s と競合しています" + +-#: libdnf/goal/Goal.cpp:117 ++#: libdnf/goal/Goal.cpp:136 + #, c-format + msgid "both module %s and %s obsolete %s" + msgstr "モジュール %s と %s 両方は %s を廃止しました" + +-#: libdnf/goal/Goal.cpp:1038 ++#: libdnf/goal/Goal.cpp:1051 + msgid "no solver set" + msgstr "設定されたソルバーはありません" + +-#: libdnf/goal/Goal.cpp:1043 ++#: libdnf/goal/Goal.cpp:1056 + #, c-format + msgid "failed to make %s absolute" + msgstr "%s を絶対的にすることに失敗しました" + +-#: libdnf/goal/Goal.cpp:1050 ++#: libdnf/goal/Goal.cpp:1063 + #, c-format + msgid "failed writing debugdata to %1$s: %2$s" + msgstr "debugdata を %1$s へ書き込むことに失敗しました: %2$s" + +-#: libdnf/goal/Goal.cpp:1062 ++#: libdnf/goal/Goal.cpp:1075 + msgid "no solv in the goal" + msgstr "目標に solv がありません" + +-#: libdnf/goal/Goal.cpp:1064 ++#: libdnf/goal/Goal.cpp:1077 + msgid "no solution, cannot remove protected package" + msgstr "ソリューションがなく、保護されたパッケージを削除できません" + +-#: libdnf/goal/Goal.cpp:1067 ++#: libdnf/goal/Goal.cpp:1080 + msgid "no solution possible" + msgstr "可能なソリューションがありません" + +-#: libdnf/goal/Goal.cpp:1479 ++#: libdnf/goal/Goal.cpp:1206 ++msgid "Problem: " ++msgstr "問題: " ++ ++#: libdnf/goal/Goal.cpp:1211 ++#, c-format ++msgid "Problem %d: " ++msgstr "問題 %d: " ++ ++#: libdnf/goal/Goal.cpp:1538 + msgid "" + "The operation would result in removing the following protected packages: " + msgstr "操作は結果的に以下の保護されたパッケージを削除します: " + +-#: libdnf/hy-iutil.cpp:322 ++#: libdnf/hy-iutil.cpp:181 ++#, c-format ++msgid "Libsolv's solv_toolversion is: %zu long but we expect max of: %zu" ++msgstr "Libsolv の solv_toolversion の長さ: %zu ですが、最大の想定値: %zu です" ++ ++#: libdnf/hy-iutil.cpp:408 + #, c-format + msgid "Failed renaming %1$s to %2$s: %3$s" + msgstr "名前を %1$s から %2$s へ変更できませんでした: %3$s" + +-#: libdnf/hy-iutil.cpp:330 ++#: libdnf/hy-iutil.cpp:416 + #, c-format + msgid "Failed setting perms on %1$s: %2$s" + msgstr "%1$s に権限を設定できませんでした: %2$s" + +-#: libdnf/hy-iutil.cpp:376 ++#: libdnf/hy-iutil.cpp:462 + #, c-format + msgid "cannot create directory %1$s: %2$s" + msgstr "ディレクトリー %1$s を作成できません : %2$s" + +-#: libdnf/hy-iutil.cpp:411 ++#: libdnf/hy-iutil.cpp:497 + #, c-format + msgid "cannot stat path %1$s: %2$s" + msgstr "パス %1$s のstatを調べられません : %2$s" + +-#: libdnf/module/ModulePackage.cpp:499 ++#: libdnf/module/ModulePackage.cpp:560 + #, c-format + msgid "Invalid format of Platform module: %s" + msgstr "不正なプラットフォームモジュールのフォーマット: %s" + +-#: libdnf/module/ModulePackage.cpp:514 ++#: libdnf/module/ModulePackage.cpp:575 + msgid "Multiple module platforms provided by available packages\n" + msgstr "利用可能パッケージに提供される複数のモジュールプラットフォーム\n" + +-#: libdnf/module/ModulePackage.cpp:527 ++#: libdnf/module/ModulePackage.cpp:588 + msgid "Multiple module platforms provided by installed packages\n" + msgstr "インストール済パッケージに提供される複数のモジュールプラットフォーム\n" + +-#: libdnf/module/ModulePackage.cpp:554 ++#: libdnf/module/ModulePackage.cpp:615 + #, c-format + msgid "Detection of Platform Module in %s failed: %s" + msgstr "%s のプラットフォームモジュールの検出に失敗しました: %s" + +-#: libdnf/module/ModulePackage.cpp:563 ++#: libdnf/module/ModulePackage.cpp:624 + #, c-format + msgid "Missing PLATFORM_ID in %s" + msgstr "%s に PLATFORM_ID が見つかりません" + +-#: libdnf/module/ModulePackage.cpp:568 ++#: libdnf/module/ModulePackage.cpp:629 + msgid "No valid Platform ID detected" + msgstr "有効な Platform ID が検出されませんでした" + +@@ -626,36 +827,71 @@ msgstr "有効な Platform ID が検出されませんでした" + msgid "Cannot enable multiple streams for module '%s'" + msgstr "モジュール '%s' の複数ストリームを有効化できません" + +-#: libdnf/module/ModulePackageContainer.cpp:294 ++#: libdnf/module/ModulePackageContainer.cpp:295 + #, c-format + msgid "Conflicting defaults with repo '%s': %s" + msgstr "repo '%s' のデフォルトが競合: %s" + +-#: libdnf/module/ModulePackageContainer.cpp:1569 ++#: libdnf/module/ModulePackageContainer.cpp:841 ++msgid "Installing module profiles:\n" ++msgstr "モジュールプロファイルのインストール中:\n" ++ ++#: libdnf/module/ModulePackageContainer.cpp:856 ++msgid "Disabling module profiles:\n" ++msgstr "モジュールプロファイルの無効化中:\n" ++ ++#: libdnf/module/ModulePackageContainer.cpp:871 ++msgid "Enabling module streams:\n" ++msgstr "モジュールストリームの有効化中:\n" ++ ++#: libdnf/module/ModulePackageContainer.cpp:885 ++msgid "Switching module streams:\n" ++msgstr "モジュールストリームの切り替え中:\n" ++ ++#: libdnf/module/ModulePackageContainer.cpp:903 ++msgid "Disabling modules:\n" ++msgstr "モジュールの無効化:\n" ++ ++#: libdnf/module/ModulePackageContainer.cpp:914 ++msgid "Resetting modules:\n" ++msgstr "モジュールの再設定中:\n" ++ ++#: libdnf/module/ModulePackageContainer.cpp:1638 + #, c-format + msgid "Unable to load modular Fail-Safe data at '%s'" + msgstr "'%s' のモジュラーフェイルセーフデータをロードできません" + +-#: libdnf/module/ModulePackageContainer.cpp:1575 ++#: libdnf/module/ModulePackageContainer.cpp:1644 + #, c-format + msgid "Unable to load modular Fail-Safe data for module '%s:%s'" + msgstr "モジュール '%s:%s' のモジュラーフェイルセーフデータをロードできません" + +-#: libdnf/module/ModulePackageContainer.cpp:1639 ++#: libdnf/module/ModulePackageContainer.cpp:1702 + #, c-format + msgid "Unable to create directory \"%s\" for modular Fail Safe data: %s" +-msgstr "ディレクトリー \"%s\" を作成できません。対象モジュラーフェイルセーフデータ: %s" ++msgstr "" ++"ディレクトリー \"%s\" を作成できません。対象モジュラーフェイルセーフデータ: " ++"%s" + +-#: libdnf/module/ModulePackageContainer.cpp:1661 ++#: libdnf/module/ModulePackageContainer.cpp:1718 + #, c-format + msgid "Unable to save a modular Fail Safe data to '%s'" + msgstr "'%s' のモジュラーフェイルセーフデータを保存できません" + +-#: libdnf/module/ModulePackageContainer.cpp:1686 ++#: libdnf/module/ModulePackageContainer.cpp:1741 + #, c-format + msgid "Unable to remove a modular Fail Safe data in '%s'" + msgstr "'%s' のモジュラーフェイルセーフデータを削除できません" + ++#: libdnf/module/ModulePackageContainer.cpp:1773 ++#, c-format ++msgid "" ++"Unable to apply modular obsoletes to '%s:%s' because target module '%s' is " ++"disabled" ++msgstr "" ++"ターゲットモジュール '%s' が無効であるため、モジュラーの廃止を '%s:%s' に適用" ++"できません" ++ + #: libdnf/module/modulemd/ModuleMetadata.cpp:86 + #, c-format + msgid "Failed to update from string: %s" +@@ -669,7 +905,7 @@ msgstr "名前解決に失敗しました: %s" + #: libdnf/module/modulemd/ModuleMetadata.cpp:115 + #, c-format + msgid "There were errors while resolving modular defaults: %s" +-msgstr "" ++msgstr "モジュラーデフォルトの解決中にエラーが発生しました: %s" + + #: libdnf/module/modulemd/ModuleMetadata.cpp:120 + #, c-format +@@ -681,6 +917,12 @@ msgstr "デフォルトのアップグレードに失敗しました: %s" + msgid "Failed to upgrade streams: %s" + msgstr "ストリームのアップグレードに失敗しました: %s" + ++#: libdnf/module/modulemd/ModuleMetadata.cpp:212 ++#, c-format ++msgid "Cannot retrieve module obsoletes because no stream matching %s: %s" ++msgstr "" ++"%s に一致するストリームがないため、モジュールの廃止を取得できません: %s" ++ + #: libdnf/plugin/plugin.cpp:46 + #, c-format + msgid "Can't load shared library \"%s\": %s" +@@ -722,6 +964,9 @@ msgid "" + "deprecated and the support will be dropped in future versions. Use '=' " + "operator instead." + msgstr "" ++"reldeps で '==' 演算子を使用すると、未定義の動作が発生する可能性があります。" ++"これは非推奨で、将来のバージョンではサポートされなくなります。代わりに '=' 演" ++"算子を使用してください。" + + #: libdnf/repo/Repo.cpp:321 + #, c-format +@@ -731,148 +976,172 @@ msgstr "リポジトリー %s にはミラーまたは baseurl セットがあ + #: libdnf/repo/Repo.cpp:330 + #, c-format + msgid "Repository '%s' has unsupported type: 'type=%s', skipping." +-msgstr "リポジトリー '%s' にはサポートされていないタイプがあります: 'type=%s'、スキッピング。" ++msgstr "" ++"リポジトリー '%s' にはサポートされていないタイプがあります: 'type=%s'、スキッ" ++"ピング。" ++ ++#: libdnf/repo/Repo.cpp:489 libdnf/repo/Repo.cpp:610 libdnf/repo/Repo.cpp:641 ++#: libdnf/repo/Repo.cpp:1387 ++#, c-format ++msgid "repo '%s': 'basecachedir' is not set" ++msgstr "repo '%s': 'basecachedir' が設定されていません" ++ ++#: libdnf/repo/Repo.cpp:512 ++msgid "" ++"Maximum download speed is lower than minimum. Please change configuration of " ++"minrate or throttle" ++msgstr "" ++"ダウンロードの最高速度は、最低速度よりも低いです。minrate またはスロットルの" ++"設定を変更してください" + + #: libdnf/repo/Repo.cpp:546 + #, c-format ++msgid "repo '%s': 'proxy_username' is set but not 'proxy_password'" ++msgstr "" ++"repo '%s': 'proxy_username' は設定済みですが、'proxy_password' は設定されてい" ++"ません" ++ ++#: libdnf/repo/Repo.cpp:548 ++msgid "'proxy_username' is set but not 'proxy_password'" ++msgstr "" ++"'proxy_username' は設定済みですが、'proxy_password' は設定されていません" ++ ++#: libdnf/repo/Repo.cpp:629 ++#, c-format + msgid "Cannot find a valid baseurl for repo: %s" + msgstr "repo に対して有効な baseurl を見つけられません: %s" + +-#: libdnf/repo/Repo.cpp:583 libdnf/repo/Repo.cpp:1672 +-msgid "" +-"Maximum download speed is lower than minimum. Please change configuration of" +-" minrate or throttle" +-msgstr "ダウンロードの最高速度は、最低速度よりも低いです。minrate またはスロットルの設定を変更してください。" +- +-#: libdnf/repo/Repo.cpp:633 libdnf/repo/Repo.cpp:655 ++#: libdnf/repo/Repo.cpp:660 libdnf/repo/Repo.cpp:682 + #, c-format + msgid "%s: gpgme_data_new_from_fd(): %s" + msgstr "%s: gpgme_data_new_from_fd(): %s" + +-#: libdnf/repo/Repo.cpp:641 libdnf/repo/Repo.cpp:663 ++#: libdnf/repo/Repo.cpp:668 libdnf/repo/Repo.cpp:690 + #, c-format + msgid "%s: gpgme_op_import(): %s" + msgstr "%s: gpgme_op_import(): %s" + +-#: libdnf/repo/Repo.cpp:686 libdnf/repo/Repo.cpp:752 libdnf/repo/Repo.cpp:880 ++#: libdnf/repo/Repo.cpp:713 libdnf/repo/Repo.cpp:779 libdnf/repo/Repo.cpp:907 + #, c-format + msgid "%s: gpgme_ctx_set_engine_info(): %s" + msgstr "%s: gpgme_ctx_set_engine_info(): %s" + +-#: libdnf/repo/Repo.cpp:713 libdnf/repo/Repo.cpp:777 ++#: libdnf/repo/Repo.cpp:740 libdnf/repo/Repo.cpp:804 + #, c-format + msgid "can not list keys: %s" + msgstr "キーを一覧表示できません: %s" + +-#: libdnf/repo/Repo.cpp:806 ++#: libdnf/repo/Repo.cpp:833 + #, c-format + msgid "Failed to retrieve GPG key for repo '%s': %s" + msgstr "repo '%s' のGPG鍵の回収に失敗しました : %s" + +-#: libdnf/repo/Repo.cpp:859 ++#: libdnf/repo/Repo.cpp:886 + #, c-format + msgid "repo %s: 0x%s already imported" + msgstr "repo %s: 0x%s はインポート済みです" + +-#: libdnf/repo/Repo.cpp:887 ++#: libdnf/repo/Repo.cpp:914 + #, c-format + msgid "repo %s: imported key 0x%s." + msgstr "repo %s: インポート済みのキー 0x%s。" + +-#: libdnf/repo/Repo.cpp:1131 ++#: libdnf/repo/Repo.cpp:1167 + #, c-format + msgid "reviving: repo '%s' skipped, no metalink." + msgstr "復元中: repo '%s' はスキップされました、metalink はありません。" + +-#: libdnf/repo/Repo.cpp:1150 ++#: libdnf/repo/Repo.cpp:1186 + #, c-format + msgid "reviving: repo '%s' skipped, no usable hash." +-msgstr "復元中: repo '%s' はスキップされました、使用可能なハッシュはありません。" ++msgstr "" ++"復元中: repo '%s' はスキップされました、使用可能なハッシュはありません。" + +-#: libdnf/repo/Repo.cpp:1173 ++#: libdnf/repo/Repo.cpp:1209 + #, c-format + msgid "reviving: failed for '%s', mismatched %s sum." + msgstr "復元中: '%s' は失敗しました、%s の合計は一致しません。" + +-#: libdnf/repo/Repo.cpp:1179 ++#: libdnf/repo/Repo.cpp:1215 + #, c-format + msgid "reviving: '%s' can be revived - metalink checksums match." + msgstr "復元中: '%s' は復元できます - metalink チェックサムが一致します。" + +-#: libdnf/repo/Repo.cpp:1204 ++#: libdnf/repo/Repo.cpp:1240 + #, c-format + msgid "reviving: '%s' can be revived - repomd matches." + msgstr "復元中: '%s' は復元できます - repomd が一致します。" + +-#: libdnf/repo/Repo.cpp:1206 ++#: libdnf/repo/Repo.cpp:1242 + #, c-format + msgid "reviving: failed for '%s', mismatched repomd." +-msgstr "復元中: '%s' に失敗しました、repomd が一致しません。" ++msgstr "復元中: '%s' に失敗しました、repomd が一致しません。" + +-#: libdnf/repo/Repo.cpp:1224 ++#: libdnf/repo/Repo.cpp:1260 + #, c-format + msgid "Cannot create repo destination directory \"%s\": %s" + msgstr "repo 送信先ディレクトリ \"%s\" を作成できません : %s" + +-#: libdnf/repo/Repo.cpp:1230 ++#: libdnf/repo/Repo.cpp:1266 + #, c-format + msgid "Cannot create repo temporary directory \"%s\": %s" + msgstr "repo 一時ディレクトリー \"%s\" を作成できません: %s" + +-#: libdnf/repo/Repo.cpp:1244 ++#: libdnf/repo/Repo.cpp:1280 + #, c-format + msgid "Cannot create directory \"%s\": %s" + msgstr "ディレクトリー \"%s\" を作成できません: %s" + +-#: libdnf/repo/Repo.cpp:1267 ++#: libdnf/repo/Repo.cpp:1303 + #, c-format + msgid "Cannot rename directory \"%s\" to \"%s\": %s" + msgstr "ディレクトリー名を \"%s\" から \"%s\" へと変更できません: %s" + +-#: libdnf/repo/Repo.cpp:1290 ++#: libdnf/repo/Repo.cpp:1326 + #, c-format + msgid "repo: using cache for: %s" + msgstr "repo: キャッシュを使用: %s" + +-#: libdnf/repo/Repo.cpp:1302 ++#: libdnf/repo/Repo.cpp:1338 + #, c-format + msgid "Cache-only enabled but no cache for '%s'" +-msgstr "キャッシュオンリーが有効になっていますが、'%s' に対するキャッシュはありません" ++msgstr "" ++"キャッシュオンリーが有効になっていますが、'%s' に対するキャッシュはありません" + +-#: libdnf/repo/Repo.cpp:1306 ++#: libdnf/repo/Repo.cpp:1342 + #, c-format + msgid "repo: downloading from remote: %s" + msgstr "repo: リモートからダウンロード中: %s" + +-#: libdnf/repo/Repo.cpp:1312 ++#: libdnf/repo/Repo.cpp:1349 + #, c-format + msgid "Failed to download metadata for repo '%s': %s" + msgstr "repo '%s' のメタデータのダウンロードに失敗しました : %s" + +-#: libdnf/repo/Repo.cpp:1338 ++#: libdnf/repo/Repo.cpp:1375 + msgid "getCachedir(): Computation of SHA256 failed" + msgstr "getCachedir(): SHA256 のコンピュテーションに失敗しました" + +-#: libdnf/repo/Repo.cpp:1363 ++#: libdnf/repo/Repo.cpp:1403 + #, c-format + msgid "Cannot create persistdir \"%s\": %s" + msgstr "persistdir \"%s\" を作成できません : %s" + +-#: libdnf/repo/Repo.cpp:1763 ++#: libdnf/repo/Repo.cpp:1780 + msgid "resume cannot be used simultaneously with the byterangestart param" + msgstr "resume は byterangestart param と同時に使用できません" + +-#: libdnf/repo/Repo.cpp:1780 ++#: libdnf/repo/Repo.cpp:1797 + #, c-format + msgid "PackageTarget initialization failed: %s" + msgstr "PackageTarget の初期化に失敗しました: %s" + +-#: libdnf/repo/Repo.cpp:1886 ++#: libdnf/repo/Repo.cpp:1903 + #, c-format + msgid "Cannot open %s: %s" + msgstr "%s を開くことができません: %s" + +-#: libdnf/repo/Repo.cpp:1930 ++#: libdnf/repo/Repo.cpp:1947 + #, c-format + msgid "Log handler with id %ld doesn't exist" + msgstr "id %ld を伴うログハンドラーは存在しません" +@@ -881,27 +1150,28 @@ msgstr "id %ld を伴うログハンドラーは存在しません" + msgid "In progress" + msgstr "進行中" + +-#: libdnf/transaction/Swdb.cpp:188 libdnf/transaction/Swdb.cpp:216 +-#: libdnf/transaction/Swdb.cpp:228 libdnf/transaction/Swdb.cpp:245 +-#: libdnf/transaction/Swdb.cpp:384 libdnf/transaction/Swdb.cpp:394 ++#: libdnf/transaction/Swdb.cpp:187 libdnf/transaction/Swdb.cpp:215 ++#: libdnf/transaction/Swdb.cpp:227 libdnf/transaction/Swdb.cpp:244 ++#: libdnf/transaction/Swdb.cpp:383 libdnf/transaction/Swdb.cpp:393 + msgid "Not in progress" + msgstr "進行中ではありません" + +-#: libdnf/transaction/Swdb.cpp:255 ++#: libdnf/transaction/Swdb.cpp:254 + msgid "No transaction in progress" + msgstr "進行中のトランザクションはありません" + +-#: libdnf/transaction/TransactionItem.cpp:147 ++#: libdnf/transaction/TransactionItem.cpp:146 + msgid "Attempt to insert transaction item into completed transaction" + msgstr "完了したトランザクションにトランザクションアイテムの挿入を試みます" + +-#: libdnf/transaction/TransactionItem.cpp:218 ++#: libdnf/transaction/TransactionItem.cpp:217 + msgid "Attempt to update transaction item in completed transaction" + msgstr "完了したトランザクションにトランザクションアイテムの更新を試みます" + + #: libdnf/transaction/Transformer.cpp:76 + msgid "Database Corrupted: no row 'version' in table 'config'" + msgstr "" ++"データベースが破損しています。テーブル 'config' の行 'version' がありません" + + #: libdnf/transaction/Transformer.cpp:681 + msgid "Transformer: can't open history persist dir" +@@ -924,8 +1194,21 @@ msgstr "TransactionItem の状態は設定されていません: %s" + msgid "Can't add console output to unsaved transaction" + msgstr "未保存のトランザクションにコンソールの出力を追加できません" + ++#~ msgid "failed to add solv" ++#~ msgstr "solv の追加に失敗しました" ++ ++#~ msgid "write_main() failed writing data: %i" ++#~ msgstr "write_main() はデータの書き込みに失敗しました: %i" ++ ++#~ msgid "write_main() failed to re-load written solv file" ++#~ msgstr "" ++#~ "write_main() は、書き込みされた solv ファイルの再ロードに失敗しました" ++ ++#~ msgid "write_ext(%1$d) has failed: %2$d" ++#~ msgstr "write_ext(%1$d) は失敗しました: %2$d" ++ ++#~ msgid "repo_add_repomdxml/rpmmd() has failed." ++#~ msgstr "repo_add_repomdxml/rpmmd() は失敗しました。" ++ + #~ msgid "Bad id for repo: %s, byte = %s %d" + #~ msgstr "repo に対する不正な id: %s, byte = %s %d" +- +-#~ msgid "failed calculating RPMDB checksum" +-#~ msgstr "RPMDB チェックサムの計算に失敗しました" +diff --git a/po/ko.po b/po/ko.po +index 48094831..777b79f0 100644 +--- a/po/ko.po ++++ b/po/ko.po +@@ -1,31 +1,33 @@ + # SOME DESCRIPTIVE TITLE. + # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER + # This file is distributed under the same license as the PACKAGE package. +-# FIRST AUTHOR , YEAR. + # Ludek Janda , 2018. #zanata ++# simmon , 2021. ++# 김인수 , 2022. + msgid "" + msgstr "" + "Project-Id-Version: PACKAGE VERSION\n" + "Report-Msgid-Bugs-To: \n" +-"POT-Creation-Date: 2020-10-05 09:18-0400\n" +-"PO-Revision-Date: 2018-11-02 05:26+0000\n" +-"Last-Translator: Copied by Zanata \n" +-"Language-Team: Korean\n" ++"POT-Creation-Date: 2023-02-28 09:11+0100\n" ++"PO-Revision-Date: 2022-11-03 02:19+0000\n" ++"Last-Translator: 김인수 \n" ++"Language-Team: Korean \n" + "Language: ko\n" + "MIME-Version: 1.0\n" + "Content-Type: text/plain; charset=UTF-8\n" + "Content-Transfer-Encoding: 8bit\n" +-"Plural-Forms: nplurals=1; plural=0\n" +-"X-Generator: Zanata 4.6.2\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Weblate 4.14.1\n" + + #: libdnf/conf/ConfigMain.cpp:62 libdnf/conf/OptionSeconds.cpp:40 + msgid "no value specified" +-msgstr "값이 지정되지 않았습니다." ++msgstr "값이 지정되지 않았습니다" + + #: libdnf/conf/ConfigMain.cpp:67 libdnf/conf/OptionSeconds.cpp:48 + #, c-format + msgid "seconds value '%s' must not be negative" +-msgstr "초 값 '%s음수가 아니어야합니다." ++msgstr "초 값 '%s 음수가 아니어야합니다" + + #: libdnf/conf/ConfigMain.cpp:71 + #, c-format +@@ -37,17 +39,34 @@ msgstr "변환 할 수 없습니다 '%s'~ 바이트" + msgid "unknown unit '%s'" + msgstr "알 수없는 단위 '%s'" + +-#: libdnf/conf/ConfigMain.cpp:332 ++#: libdnf/conf/ConfigMain.cpp:204 libdnf/conf/OptionEnum.cpp:83 ++#: libdnf/conf/OptionNumber.cpp:88 ++msgid "invalid value" ++msgstr "잘못된 값" ++ ++#: libdnf/conf/ConfigMain.cpp:207 ++msgid "value 1 is not allowed" ++msgstr "값 1은 허용되지 않습니다" ++ ++#: libdnf/conf/ConfigMain.cpp:209 ++msgid "negative value is not allowed" ++msgstr "음수 값은 허용되지 않습니다" ++ ++#: libdnf/conf/ConfigMain.cpp:341 + #, c-format + msgid "percentage '%s' is out of range" +-msgstr "백분율 '%s'범위를 벗어났습니다." ++msgstr "백분율 '%s' 범위를 벗어났습니다" ++ ++#: libdnf/conf/ConfigRepo.cpp:182 ++msgid "only the value 'priority' is supported." ++msgstr "'우선순위' 값만 지원됩니다." + +-#: libdnf/conf/OptionBinds.cpp:76 ++#: libdnf/conf/OptionBinds.cpp:85 + #, c-format + msgid "Configuration: OptionBinding with id \"%s\" does not exist" + msgstr "구성 : ID가 \"%s\" 존재하지 않는다" + +-#: libdnf/conf/OptionBinds.cpp:88 ++#: libdnf/conf/OptionBinds.cpp:97 + #, c-format + msgid "Configuration: OptionBinding with id \"%s\" already exists" + msgstr "구성 : ID가 \"%s\" 이미 존재 함" +@@ -58,14 +77,10 @@ msgid "invalid boolean value '%s'" + msgstr "유효하지 않은 부울 값 '%s'" + + #: libdnf/conf/OptionEnum.cpp:72 libdnf/conf/OptionEnum.cpp:158 +-#: libdnf/conf/OptionString.cpp:59 libdnf/conf/OptionStringList.cpp:59 ++#: libdnf/conf/OptionString.cpp:64 libdnf/conf/OptionStringList.cpp:59 + #, c-format + msgid "'%s' is not an allowed value" +-msgstr "'%s'은 (는) 허용 된 값이 아닙니다." +- +-#: libdnf/conf/OptionEnum.cpp:83 libdnf/conf/OptionNumber.cpp:88 +-msgid "invalid value" +-msgstr "잘못된 값" ++msgstr "'%s'는 허용 된 값이 아닙니다" + + #: libdnf/conf/OptionNumber.cpp:73 + #, c-format +@@ -92,29 +107,136 @@ msgstr "주어진 경로 '%s' 존재하지 않는다." + msgid "could not convert '%s' to seconds" + msgstr "변환 할 수 없습니다 '%s'초까지" + +-#: libdnf/conf/OptionString.cpp:74 ++#: libdnf/conf/OptionString.cpp:79 + msgid "GetValue(): Value not set" +-msgstr "GetValue () : 값이 설정되지 않았습니다." ++msgstr "GetValue () : 값이 설정되지 않았습니다" + +-#: libdnf/dnf-goal.cpp:68 +-msgid "Could not depsolve transaction; " ++#: libdnf/dnf-context.cpp:3176 libdnf/dnf-context.cpp:3185 ++#, c-format ++msgid "Cannot enable more streams from module '%s' at the same time" ++msgstr "동시에 모듈 '%s’에서 다른 스트림을 활성화 할 수 없습니다" ++ ++#: libdnf/dnf-context.cpp:3194 libdnf/dnf-context.cpp:3212 ++#, c-format ++msgid "" ++"Cannot enable module '%1$s' stream '%2$s': State of module already modified" ++msgstr "" ++"모듈 '%1$s' 스트림 '%2$s 을 활성화 할 수 없습니다: 모듈 상태가 이미 변경되었" ++"습니다" ++ ++#: libdnf/dnf-context.cpp:3259 ++#, c-format ++msgid "Modular dependency problem with Defaults: %s" ++msgstr "기본설정에 모듈 의존성 문제: %s" ++ ++#: libdnf/dnf-context.cpp:3262 ++#, c-format ++msgid "Modular dependency problem: %s" ++msgstr "모듈러 의존성 문제: %s" ++ ++#: libdnf/dnf-context.cpp:3296 libdnf/dnf-context.cpp:3320 ++#: libdnf/dnf-context.cpp:3331 libdnf/dnf-context.cpp:3370 ++#: libdnf/dnf-context.cpp:3386 libdnf/dnf-context.cpp:3418 ++#: libdnf/dnf-context.cpp:3462 libdnf/dnf-context.cpp:3472 ++#, c-format ++msgid "Unable to resolve argument '%s'" ++msgstr "인수 %s를 해결 할 수 없습니다" ++ ++#: libdnf/dnf-context.cpp:3303 ++#, c-format ++msgid "" ++"Only module name is required. Ignoring unneeded information in argument: '%s'" ++msgstr "모듈 이름만 필요합니다. 인수에서 불필요한 정보를 무시합니다: '%s'" ++ ++#: libdnf/dnf-context.cpp:3317 ++#, c-format ++msgid "Cannot reset module '%s': State of module already modified" ++msgstr "모듈 '%s 를 재설정 할 수 없습니다: 모듈 상태가 이미 변경되었습니다" ++ ++#: libdnf/dnf-context.cpp:3328 ++#, c-format ++msgid "Cannot disable module '%s': State of module already modified" ++msgstr "모듈 '%s'사용 할 수 없습니다: 모듈 상태는 이미 적재되었습니다" ++ ++#: libdnf/dnf-context.cpp:3359 libdnf/dnf-context.cpp:3451 ++#: libdnf/dnf-context.cpp:3564 ++msgid "No modular data available" ++msgstr "모듈러 자료를 이용 할 수 없습니다" ++ ++#: libdnf/dnf-context.cpp:3376 ++#, c-format ++msgid "Ignoring unneeded information in argument: '%s'" ++msgstr "인수: '%s'에 불필요한 정보를 무시하기" ++ ++#: libdnf/dnf-context.cpp:3414 ++#, c-format ++msgid "" ++"Problem during enablement of dependency tree for module '%1$s' stream " ++"'%2$s': %3$s" ++msgstr "" ++"모듈 '%1$s' 스트림 '%2$s': %3$s 위해 의존성 트리의 활성화하는 중에 발생하는 " ++"문제" ++ ++#: libdnf/dnf-context.cpp:3426 ++msgid "Problems appeared for module enable request" ++msgstr "모듈 활성화 요청에 나타난 문제" ++ ++#. this really should never happen; unless the modular repodata is corrupted ++#: libdnf/dnf-context.cpp:3501 ++#, c-format ++msgid "Failed to parse module artifact NEVRA '%s'" ++msgstr "모듈 artifact NERVE '%s' 구분 분석에 실패함" ++ ++#: libdnf/dnf-context.cpp:3535 ++msgid "Problems appeared for module install request" ++msgstr "모듈 설치 요청을 위해 나타난 문제" ++ ++#: libdnf/dnf-context.cpp:3595 ++msgid "Problems appeared for module reset request" ++msgstr "모듈 초기화 요청을 위해 나나탄 문제" ++ ++#: libdnf/dnf-context.cpp:3597 ++msgid "Problems appeared for module disable request" ++msgstr "모듈 비활성화 요청을 위해 나타난 문제" ++ ++#: libdnf/dnf-context.cpp:3633 ++#, c-format ++msgid "" ++"The operation would result in switching of module '%s' stream '%s' to stream " ++"'%s'" ++msgstr "이 동작은 모듈 '%s'' 스트림 ‘%s'에서 스트림 '%s'로의 전환 결과입니다" ++ ++#: libdnf/dnf-context.cpp:3637 ++msgid "" ++"It is not possible to switch enabled streams of a module.\n" ++"It is recommended to remove all installed content from the module, and reset " ++"the module using 'microdnf module reset ' command. After you " ++"reset the module, you can install the other stream." + msgstr "" ++"활성화된 모듈 스트림을 전환 할 수 없습니다.\n" ++"설치된 모든 내용을 모듈에서 제거하고 ‘' 명령을 사용하여 모듈을 " ++"재설정하는 것이 좋습니다. 모듈을 재설정한 후, 다른 스트림을 설치 할 수 있습니" ++"다." + +-#: libdnf/dnf-goal.cpp:70 ++#: libdnf/dnf-goal.cpp:85 ++msgid "Could not depsolve transaction; " ++msgstr "연결을 해제 할 수 없습니다; " ++ ++#: libdnf/dnf-goal.cpp:87 + #, c-format + msgid "%i problem detected:\n" + msgid_plural "%i problems detected:\n" +-msgstr[0] "" ++msgstr[0] "%i 발견 된 문제 :\n" + +-#: libdnf/dnf-goal.cpp:78 ++#: libdnf/dnf-goal.cpp:95 + #, c-format + msgid " Problem %1$i: %2$s\n" +-msgstr "" ++msgstr " 문제 %1$i: %2$s\n" + +-#: libdnf/dnf-goal.cpp:80 ++#: libdnf/dnf-goal.cpp:97 + #, c-format + msgid " Problem: %s\n" +-msgstr "" ++msgstr " 문제: %s\n" + + #: libdnf/dnf-rpmts.cpp:79 + #, c-format +@@ -122,6 +244,8 @@ msgid "" + "No available modular metadata for modular package '%s'; cannot be installed " + "on the system" + msgstr "" ++"모듈러 꾸러미 '%s'에 사용 가능한 모듈러 메타데이터가 없으며; 시스템에 설치 " ++"할 수 없습니다" + + #: libdnf/dnf-rpmts.cpp:121 libdnf/dnf-rpmts.cpp:166 + #, c-format +@@ -156,11 +280,12 @@ msgstr "설치 요소를 추가하지 못했습니다. %1$s [%2$i]" + #: libdnf/dnf-rpmts.cpp:274 + #, c-format + msgid "Error running transaction: %s" +-msgstr "트랜잭션 실행 오류 : %s" ++msgstr "연결 실행 오류 : %s" + + #: libdnf/dnf-rpmts.cpp:283 + msgid "Error running transaction and no problems were reported!" +-msgstr "트랜잭션을 실행하는 중 오류가 발생했으며 아무런 문제도보고되지 않았습니다!" ++msgstr "" ++"연결을 실행하는 중 오류가 발생했으며 아무런 문제도 보고되지 않았습니다!" + + #: libdnf/dnf-rpmts.cpp:346 + msgid "Fatal error, run database recovery" +@@ -176,87 +301,126 @@ msgstr "꾸러미를 찾지 못했습니다. %s" + msgid "could not add erase element %1$s(%2$i)" + msgstr "요소 지우기를 추가 할 수 없습니다. %1$s(%2$i)" + +-#: libdnf/dnf-sack.cpp:381 ++#: libdnf/dnf-sack.cpp:252 ++msgid "repo_add_solv() has failed." ++msgstr "repo_add_solv() 실패하였습니다." ++ ++#: libdnf/dnf-sack.cpp:416 + #, c-format +-msgid "no %1$s string for %2$s" +-msgstr "" ++msgid "Loading extension cache %s (%d) failed: " ++msgstr "확장 캐쉬 %s (%d) 적재 중 실패함: " + +-#: libdnf/dnf-sack.cpp:404 +-msgid "failed to add solv" +-msgstr "solv를 추가하지 못했습니다." ++#: libdnf/dnf-sack.cpp:430 ++#, c-format ++msgid "no %1$s string for %2$s" ++msgstr "%2$s에 %1$s 문자열이 없습니다" + +-#: libdnf/dnf-sack.cpp:422 ++#: libdnf/dnf-sack.cpp:440 + #, c-format + msgid "failed to open: %s" + msgstr "열지 못했습니다 : %s" + +-#: libdnf/dnf-sack.cpp:501 ++#: libdnf/dnf-sack.cpp:519 + #, c-format + msgid "cannot create temporary file: %s" + msgstr "임시 파일을 만들 수 없습니다. %s" + +-#: libdnf/dnf-sack.cpp:511 ++#: libdnf/dnf-sack.cpp:529 + #, c-format + msgid "failed opening tmp file: %s" + msgstr "여는 tmp 파일을 열지 못했습니다. %s" + +-#: libdnf/dnf-sack.cpp:523 ++#: libdnf/dnf-sack.cpp:551 + #, c-format +-msgid "write_main() failed writing data: %i" +-msgstr "write_main() failed writing data: %i" ++msgid "While writing primary cache %s repowriter write failed: %i, error: %s" ++msgstr "기본 캐쉬 %s를 쓰는 동안에 repowriter 쓰기가 실패함: %i, 오류: %s" + +-#: libdnf/dnf-sack.cpp:540 +-msgid "write_main() failed to re-load written solv file" +-msgstr "write_main ()이 작성된 solv 파일을 다시로드하지 못했습니다." ++#: libdnf/dnf-sack.cpp:561 ++#, c-format ++msgid "Failed closing tmp file %s: %s" ++msgstr "tmp 파일을 닫는데 실패함 %s: %s" + +-#: libdnf/dnf-sack.cpp:605 ++#: libdnf/dnf-sack.cpp:571 ++#, c-format ++msgid "Failed to use newly written primary cache: %s: " ++msgstr "새롭게 작성된 기본 캐쉬를 사용하는데 실패함: %s: " ++ ++#: libdnf/dnf-sack.cpp:577 ++#, c-format ++msgid "Failed to use newly written primary cache: %s" ++msgstr "새롭게 작성된 기본 캐쉬를 사용하는데 실패함: %s" ++ ++#: libdnf/dnf-sack.cpp:627 + #, c-format + msgid "can not create temporary file %s" + msgstr "임시 파일을 만들 수 없습니다. %s" + +-#: libdnf/dnf-sack.cpp:623 ++#: libdnf/dnf-sack.cpp:667 ++#, c-format ++msgid "" ++"While writing extension cache %s (%d): repowriter write failed: %i, error: %s" ++msgstr "확장 캐쉬 %s (%d)를 쓰는 동안: repowriter 쓰기가 실패함: %i, 오류: %s" ++ ++#: libdnf/dnf-sack.cpp:677 + #, c-format +-msgid "write_ext(%1$d) has failed: %2$d" +-msgstr "write_ext(%1$d) has failed: %2$d" ++msgid "While writing extension cache (%d): cannot close temporary file: %s" ++msgstr "확장 캐쉬 (%d)를 쓰는 동안: 임시 파일을 닫을 수 없습니다: %s" + +-#: libdnf/dnf-sack.cpp:678 ++#: libdnf/dnf-sack.cpp:693 ++#, c-format ++msgid "Failed to use newly written extension cache: %s (%d): " ++msgstr "새롭게 작성된 확장 캐쉬를 사용하는데 실패함: %s (%d): " ++ ++#: libdnf/dnf-sack.cpp:700 ++#, c-format ++msgid "Failed to use newly written extension cache: %s (%d)" ++msgstr "새롭게 작성된 확장 캐쉬를 사용하는데 실패함: %s (%d)" ++ ++#: libdnf/dnf-sack.cpp:741 + msgid "null repo md file" + msgstr "null repo md 파일" + +-#: libdnf/dnf-sack.cpp:687 ++#: libdnf/dnf-sack.cpp:750 + #, c-format + msgid "can not read file %1$s: %2$s" + msgstr "파일을 읽을 수 없습니다. %1$s: %2$s" + +-#: libdnf/dnf-sack.cpp:701 +-msgid "repo_add_solv() has failed." +-msgstr "repo_add_solv() has failed." ++#: libdnf/dnf-sack.cpp:765 ++#, c-format ++msgid "While loading repository failed to use %s: " ++msgstr "저장소를 적재하는 동안에 %s를 사용하는데 실패함: " + +-#: libdnf/dnf-sack.cpp:714 ++#: libdnf/dnf-sack.cpp:776 + msgid "loading of MD_TYPE_PRIMARY has failed." +-msgstr "" ++msgstr "MD_TYPE_PRIMARY를 적재하지 못했습니다." + +-#: libdnf/dnf-sack.cpp:727 +-msgid "repo_add_repomdxml/rpmmd() has failed." +-msgstr "repo_add_repomdxml/rpmmd() has failed." ++#: libdnf/dnf-sack.cpp:788 ++#, c-format ++msgid "Loading repomd has failed: %s" ++msgstr "repomd 적재하는데 실패함: %s" ++ ++#: libdnf/dnf-sack.cpp:799 ++#, c-format ++msgid "Loading primary has failed: %s" ++msgstr "기본 적재하는데 실패함: %s" + +-#: libdnf/dnf-sack.cpp:794 ++#: libdnf/dnf-sack.cpp:865 + msgid "failed to auto-detect architecture" +-msgstr "아키텍처 자동 검색에 실패했습니다." ++msgstr "구조 자동 검색에 실패했습니다" + +-#: libdnf/dnf-sack.cpp:919 ++#: libdnf/dnf-sack.cpp:1030 + #, c-format + msgid "failed creating cachedir %s" +-msgstr "캐시 된 생성 실패 %s" ++msgstr "캐쉬 된 생성 실패 %s" + +-#: libdnf/dnf-sack.cpp:1696 ++#: libdnf/dnf-sack.cpp:1807 + msgid "failed loading RPMDB" + msgstr "RPMDB로드 실패" + +-#: libdnf/dnf-sack.cpp:2403 ++#: libdnf/dnf-sack.cpp:2532 + #, c-format + msgid "No module defaults found: %s" +-msgstr "" ++msgstr "모듈 기본 설정을 찾을 수 없습니다: %s" + + #: libdnf/dnf-state.cpp:1184 + #, c-format +@@ -285,7 +449,7 @@ msgstr "이미 100 %% 상태 [%s]" + #: libdnf/dnf-transaction.cpp:300 + #, c-format + msgid "Sources not set when trying to ensure package %s" +-msgstr "패키지를 만들 때 소스가 설정되지 않았습니다. %s" ++msgstr "꾸러미 %s를 확인 하려고 할 때 원천이 설정되지 않았습니다" + + #: libdnf/dnf-transaction.cpp:326 + #, c-format +@@ -299,7 +463,7 @@ msgstr "신뢰할 수 없는지 확인하지 못했습니다. " + #: libdnf/dnf-transaction.cpp:377 + #, c-format + msgid "Downloaded file for %s not found" +-msgstr "에 대한 다운로드 파일 %s 찾을 수 없음" ++msgstr "에 대한 내려받기 파일 %s 찾을 수 없음" + + #: libdnf/dnf-transaction.cpp:397 + #, c-format +@@ -308,7 +472,7 @@ msgstr "꾸러미 %1$s 확인 및 복구 할 수 없습니다. %2$s GPG 사용 + + #: libdnf/dnf-transaction.cpp:831 libdnf/dnf-transaction.cpp:903 + msgid "Failed to get value for CacheDir" +-msgstr "CacheDir에 대한 값을 가져 오는 데 실패했습니다." ++msgstr "CacheDir에 대한 값을 가져 오는 데 실패했습니다" + + #: libdnf/dnf-transaction.cpp:911 + #, c-format +@@ -325,26 +489,26 @@ msgstr "에 대한 파일 시스템 크기를 가져 오는 데 실패했습니 + msgid "Not enough free space in %1$s: needed %2$s, available %3$s" + msgstr "여유 공간이 부족합니다. %1$s: 필요 %2$s, 이용 가능 %3$s" + +-#: libdnf/dnf-transaction.cpp:1196 ++#: libdnf/dnf-transaction.cpp:1195 + msgid "failed to set root" +-msgstr "루트를 설정하지 못했습니다." ++msgstr "루트를 설정하지 못했습니다" + +-#: libdnf/dnf-transaction.cpp:1418 ++#: libdnf/dnf-transaction.cpp:1416 + #, c-format + msgid "Error %i running transaction test" +-msgstr "오류 %i 실행중인 트랜잭션 테스트" ++msgstr "%i 연결 실행 중 오류" + +-#: libdnf/dnf-transaction.cpp:1458 ++#: libdnf/dnf-transaction.cpp:1456 + #, c-format + msgid "Error %i running transaction" +-msgstr "오류 %i 실행중인 거래" ++msgstr "오류 %i 실행중인 연결" + +-#: libdnf/dnf-transaction.cpp:1473 ++#: libdnf/dnf-transaction.cpp:1472 + #, c-format + msgid "Transaction did not go to writing phase, but returned no error(%i)" +-msgstr "트랜잭션이 쓰기 단계로 이동하지 않았지만 오류를 반환하지 않았습니다 (%i)" ++msgstr "연결이 쓰기 단계로 이동하지 않았지만 오류를 반환하지 않았습니다 (%i)" + +-#: libdnf/dnf-utils.cpp:111 libdnf/hy-iutil.cpp:399 ++#: libdnf/dnf-utils.cpp:111 libdnf/hy-iutil.cpp:485 + #, c-format + msgid "cannot open directory %1$s: %2$s" + msgstr "디렉토리를 열 수 없습니다. %1$s: %2$s" +@@ -354,369 +518,421 @@ msgstr "디렉토리를 열 수 없습니다. %1$s: %2$s" + msgid "failed to remove %s" + msgstr "제거하지 못했습니다. %s" + +-#: libdnf/goal/Goal.cpp:55 ++#: libdnf/goal/Goal.cpp:74 + msgid "Ill-formed Selector, presence of multiple match objects in the filter" +-msgstr "" ++msgstr "잘못된 형식의 선택기, 필터에 일치하는 개체가 여러 개 있음" + +-#: libdnf/goal/Goal.cpp:56 ++#: libdnf/goal/Goal.cpp:75 + msgid "Ill-formed Selector used for the operation, incorrect comparison type" +-msgstr "" ++msgstr "조작에 잘못 형성된 선택자, 잘못된 비교 유형" + +-#: libdnf/goal/Goal.cpp:67 libdnf/goal/Goal.cpp:94 ++#: libdnf/goal/Goal.cpp:86 libdnf/goal/Goal.cpp:113 + msgid " does not belong to a distupgrade repository" +-msgstr "" ++msgstr " distupgrade 저장소에 속하지 않습니다" + +-#: libdnf/goal/Goal.cpp:68 libdnf/goal/Goal.cpp:95 ++#: libdnf/goal/Goal.cpp:87 libdnf/goal/Goal.cpp:114 + msgid " has inferior architecture" +-msgstr "" ++msgstr " 하위 구조" + +-#: libdnf/goal/Goal.cpp:69 ++#: libdnf/goal/Goal.cpp:88 + msgid "problem with installed package " +-msgstr "" ++msgstr "설치된 꾸러미 문제 " + +-#: libdnf/goal/Goal.cpp:70 libdnf/goal/Goal.cpp:97 ++#: libdnf/goal/Goal.cpp:89 libdnf/goal/Goal.cpp:116 + msgid "conflicting requests" +-msgstr "" ++msgstr "충돌하는 요청" + +-#: libdnf/goal/Goal.cpp:71 libdnf/goal/Goal.cpp:98 ++#: libdnf/goal/Goal.cpp:90 libdnf/goal/Goal.cpp:117 + msgid "unsupported request" +-msgstr "" ++msgstr "지원되지 않는 요청" + +-#: libdnf/goal/Goal.cpp:72 libdnf/goal/Goal.cpp:99 ++#: libdnf/goal/Goal.cpp:91 libdnf/goal/Goal.cpp:118 + msgid "nothing provides requested " +-msgstr "" ++msgstr "요청이 없습니다 " + +-#: libdnf/goal/Goal.cpp:73 ++#: libdnf/goal/Goal.cpp:92 + #, c-format + msgid "package %s does not exist" +-msgstr "" ++msgstr "꾸러미 %s가 존재하지 않습니다" + +-#: libdnf/goal/Goal.cpp:74 libdnf/goal/Goal.cpp:101 ++#: libdnf/goal/Goal.cpp:93 libdnf/goal/Goal.cpp:120 + msgid " is provided by the system" +-msgstr "" ++msgstr " 시스템에서 제공" + +-#: libdnf/goal/Goal.cpp:75 libdnf/goal/Goal.cpp:102 ++#: libdnf/goal/Goal.cpp:94 libdnf/goal/Goal.cpp:121 + msgid "some dependency problem" +-msgstr "" ++msgstr "종속성 문제" + +-#: libdnf/goal/Goal.cpp:76 ++#: libdnf/goal/Goal.cpp:95 + msgid "cannot install the best update candidate for package " +-msgstr "" ++msgstr "꾸러미에 가장 적합한 최신화 선택을 설치 할 수 없습니다 " + +-#: libdnf/goal/Goal.cpp:77 libdnf/goal/Goal.cpp:104 ++#: libdnf/goal/Goal.cpp:96 libdnf/goal/Goal.cpp:123 + msgid "cannot install the best candidate for the job" +-msgstr "" ++msgstr "작업에 가장 적합한 선택을 설치 할 수 없습니다" + +-#: libdnf/goal/Goal.cpp:78 ++#: libdnf/goal/Goal.cpp:97 + #, c-format + msgid "package %s is filtered out by modular filtering" +-msgstr "" ++msgstr "꾸러미 %s가 모듈식으로 걸러 제거됩니다" + +-#: libdnf/goal/Goal.cpp:79 ++#: libdnf/goal/Goal.cpp:98 + #, c-format + msgid "package %s does not have a compatible architecture" +-msgstr "" ++msgstr "꾸러미 %s에 호환 구조가 없습니다" + +-#: libdnf/goal/Goal.cpp:80 ++#: libdnf/goal/Goal.cpp:99 + #, c-format + msgid "package %s is not installable" +-msgstr "" ++msgstr "꾸러미 %s 가 설치 할 수 없습니다" + +-#: libdnf/goal/Goal.cpp:81 ++#: libdnf/goal/Goal.cpp:100 + #, c-format + msgid "package %s is filtered out by exclude filtering" +-msgstr "" ++msgstr "꾸러미 %s가 걸러지는 것에서 제외되었습니다" + +-#: libdnf/goal/Goal.cpp:82 ++#: libdnf/goal/Goal.cpp:101 + #, c-format + msgid "nothing provides %s needed by %s" +-msgstr "" ++msgstr "%s에 필요한 %s가 제공되지 않았습니다" + +-#: libdnf/goal/Goal.cpp:83 ++#: libdnf/goal/Goal.cpp:102 + #, c-format + msgid "cannot install both %s and %s" +-msgstr "" ++msgstr "%s 와 %s 모두 설치 할 수 없습니다" + +-#: libdnf/goal/Goal.cpp:84 ++#: libdnf/goal/Goal.cpp:103 + #, c-format + msgid "package %s conflicts with %s provided by %s" +-msgstr "" ++msgstr "꾸러미 %s은 %s에서 제공된 %s와 충돌합니다" + +-#: libdnf/goal/Goal.cpp:85 ++#: libdnf/goal/Goal.cpp:104 + #, c-format + msgid "package %s obsoletes %s provided by %s" +-msgstr "" ++msgstr "꾸러미 %s가 %s에의해 제공된 %s를 폐기합니다" + +-#: libdnf/goal/Goal.cpp:86 ++#: libdnf/goal/Goal.cpp:105 + #, c-format + msgid "installed package %s obsoletes %s provided by %s" +-msgstr "" ++msgstr "설치된 꾸러미 %s는 %s에 의해 %s 폐기되었습니다" + +-#: libdnf/goal/Goal.cpp:87 ++#: libdnf/goal/Goal.cpp:106 + #, c-format + msgid "package %s implicitly obsoletes %s provided by %s" +-msgstr "" ++msgstr "꾸러미 %s가 %s에 의해 %s가 암시적으로 폐기되었습니다" + +-#: libdnf/goal/Goal.cpp:88 ++#: libdnf/goal/Goal.cpp:107 + #, c-format + msgid "package %s requires %s, but none of the providers can be installed" +-msgstr "" ++msgstr "꾸러미 %s는 %s가 필요하지만, 공급자가 없어 설치 할 수 없습니다" + +-#: libdnf/goal/Goal.cpp:89 ++#: libdnf/goal/Goal.cpp:108 + #, c-format + msgid "package %s conflicts with %s provided by itself" +-msgstr "" ++msgstr "꾸러미 %s가 자체적으로 제공된 %s와 충돌합니다" + +-#: libdnf/goal/Goal.cpp:90 ++#: libdnf/goal/Goal.cpp:109 + #, c-format + msgid "both package %s and %s obsolete %s" +-msgstr "" ++msgstr "꾸러미 %s 와 %s 는 모두 %s에서 폐기되었습니다" + +-#: libdnf/goal/Goal.cpp:96 ++#: libdnf/goal/Goal.cpp:115 + msgid "problem with installed module " +-msgstr "" ++msgstr "설치된 모듈 문제 " + +-#: libdnf/goal/Goal.cpp:100 ++#: libdnf/goal/Goal.cpp:119 + #, c-format + msgid "module %s does not exist" +-msgstr "" ++msgstr "모듈 %s이 존재하지 않음" + +-#: libdnf/goal/Goal.cpp:103 ++#: libdnf/goal/Goal.cpp:122 + msgid "cannot install the best update candidate for module " +-msgstr "" ++msgstr "모듈에 가장 적합한 최신화 추천을 설치 할 수 없습니다 " + +-#: libdnf/goal/Goal.cpp:105 libdnf/goal/Goal.cpp:108 ++#: libdnf/goal/Goal.cpp:124 libdnf/goal/Goal.cpp:127 + #, c-format + msgid "module %s is disabled" +-msgstr "" ++msgstr "모듈 %s를 사용할 수 없습니다" + +-#: libdnf/goal/Goal.cpp:106 ++#: libdnf/goal/Goal.cpp:125 + #, c-format + msgid "module %s does not have a compatible architecture" +-msgstr "" ++msgstr "모듈 %s 에 호환되는 구조가 없습니다" + +-#: libdnf/goal/Goal.cpp:107 ++#: libdnf/goal/Goal.cpp:126 + #, c-format + msgid "module %s is not installable" +-msgstr "" ++msgstr "모듈 %s 를 설치 할 수 없습니다" + +-#: libdnf/goal/Goal.cpp:109 ++#: libdnf/goal/Goal.cpp:128 + #, c-format + msgid "nothing provides %s needed by module %s" +-msgstr "" ++msgstr "모듈 %s 에 필요한 %s 가 제공되지 않았습니다" + +-#: libdnf/goal/Goal.cpp:110 ++#: libdnf/goal/Goal.cpp:129 + #, c-format + msgid "cannot install both modules %s and %s" +-msgstr "" ++msgstr "모듈 %s 와 %s를 모두 설치 할 수 없습니다" + +-#: libdnf/goal/Goal.cpp:111 ++#: libdnf/goal/Goal.cpp:130 + #, c-format + msgid "module %s conflicts with %s provided by %s" +-msgstr "" ++msgstr "모듈 %s가 %s에 의해 제공된 %s와 충돌합니다" + +-#: libdnf/goal/Goal.cpp:112 ++#: libdnf/goal/Goal.cpp:131 + #, c-format + msgid "module %s obsoletes %s provided by %s" +-msgstr "" ++msgstr "모듈 %s가 %s에 의해 제공된 %s를 폐기하였습니다" + +-#: libdnf/goal/Goal.cpp:113 ++#: libdnf/goal/Goal.cpp:132 + #, c-format + msgid "installed module %s obsoletes %s provided by %s" +-msgstr "" ++msgstr "설치된 모듈 %s 가 %s의해 제공된 %s를 폐기합니다" + +-#: libdnf/goal/Goal.cpp:114 ++#: libdnf/goal/Goal.cpp:133 + #, c-format + msgid "module %s implicitly obsoletes %s provided by %s" +-msgstr "" ++msgstr "모듈 %s가 %s 에 의해 %s를 암시적으로 폐기되었습니다" + +-#: libdnf/goal/Goal.cpp:115 ++#: libdnf/goal/Goal.cpp:134 + #, c-format + msgid "module %s requires %s, but none of the providers can be installed" +-msgstr "" ++msgstr "모듈 %s 에 %s 가 필요하지만 공급 업체가 없어 설치 할 수 없습니다" + +-#: libdnf/goal/Goal.cpp:116 ++#: libdnf/goal/Goal.cpp:135 + #, c-format + msgid "module %s conflicts with %s provided by itself" +-msgstr "" ++msgstr "모듈 %s가 자체적으로 제공된 %s와 충돌합니다" + +-#: libdnf/goal/Goal.cpp:117 ++#: libdnf/goal/Goal.cpp:136 + #, c-format + msgid "both module %s and %s obsolete %s" +-msgstr "" ++msgstr "모듈 %s와 %s가 %s에서 폐기되었습니다" + +-#: libdnf/goal/Goal.cpp:1038 ++#: libdnf/goal/Goal.cpp:1051 + msgid "no solver set" +-msgstr "" ++msgstr "solver 설정 없음" + +-#: libdnf/goal/Goal.cpp:1043 ++#: libdnf/goal/Goal.cpp:1056 + #, c-format + msgid "failed to make %s absolute" +-msgstr "" ++msgstr "%s 절대값을 생성을 실패하였습니다" + +-#: libdnf/goal/Goal.cpp:1050 ++#: libdnf/goal/Goal.cpp:1063 + #, c-format + msgid "failed writing debugdata to %1$s: %2$s" +-msgstr "" ++msgstr "%1$s: %2$s에 디버그자료 쓰기를 실패했습니다" + +-#: libdnf/goal/Goal.cpp:1062 ++#: libdnf/goal/Goal.cpp:1075 + msgid "no solv in the goal" +-msgstr "" ++msgstr "목표에 solv가 없다" + +-#: libdnf/goal/Goal.cpp:1064 ++#: libdnf/goal/Goal.cpp:1077 + msgid "no solution, cannot remove protected package" +-msgstr "" ++msgstr "해결책 없음, 보호 된 꾸러미를 제거 할 수 없음" + +-#: libdnf/goal/Goal.cpp:1067 ++#: libdnf/goal/Goal.cpp:1080 + msgid "no solution possible" +-msgstr "" ++msgstr "해결책 없음" ++ ++#: libdnf/goal/Goal.cpp:1206 ++msgid "Problem: " ++msgstr "문제: " ++ ++#: libdnf/goal/Goal.cpp:1211 ++#, c-format ++msgid "Problem %d: " ++msgstr "문제 %d: " + +-#: libdnf/goal/Goal.cpp:1479 ++#: libdnf/goal/Goal.cpp:1538 + msgid "" + "The operation would result in removing the following protected packages: " +-msgstr "" ++msgstr "이 작업으로 인해 다음과 같은 보호 꾸러미가 제거됩니다. " + +-#: libdnf/hy-iutil.cpp:322 ++#: libdnf/hy-iutil.cpp:181 ++#, c-format ++msgid "Libsolv's solv_toolversion is: %zu long but we expect max of: %zu" ++msgstr "Libsolv의 solv_toolversion은 %zu 길이지만 최대값은 %zu로 예상됩니다" ++ ++#: libdnf/hy-iutil.cpp:408 + #, c-format + msgid "Failed renaming %1$s to %2$s: %3$s" +-msgstr "" ++msgstr "%1$s 을 %2$s: %3$s에 이름 바꾸기 실패" + +-#: libdnf/hy-iutil.cpp:330 ++#: libdnf/hy-iutil.cpp:416 + #, c-format + msgid "Failed setting perms on %1$s: %2$s" +-msgstr "" ++msgstr "%1$s: %2$s에 perms 설정 실패하였습니다" + +-#: libdnf/hy-iutil.cpp:376 ++#: libdnf/hy-iutil.cpp:462 + #, c-format + msgid "cannot create directory %1$s: %2$s" +-msgstr "" ++msgstr "디렉토리를 생성 할 수 없습니다 %1$s: %2$s" + +-#: libdnf/hy-iutil.cpp:411 ++#: libdnf/hy-iutil.cpp:497 + #, c-format + msgid "cannot stat path %1$s: %2$s" +-msgstr "" ++msgstr "경로 %1$s: %2$s stat 할 수 없습니다" + +-#: libdnf/module/ModulePackage.cpp:499 ++#: libdnf/module/ModulePackage.cpp:560 + #, c-format + msgid "Invalid format of Platform module: %s" +-msgstr "" ++msgstr "잘못된 형식의 기반 모듈: %s" + +-#: libdnf/module/ModulePackage.cpp:514 ++#: libdnf/module/ModulePackage.cpp:575 + msgid "Multiple module platforms provided by available packages\n" +-msgstr "" ++msgstr "사용 가능한 꾸러미로 제공되는 다중 모듈 기반\n" + +-#: libdnf/module/ModulePackage.cpp:527 ++#: libdnf/module/ModulePackage.cpp:588 + msgid "Multiple module platforms provided by installed packages\n" +-msgstr "" ++msgstr "설치된 꾸러미로 제공되는 다중 모듈 기반\n" + +-#: libdnf/module/ModulePackage.cpp:554 ++#: libdnf/module/ModulePackage.cpp:615 + #, c-format + msgid "Detection of Platform Module in %s failed: %s" +-msgstr "" ++msgstr "%s 실패한: %s 에서 기반(Platform) 모듈 감지" + +-#: libdnf/module/ModulePackage.cpp:563 ++#: libdnf/module/ModulePackage.cpp:624 + #, c-format + msgid "Missing PLATFORM_ID in %s" +-msgstr "" ++msgstr "%s에서 PLATFORM_ID가 누락됨" + +-#: libdnf/module/ModulePackage.cpp:568 ++#: libdnf/module/ModulePackage.cpp:629 + msgid "No valid Platform ID detected" +-msgstr "" ++msgstr "유효한 기반(Platform) ID가 없습니다" + + #: libdnf/module/ModulePackageContainer.cpp:68 + #, c-format + msgid "Cannot enable multiple streams for module '%s'" +-msgstr "" ++msgstr "모듈 '%s’를 위해 다중 스트림을 활성화 할 수 없습니다" + +-#: libdnf/module/ModulePackageContainer.cpp:294 ++#: libdnf/module/ModulePackageContainer.cpp:295 + #, c-format + msgid "Conflicting defaults with repo '%s': %s" +-msgstr "" ++msgstr "저장소 '%s: %s'와 기본 설정이 충돌합니다" ++ ++#: libdnf/module/ModulePackageContainer.cpp:841 ++msgid "Installing module profiles:\n" ++msgstr "모듈 프로파일 설치:\n" ++ ++#: libdnf/module/ModulePackageContainer.cpp:856 ++msgid "Disabling module profiles:\n" ++msgstr "모듈 프로파일 비활성화:\n" ++ ++#: libdnf/module/ModulePackageContainer.cpp:871 ++msgid "Enabling module streams:\n" ++msgstr "모듈 스트림 활성화:\n" ++ ++#: libdnf/module/ModulePackageContainer.cpp:885 ++msgid "Switching module streams:\n" ++msgstr "모듈 스트림 전환:\n" ++ ++#: libdnf/module/ModulePackageContainer.cpp:903 ++msgid "Disabling modules:\n" ++msgstr "모듈 비활성화:\n" ++ ++#: libdnf/module/ModulePackageContainer.cpp:914 ++msgid "Resetting modules:\n" ++msgstr "모듈 재설정:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:1569 ++#: libdnf/module/ModulePackageContainer.cpp:1638 + #, c-format + msgid "Unable to load modular Fail-Safe data at '%s'" +-msgstr "" ++msgstr "'%s'에서 모듈식 Fail-Safe 자료를 적재 할 수 없습니다" + +-#: libdnf/module/ModulePackageContainer.cpp:1575 ++#: libdnf/module/ModulePackageContainer.cpp:1644 + #, c-format + msgid "Unable to load modular Fail-Safe data for module '%s:%s'" +-msgstr "" ++msgstr "모듈 '%s:%s'에 대해 모듈식 Fail-Safe 자료를 적재 할 수 없습니다" + +-#: libdnf/module/ModulePackageContainer.cpp:1639 ++#: libdnf/module/ModulePackageContainer.cpp:1702 + #, c-format + msgid "Unable to create directory \"%s\" for modular Fail Safe data: %s" +-msgstr "" ++msgstr "모듈식 Fail-Safe 데이터에 대한 “%s\" 디렉토리를 만들 수 없습니다: %s" + +-#: libdnf/module/ModulePackageContainer.cpp:1661 ++#: libdnf/module/ModulePackageContainer.cpp:1718 + #, c-format + msgid "Unable to save a modular Fail Safe data to '%s'" +-msgstr "" ++msgstr "모듈식 Fail Safe 자료를 '%s'에 저장 할 수 없습니다" + +-#: libdnf/module/ModulePackageContainer.cpp:1686 ++#: libdnf/module/ModulePackageContainer.cpp:1741 + #, c-format + msgid "Unable to remove a modular Fail Safe data in '%s'" ++msgstr "'%s'에서 모듈식 Fail Safe 자료를 제거 할 수 없습니다" ++ ++#: libdnf/module/ModulePackageContainer.cpp:1773 ++#, c-format ++msgid "" ++"Unable to apply modular obsoletes to '%s:%s' because target module '%s' is " ++"disabled" + msgstr "" ++"'%s:%s'에 사용되지 않는 모듈을 적용할 수 없습니다(대상 모듈 '%s'가 비활성화 " ++"되어 있기 때문에)" + + #: libdnf/module/modulemd/ModuleMetadata.cpp:86 + #, c-format + msgid "Failed to update from string: %s" +-msgstr "" ++msgstr "문자열에서 최신화하지 못했습니다: %s" + + #: libdnf/module/modulemd/ModuleMetadata.cpp:110 + #, c-format + msgid "Failed to resolve: %s" +-msgstr "" ++msgstr "해결하지 못했습니다: %s" + + #: libdnf/module/modulemd/ModuleMetadata.cpp:115 + #, c-format + msgid "There were errors while resolving modular defaults: %s" +-msgstr "" ++msgstr "모듈식 기본값을 해결하는 동안 오류가 발생했습니다: %s" + + #: libdnf/module/modulemd/ModuleMetadata.cpp:120 + #, c-format + msgid "Failed to upgrade defaults: %s" +-msgstr "" ++msgstr "기본값을 최신화에 실패하였습니다: %s" + + #: libdnf/module/modulemd/ModuleMetadata.cpp:123 + #, c-format + msgid "Failed to upgrade streams: %s" +-msgstr "" ++msgstr "스트림 최신화에 실패하였습니다: %s" ++ ++#: libdnf/module/modulemd/ModuleMetadata.cpp:212 ++#, c-format ++msgid "Cannot retrieve module obsoletes because no stream matching %s: %s" ++msgstr "%s: %s 일치하는 스트림이 없기 때문에 구식 모듈을 검색 할 수 없습니다" + + #: libdnf/plugin/plugin.cpp:46 + #, c-format + msgid "Can't load shared library \"%s\": %s" +-msgstr "" ++msgstr "공유 라이브러리\"%s\": %s 를 적재 할 수 없습니다" + + #: libdnf/plugin/plugin.cpp:61 libdnf/plugin/plugin.cpp:67 + #: libdnf/plugin/plugin.cpp:73 libdnf/plugin/plugin.cpp:79 + #, c-format + msgid "Can't obtain address of symbol \"%s\": %s" +-msgstr "" ++msgstr "기호 \"%s\": %s 의 주소를 가져 올 수 없습니다" + + #: libdnf/plugin/plugin.cpp:86 + #, c-format + msgid "Loading plugin file=\"%s\"" +-msgstr "" ++msgstr "플러그인 파일 적재중=\"%s\"" + + #: libdnf/plugin/plugin.cpp:89 + #, c-format + msgid "Loaded plugin name=\"%s\", version=\"%s\"" +-msgstr "" ++msgstr "적재된 플러그인 이름=\"%s\", 버전=\"%s\"" + + #: libdnf/plugin/plugin.cpp:96 + msgid "Plugins::loadPlugins() dirPath cannot be empty" +-msgstr "" ++msgstr "Plugins::loadPlugins() dirPath는 비워 둘 수 없습니다" + + #: libdnf/plugin/plugin.cpp:105 + #, c-format + msgid "Can't read plugin directory \"%s\": %s" +-msgstr "" ++msgstr "플러그인 디렉토리 \"%s\": %s 를 읽을 수 없습니다" + + #: libdnf/plugin/plugin.cpp:114 + #, c-format + msgid "Can't load plugin \"%s\": %s" +-msgstr "" ++msgstr "플러그인\"%s\": %s를 적재 할 수 없습니다" + + #: libdnf/repo/DependencySplitter.cpp:50 + msgid "" +@@ -724,198 +940,220 @@ msgid "" + "deprecated and the support will be dropped in future versions. Use '=' " + "operator instead." + msgstr "" ++"reldeps에 '=='연산자를 사용하면 정의되지 않은 동작이 발생할 수 있습니다. 이 " ++"연산자는 더 이상 사용되지 않으며, 향후 버전에서는 지원이 중단됩니다. 대신 " ++"'=' 연산자를 사용하세요." + + #: libdnf/repo/Repo.cpp:321 + #, c-format + msgid "Repository %s has no mirror or baseurl set." +-msgstr "" ++msgstr "저장소 %s 는 연결주소 또는 baseurl 구성을 갖고 있지 않습니다." + + #: libdnf/repo/Repo.cpp:330 + #, c-format + msgid "Repository '%s' has unsupported type: 'type=%s', skipping." ++msgstr "저장소 '%s'는 지원하지 않는 유형: 'type=%s'이며, 건너뜁니다." ++ ++#: libdnf/repo/Repo.cpp:489 libdnf/repo/Repo.cpp:610 libdnf/repo/Repo.cpp:641 ++#: libdnf/repo/Repo.cpp:1387 ++#, c-format ++msgid "repo '%s': 'basecachedir' is not set" ++msgstr "repo '%s': 'basecachedir가 구성되어 있지 않습니다" ++ ++#: libdnf/repo/Repo.cpp:512 ++msgid "" ++"Maximum download speed is lower than minimum. Please change configuration of " ++"minrate or throttle" + msgstr "" ++"최대 내려받기 속도는 최저보다 낮습니다. 최저속도나 변환 환경구성을 변경해 주" ++"세요" + + #: libdnf/repo/Repo.cpp:546 + #, c-format +-msgid "Cannot find a valid baseurl for repo: %s" ++msgid "repo '%s': 'proxy_username' is set but not 'proxy_password'" + msgstr "" ++"repo '%s': 'proxy_username' 는 구성되어 있지만 'proxy_password'가 없습니다" + +-#: libdnf/repo/Repo.cpp:583 libdnf/repo/Repo.cpp:1672 +-msgid "" +-"Maximum download speed is lower than minimum. Please change configuration of" +-" minrate or throttle" +-msgstr "" ++#: libdnf/repo/Repo.cpp:548 ++msgid "'proxy_username' is set but not 'proxy_password'" ++msgstr "'proxy_username' 이 구성되어 있지만 'proxy_password'가 없습니다" ++ ++#: libdnf/repo/Repo.cpp:629 ++#, c-format ++msgid "Cannot find a valid baseurl for repo: %s" ++msgstr "repo: %s 를 위해 유효한 baseurl을 찾을 수 없습니다" + +-#: libdnf/repo/Repo.cpp:633 libdnf/repo/Repo.cpp:655 ++#: libdnf/repo/Repo.cpp:660 libdnf/repo/Repo.cpp:682 + #, c-format + msgid "%s: gpgme_data_new_from_fd(): %s" + msgstr "%s: gpgme_data_new_from_fd(): %s" + +-#: libdnf/repo/Repo.cpp:641 libdnf/repo/Repo.cpp:663 ++#: libdnf/repo/Repo.cpp:668 libdnf/repo/Repo.cpp:690 + #, c-format + msgid "%s: gpgme_op_import(): %s" + msgstr "%s: gpgme_op_import(): %s" + +-#: libdnf/repo/Repo.cpp:686 libdnf/repo/Repo.cpp:752 libdnf/repo/Repo.cpp:880 ++#: libdnf/repo/Repo.cpp:713 libdnf/repo/Repo.cpp:779 libdnf/repo/Repo.cpp:907 + #, c-format + msgid "%s: gpgme_ctx_set_engine_info(): %s" + msgstr "%s: gpgme_ctx_set_engine_info(): %s" + +-#: libdnf/repo/Repo.cpp:713 libdnf/repo/Repo.cpp:777 ++#: libdnf/repo/Repo.cpp:740 libdnf/repo/Repo.cpp:804 + #, c-format + msgid "can not list keys: %s" + msgstr "열쇠를 나열 할 수 없습니다 : %s" + +-#: libdnf/repo/Repo.cpp:806 ++#: libdnf/repo/Repo.cpp:833 + #, c-format + msgid "Failed to retrieve GPG key for repo '%s': %s" +-msgstr "" ++msgstr "repo '%s': %sf 를 위해 GPG key 가져오기에 실패하였습니다" + +-#: libdnf/repo/Repo.cpp:859 ++#: libdnf/repo/Repo.cpp:886 + #, c-format + msgid "repo %s: 0x%s already imported" +-msgstr "레포 %s: 0x%s 이미 수입" ++msgstr "repo %s: 0x%s를 이미 가져왔습니다" + +-#: libdnf/repo/Repo.cpp:887 ++#: libdnf/repo/Repo.cpp:914 + #, c-format + msgid "repo %s: imported key 0x%s." +-msgstr "레포 %s: 가져온 키 0x%s." ++msgstr "repo %s: 0x%s 키를 가져왔습니다." + +-#: libdnf/repo/Repo.cpp:1131 ++#: libdnf/repo/Repo.cpp:1167 + #, c-format + msgid "reviving: repo '%s' skipped, no metalink." +-msgstr "부활 : repo '%s'건너 뛰었습니다." ++msgstr "부활: repo '%s' 건너 뛰었으며, 메타링크가 없습니다." + +-#: libdnf/repo/Repo.cpp:1150 ++#: libdnf/repo/Repo.cpp:1186 + #, c-format + msgid "reviving: repo '%s' skipped, no usable hash." +-msgstr "부활 : repo '%s'건너 뛰었습니다. 사용 가능한 해시가 없습니다." ++msgstr "부활: repo '%s'건너 뛰었으며, 사용 가능한 해쉬가 없습니다." + +-#: libdnf/repo/Repo.cpp:1173 ++#: libdnf/repo/Repo.cpp:1209 + #, c-format + msgid "reviving: failed for '%s', mismatched %s sum." +-msgstr "되살리기 : 실패한 '%s', 불일치 %s 합집합." ++msgstr "부활 : '%s'에 실패하고, %s 합과 일치하지 않음." + +-#: libdnf/repo/Repo.cpp:1179 ++#: libdnf/repo/Repo.cpp:1215 + #, c-format + msgid "reviving: '%s' can be revived - metalink checksums match." +-msgstr "되살아 난다 : '%s'부활 할 수 있습니다 - metalink 체크섬이 일치합니다." ++msgstr "부활: '%s'는 부활 할 수 있습니다 - 메타링크 체크섬이 일치합니다." + +-#: libdnf/repo/Repo.cpp:1204 ++#: libdnf/repo/Repo.cpp:1240 + #, c-format + msgid "reviving: '%s' can be revived - repomd matches." +-msgstr "되살아 난다 : '%s'부활 할 수 있습니다 - repomd가 일치합니다." ++msgstr "부활: '%s'는 부활 할 수 있습니다 - repomd가 일치합니다." + +-#: libdnf/repo/Repo.cpp:1206 ++#: libdnf/repo/Repo.cpp:1242 + #, c-format + msgid "reviving: failed for '%s', mismatched repomd." +-msgstr "되살리기 : 실패한 '%s', 일치하지 않는 repomd." ++msgstr "부활: '%s'에 실패하고, 일치하지 않은 repomd." + +-#: libdnf/repo/Repo.cpp:1224 ++#: libdnf/repo/Repo.cpp:1260 + #, c-format + msgid "Cannot create repo destination directory \"%s\": %s" +-msgstr "" ++msgstr "repo 목적지 디렉토리 \"%s\": %s 를 생성 할 수 없습니다" + +-#: libdnf/repo/Repo.cpp:1230 ++#: libdnf/repo/Repo.cpp:1266 + #, c-format + msgid "Cannot create repo temporary directory \"%s\": %s" + msgstr "임시 저장소 디렉토리를 만들 수 없습니다 \"%s\": %s" + +-#: libdnf/repo/Repo.cpp:1244 ++#: libdnf/repo/Repo.cpp:1280 + #, c-format + msgid "Cannot create directory \"%s\": %s" + msgstr "디렉토리를 만들 수 없습니다 \"%s\": %s" + +-#: libdnf/repo/Repo.cpp:1267 ++#: libdnf/repo/Repo.cpp:1303 + #, c-format + msgid "Cannot rename directory \"%s\" to \"%s\": %s" +-msgstr "디렉터리 이름을 바꿀 수 없습니다 \"%s\"~\"%s\": %s" ++msgstr "디렉토리 \"%s\"를 \"%s\": %s로 변경 할 수 없음" + +-#: libdnf/repo/Repo.cpp:1290 ++#: libdnf/repo/Repo.cpp:1326 + #, c-format + msgid "repo: using cache for: %s" +-msgstr "repo : 캐시 사용 : %s" ++msgstr "repo: 캐쉬 사용: %s" + +-#: libdnf/repo/Repo.cpp:1302 ++#: libdnf/repo/Repo.cpp:1338 + #, c-format + msgid "Cache-only enabled but no cache for '%s'" +-msgstr "캐시 만 사용 가능하지만 '%s'" ++msgstr "캐쉬만 사용 가능하지만 '%s'를 위해 캐쉬가 없습니다" + +-#: libdnf/repo/Repo.cpp:1306 ++#: libdnf/repo/Repo.cpp:1342 + #, c-format + msgid "repo: downloading from remote: %s" +-msgstr "repo : 원격에서 다운로드 중 : %s" ++msgstr "repo: 원격에서 내려받기 중: %s" + +-#: libdnf/repo/Repo.cpp:1312 ++#: libdnf/repo/Repo.cpp:1349 + #, c-format + msgid "Failed to download metadata for repo '%s': %s" +-msgstr "" ++msgstr "repo를 위한 메타자료 내려받기에 실패하였습니다 '%s': %s" + +-#: libdnf/repo/Repo.cpp:1338 ++#: libdnf/repo/Repo.cpp:1375 + msgid "getCachedir(): Computation of SHA256 failed" +-msgstr "getCachedir () : SHA256 계산에 실패했습니다." ++msgstr "getCachedir(): SHA256 계산에 실패했습니다" + +-#: libdnf/repo/Repo.cpp:1363 ++#: libdnf/repo/Repo.cpp:1403 + #, c-format + msgid "Cannot create persistdir \"%s\": %s" +-msgstr "" ++msgstr "persistdir \"%s\": %s 를 생성 할 수 없습니다" + +-#: libdnf/repo/Repo.cpp:1763 ++#: libdnf/repo/Repo.cpp:1780 + msgid "resume cannot be used simultaneously with the byterangestart param" +-msgstr "이력서는 byterangestart 매개 변수와 동시에 사용할 수 없습니다." ++msgstr "이력서는 byterangestart 매개 변수와 동시에 사용 할 수 없습니다" + +-#: libdnf/repo/Repo.cpp:1780 ++#: libdnf/repo/Repo.cpp:1797 + #, c-format + msgid "PackageTarget initialization failed: %s" +-msgstr "PackageTarget 초기화에 실패했습니다 : %s" ++msgstr "PackageTarget 초기화에 실패했습니다: %s" + +-#: libdnf/repo/Repo.cpp:1886 ++#: libdnf/repo/Repo.cpp:1903 + #, c-format + msgid "Cannot open %s: %s" +-msgstr "열 수 없다 %s: %s" ++msgstr "열 수 없습니다 %s: %s" + +-#: libdnf/repo/Repo.cpp:1930 ++#: libdnf/repo/Repo.cpp:1947 + #, c-format + msgid "Log handler with id %ld doesn't exist" +-msgstr "ID가있는 로그 처리기 %ld 존재하지 않는다." ++msgstr "ID가 있는 로그 처리기 %ld가 존재하지 않습니다" + + #: libdnf/transaction/Swdb.cpp:173 + msgid "In progress" + msgstr "진행 중" + +-#: libdnf/transaction/Swdb.cpp:188 libdnf/transaction/Swdb.cpp:216 +-#: libdnf/transaction/Swdb.cpp:228 libdnf/transaction/Swdb.cpp:245 +-#: libdnf/transaction/Swdb.cpp:384 libdnf/transaction/Swdb.cpp:394 ++#: libdnf/transaction/Swdb.cpp:187 libdnf/transaction/Swdb.cpp:215 ++#: libdnf/transaction/Swdb.cpp:227 libdnf/transaction/Swdb.cpp:244 ++#: libdnf/transaction/Swdb.cpp:383 libdnf/transaction/Swdb.cpp:393 + msgid "Not in progress" + msgstr "진행 중이 아님" + +-#: libdnf/transaction/Swdb.cpp:255 ++#: libdnf/transaction/Swdb.cpp:254 + msgid "No transaction in progress" +-msgstr "진행중인 트랜잭션 없음" ++msgstr "진행 중인 연결 없음" + +-#: libdnf/transaction/TransactionItem.cpp:147 ++#: libdnf/transaction/TransactionItem.cpp:146 + msgid "Attempt to insert transaction item into completed transaction" +-msgstr "트랜잭션 항목을 완료된 트랜잭션에 삽입하려고 시도했습니다." ++msgstr "연결 항목을 완료된 연결에 삽입하려고 시도했습니다" + +-#: libdnf/transaction/TransactionItem.cpp:218 ++#: libdnf/transaction/TransactionItem.cpp:217 + msgid "Attempt to update transaction item in completed transaction" +-msgstr "완료된 트랜잭션에서 트랜잭션 항목 업데이트를 시도합니다." ++msgstr "완료된 연결에서 연결 항목 최신화를 시도합니다" + + #: libdnf/transaction/Transformer.cpp:76 + msgid "Database Corrupted: no row 'version' in table 'config'" + msgstr "" ++"데이타베이스가 오염되었습니다: 테이블 'config'에 'version' 행이 없습니다" + + #: libdnf/transaction/Transformer.cpp:681 + msgid "Transformer: can't open history persist dir" +-msgstr "변압기 : 역사를 열 수 없습니다." ++msgstr "변형: persist dir 기록을 열 수 없습니다" + + #: libdnf/transaction/Transformer.cpp:694 + msgid "Couldn't find a history database" +-msgstr "기록 데이터베이스를 찾을 수 없습니다." ++msgstr "기록 데이타베이스를 찾을 수 없습니다" + + #: libdnf/transaction/private/Transaction.cpp:41 + msgid "Transaction has already began!" +-msgstr "거래가 이미 시작되었습니다!" ++msgstr "연결이 이미 시작되었습니다!" + + #: libdnf/transaction/private/Transaction.cpp:58 + #, c-format +@@ -924,7 +1162,19 @@ msgstr "TransactionItem 상태가 설정되지 않았습니다. %s" + + #: libdnf/transaction/private/Transaction.cpp:243 + msgid "Can't add console output to unsaved transaction" +-msgstr "저장되지 않은 트랜잭션에 콘솔 출력을 추가 할 수 없습니다." ++msgstr "저장되지 않은 연결에 콘솔 출력을 추가 할 수 없습니다" ++ ++#~ msgid "failed to add solv" ++#~ msgstr "solv를 추가하지 못했습니다" ++ ++#~ msgid "write_main() failed writing data: %i" ++#~ msgstr "write_main() 실패한 쓰기 자료: %i" ++ ++#~ msgid "write_main() failed to re-load written solv file" ++#~ msgstr "write_main ()이 작성된 solv 파일을 다시 적재하지 못했습니다" ++ ++#~ msgid "write_ext(%1$d) has failed: %2$d" ++#~ msgstr "write_ext(%1$d) 실패하였습니다: %2$d" + +-#~ msgid "failed calculating RPMDB checksum" +-#~ msgstr "RPMDB 체크섬 계산 실패" ++#~ msgid "repo_add_repomdxml/rpmmd() has failed." ++#~ msgstr "repo_add_repomdxml/rpmmd() 실패하였습니다." +diff --git a/po/libdnf.pot b/po/libdnf.pot +index e7c0edfc..0242c115 100644 +--- a/po/libdnf.pot ++++ b/po/libdnf.pot +@@ -8,7 +8,7 @@ msgid "" + msgstr "" + "Project-Id-Version: PACKAGE VERSION\n" + "Report-Msgid-Bugs-To: \n" +-"POT-Creation-Date: 2020-10-05 09:18-0400\n" ++"POT-Creation-Date: 2023-02-28 09:11+0100\n" + "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" + "Last-Translator: FULL NAME \n" + "Language-Team: LANGUAGE \n" +@@ -37,17 +37,34 @@ msgstr "" + msgid "unknown unit '%s'" + msgstr "" + +-#: libdnf/conf/ConfigMain.cpp:332 ++#: libdnf/conf/ConfigMain.cpp:204 libdnf/conf/OptionEnum.cpp:83 ++#: libdnf/conf/OptionNumber.cpp:88 ++msgid "invalid value" ++msgstr "" ++ ++#: libdnf/conf/ConfigMain.cpp:207 ++msgid "value 1 is not allowed" ++msgstr "" ++ ++#: libdnf/conf/ConfigMain.cpp:209 ++msgid "negative value is not allowed" ++msgstr "" ++ ++#: libdnf/conf/ConfigMain.cpp:341 + #, c-format + msgid "percentage '%s' is out of range" + msgstr "" + +-#: libdnf/conf/OptionBinds.cpp:76 ++#: libdnf/conf/ConfigRepo.cpp:182 ++msgid "only the value 'priority' is supported." ++msgstr "" ++ ++#: libdnf/conf/OptionBinds.cpp:85 + #, c-format + msgid "Configuration: OptionBinding with id \"%s\" does not exist" + msgstr "" + +-#: libdnf/conf/OptionBinds.cpp:88 ++#: libdnf/conf/OptionBinds.cpp:97 + #, c-format + msgid "Configuration: OptionBinding with id \"%s\" already exists" + msgstr "" +@@ -58,15 +75,11 @@ msgid "invalid boolean value '%s'" + msgstr "" + + #: libdnf/conf/OptionEnum.cpp:72 libdnf/conf/OptionEnum.cpp:158 +-#: libdnf/conf/OptionString.cpp:59 libdnf/conf/OptionStringList.cpp:59 ++#: libdnf/conf/OptionString.cpp:64 libdnf/conf/OptionStringList.cpp:59 + #, c-format + msgid "'%s' is not an allowed value" + msgstr "" + +-#: libdnf/conf/OptionEnum.cpp:83 libdnf/conf/OptionNumber.cpp:88 +-msgid "invalid value" +-msgstr "" +- + #: libdnf/conf/OptionNumber.cpp:73 + #, c-format + msgid "given value [%d] should be less than allowed value [%d]." +@@ -92,27 +105,126 @@ msgstr "" + msgid "could not convert '%s' to seconds" + msgstr "" + +-#: libdnf/conf/OptionString.cpp:74 ++#: libdnf/conf/OptionString.cpp:79 + msgid "GetValue(): Value not set" + msgstr "" + +-#: libdnf/dnf-goal.cpp:68 ++#: libdnf/dnf-context.cpp:3176 libdnf/dnf-context.cpp:3185 ++#, c-format ++msgid "Cannot enable more streams from module '%s' at the same time" ++msgstr "" ++ ++#: libdnf/dnf-context.cpp:3194 libdnf/dnf-context.cpp:3212 ++#, c-format ++msgid "" ++"Cannot enable module '%1$s' stream '%2$s': State of module already modified" ++msgstr "" ++ ++#: libdnf/dnf-context.cpp:3259 ++#, c-format ++msgid "Modular dependency problem with Defaults: %s" ++msgstr "" ++ ++#: libdnf/dnf-context.cpp:3262 ++#, c-format ++msgid "Modular dependency problem: %s" ++msgstr "" ++ ++#: libdnf/dnf-context.cpp:3296 libdnf/dnf-context.cpp:3320 ++#: libdnf/dnf-context.cpp:3331 libdnf/dnf-context.cpp:3370 ++#: libdnf/dnf-context.cpp:3386 libdnf/dnf-context.cpp:3418 ++#: libdnf/dnf-context.cpp:3462 libdnf/dnf-context.cpp:3472 ++#, c-format ++msgid "Unable to resolve argument '%s'" ++msgstr "" ++ ++#: libdnf/dnf-context.cpp:3303 ++#, c-format ++msgid "" ++"Only module name is required. Ignoring unneeded information in argument: '%s'" ++msgstr "" ++ ++#: libdnf/dnf-context.cpp:3317 ++#, c-format ++msgid "Cannot reset module '%s': State of module already modified" ++msgstr "" ++ ++#: libdnf/dnf-context.cpp:3328 ++#, c-format ++msgid "Cannot disable module '%s': State of module already modified" ++msgstr "" ++ ++#: libdnf/dnf-context.cpp:3359 libdnf/dnf-context.cpp:3451 ++#: libdnf/dnf-context.cpp:3564 ++msgid "No modular data available" ++msgstr "" ++ ++#: libdnf/dnf-context.cpp:3376 ++#, c-format ++msgid "Ignoring unneeded information in argument: '%s'" ++msgstr "" ++ ++#: libdnf/dnf-context.cpp:3414 ++#, c-format ++msgid "" ++"Problem during enablement of dependency tree for module '%1$s' stream " ++"'%2$s': %3$s" ++msgstr "" ++ ++#: libdnf/dnf-context.cpp:3426 ++msgid "Problems appeared for module enable request" ++msgstr "" ++ ++#. this really should never happen; unless the modular repodata is corrupted ++#: libdnf/dnf-context.cpp:3501 ++#, c-format ++msgid "Failed to parse module artifact NEVRA '%s'" ++msgstr "" ++ ++#: libdnf/dnf-context.cpp:3535 ++msgid "Problems appeared for module install request" ++msgstr "" ++ ++#: libdnf/dnf-context.cpp:3595 ++msgid "Problems appeared for module reset request" ++msgstr "" ++ ++#: libdnf/dnf-context.cpp:3597 ++msgid "Problems appeared for module disable request" ++msgstr "" ++ ++#: libdnf/dnf-context.cpp:3633 ++#, c-format ++msgid "" ++"The operation would result in switching of module '%s' stream '%s' to stream " ++"'%s'" ++msgstr "" ++ ++#: libdnf/dnf-context.cpp:3637 ++msgid "" ++"It is not possible to switch enabled streams of a module.\n" ++"It is recommended to remove all installed content from the module, and reset " ++"the module using 'microdnf module reset ' command. After you " ++"reset the module, you can install the other stream." ++msgstr "" ++ ++#: libdnf/dnf-goal.cpp:85 + msgid "Could not depsolve transaction; " + msgstr "" + +-#: libdnf/dnf-goal.cpp:70 ++#: libdnf/dnf-goal.cpp:87 + #, c-format + msgid "%i problem detected:\n" + msgid_plural "%i problems detected:\n" + msgstr[0] "" + msgstr[1] "" + +-#: libdnf/dnf-goal.cpp:78 ++#: libdnf/dnf-goal.cpp:95 + #, c-format + msgid " Problem %1$i: %2$s\n" + msgstr "" + +-#: libdnf/dnf-goal.cpp:80 ++#: libdnf/dnf-goal.cpp:97 + #, c-format + msgid " Problem: %s\n" + msgstr "" +@@ -177,84 +289,123 @@ msgstr "" + msgid "could not add erase element %1$s(%2$i)" + msgstr "" + +-#: libdnf/dnf-sack.cpp:381 ++#: libdnf/dnf-sack.cpp:252 ++msgid "repo_add_solv() has failed." ++msgstr "" ++ ++#: libdnf/dnf-sack.cpp:416 + #, c-format +-msgid "no %1$s string for %2$s" ++msgid "Loading extension cache %s (%d) failed: " + msgstr "" + +-#: libdnf/dnf-sack.cpp:404 +-msgid "failed to add solv" ++#: libdnf/dnf-sack.cpp:430 ++#, c-format ++msgid "no %1$s string for %2$s" + msgstr "" + +-#: libdnf/dnf-sack.cpp:422 ++#: libdnf/dnf-sack.cpp:440 + #, c-format + msgid "failed to open: %s" + msgstr "" + +-#: libdnf/dnf-sack.cpp:501 ++#: libdnf/dnf-sack.cpp:519 + #, c-format + msgid "cannot create temporary file: %s" + msgstr "" + +-#: libdnf/dnf-sack.cpp:511 ++#: libdnf/dnf-sack.cpp:529 + #, c-format + msgid "failed opening tmp file: %s" + msgstr "" + +-#: libdnf/dnf-sack.cpp:523 ++#: libdnf/dnf-sack.cpp:551 + #, c-format +-msgid "write_main() failed writing data: %i" ++msgid "While writing primary cache %s repowriter write failed: %i, error: %s" + msgstr "" + +-#: libdnf/dnf-sack.cpp:540 +-msgid "write_main() failed to re-load written solv file" ++#: libdnf/dnf-sack.cpp:561 ++#, c-format ++msgid "Failed closing tmp file %s: %s" + msgstr "" + +-#: libdnf/dnf-sack.cpp:605 ++#: libdnf/dnf-sack.cpp:571 ++#, c-format ++msgid "Failed to use newly written primary cache: %s: " ++msgstr "" ++ ++#: libdnf/dnf-sack.cpp:577 ++#, c-format ++msgid "Failed to use newly written primary cache: %s" ++msgstr "" ++ ++#: libdnf/dnf-sack.cpp:627 + #, c-format + msgid "can not create temporary file %s" + msgstr "" + +-#: libdnf/dnf-sack.cpp:623 ++#: libdnf/dnf-sack.cpp:667 ++#, c-format ++msgid "" ++"While writing extension cache %s (%d): repowriter write failed: %i, error: %s" ++msgstr "" ++ ++#: libdnf/dnf-sack.cpp:677 + #, c-format +-msgid "write_ext(%1$d) has failed: %2$d" ++msgid "While writing extension cache (%d): cannot close temporary file: %s" + msgstr "" + +-#: libdnf/dnf-sack.cpp:678 ++#: libdnf/dnf-sack.cpp:693 ++#, c-format ++msgid "Failed to use newly written extension cache: %s (%d): " ++msgstr "" ++ ++#: libdnf/dnf-sack.cpp:700 ++#, c-format ++msgid "Failed to use newly written extension cache: %s (%d)" ++msgstr "" ++ ++#: libdnf/dnf-sack.cpp:741 + msgid "null repo md file" + msgstr "" + +-#: libdnf/dnf-sack.cpp:687 ++#: libdnf/dnf-sack.cpp:750 + #, c-format + msgid "can not read file %1$s: %2$s" + msgstr "" + +-#: libdnf/dnf-sack.cpp:701 +-msgid "repo_add_solv() has failed." ++#: libdnf/dnf-sack.cpp:765 ++#, c-format ++msgid "While loading repository failed to use %s: " + msgstr "" + +-#: libdnf/dnf-sack.cpp:714 ++#: libdnf/dnf-sack.cpp:776 + msgid "loading of MD_TYPE_PRIMARY has failed." + msgstr "" + +-#: libdnf/dnf-sack.cpp:727 +-msgid "repo_add_repomdxml/rpmmd() has failed." ++#: libdnf/dnf-sack.cpp:788 ++#, c-format ++msgid "Loading repomd has failed: %s" + msgstr "" + +-#: libdnf/dnf-sack.cpp:794 ++#: libdnf/dnf-sack.cpp:799 ++#, c-format ++msgid "Loading primary has failed: %s" ++msgstr "" ++ ++#: libdnf/dnf-sack.cpp:865 + msgid "failed to auto-detect architecture" + msgstr "" + +-#: libdnf/dnf-sack.cpp:919 ++#: libdnf/dnf-sack.cpp:1030 + #, c-format + msgid "failed creating cachedir %s" + msgstr "" + +-#: libdnf/dnf-sack.cpp:1696 ++#: libdnf/dnf-sack.cpp:1807 + msgid "failed loading RPMDB" + msgstr "" + +-#: libdnf/dnf-sack.cpp:2403 ++#: libdnf/dnf-sack.cpp:2532 + #, c-format + msgid "No module defaults found: %s" + msgstr "" +@@ -326,26 +477,26 @@ msgstr "" + msgid "Not enough free space in %1$s: needed %2$s, available %3$s" + msgstr "" + +-#: libdnf/dnf-transaction.cpp:1196 ++#: libdnf/dnf-transaction.cpp:1195 + msgid "failed to set root" + msgstr "" + +-#: libdnf/dnf-transaction.cpp:1418 ++#: libdnf/dnf-transaction.cpp:1416 + #, c-format + msgid "Error %i running transaction test" + msgstr "" + +-#: libdnf/dnf-transaction.cpp:1458 ++#: libdnf/dnf-transaction.cpp:1456 + #, c-format + msgid "Error %i running transaction" + msgstr "" + +-#: libdnf/dnf-transaction.cpp:1473 ++#: libdnf/dnf-transaction.cpp:1472 + #, c-format + msgid "Transaction did not go to writing phase, but returned no error(%i)" + msgstr "" + +-#: libdnf/dnf-utils.cpp:111 libdnf/hy-iutil.cpp:399 ++#: libdnf/dnf-utils.cpp:111 libdnf/hy-iutil.cpp:485 + #, c-format + msgid "cannot open directory %1$s: %2$s" + msgstr "" +@@ -355,272 +506,286 @@ msgstr "" + msgid "failed to remove %s" + msgstr "" + +-#: libdnf/goal/Goal.cpp:55 ++#: libdnf/goal/Goal.cpp:74 + msgid "Ill-formed Selector, presence of multiple match objects in the filter" + msgstr "" + +-#: libdnf/goal/Goal.cpp:56 ++#: libdnf/goal/Goal.cpp:75 + msgid "Ill-formed Selector used for the operation, incorrect comparison type" + msgstr "" + +-#: libdnf/goal/Goal.cpp:67 libdnf/goal/Goal.cpp:94 ++#: libdnf/goal/Goal.cpp:86 libdnf/goal/Goal.cpp:113 + msgid " does not belong to a distupgrade repository" + msgstr "" + +-#: libdnf/goal/Goal.cpp:68 libdnf/goal/Goal.cpp:95 ++#: libdnf/goal/Goal.cpp:87 libdnf/goal/Goal.cpp:114 + msgid " has inferior architecture" + msgstr "" + +-#: libdnf/goal/Goal.cpp:69 ++#: libdnf/goal/Goal.cpp:88 + msgid "problem with installed package " + msgstr "" + +-#: libdnf/goal/Goal.cpp:70 libdnf/goal/Goal.cpp:97 ++#: libdnf/goal/Goal.cpp:89 libdnf/goal/Goal.cpp:116 + msgid "conflicting requests" + msgstr "" + +-#: libdnf/goal/Goal.cpp:71 libdnf/goal/Goal.cpp:98 ++#: libdnf/goal/Goal.cpp:90 libdnf/goal/Goal.cpp:117 + msgid "unsupported request" + msgstr "" + +-#: libdnf/goal/Goal.cpp:72 libdnf/goal/Goal.cpp:99 ++#: libdnf/goal/Goal.cpp:91 libdnf/goal/Goal.cpp:118 + msgid "nothing provides requested " + msgstr "" + +-#: libdnf/goal/Goal.cpp:73 ++#: libdnf/goal/Goal.cpp:92 + #, c-format + msgid "package %s does not exist" + msgstr "" + +-#: libdnf/goal/Goal.cpp:74 libdnf/goal/Goal.cpp:101 ++#: libdnf/goal/Goal.cpp:93 libdnf/goal/Goal.cpp:120 + msgid " is provided by the system" + msgstr "" + +-#: libdnf/goal/Goal.cpp:75 libdnf/goal/Goal.cpp:102 ++#: libdnf/goal/Goal.cpp:94 libdnf/goal/Goal.cpp:121 + msgid "some dependency problem" + msgstr "" + +-#: libdnf/goal/Goal.cpp:76 ++#: libdnf/goal/Goal.cpp:95 + msgid "cannot install the best update candidate for package " + msgstr "" + +-#: libdnf/goal/Goal.cpp:77 libdnf/goal/Goal.cpp:104 ++#: libdnf/goal/Goal.cpp:96 libdnf/goal/Goal.cpp:123 + msgid "cannot install the best candidate for the job" + msgstr "" + +-#: libdnf/goal/Goal.cpp:78 ++#: libdnf/goal/Goal.cpp:97 + #, c-format + msgid "package %s is filtered out by modular filtering" + msgstr "" + +-#: libdnf/goal/Goal.cpp:79 ++#: libdnf/goal/Goal.cpp:98 + #, c-format + msgid "package %s does not have a compatible architecture" + msgstr "" + +-#: libdnf/goal/Goal.cpp:80 ++#: libdnf/goal/Goal.cpp:99 + #, c-format + msgid "package %s is not installable" + msgstr "" + +-#: libdnf/goal/Goal.cpp:81 ++#: libdnf/goal/Goal.cpp:100 + #, c-format + msgid "package %s is filtered out by exclude filtering" + msgstr "" + +-#: libdnf/goal/Goal.cpp:82 ++#: libdnf/goal/Goal.cpp:101 + #, c-format + msgid "nothing provides %s needed by %s" + msgstr "" + +-#: libdnf/goal/Goal.cpp:83 ++#: libdnf/goal/Goal.cpp:102 + #, c-format + msgid "cannot install both %s and %s" + msgstr "" + +-#: libdnf/goal/Goal.cpp:84 ++#: libdnf/goal/Goal.cpp:103 + #, c-format + msgid "package %s conflicts with %s provided by %s" + msgstr "" + +-#: libdnf/goal/Goal.cpp:85 ++#: libdnf/goal/Goal.cpp:104 + #, c-format + msgid "package %s obsoletes %s provided by %s" + msgstr "" + +-#: libdnf/goal/Goal.cpp:86 ++#: libdnf/goal/Goal.cpp:105 + #, c-format + msgid "installed package %s obsoletes %s provided by %s" + msgstr "" + +-#: libdnf/goal/Goal.cpp:87 ++#: libdnf/goal/Goal.cpp:106 + #, c-format + msgid "package %s implicitly obsoletes %s provided by %s" + msgstr "" + +-#: libdnf/goal/Goal.cpp:88 ++#: libdnf/goal/Goal.cpp:107 + #, c-format + msgid "package %s requires %s, but none of the providers can be installed" + msgstr "" + +-#: libdnf/goal/Goal.cpp:89 ++#: libdnf/goal/Goal.cpp:108 + #, c-format + msgid "package %s conflicts with %s provided by itself" + msgstr "" + +-#: libdnf/goal/Goal.cpp:90 ++#: libdnf/goal/Goal.cpp:109 + #, c-format + msgid "both package %s and %s obsolete %s" + msgstr "" + +-#: libdnf/goal/Goal.cpp:96 ++#: libdnf/goal/Goal.cpp:115 + msgid "problem with installed module " + msgstr "" + +-#: libdnf/goal/Goal.cpp:100 ++#: libdnf/goal/Goal.cpp:119 + #, c-format + msgid "module %s does not exist" + msgstr "" + +-#: libdnf/goal/Goal.cpp:103 ++#: libdnf/goal/Goal.cpp:122 + msgid "cannot install the best update candidate for module " + msgstr "" + +-#: libdnf/goal/Goal.cpp:105 libdnf/goal/Goal.cpp:108 ++#: libdnf/goal/Goal.cpp:124 libdnf/goal/Goal.cpp:127 + #, c-format + msgid "module %s is disabled" + msgstr "" + +-#: libdnf/goal/Goal.cpp:106 ++#: libdnf/goal/Goal.cpp:125 + #, c-format + msgid "module %s does not have a compatible architecture" + msgstr "" + +-#: libdnf/goal/Goal.cpp:107 ++#: libdnf/goal/Goal.cpp:126 + #, c-format + msgid "module %s is not installable" + msgstr "" + +-#: libdnf/goal/Goal.cpp:109 ++#: libdnf/goal/Goal.cpp:128 + #, c-format + msgid "nothing provides %s needed by module %s" + msgstr "" + +-#: libdnf/goal/Goal.cpp:110 ++#: libdnf/goal/Goal.cpp:129 + #, c-format + msgid "cannot install both modules %s and %s" + msgstr "" + +-#: libdnf/goal/Goal.cpp:111 ++#: libdnf/goal/Goal.cpp:130 + #, c-format + msgid "module %s conflicts with %s provided by %s" + msgstr "" + +-#: libdnf/goal/Goal.cpp:112 ++#: libdnf/goal/Goal.cpp:131 + #, c-format + msgid "module %s obsoletes %s provided by %s" + msgstr "" + +-#: libdnf/goal/Goal.cpp:113 ++#: libdnf/goal/Goal.cpp:132 + #, c-format + msgid "installed module %s obsoletes %s provided by %s" + msgstr "" + +-#: libdnf/goal/Goal.cpp:114 ++#: libdnf/goal/Goal.cpp:133 + #, c-format + msgid "module %s implicitly obsoletes %s provided by %s" + msgstr "" + +-#: libdnf/goal/Goal.cpp:115 ++#: libdnf/goal/Goal.cpp:134 + #, c-format + msgid "module %s requires %s, but none of the providers can be installed" + msgstr "" + +-#: libdnf/goal/Goal.cpp:116 ++#: libdnf/goal/Goal.cpp:135 + #, c-format + msgid "module %s conflicts with %s provided by itself" + msgstr "" + +-#: libdnf/goal/Goal.cpp:117 ++#: libdnf/goal/Goal.cpp:136 + #, c-format + msgid "both module %s and %s obsolete %s" + msgstr "" + +-#: libdnf/goal/Goal.cpp:1038 ++#: libdnf/goal/Goal.cpp:1051 + msgid "no solver set" + msgstr "" + +-#: libdnf/goal/Goal.cpp:1043 ++#: libdnf/goal/Goal.cpp:1056 + #, c-format + msgid "failed to make %s absolute" + msgstr "" + +-#: libdnf/goal/Goal.cpp:1050 ++#: libdnf/goal/Goal.cpp:1063 + #, c-format + msgid "failed writing debugdata to %1$s: %2$s" + msgstr "" + +-#: libdnf/goal/Goal.cpp:1062 ++#: libdnf/goal/Goal.cpp:1075 + msgid "no solv in the goal" + msgstr "" + +-#: libdnf/goal/Goal.cpp:1064 ++#: libdnf/goal/Goal.cpp:1077 + msgid "no solution, cannot remove protected package" + msgstr "" + +-#: libdnf/goal/Goal.cpp:1067 ++#: libdnf/goal/Goal.cpp:1080 + msgid "no solution possible" + msgstr "" + +-#: libdnf/goal/Goal.cpp:1479 ++#: libdnf/goal/Goal.cpp:1206 ++msgid "Problem: " ++msgstr "" ++ ++#: libdnf/goal/Goal.cpp:1211 ++#, c-format ++msgid "Problem %d: " ++msgstr "" ++ ++#: libdnf/goal/Goal.cpp:1538 + msgid "" + "The operation would result in removing the following protected packages: " + msgstr "" + +-#: libdnf/hy-iutil.cpp:322 ++#: libdnf/hy-iutil.cpp:181 ++#, c-format ++msgid "Libsolv's solv_toolversion is: %zu long but we expect max of: %zu" ++msgstr "" ++ ++#: libdnf/hy-iutil.cpp:408 + #, c-format + msgid "Failed renaming %1$s to %2$s: %3$s" + msgstr "" + +-#: libdnf/hy-iutil.cpp:330 ++#: libdnf/hy-iutil.cpp:416 + #, c-format + msgid "Failed setting perms on %1$s: %2$s" + msgstr "" + +-#: libdnf/hy-iutil.cpp:376 ++#: libdnf/hy-iutil.cpp:462 + #, c-format + msgid "cannot create directory %1$s: %2$s" + msgstr "" + +-#: libdnf/hy-iutil.cpp:411 ++#: libdnf/hy-iutil.cpp:497 + #, c-format + msgid "cannot stat path %1$s: %2$s" + msgstr "" + +-#: libdnf/module/ModulePackage.cpp:499 ++#: libdnf/module/ModulePackage.cpp:560 + #, c-format + msgid "Invalid format of Platform module: %s" + msgstr "" + +-#: libdnf/module/ModulePackage.cpp:514 ++#: libdnf/module/ModulePackage.cpp:575 + msgid "Multiple module platforms provided by available packages\n" + msgstr "" + +-#: libdnf/module/ModulePackage.cpp:527 ++#: libdnf/module/ModulePackage.cpp:588 + msgid "Multiple module platforms provided by installed packages\n" + msgstr "" + +-#: libdnf/module/ModulePackage.cpp:554 ++#: libdnf/module/ModulePackage.cpp:615 + #, c-format + msgid "Detection of Platform Module in %s failed: %s" + msgstr "" + +-#: libdnf/module/ModulePackage.cpp:563 ++#: libdnf/module/ModulePackage.cpp:624 + #, c-format + msgid "Missing PLATFORM_ID in %s" + msgstr "" + +-#: libdnf/module/ModulePackage.cpp:568 ++#: libdnf/module/ModulePackage.cpp:629 + msgid "No valid Platform ID detected" + msgstr "" + +@@ -629,36 +794,67 @@ msgstr "" + msgid "Cannot enable multiple streams for module '%s'" + msgstr "" + +-#: libdnf/module/ModulePackageContainer.cpp:294 ++#: libdnf/module/ModulePackageContainer.cpp:295 + #, c-format + msgid "Conflicting defaults with repo '%s': %s" + msgstr "" + +-#: libdnf/module/ModulePackageContainer.cpp:1569 ++#: libdnf/module/ModulePackageContainer.cpp:841 ++msgid "Installing module profiles:\n" ++msgstr "" ++ ++#: libdnf/module/ModulePackageContainer.cpp:856 ++msgid "Disabling module profiles:\n" ++msgstr "" ++ ++#: libdnf/module/ModulePackageContainer.cpp:871 ++msgid "Enabling module streams:\n" ++msgstr "" ++ ++#: libdnf/module/ModulePackageContainer.cpp:885 ++msgid "Switching module streams:\n" ++msgstr "" ++ ++#: libdnf/module/ModulePackageContainer.cpp:903 ++msgid "Disabling modules:\n" ++msgstr "" ++ ++#: libdnf/module/ModulePackageContainer.cpp:914 ++msgid "Resetting modules:\n" ++msgstr "" ++ ++#: libdnf/module/ModulePackageContainer.cpp:1638 + #, c-format + msgid "Unable to load modular Fail-Safe data at '%s'" + msgstr "" + +-#: libdnf/module/ModulePackageContainer.cpp:1575 ++#: libdnf/module/ModulePackageContainer.cpp:1644 + #, c-format + msgid "Unable to load modular Fail-Safe data for module '%s:%s'" + msgstr "" + +-#: libdnf/module/ModulePackageContainer.cpp:1639 ++#: libdnf/module/ModulePackageContainer.cpp:1702 + #, c-format + msgid "Unable to create directory \"%s\" for modular Fail Safe data: %s" + msgstr "" + +-#: libdnf/module/ModulePackageContainer.cpp:1661 ++#: libdnf/module/ModulePackageContainer.cpp:1718 + #, c-format + msgid "Unable to save a modular Fail Safe data to '%s'" + msgstr "" + +-#: libdnf/module/ModulePackageContainer.cpp:1686 ++#: libdnf/module/ModulePackageContainer.cpp:1741 + #, c-format + msgid "Unable to remove a modular Fail Safe data in '%s'" + msgstr "" + ++#: libdnf/module/ModulePackageContainer.cpp:1773 ++#, c-format ++msgid "" ++"Unable to apply modular obsoletes to '%s:%s' because target module '%s' is " ++"disabled" ++msgstr "" ++ + #: libdnf/module/modulemd/ModuleMetadata.cpp:86 + #, c-format + msgid "Failed to update from string: %s" +@@ -684,6 +880,11 @@ msgstr "" + msgid "Failed to upgrade streams: %s" + msgstr "" + ++#: libdnf/module/modulemd/ModuleMetadata.cpp:212 ++#, c-format ++msgid "Cannot retrieve module obsoletes because no stream matching %s: %s" ++msgstr "" ++ + #: libdnf/plugin/plugin.cpp:46 + #, c-format + msgid "Can't load shared library \"%s\": %s" +@@ -736,146 +937,161 @@ msgstr "" + msgid "Repository '%s' has unsupported type: 'type=%s', skipping." + msgstr "" + +-#: libdnf/repo/Repo.cpp:546 ++#: libdnf/repo/Repo.cpp:489 libdnf/repo/Repo.cpp:610 libdnf/repo/Repo.cpp:641 ++#: libdnf/repo/Repo.cpp:1387 + #, c-format +-msgid "Cannot find a valid baseurl for repo: %s" ++msgid "repo '%s': 'basecachedir' is not set" + msgstr "" + +-#: libdnf/repo/Repo.cpp:583 libdnf/repo/Repo.cpp:1672 ++#: libdnf/repo/Repo.cpp:512 + msgid "" + "Maximum download speed is lower than minimum. Please change configuration of " + "minrate or throttle" + msgstr "" + +-#: libdnf/repo/Repo.cpp:633 libdnf/repo/Repo.cpp:655 ++#: libdnf/repo/Repo.cpp:546 ++#, c-format ++msgid "repo '%s': 'proxy_username' is set but not 'proxy_password'" ++msgstr "" ++ ++#: libdnf/repo/Repo.cpp:548 ++msgid "'proxy_username' is set but not 'proxy_password'" ++msgstr "" ++ ++#: libdnf/repo/Repo.cpp:629 ++#, c-format ++msgid "Cannot find a valid baseurl for repo: %s" ++msgstr "" ++ ++#: libdnf/repo/Repo.cpp:660 libdnf/repo/Repo.cpp:682 + #, c-format + msgid "%s: gpgme_data_new_from_fd(): %s" + msgstr "" + +-#: libdnf/repo/Repo.cpp:641 libdnf/repo/Repo.cpp:663 ++#: libdnf/repo/Repo.cpp:668 libdnf/repo/Repo.cpp:690 + #, c-format + msgid "%s: gpgme_op_import(): %s" + msgstr "" + +-#: libdnf/repo/Repo.cpp:686 libdnf/repo/Repo.cpp:752 libdnf/repo/Repo.cpp:880 ++#: libdnf/repo/Repo.cpp:713 libdnf/repo/Repo.cpp:779 libdnf/repo/Repo.cpp:907 + #, c-format + msgid "%s: gpgme_ctx_set_engine_info(): %s" + msgstr "" + +-#: libdnf/repo/Repo.cpp:713 libdnf/repo/Repo.cpp:777 ++#: libdnf/repo/Repo.cpp:740 libdnf/repo/Repo.cpp:804 + #, c-format + msgid "can not list keys: %s" + msgstr "" + +-#: libdnf/repo/Repo.cpp:806 ++#: libdnf/repo/Repo.cpp:833 + #, c-format + msgid "Failed to retrieve GPG key for repo '%s': %s" + msgstr "" + +-#: libdnf/repo/Repo.cpp:859 ++#: libdnf/repo/Repo.cpp:886 + #, c-format + msgid "repo %s: 0x%s already imported" + msgstr "" + +-#: libdnf/repo/Repo.cpp:887 ++#: libdnf/repo/Repo.cpp:914 + #, c-format + msgid "repo %s: imported key 0x%s." + msgstr "" + +-#: libdnf/repo/Repo.cpp:1131 ++#: libdnf/repo/Repo.cpp:1167 + #, c-format + msgid "reviving: repo '%s' skipped, no metalink." + msgstr "" + +-#: libdnf/repo/Repo.cpp:1150 ++#: libdnf/repo/Repo.cpp:1186 + #, c-format + msgid "reviving: repo '%s' skipped, no usable hash." + msgstr "" + +-#: libdnf/repo/Repo.cpp:1173 ++#: libdnf/repo/Repo.cpp:1209 + #, c-format + msgid "reviving: failed for '%s', mismatched %s sum." + msgstr "" + +-#: libdnf/repo/Repo.cpp:1179 ++#: libdnf/repo/Repo.cpp:1215 + #, c-format + msgid "reviving: '%s' can be revived - metalink checksums match." + msgstr "" + +-#: libdnf/repo/Repo.cpp:1204 ++#: libdnf/repo/Repo.cpp:1240 + #, c-format + msgid "reviving: '%s' can be revived - repomd matches." + msgstr "" + +-#: libdnf/repo/Repo.cpp:1206 ++#: libdnf/repo/Repo.cpp:1242 + #, c-format + msgid "reviving: failed for '%s', mismatched repomd." + msgstr "" + +-#: libdnf/repo/Repo.cpp:1224 ++#: libdnf/repo/Repo.cpp:1260 + #, c-format + msgid "Cannot create repo destination directory \"%s\": %s" + msgstr "" + +-#: libdnf/repo/Repo.cpp:1230 ++#: libdnf/repo/Repo.cpp:1266 + #, c-format + msgid "Cannot create repo temporary directory \"%s\": %s" + msgstr "" + +-#: libdnf/repo/Repo.cpp:1244 ++#: libdnf/repo/Repo.cpp:1280 + #, c-format + msgid "Cannot create directory \"%s\": %s" + msgstr "" + +-#: libdnf/repo/Repo.cpp:1267 ++#: libdnf/repo/Repo.cpp:1303 + #, c-format + msgid "Cannot rename directory \"%s\" to \"%s\": %s" + msgstr "" + +-#: libdnf/repo/Repo.cpp:1290 ++#: libdnf/repo/Repo.cpp:1326 + #, c-format + msgid "repo: using cache for: %s" + msgstr "" + +-#: libdnf/repo/Repo.cpp:1302 ++#: libdnf/repo/Repo.cpp:1338 + #, c-format + msgid "Cache-only enabled but no cache for '%s'" + msgstr "" + +-#: libdnf/repo/Repo.cpp:1306 ++#: libdnf/repo/Repo.cpp:1342 + #, c-format + msgid "repo: downloading from remote: %s" + msgstr "" + +-#: libdnf/repo/Repo.cpp:1312 ++#: libdnf/repo/Repo.cpp:1349 + #, c-format + msgid "Failed to download metadata for repo '%s': %s" + msgstr "" + +-#: libdnf/repo/Repo.cpp:1338 ++#: libdnf/repo/Repo.cpp:1375 + msgid "getCachedir(): Computation of SHA256 failed" + msgstr "" + +-#: libdnf/repo/Repo.cpp:1363 ++#: libdnf/repo/Repo.cpp:1403 + #, c-format + msgid "Cannot create persistdir \"%s\": %s" + msgstr "" + +-#: libdnf/repo/Repo.cpp:1763 ++#: libdnf/repo/Repo.cpp:1780 + msgid "resume cannot be used simultaneously with the byterangestart param" + msgstr "" + +-#: libdnf/repo/Repo.cpp:1780 ++#: libdnf/repo/Repo.cpp:1797 + #, c-format + msgid "PackageTarget initialization failed: %s" + msgstr "" + +-#: libdnf/repo/Repo.cpp:1886 ++#: libdnf/repo/Repo.cpp:1903 + #, c-format + msgid "Cannot open %s: %s" + msgstr "" + +-#: libdnf/repo/Repo.cpp:1930 ++#: libdnf/repo/Repo.cpp:1947 + #, c-format + msgid "Log handler with id %ld doesn't exist" + msgstr "" +@@ -884,21 +1100,21 @@ msgstr "" + msgid "In progress" + msgstr "" + +-#: libdnf/transaction/Swdb.cpp:188 libdnf/transaction/Swdb.cpp:216 +-#: libdnf/transaction/Swdb.cpp:228 libdnf/transaction/Swdb.cpp:245 +-#: libdnf/transaction/Swdb.cpp:384 libdnf/transaction/Swdb.cpp:394 ++#: libdnf/transaction/Swdb.cpp:187 libdnf/transaction/Swdb.cpp:215 ++#: libdnf/transaction/Swdb.cpp:227 libdnf/transaction/Swdb.cpp:244 ++#: libdnf/transaction/Swdb.cpp:383 libdnf/transaction/Swdb.cpp:393 + msgid "Not in progress" + msgstr "" + +-#: libdnf/transaction/Swdb.cpp:255 ++#: libdnf/transaction/Swdb.cpp:254 + msgid "No transaction in progress" + msgstr "" + +-#: libdnf/transaction/TransactionItem.cpp:147 ++#: libdnf/transaction/TransactionItem.cpp:146 + msgid "Attempt to insert transaction item into completed transaction" + msgstr "" + +-#: libdnf/transaction/TransactionItem.cpp:218 ++#: libdnf/transaction/TransactionItem.cpp:217 + msgid "Attempt to update transaction item in completed transaction" + msgstr "" + +diff --git a/po/zh_CN.po b/po/zh_CN.po +index 9583b075..3c800f87 100644 +--- a/po/zh_CN.po ++++ b/po/zh_CN.po +@@ -1,19 +1,22 @@ +-# Charles Lee , 2017. #zanata, 2020. +-# Ludek Janda , 2018. #zanata ++# Charles Lee , 2017. #zanata, 2020, 2021. ++# Ludek Janda , 2018. #zanata, 2021. ++# Sundeep Anand , 2021, 2022. ++# Transtats , 2022. + msgid "" + msgstr "" + "Project-Id-Version: PACKAGE VERSION\n" + "Report-Msgid-Bugs-To: \n" +-"POT-Creation-Date: 2020-10-05 09:18-0400\n" +-"PO-Revision-Date: 2020-07-09 13:27+0000\n" +-"Last-Translator: Charles Lee \n" +-"Language-Team: Chinese (Simplified) \n" ++"POT-Creation-Date: 2023-02-28 09:11+0100\n" ++"PO-Revision-Date: 2022-09-06 07:19+0000\n" ++"Last-Translator: Transtats \n" ++"Language-Team: Chinese (Simplified) \n" + "Language: zh_CN\n" + "MIME-Version: 1.0\n" + "Content-Type: text/plain; charset=UTF-8\n" + "Content-Transfer-Encoding: 8bit\n" + "Plural-Forms: nplurals=1; plural=0;\n" +-"X-Generator: Weblate 4.1.1\n" ++"X-Generator: Weblate 4.14\n" + + #: libdnf/conf/ConfigMain.cpp:62 libdnf/conf/OptionSeconds.cpp:40 + msgid "no value specified" +@@ -32,37 +35,50 @@ msgstr "无法把 '%s' 转换为字节" + #: libdnf/conf/ConfigMain.cpp:83 libdnf/conf/OptionSeconds.cpp:66 + #, c-format + msgid "unknown unit '%s'" +-msgstr "未知单元 “%s”" ++msgstr "未知单元 '%s'" + +-#: libdnf/conf/ConfigMain.cpp:332 ++#: libdnf/conf/ConfigMain.cpp:204 libdnf/conf/OptionEnum.cpp:83 ++#: libdnf/conf/OptionNumber.cpp:88 ++msgid "invalid value" ++msgstr "无效值" ++ ++#: libdnf/conf/ConfigMain.cpp:207 ++msgid "value 1 is not allowed" ++msgstr "1 不是一个被允许的值" ++ ++#: libdnf/conf/ConfigMain.cpp:209 ++msgid "negative value is not allowed" ++msgstr "负数值不被允许" ++ ++#: libdnf/conf/ConfigMain.cpp:341 + #, c-format + msgid "percentage '%s' is out of range" + msgstr "百分数 '%s' 超出范围" + +-#: libdnf/conf/OptionBinds.cpp:76 ++#: libdnf/conf/ConfigRepo.cpp:182 ++msgid "only the value 'priority' is supported." ++msgstr "只支持值 'priority'。" ++ ++#: libdnf/conf/OptionBinds.cpp:85 + #, c-format + msgid "Configuration: OptionBinding with id \"%s\" does not exist" +-msgstr "配置:ID 为 \"%s\" 的 OptionBinding 不存在" ++msgstr "配置:ID 为 \"%s\" 的 OptionBinding 不存在" + +-#: libdnf/conf/OptionBinds.cpp:88 ++#: libdnf/conf/OptionBinds.cpp:97 + #, c-format + msgid "Configuration: OptionBinding with id \"%s\" already exists" +-msgstr "配置:ID 为 \"%s\" 的 OptionBinding 已存在" ++msgstr "配置:ID 为 \"%s\" 的 OptionBinding 已存在" + + #: libdnf/conf/OptionBool.cpp:47 + #, c-format + msgid "invalid boolean value '%s'" +-msgstr "无效的布尔值“%s”" ++msgstr "无效的布尔值 '%s'" + + #: libdnf/conf/OptionEnum.cpp:72 libdnf/conf/OptionEnum.cpp:158 +-#: libdnf/conf/OptionString.cpp:59 libdnf/conf/OptionStringList.cpp:59 ++#: libdnf/conf/OptionString.cpp:64 libdnf/conf/OptionStringList.cpp:59 + #, c-format + msgid "'%s' is not an allowed value" +-msgstr "'%s' 不是一个允许的值" +- +-#: libdnf/conf/OptionEnum.cpp:83 libdnf/conf/OptionNumber.cpp:88 +-msgid "invalid value" +-msgstr "无效值" ++msgstr "'%s' 不是一个允许的值" + + #: libdnf/conf/OptionNumber.cpp:73 + #, c-format +@@ -89,26 +105,128 @@ msgstr "给定的路径 “%s” 不存在。" + msgid "could not convert '%s' to seconds" + msgstr "无法把 '%s' 转换为秒" + +-#: libdnf/conf/OptionString.cpp:74 ++#: libdnf/conf/OptionString.cpp:79 + msgid "GetValue(): Value not set" + msgstr "GetValue(): 值没有设置" + +-#: libdnf/dnf-goal.cpp:68 ++#: libdnf/dnf-context.cpp:3176 libdnf/dnf-context.cpp:3185 ++#, c-format ++msgid "Cannot enable more streams from module '%s' at the same time" ++msgstr "无法同时从模块 '%s' 中启用更多流" ++ ++#: libdnf/dnf-context.cpp:3194 libdnf/dnf-context.cpp:3212 ++#, c-format ++msgid "" ++"Cannot enable module '%1$s' stream '%2$s': State of module already modified" ++msgstr "无法启用模块 '%1$s' 流 '%2$s':已经修改的模块状态" ++ ++#: libdnf/dnf-context.cpp:3259 ++#, c-format ++msgid "Modular dependency problem with Defaults: %s" ++msgstr "默认设置的模块依赖性问题:%s" ++ ++#: libdnf/dnf-context.cpp:3262 ++#, c-format ++msgid "Modular dependency problem: %s" ++msgstr "模块依赖问题:%s" ++ ++#: libdnf/dnf-context.cpp:3296 libdnf/dnf-context.cpp:3320 ++#: libdnf/dnf-context.cpp:3331 libdnf/dnf-context.cpp:3370 ++#: libdnf/dnf-context.cpp:3386 libdnf/dnf-context.cpp:3418 ++#: libdnf/dnf-context.cpp:3462 libdnf/dnf-context.cpp:3472 ++#, c-format ++msgid "Unable to resolve argument '%s'" ++msgstr "无法解析参数 '%s'" ++ ++#: libdnf/dnf-context.cpp:3303 ++#, c-format ++msgid "" ++"Only module name is required. Ignoring unneeded information in argument: '%s'" ++msgstr "只需要模块名。忽略参数 '%s' 中的无用信息" ++ ++#: libdnf/dnf-context.cpp:3317 ++#, c-format ++msgid "Cannot reset module '%s': State of module already modified" ++msgstr "无法重置模块 '%s':已修改的模块状态" ++ ++#: libdnf/dnf-context.cpp:3328 ++#, c-format ++msgid "Cannot disable module '%s': State of module already modified" ++msgstr "无法禁用模块 '%s':已经修改的模块状态" ++ ++#: libdnf/dnf-context.cpp:3359 libdnf/dnf-context.cpp:3451 ++#: libdnf/dnf-context.cpp:3564 ++msgid "No modular data available" ++msgstr "没有可用的模块数据" ++ ++#: libdnf/dnf-context.cpp:3376 ++#, c-format ++msgid "Ignoring unneeded information in argument: '%s'" ++msgstr "忽略参数中不需要的信息:'%s'" ++ ++#: libdnf/dnf-context.cpp:3414 ++#, c-format ++msgid "" ++"Problem during enablement of dependency tree for module '%1$s' stream " ++"'%2$s': %3$s" ++msgstr "为模块 '%1$s' 流 '%2$s' 启用依赖树时出现问题: %3$s" ++ ++#: libdnf/dnf-context.cpp:3426 ++msgid "Problems appeared for module enable request" ++msgstr "模块启用请求时出现问题" ++ ++#. this really should never happen; unless the modular repodata is corrupted ++#: libdnf/dnf-context.cpp:3501 ++#, c-format ++msgid "Failed to parse module artifact NEVRA '%s'" ++msgstr "无法解析模块工件 NEVRA '%s'" ++ ++#: libdnf/dnf-context.cpp:3535 ++msgid "Problems appeared for module install request" ++msgstr "模块安装请求出现问题" ++ ++#: libdnf/dnf-context.cpp:3595 ++msgid "Problems appeared for module reset request" ++msgstr "模块重置请求时出现问题" ++ ++#: libdnf/dnf-context.cpp:3597 ++msgid "Problems appeared for module disable request" ++msgstr "模块禁用请求时出现问题" ++ ++#: libdnf/dnf-context.cpp:3633 ++#, c-format ++msgid "" ++"The operation would result in switching of module '%s' stream '%s' to stream " ++"'%s'" ++msgstr "这个操作会把模块 '%s' 从流 '%s' 切换到流 '%s'" ++ ++#: libdnf/dnf-context.cpp:3637 ++msgid "" ++"It is not possible to switch enabled streams of a module.\n" ++"It is recommended to remove all installed content from the module, and reset " ++"the module using 'microdnf module reset ' command. After you " ++"reset the module, you can install the other stream." ++msgstr "" ++"无法切换一个模块已启用的流。 \n" ++"推荐从模块中删除所有已安装的内容,使用 'microdnf module reset ' " ++"命令重置模块。在重置模块后就可以安装其他流。" ++ ++#: libdnf/dnf-goal.cpp:85 + msgid "Could not depsolve transaction; " +-msgstr "无法 depsolve 事务: " ++msgstr "无法 depsolve 事务; " + +-#: libdnf/dnf-goal.cpp:70 ++#: libdnf/dnf-goal.cpp:87 + #, c-format + msgid "%i problem detected:\n" + msgid_plural "%i problems detected:\n" + msgstr[0] "发现 %i 问题:\n" + +-#: libdnf/dnf-goal.cpp:78 ++#: libdnf/dnf-goal.cpp:95 + #, c-format + msgid " Problem %1$i: %2$s\n" + msgstr " 问题 %1$i: %2$s\n" + +-#: libdnf/dnf-goal.cpp:80 ++#: libdnf/dnf-goal.cpp:97 + #, c-format + msgid " Problem: %s\n" + msgstr " 问题: %s\n" +@@ -118,7 +236,7 @@ msgstr " 问题: %s\n" + msgid "" + "No available modular metadata for modular package '%s'; cannot be installed " + "on the system" +-msgstr "" ++msgstr "模块软件包 '%s' 没有可用的模块元数据,它将不能被安装至此系统上" + + #: libdnf/dnf-rpmts.cpp:121 libdnf/dnf-rpmts.cpp:166 + #, c-format +@@ -173,87 +291,126 @@ msgstr "无法找到软件包 %s" + msgid "could not add erase element %1$s(%2$i)" + msgstr "无法添加删除元素 %1$s(%2$i)" + +-#: libdnf/dnf-sack.cpp:381 ++#: libdnf/dnf-sack.cpp:252 ++msgid "repo_add_solv() has failed." ++msgstr "repo_add_solv() 已失败。" ++ ++#: libdnf/dnf-sack.cpp:416 + #, c-format +-msgid "no %1$s string for %2$s" +-msgstr "" ++msgid "Loading extension cache %s (%d) failed: " ++msgstr "加载扩展缓存 %s (%d) 失败: " + +-#: libdnf/dnf-sack.cpp:404 +-msgid "failed to add solv" +-msgstr "添加 solv 失败" ++#: libdnf/dnf-sack.cpp:430 ++#, c-format ++msgid "no %1$s string for %2$s" ++msgstr "没有 %2$s 的 %1$s 字符串" + +-#: libdnf/dnf-sack.cpp:422 ++#: libdnf/dnf-sack.cpp:440 + #, c-format + msgid "failed to open: %s" + msgstr "打开失败:%s" + +-#: libdnf/dnf-sack.cpp:501 ++#: libdnf/dnf-sack.cpp:519 + #, c-format + msgid "cannot create temporary file: %s" + msgstr "不能创建临时文件: %s" + +-#: libdnf/dnf-sack.cpp:511 ++#: libdnf/dnf-sack.cpp:529 + #, c-format + msgid "failed opening tmp file: %s" + msgstr "打开 tmp 文件失败: %s" + +-#: libdnf/dnf-sack.cpp:523 ++#: libdnf/dnf-sack.cpp:551 ++#, c-format ++msgid "While writing primary cache %s repowriter write failed: %i, error: %s" ++msgstr "写主缓存 %s 时 repowriter 写失败:%i 错误:%s" ++ ++#: libdnf/dnf-sack.cpp:561 + #, c-format +-msgid "write_main() failed writing data: %i" +-msgstr "write_main() 写数据失败: %i" ++msgid "Failed closing tmp file %s: %s" ++msgstr "关闭临时文件 %s 失败:%s" + +-#: libdnf/dnf-sack.cpp:540 +-msgid "write_main() failed to re-load written solv file" +-msgstr "write_main() 重新加载写的 solv 文件失败" ++#: libdnf/dnf-sack.cpp:571 ++#, c-format ++msgid "Failed to use newly written primary cache: %s: " ++msgstr "使用新写的主缓存失败:%s: " ++ ++#: libdnf/dnf-sack.cpp:577 ++#, c-format ++msgid "Failed to use newly written primary cache: %s" ++msgstr "使用新写的主缓存失败:%s" + +-#: libdnf/dnf-sack.cpp:605 ++#: libdnf/dnf-sack.cpp:627 + #, c-format + msgid "can not create temporary file %s" + msgstr "不能创建临时文件 %s" + +-#: libdnf/dnf-sack.cpp:623 ++#: libdnf/dnf-sack.cpp:667 ++#, c-format ++msgid "" ++"While writing extension cache %s (%d): repowriter write failed: %i, error: %s" ++msgstr "编写扩展缓存 %s (%d) 时: repowriter 写失败: %i,错误: %s" ++ ++#: libdnf/dnf-sack.cpp:677 + #, c-format +-msgid "write_ext(%1$d) has failed: %2$d" +-msgstr "write_ext(%1$d) 已失败: %2$d" ++msgid "While writing extension cache (%d): cannot close temporary file: %s" ++msgstr "编写扩展缓存 (%d) 时:无法关闭临时文件:%s" + +-#: libdnf/dnf-sack.cpp:678 ++#: libdnf/dnf-sack.cpp:693 ++#, c-format ++msgid "Failed to use newly written extension cache: %s (%d): " ++msgstr "使用新写的扩展缓存失败:%s (%d): " ++ ++#: libdnf/dnf-sack.cpp:700 ++#, c-format ++msgid "Failed to use newly written extension cache: %s (%d)" ++msgstr "使用新写的扩展缓存失败:%s (%d)" ++ ++#: libdnf/dnf-sack.cpp:741 + msgid "null repo md file" +-msgstr "null repo md 文件" ++msgstr "null 存储库 md 文件" + +-#: libdnf/dnf-sack.cpp:687 ++#: libdnf/dnf-sack.cpp:750 + #, c-format + msgid "can not read file %1$s: %2$s" + msgstr "不能读文件 %1$s: %2$s" + +-#: libdnf/dnf-sack.cpp:701 +-msgid "repo_add_solv() has failed." +-msgstr "repo_add_solv() 已失败。" ++#: libdnf/dnf-sack.cpp:765 ++#, c-format ++msgid "While loading repository failed to use %s: " ++msgstr "加载软件仓库时使用 %s 失败: " + +-#: libdnf/dnf-sack.cpp:714 ++#: libdnf/dnf-sack.cpp:776 + msgid "loading of MD_TYPE_PRIMARY has failed." +-msgstr "" ++msgstr "加载 MD_TYPE_PRIMARY 失败。" ++ ++#: libdnf/dnf-sack.cpp:788 ++#, c-format ++msgid "Loading repomd has failed: %s" ++msgstr "加载 repomd 失败:%s" + +-#: libdnf/dnf-sack.cpp:727 +-msgid "repo_add_repomdxml/rpmmd() has failed." +-msgstr "repo_add_repomdxml/rpmmd() 已失败。" ++#: libdnf/dnf-sack.cpp:799 ++#, c-format ++msgid "Loading primary has failed: %s" ++msgstr "加载主设备失败:%s" + +-#: libdnf/dnf-sack.cpp:794 ++#: libdnf/dnf-sack.cpp:865 + msgid "failed to auto-detect architecture" + msgstr "自动检测架构失败" + +-#: libdnf/dnf-sack.cpp:919 ++#: libdnf/dnf-sack.cpp:1030 + #, c-format + msgid "failed creating cachedir %s" + msgstr "无法创建 cachedir %s" + +-#: libdnf/dnf-sack.cpp:1696 ++#: libdnf/dnf-sack.cpp:1807 + msgid "failed loading RPMDB" + msgstr "无法加载 RPMDB" + +-#: libdnf/dnf-sack.cpp:2403 ++#: libdnf/dnf-sack.cpp:2532 + #, c-format + msgid "No module defaults found: %s" +-msgstr "" ++msgstr "没有找到模块默认设置:%s" + + #: libdnf/dnf-state.cpp:1184 + #, c-format +@@ -287,11 +444,11 @@ msgstr "在尝试确保软件包 %s 时源没有设置" + #: libdnf/dnf-transaction.cpp:326 + #, c-format + msgid "Failed to ensure %1$s as repo %2$s not found(%3$i repos loaded)" +-msgstr "无法确保 %1$s,因为 repo %2$s 没有找到 (%3$i repos 已加载)" ++msgstr "无法确保 %1$s,因为存储库 %2$s 没有找到 (%3$i 存储库已加载)" + + #: libdnf/dnf-transaction.cpp:367 + msgid "Failed to check untrusted: " +-msgstr "检查不被信任失败: " ++msgstr "检查不被信任失败 : " + + #: libdnf/dnf-transaction.cpp:377 + #, c-format +@@ -301,7 +458,7 @@ msgstr "没有找到下载的文件 %s" + #: libdnf/dnf-transaction.cpp:397 + #, c-format + msgid "package %1$s cannot be verified and repo %2$s is GPG enabled: %3$s" +-msgstr "软件包 %1$s 不能被验证,repo %2$s 启用了 GPG: %3$s" ++msgstr "软件包 %1$s 不能被验证,存储库 %2$s 启用了 GPG: %3$s" + + #: libdnf/dnf-transaction.cpp:831 libdnf/dnf-transaction.cpp:903 + msgid "Failed to get value for CacheDir" +@@ -310,7 +467,7 @@ msgstr "无法为 CacheDir 获得值" + #: libdnf/dnf-transaction.cpp:911 + #, c-format + msgid "Failed to get filesystem free size for %s: " +-msgstr "无法为 %s 获得文件系统可用空间的大小: " ++msgstr "无法为 %s 获得文件系统可用空间的大小: " + + #: libdnf/dnf-transaction.cpp:919 + #, c-format +@@ -322,26 +479,26 @@ msgstr "无法为 %s 获得文件系统可用空间的大小" + msgid "Not enough free space in %1$s: needed %2$s, available %3$s" + msgstr "%1$s 没有足够的空闲空间: 需要 %2$s,可用 %3$s" + +-#: libdnf/dnf-transaction.cpp:1196 ++#: libdnf/dnf-transaction.cpp:1195 + msgid "failed to set root" + msgstr "设置 root 失败" + +-#: libdnf/dnf-transaction.cpp:1418 ++#: libdnf/dnf-transaction.cpp:1416 + #, c-format + msgid "Error %i running transaction test" +-msgstr "错误 %i 运行事务测试" ++msgstr "运行事务测试时错误 %i" + +-#: libdnf/dnf-transaction.cpp:1458 ++#: libdnf/dnf-transaction.cpp:1456 + #, c-format + msgid "Error %i running transaction" +-msgstr "错误 %i 运行事务" ++msgstr "运行事务时错误 %i" + +-#: libdnf/dnf-transaction.cpp:1473 ++#: libdnf/dnf-transaction.cpp:1472 + #, c-format + msgid "Transaction did not go to writing phase, but returned no error(%i)" + msgstr "事务没有进入写阶段,但没有返回错误(%i)" + +-#: libdnf/dnf-utils.cpp:111 libdnf/hy-iutil.cpp:399 ++#: libdnf/dnf-utils.cpp:111 libdnf/hy-iutil.cpp:485 + #, c-format + msgid "cannot open directory %1$s: %2$s" + msgstr "无法打开目录 %1$s: %2$s" +@@ -351,369 +508,419 @@ msgstr "无法打开目录 %1$s: %2$s" + msgid "failed to remove %s" + msgstr "无法删除 %s" + +-#: libdnf/goal/Goal.cpp:55 ++#: libdnf/goal/Goal.cpp:74 + msgid "Ill-formed Selector, presence of multiple match objects in the filter" + msgstr "Ill-formed Selector,在过滤器中有多个匹配的对象" + +-#: libdnf/goal/Goal.cpp:56 ++#: libdnf/goal/Goal.cpp:75 + msgid "Ill-formed Selector used for the operation, incorrect comparison type" + msgstr "这个操作使用了 Ill-formed Selector,不正确的比较类型" + +-#: libdnf/goal/Goal.cpp:67 libdnf/goal/Goal.cpp:94 ++#: libdnf/goal/Goal.cpp:86 libdnf/goal/Goal.cpp:113 + msgid " does not belong to a distupgrade repository" +-msgstr "" ++msgstr " 不属于 distupgrade 仓库" + +-#: libdnf/goal/Goal.cpp:68 libdnf/goal/Goal.cpp:95 ++#: libdnf/goal/Goal.cpp:87 libdnf/goal/Goal.cpp:114 + msgid " has inferior architecture" +-msgstr "" ++msgstr " 有 inferior 架构" + +-#: libdnf/goal/Goal.cpp:69 ++#: libdnf/goal/Goal.cpp:88 + msgid "problem with installed package " +-msgstr "" ++msgstr "安装的软件包的问题 " + +-#: libdnf/goal/Goal.cpp:70 libdnf/goal/Goal.cpp:97 ++#: libdnf/goal/Goal.cpp:89 libdnf/goal/Goal.cpp:116 + msgid "conflicting requests" +-msgstr "" ++msgstr "冲突的请求" + +-#: libdnf/goal/Goal.cpp:71 libdnf/goal/Goal.cpp:98 ++#: libdnf/goal/Goal.cpp:90 libdnf/goal/Goal.cpp:117 + msgid "unsupported request" +-msgstr "" ++msgstr "不支持的请求" + +-#: libdnf/goal/Goal.cpp:72 libdnf/goal/Goal.cpp:99 ++#: libdnf/goal/Goal.cpp:91 libdnf/goal/Goal.cpp:118 + msgid "nothing provides requested " +-msgstr "" ++msgstr "没有东西可以提供所请求的 " + +-#: libdnf/goal/Goal.cpp:73 ++#: libdnf/goal/Goal.cpp:92 + #, c-format + msgid "package %s does not exist" +-msgstr "" ++msgstr "软件包 %s 不存在" + +-#: libdnf/goal/Goal.cpp:74 libdnf/goal/Goal.cpp:101 ++#: libdnf/goal/Goal.cpp:93 libdnf/goal/Goal.cpp:120 + msgid " is provided by the system" +-msgstr "" ++msgstr " 由系统提供" + +-#: libdnf/goal/Goal.cpp:75 libdnf/goal/Goal.cpp:102 ++#: libdnf/goal/Goal.cpp:94 libdnf/goal/Goal.cpp:121 + msgid "some dependency problem" +-msgstr "" ++msgstr "一些依赖问题" + +-#: libdnf/goal/Goal.cpp:76 ++#: libdnf/goal/Goal.cpp:95 + msgid "cannot install the best update candidate for package " +-msgstr "" ++msgstr "无法为软件包安装最佳更新候选 " + +-#: libdnf/goal/Goal.cpp:77 libdnf/goal/Goal.cpp:104 ++#: libdnf/goal/Goal.cpp:96 libdnf/goal/Goal.cpp:123 + msgid "cannot install the best candidate for the job" +-msgstr "" ++msgstr "无法为该任务安装最佳候选" + +-#: libdnf/goal/Goal.cpp:78 ++#: libdnf/goal/Goal.cpp:97 + #, c-format + msgid "package %s is filtered out by modular filtering" +-msgstr "" ++msgstr "软件包 %s 被模块过滤过滤掉" + +-#: libdnf/goal/Goal.cpp:79 ++#: libdnf/goal/Goal.cpp:98 + #, c-format + msgid "package %s does not have a compatible architecture" +-msgstr "" ++msgstr "软件包 %s 没有兼容的架构" + +-#: libdnf/goal/Goal.cpp:80 ++#: libdnf/goal/Goal.cpp:99 + #, c-format + msgid "package %s is not installable" +-msgstr "" ++msgstr "软件包 %s 不可安装" + +-#: libdnf/goal/Goal.cpp:81 ++#: libdnf/goal/Goal.cpp:100 + #, c-format + msgid "package %s is filtered out by exclude filtering" +-msgstr "" ++msgstr "软件包 %s 被排除过滤过滤掉" + +-#: libdnf/goal/Goal.cpp:82 ++#: libdnf/goal/Goal.cpp:101 + #, c-format + msgid "nothing provides %s needed by %s" +-msgstr "" ++msgstr "没有提供 %s 所需要的 %s" + +-#: libdnf/goal/Goal.cpp:83 ++#: libdnf/goal/Goal.cpp:102 + #, c-format + msgid "cannot install both %s and %s" +-msgstr "" ++msgstr "无法同时安装 %s 和 %s" + +-#: libdnf/goal/Goal.cpp:84 ++#: libdnf/goal/Goal.cpp:103 + #, c-format + msgid "package %s conflicts with %s provided by %s" +-msgstr "" ++msgstr "软件包 %s 与 %s(由 %s 提供)冲突" + +-#: libdnf/goal/Goal.cpp:85 ++#: libdnf/goal/Goal.cpp:104 + #, c-format + msgid "package %s obsoletes %s provided by %s" +-msgstr "" ++msgstr "软件包 %s 淘汰了 %s 提供的 %s" + +-#: libdnf/goal/Goal.cpp:86 ++#: libdnf/goal/Goal.cpp:105 + #, c-format + msgid "installed package %s obsoletes %s provided by %s" +-msgstr "" ++msgstr "已安装的软件包 %s 淘汰了 %s 提供的 %s" + +-#: libdnf/goal/Goal.cpp:87 ++#: libdnf/goal/Goal.cpp:106 + #, c-format + msgid "package %s implicitly obsoletes %s provided by %s" +-msgstr "" ++msgstr "软件包 %s 隐式地淘汰了 %s 提供的 %s" + +-#: libdnf/goal/Goal.cpp:88 ++#: libdnf/goal/Goal.cpp:107 + #, c-format + msgid "package %s requires %s, but none of the providers can be installed" +-msgstr "" ++msgstr "软件包 %s 需要 %s,但没有提供者可以被安装" + +-#: libdnf/goal/Goal.cpp:89 ++#: libdnf/goal/Goal.cpp:108 + #, c-format + msgid "package %s conflicts with %s provided by itself" +-msgstr "" ++msgstr "软件包 %s 与自己提供的 %s 冲突" + +-#: libdnf/goal/Goal.cpp:90 ++#: libdnf/goal/Goal.cpp:109 + #, c-format + msgid "both package %s and %s obsolete %s" +-msgstr "" ++msgstr "软件包 %s 和 %s 同时取代了 %s" + +-#: libdnf/goal/Goal.cpp:96 ++#: libdnf/goal/Goal.cpp:115 + msgid "problem with installed module " +-msgstr "" ++msgstr "已安装模块的问题 " + +-#: libdnf/goal/Goal.cpp:100 ++#: libdnf/goal/Goal.cpp:119 + #, c-format + msgid "module %s does not exist" +-msgstr "" ++msgstr "模块 %s 不存在" + +-#: libdnf/goal/Goal.cpp:103 ++#: libdnf/goal/Goal.cpp:122 + msgid "cannot install the best update candidate for module " +-msgstr "" ++msgstr "无法为模块安装最佳更新候选 " + +-#: libdnf/goal/Goal.cpp:105 libdnf/goal/Goal.cpp:108 ++#: libdnf/goal/Goal.cpp:124 libdnf/goal/Goal.cpp:127 + #, c-format + msgid "module %s is disabled" +-msgstr "" ++msgstr "模块 %s 被禁用" + +-#: libdnf/goal/Goal.cpp:106 ++#: libdnf/goal/Goal.cpp:125 + #, c-format + msgid "module %s does not have a compatible architecture" +-msgstr "" ++msgstr "模块 %s 没有兼容的架构" + +-#: libdnf/goal/Goal.cpp:107 ++#: libdnf/goal/Goal.cpp:126 + #, c-format + msgid "module %s is not installable" +-msgstr "" ++msgstr "模块 %s 不可安装" + +-#: libdnf/goal/Goal.cpp:109 ++#: libdnf/goal/Goal.cpp:128 + #, c-format + msgid "nothing provides %s needed by module %s" +-msgstr "" ++msgstr "没有提供模块 %s 所需要的 %s" + +-#: libdnf/goal/Goal.cpp:110 ++#: libdnf/goal/Goal.cpp:129 + #, c-format + msgid "cannot install both modules %s and %s" +-msgstr "" ++msgstr "不能同时安装模块 %s 和 %s" + +-#: libdnf/goal/Goal.cpp:111 ++#: libdnf/goal/Goal.cpp:130 + #, c-format + msgid "module %s conflicts with %s provided by %s" +-msgstr "" ++msgstr "模块 %s 与 %s 提供的 %s 冲突" + +-#: libdnf/goal/Goal.cpp:112 ++#: libdnf/goal/Goal.cpp:131 + #, c-format + msgid "module %s obsoletes %s provided by %s" +-msgstr "" ++msgstr "模块 %s 淘汰了 %s 提供的 %s" + +-#: libdnf/goal/Goal.cpp:113 ++#: libdnf/goal/Goal.cpp:132 + #, c-format + msgid "installed module %s obsoletes %s provided by %s" +-msgstr "" ++msgstr "已安装的模块 %s 淘汰了 %s 提供的 %s" + +-#: libdnf/goal/Goal.cpp:114 ++#: libdnf/goal/Goal.cpp:133 + #, c-format + msgid "module %s implicitly obsoletes %s provided by %s" +-msgstr "" ++msgstr "模块 %s 隐式地淘汰了 %s 提供的 %s" + +-#: libdnf/goal/Goal.cpp:115 ++#: libdnf/goal/Goal.cpp:134 + #, c-format + msgid "module %s requires %s, but none of the providers can be installed" +-msgstr "" ++msgstr "模块 %s 需要 %s,但无法安装任何提供程序" + +-#: libdnf/goal/Goal.cpp:116 ++#: libdnf/goal/Goal.cpp:135 + #, c-format + msgid "module %s conflicts with %s provided by itself" +-msgstr "" ++msgstr "模块 %s 与自己提供的 %s 冲突" + +-#: libdnf/goal/Goal.cpp:117 ++#: libdnf/goal/Goal.cpp:136 + #, c-format + msgid "both module %s and %s obsolete %s" +-msgstr "" ++msgstr "模块 %s 和 %s 同时取代了 %s" + +-#: libdnf/goal/Goal.cpp:1038 ++#: libdnf/goal/Goal.cpp:1051 + msgid "no solver set" + msgstr "无 solver 设置" + +-#: libdnf/goal/Goal.cpp:1043 ++#: libdnf/goal/Goal.cpp:1056 + #, c-format + msgid "failed to make %s absolute" + msgstr "无法使 %s 绝对" + +-#: libdnf/goal/Goal.cpp:1050 ++#: libdnf/goal/Goal.cpp:1063 + #, c-format + msgid "failed writing debugdata to %1$s: %2$s" + msgstr "把 debugdata 写入到 %1$s 失败: %2$s" + +-#: libdnf/goal/Goal.cpp:1062 ++#: libdnf/goal/Goal.cpp:1075 + msgid "no solv in the goal" + msgstr "在目标中没有 solv" + +-#: libdnf/goal/Goal.cpp:1064 ++#: libdnf/goal/Goal.cpp:1077 + msgid "no solution, cannot remove protected package" + msgstr "没有解决方案,不能删除保护的软件包" + +-#: libdnf/goal/Goal.cpp:1067 ++#: libdnf/goal/Goal.cpp:1080 + msgid "no solution possible" + msgstr "没有可能的解决方案" + +-#: libdnf/goal/Goal.cpp:1479 ++#: libdnf/goal/Goal.cpp:1206 ++msgid "Problem: " ++msgstr "问题: " ++ ++#: libdnf/goal/Goal.cpp:1211 ++#, c-format ++msgid "Problem %d: " ++msgstr "问题 %d: " ++ ++#: libdnf/goal/Goal.cpp:1538 + msgid "" + "The operation would result in removing the following protected packages: " +-msgstr "这个操作可能会导致删除以下受保护的软件包: " ++msgstr "这个操作将会导致删除以下受保护的软件包: " ++ ++#: libdnf/hy-iutil.cpp:181 ++#, c-format ++msgid "Libsolv's solv_toolversion is: %zu long but we expect max of: %zu" ++msgstr "Libsolv 的 solv_toolversion 为: %zu,但我们预计最大为:%zu" + +-#: libdnf/hy-iutil.cpp:322 ++#: libdnf/hy-iutil.cpp:408 + #, c-format + msgid "Failed renaming %1$s to %2$s: %3$s" + msgstr "将 %1$s 重命名为 %2$s 失败: %3$s" + +-#: libdnf/hy-iutil.cpp:330 ++#: libdnf/hy-iutil.cpp:416 + #, c-format + msgid "Failed setting perms on %1$s: %2$s" + msgstr "在 %1$s 中设置 perms 失败: %2$s" + +-#: libdnf/hy-iutil.cpp:376 ++#: libdnf/hy-iutil.cpp:462 + #, c-format + msgid "cannot create directory %1$s: %2$s" +-msgstr "" ++msgstr "无法创建目录 %1$s: %2$s" + +-#: libdnf/hy-iutil.cpp:411 ++#: libdnf/hy-iutil.cpp:497 + #, c-format + msgid "cannot stat path %1$s: %2$s" +-msgstr "" ++msgstr "无法 stat 路径 %1$s: %2$s" + +-#: libdnf/module/ModulePackage.cpp:499 ++#: libdnf/module/ModulePackage.cpp:560 + #, c-format + msgid "Invalid format of Platform module: %s" +-msgstr "" ++msgstr "Platform 模块格式无效 : %s" + +-#: libdnf/module/ModulePackage.cpp:514 ++#: libdnf/module/ModulePackage.cpp:575 + msgid "Multiple module platforms provided by available packages\n" +-msgstr "" ++msgstr "可用软件包提供了多个模块平台\n" + +-#: libdnf/module/ModulePackage.cpp:527 ++#: libdnf/module/ModulePackage.cpp:588 + msgid "Multiple module platforms provided by installed packages\n" +-msgstr "" ++msgstr "已安装的软件包提供了多个模块平台\n" + +-#: libdnf/module/ModulePackage.cpp:554 ++#: libdnf/module/ModulePackage.cpp:615 + #, c-format + msgid "Detection of Platform Module in %s failed: %s" +-msgstr "" ++msgstr "检测 %s 中的 Platform 模块失败: %s" + +-#: libdnf/module/ModulePackage.cpp:563 ++#: libdnf/module/ModulePackage.cpp:624 + #, c-format + msgid "Missing PLATFORM_ID in %s" +-msgstr "" ++msgstr "在 %s 中缺少 PLATFORM_ID" + +-#: libdnf/module/ModulePackage.cpp:568 ++#: libdnf/module/ModulePackage.cpp:629 + msgid "No valid Platform ID detected" +-msgstr "" ++msgstr "没有检测到有效的 Platform ID" + + #: libdnf/module/ModulePackageContainer.cpp:68 + #, c-format + msgid "Cannot enable multiple streams for module '%s'" +-msgstr "" ++msgstr "无法为模块 '%s' 启用多个流" + +-#: libdnf/module/ModulePackageContainer.cpp:294 ++#: libdnf/module/ModulePackageContainer.cpp:295 + #, c-format + msgid "Conflicting defaults with repo '%s': %s" +-msgstr "" ++msgstr "默认设置与存储库 '%s' 冲突 : %s" ++ ++#: libdnf/module/ModulePackageContainer.cpp:841 ++msgid "Installing module profiles:\n" ++msgstr "安装模块配置档案:\n" ++ ++#: libdnf/module/ModulePackageContainer.cpp:856 ++msgid "Disabling module profiles:\n" ++msgstr "禁用模块配置档案:\n" ++ ++#: libdnf/module/ModulePackageContainer.cpp:871 ++msgid "Enabling module streams:\n" ++msgstr "启用模块流:\n" ++ ++#: libdnf/module/ModulePackageContainer.cpp:885 ++msgid "Switching module streams:\n" ++msgstr "切换模块流:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:1569 ++#: libdnf/module/ModulePackageContainer.cpp:903 ++msgid "Disabling modules:\n" ++msgstr "禁用模块:\n" ++ ++#: libdnf/module/ModulePackageContainer.cpp:914 ++msgid "Resetting modules:\n" ++msgstr "重置模块:\n" ++ ++#: libdnf/module/ModulePackageContainer.cpp:1638 + #, c-format + msgid "Unable to load modular Fail-Safe data at '%s'" +-msgstr "" ++msgstr "无法加载位于 '%s' 的模块 Fail-Safe 数据" + +-#: libdnf/module/ModulePackageContainer.cpp:1575 ++#: libdnf/module/ModulePackageContainer.cpp:1644 + #, c-format + msgid "Unable to load modular Fail-Safe data for module '%s:%s'" +-msgstr "" ++msgstr "无法为模块 '%s:%s' 加载模块 Fail-Safe 数据" + +-#: libdnf/module/ModulePackageContainer.cpp:1639 ++#: libdnf/module/ModulePackageContainer.cpp:1702 + #, c-format + msgid "Unable to create directory \"%s\" for modular Fail Safe data: %s" +-msgstr "" ++msgstr "无法为模块 Fail Safe 数据创建目录 \"%s\" : %s" + +-#: libdnf/module/ModulePackageContainer.cpp:1661 ++#: libdnf/module/ModulePackageContainer.cpp:1718 + #, c-format + msgid "Unable to save a modular Fail Safe data to '%s'" +-msgstr "" ++msgstr "无法把模块 Fail Safe 数据保存到 '%s'" + +-#: libdnf/module/ModulePackageContainer.cpp:1686 ++#: libdnf/module/ModulePackageContainer.cpp:1741 + #, c-format + msgid "Unable to remove a modular Fail Safe data in '%s'" +-msgstr "" ++msgstr "无法删除 '%s' 中的模块 Fail Safe 数据" ++ ++#: libdnf/module/ModulePackageContainer.cpp:1773 ++#, c-format ++msgid "" ++"Unable to apply modular obsoletes to '%s:%s' because target module '%s' is " ++"disabled" ++msgstr "无法将模块化过时应用到 '%s:%s',因为目标模块 '%s' 被禁用" + + #: libdnf/module/modulemd/ModuleMetadata.cpp:86 + #, c-format + msgid "Failed to update from string: %s" +-msgstr "" ++msgstr "无法从字符串更新: %s" + + #: libdnf/module/modulemd/ModuleMetadata.cpp:110 + #, c-format + msgid "Failed to resolve: %s" +-msgstr "" ++msgstr "无法解析: %s" + + #: libdnf/module/modulemd/ModuleMetadata.cpp:115 + #, c-format + msgid "There were errors while resolving modular defaults: %s" +-msgstr "" ++msgstr "在解析模块默认值时出现了错误:%s" + + #: libdnf/module/modulemd/ModuleMetadata.cpp:120 + #, c-format + msgid "Failed to upgrade defaults: %s" +-msgstr "" ++msgstr "无法升级默认值: %s" + + #: libdnf/module/modulemd/ModuleMetadata.cpp:123 + #, c-format + msgid "Failed to upgrade streams: %s" +-msgstr "" ++msgstr "升级流失败: %s" ++ ++#: libdnf/module/modulemd/ModuleMetadata.cpp:212 ++#, c-format ++msgid "Cannot retrieve module obsoletes because no stream matching %s: %s" ++msgstr "无法获取模块过时,因为没有流匹配 %s:%s" + + #: libdnf/plugin/plugin.cpp:46 + #, c-format + msgid "Can't load shared library \"%s\": %s" +-msgstr "" ++msgstr "无法加载共享库 \"%s\": %s" + + #: libdnf/plugin/plugin.cpp:61 libdnf/plugin/plugin.cpp:67 + #: libdnf/plugin/plugin.cpp:73 libdnf/plugin/plugin.cpp:79 + #, c-format + msgid "Can't obtain address of symbol \"%s\": %s" +-msgstr "" ++msgstr "无法获取符号 \"%s\" 的地址: %s" + + #: libdnf/plugin/plugin.cpp:86 + #, c-format + msgid "Loading plugin file=\"%s\"" +-msgstr "" ++msgstr "正在加载插件文件=\"%s\"" + + #: libdnf/plugin/plugin.cpp:89 + #, c-format + msgid "Loaded plugin name=\"%s\", version=\"%s\"" +-msgstr "" ++msgstr "已加载插件名=\"%s\", 版本=\"%s\"" + + #: libdnf/plugin/plugin.cpp:96 + msgid "Plugins::loadPlugins() dirPath cannot be empty" +-msgstr "" ++msgstr "Plugins::loadPlugins() dirPath 不能为空" + + #: libdnf/plugin/plugin.cpp:105 + #, c-format + msgid "Can't read plugin directory \"%s\": %s" +-msgstr "" ++msgstr "无法读取插件目录 \"%s\": %s" + + #: libdnf/plugin/plugin.cpp:114 + #, c-format + msgid "Can't load plugin \"%s\": %s" +-msgstr "" ++msgstr "无法加载插件 \"%s\": %s" + + #: libdnf/repo/DependencySplitter.cpp:50 + msgid "" +@@ -721,6 +928,8 @@ msgid "" + "deprecated and the support will be dropped in future versions. Use '=' " + "operator instead." + msgstr "" ++"在 reldeps 中使用 '==' 操作符可能导致一个未定义的行为。这个操作符已被废弃,并" ++"且在未来的版本中会取消对它的支持。请使用 '=' 操作符代替。" + + #: libdnf/repo/Repo.cpp:321 + #, c-format +@@ -732,146 +941,161 @@ msgstr "软件仓库 %s 没有设置镜像或者 baseurl。" + msgid "Repository '%s' has unsupported type: 'type=%s', skipping." + msgstr "仓库 '%s' 有不被支持的类型: 'type=%s', 忽略。" + +-#: libdnf/repo/Repo.cpp:546 ++#: libdnf/repo/Repo.cpp:489 libdnf/repo/Repo.cpp:610 libdnf/repo/Repo.cpp:641 ++#: libdnf/repo/Repo.cpp:1387 + #, c-format +-msgid "Cannot find a valid baseurl for repo: %s" +-msgstr "无法为仓库 %s 找到一个有效的 baseurl" ++msgid "repo '%s': 'basecachedir' is not set" ++msgstr "存储库 '%s': 'basecachedir' 没有设置" + +-#: libdnf/repo/Repo.cpp:583 libdnf/repo/Repo.cpp:1672 ++#: libdnf/repo/Repo.cpp:512 + msgid "" +-"Maximum download speed is lower than minimum. Please change configuration of" +-" minrate or throttle" ++"Maximum download speed is lower than minimum. Please change configuration of " ++"minrate or throttle" + msgstr "最大下载速度低于最小值。请修改 minrate 或 throttle 的配置" + +-#: libdnf/repo/Repo.cpp:633 libdnf/repo/Repo.cpp:655 ++#: libdnf/repo/Repo.cpp:546 ++#, c-format ++msgid "repo '%s': 'proxy_username' is set but not 'proxy_password'" ++msgstr "存储库 '%s': 'proxy_username' 已被设置,但没有设置 'proxy_password'" ++ ++#: libdnf/repo/Repo.cpp:548 ++msgid "'proxy_username' is set but not 'proxy_password'" ++msgstr "'proxy_username' 已被设置,但没有设置 'proxy_password'" ++ ++#: libdnf/repo/Repo.cpp:629 ++#, c-format ++msgid "Cannot find a valid baseurl for repo: %s" ++msgstr "无法为存储库找到一个有效的 baseurl:%s" ++ ++#: libdnf/repo/Repo.cpp:660 libdnf/repo/Repo.cpp:682 + #, c-format + msgid "%s: gpgme_data_new_from_fd(): %s" + msgstr "%s: gpgme_data_new_from_fd(): %s" + +-#: libdnf/repo/Repo.cpp:641 libdnf/repo/Repo.cpp:663 ++#: libdnf/repo/Repo.cpp:668 libdnf/repo/Repo.cpp:690 + #, c-format + msgid "%s: gpgme_op_import(): %s" + msgstr "%s: gpgme_op_import(): %s" + +-#: libdnf/repo/Repo.cpp:686 libdnf/repo/Repo.cpp:752 libdnf/repo/Repo.cpp:880 ++#: libdnf/repo/Repo.cpp:713 libdnf/repo/Repo.cpp:779 libdnf/repo/Repo.cpp:907 + #, c-format + msgid "%s: gpgme_ctx_set_engine_info(): %s" + msgstr "%s: gpgme_ctx_set_engine_info(): %s" + +-#: libdnf/repo/Repo.cpp:713 libdnf/repo/Repo.cpp:777 ++#: libdnf/repo/Repo.cpp:740 libdnf/repo/Repo.cpp:804 + #, c-format + msgid "can not list keys: %s" + msgstr "不能列出 key: %s" + +-#: libdnf/repo/Repo.cpp:806 ++#: libdnf/repo/Repo.cpp:833 + #, c-format + msgid "Failed to retrieve GPG key for repo '%s': %s" +-msgstr "" ++msgstr "为仓库 '%s' 获取 GPG 密钥失败 : %s" + +-#: libdnf/repo/Repo.cpp:859 ++#: libdnf/repo/Repo.cpp:886 + #, c-format + msgid "repo %s: 0x%s already imported" +-msgstr "repo %s: 0x%s 已被导入" ++msgstr "存储库 %s: 0x%s 已被导入" + +-#: libdnf/repo/Repo.cpp:887 ++#: libdnf/repo/Repo.cpp:914 + #, c-format + msgid "repo %s: imported key 0x%s." +-msgstr "repo %s: 已导入密钥 0x%s。" ++msgstr "存储库 %s: 已导入密钥 0x%s。" + +-#: libdnf/repo/Repo.cpp:1131 ++#: libdnf/repo/Repo.cpp:1167 + #, c-format + msgid "reviving: repo '%s' skipped, no metalink." + msgstr "恢复中: 仓库 '%s' 已被跳过,无 metalink。" + +-#: libdnf/repo/Repo.cpp:1150 ++#: libdnf/repo/Repo.cpp:1186 + #, c-format + msgid "reviving: repo '%s' skipped, no usable hash." + msgstr "恢复中: 仓库 '%s' 已被跳过,无可用 hash。" + +-#: libdnf/repo/Repo.cpp:1173 ++#: libdnf/repo/Repo.cpp:1209 + #, c-format + msgid "reviving: failed for '%s', mismatched %s sum." + msgstr "恢复: '%s' 失败,不匹配的 %s sum。" + +-#: libdnf/repo/Repo.cpp:1179 ++#: libdnf/repo/Repo.cpp:1215 + #, c-format + msgid "reviving: '%s' can be revived - metalink checksums match." + msgstr "恢复中: '%s' 可以被恢复 - metalink 校验和匹配。" + +-#: libdnf/repo/Repo.cpp:1204 ++#: libdnf/repo/Repo.cpp:1240 + #, c-format + msgid "reviving: '%s' can be revived - repomd matches." + msgstr "恢复: '%s' 可用被恢复 - repomd 匹配。" + +-#: libdnf/repo/Repo.cpp:1206 ++#: libdnf/repo/Repo.cpp:1242 + #, c-format + msgid "reviving: failed for '%s', mismatched repomd." + msgstr "恢复: '%s' 失败,不匹配的 repomd。" + +-#: libdnf/repo/Repo.cpp:1224 ++#: libdnf/repo/Repo.cpp:1260 + #, c-format + msgid "Cannot create repo destination directory \"%s\": %s" +-msgstr "" ++msgstr "无法创建仓库目标目录 \"%s\": %s" + +-#: libdnf/repo/Repo.cpp:1230 ++#: libdnf/repo/Repo.cpp:1266 + #, c-format + msgid "Cannot create repo temporary directory \"%s\": %s" +-msgstr "无法创建 repo 临时目录 \"%s\": %s" ++msgstr "无法创建存储库临时目录 \"%s\": %s" + +-#: libdnf/repo/Repo.cpp:1244 ++#: libdnf/repo/Repo.cpp:1280 + #, c-format + msgid "Cannot create directory \"%s\": %s" + msgstr "无法创建目录 \"%s\": %s" + +-#: libdnf/repo/Repo.cpp:1267 ++#: libdnf/repo/Repo.cpp:1303 + #, c-format + msgid "Cannot rename directory \"%s\" to \"%s\": %s" + msgstr "无法把目录 \"%s\" 重命名为 \"%s\": %s" + +-#: libdnf/repo/Repo.cpp:1290 ++#: libdnf/repo/Repo.cpp:1326 + #, c-format + msgid "repo: using cache for: %s" +-msgstr "仓库: 正在为 %s 使用缓存" ++msgstr "存储库:使用缓存用于:%s" + +-#: libdnf/repo/Repo.cpp:1302 ++#: libdnf/repo/Repo.cpp:1338 + #, c-format + msgid "Cache-only enabled but no cache for '%s'" +-msgstr "仅使用缓存已开启但没有 '%s' 的缓存" ++msgstr "仅启用缓存,但没有 '%s' 的缓存" + +-#: libdnf/repo/Repo.cpp:1306 ++#: libdnf/repo/Repo.cpp:1342 + #, c-format + msgid "repo: downloading from remote: %s" +-msgstr "repo: 从远程下载: %s" ++msgstr "存储库: 从远程下载: %s" + +-#: libdnf/repo/Repo.cpp:1312 ++#: libdnf/repo/Repo.cpp:1349 + #, c-format + msgid "Failed to download metadata for repo '%s': %s" +-msgstr "" ++msgstr "为仓库 '%s' 下载元数据失败 : %s" + +-#: libdnf/repo/Repo.cpp:1338 ++#: libdnf/repo/Repo.cpp:1375 + msgid "getCachedir(): Computation of SHA256 failed" + msgstr "getCachedir(): 计算 SHA256 失败" + +-#: libdnf/repo/Repo.cpp:1363 ++#: libdnf/repo/Repo.cpp:1403 + #, c-format + msgid "Cannot create persistdir \"%s\": %s" +-msgstr "" ++msgstr "无法创建 persistdir \"%s\": %s" + +-#: libdnf/repo/Repo.cpp:1763 ++#: libdnf/repo/Repo.cpp:1780 + msgid "resume cannot be used simultaneously with the byterangestart param" + msgstr "resume 不能和 the byterangestart 参数同时使用" + +-#: libdnf/repo/Repo.cpp:1780 ++#: libdnf/repo/Repo.cpp:1797 + #, c-format + msgid "PackageTarget initialization failed: %s" + msgstr "PackageTarget 初始失败: %s" + +-#: libdnf/repo/Repo.cpp:1886 ++#: libdnf/repo/Repo.cpp:1903 + #, c-format + msgid "Cannot open %s: %s" + msgstr "无法打开 %s: %s" + +-#: libdnf/repo/Repo.cpp:1930 ++#: libdnf/repo/Repo.cpp:1947 + #, c-format + msgid "Log handler with id %ld doesn't exist" + msgstr "id 为 %ld 的日志处理器不存在" +@@ -880,31 +1104,31 @@ msgstr "id 为 %ld 的日志处理器不存在" + msgid "In progress" + msgstr "进行中" + +-#: libdnf/transaction/Swdb.cpp:188 libdnf/transaction/Swdb.cpp:216 +-#: libdnf/transaction/Swdb.cpp:228 libdnf/transaction/Swdb.cpp:245 +-#: libdnf/transaction/Swdb.cpp:384 libdnf/transaction/Swdb.cpp:394 ++#: libdnf/transaction/Swdb.cpp:187 libdnf/transaction/Swdb.cpp:215 ++#: libdnf/transaction/Swdb.cpp:227 libdnf/transaction/Swdb.cpp:244 ++#: libdnf/transaction/Swdb.cpp:383 libdnf/transaction/Swdb.cpp:393 + msgid "Not in progress" + msgstr "没有在进行中" + +-#: libdnf/transaction/Swdb.cpp:255 ++#: libdnf/transaction/Swdb.cpp:254 + msgid "No transaction in progress" + msgstr "没有事务在进行中" + +-#: libdnf/transaction/TransactionItem.cpp:147 ++#: libdnf/transaction/TransactionItem.cpp:146 + msgid "Attempt to insert transaction item into completed transaction" + msgstr "试图向已完成的事务中插入事务项" + +-#: libdnf/transaction/TransactionItem.cpp:218 ++#: libdnf/transaction/TransactionItem.cpp:217 + msgid "Attempt to update transaction item in completed transaction" + msgstr "试图在已完成的事务中更新事务" + + #: libdnf/transaction/Transformer.cpp:76 + msgid "Database Corrupted: no row 'version' in table 'config'" +-msgstr "" ++msgstr "数据库损坏:表 'config' 中没有 'version' 行" + + #: libdnf/transaction/Transformer.cpp:681 + msgid "Transformer: can't open history persist dir" +-msgstr "Transformer: 无法打开 history persist dir" ++msgstr "转换程序: 无法打开历史持久目录" + + #: libdnf/transaction/Transformer.cpp:694 + msgid "Couldn't find a history database" +@@ -923,8 +1147,20 @@ msgstr "TransactionItem 状态没有设置:%s" + msgid "Can't add console output to unsaved transaction" + msgstr "无法向未保存的事务中添加控制台输出" + ++#~ msgid "failed to add solv" ++#~ msgstr "添加 solv 失败" ++ ++#~ msgid "write_main() failed writing data: %i" ++#~ msgstr "write_main() 写数据失败: %i" ++ ++#~ msgid "write_main() failed to re-load written solv file" ++#~ msgstr "write_main() 重新加载写的 solv 文件失败" ++ ++#~ msgid "write_ext(%1$d) has failed: %2$d" ++#~ msgstr "write_ext(%1$d) 已失败: %2$d" ++ ++#~ msgid "repo_add_repomdxml/rpmmd() has failed." ++#~ msgstr "repo_add_repomdxml/rpmmd() 已失败。" ++ + #~ msgid "Bad id for repo: %s, byte = %s %d" + #~ msgstr "repo 的 id 无效: %s, byte = %s %d" +- +-#~ msgid "failed calculating RPMDB checksum" +-#~ msgstr "无法计算 RPMDB checksum" +-- +2.39.2 + diff --git a/SOURCES/0044-Add_repoid_to_solver_error_messagase.patch b/SOURCES/0044-Add_repoid_to_solver_error_messagase.patch new file mode 100644 index 0000000..392dc35 --- /dev/null +++ b/SOURCES/0044-Add_repoid_to_solver_error_messagase.patch @@ -0,0 +1,317 @@ +From 0e13ac4820e72682b427cfe3cabcfa32561cf631 Mon Sep 17 00:00:00 2001 +From: Jaroslav Mracek +Date: Fri, 24 Mar 2023 13:22:41 +0100 +Subject: [PATCH] Backport: Split modular packages to to repositories according + their origin + +It will help to provide information about repository origin to libsolv +modular error messages. +--- + libdnf/module/ModulePackageContainer.cpp | 42 ++++++++++++++---------- + 1 file changed, 24 insertions(+), 18 deletions(-) + +diff --git a/libdnf/module/ModulePackageContainer.cpp b/libdnf/module/ModulePackageContainer.cpp +index f9f861c1..546d5837 100644 +--- a/libdnf/module/ModulePackageContainer.cpp ++++ b/libdnf/module/ModulePackageContainer.cpp +@@ -235,13 +235,6 @@ ModulePackageContainer::ModulePackageContainer(bool allArch, std::string install + pImpl->persistDir = dir; + } + +- Pool * pool = dnf_sack_get_pool(pImpl->moduleSack); +- HyRepo hrepo = hy_repo_create("available"); +- auto repoImpl = libdnf::repoGetImpl(hrepo); +- LibsolvRepo *repo = repo_create(pool, "available"); +- repo->appdata = hrepo; +- repoImpl->libsolvRepo = repo; +- repoImpl->needs_internalizing = 1; + pImpl->installRoot = installRoot; + g_autofree gchar * path = g_build_filename(pImpl->installRoot.c_str(), + "/etc/dnf/modules.d", NULL); +@@ -324,23 +317,36 @@ ModulePackageContainer::add(const std::string &fileContent, const std::string & + md.addMetadataFromString(fileContent, 0); + md.resolveAddedMetadata(); + ++ LibsolvRepo * repo = nullptr; + LibsolvRepo * r; + Id id; + ++ // Search whether available repo was already created + FOR_REPOS(id, r) { +- if (strcmp(r->name, "available") == 0) { +- g_autofree gchar * path = g_build_filename(pImpl->installRoot.c_str(), +- "/etc/dnf/modules.d", NULL); +- std::vector packages = md.getAllModulePackages(pImpl->moduleSack, r, repoID); +- for(auto const& modulePackagePtr: packages) { +- std::unique_ptr modulePackage(modulePackagePtr); +- pImpl->modules.insert(std::make_pair(modulePackage->getId(), std::move(modulePackage))); +- pImpl->persistor->insert(modulePackagePtr->getName(), path); +- } +- +- return; ++ if (strcmp(r->name, repoID.c_str()) == 0) { ++ repo = r; + } + } ++ ++ // If not created yet, create it ++ if (!repo) { ++ Pool * pool = dnf_sack_get_pool(pImpl->moduleSack); ++ HyRepo hrepo = hy_repo_create(repoID.c_str()); ++ auto repoImpl = libdnf::repoGetImpl(hrepo); ++ repo = repo_create(pool, repoID.c_str()); ++ repo->appdata = hrepo; ++ repoImpl->libsolvRepo = repo; ++ repoImpl->needs_internalizing = 1; ++ } ++ ++ // add all modules to repository and pass ownership to module container ++ g_autofree gchar * path = g_build_filename(pImpl->installRoot.c_str(), "/etc/dnf/modules.d", NULL); ++ auto packages = md.getAllModulePackages(pImpl->moduleSack, r, repoID); ++ for(auto const& modulePackagePtr: packages) { ++ std::unique_ptr modulePackage(modulePackagePtr); ++ pImpl->modules.insert(std::make_pair(modulePackage->getId(), std::move(modulePackage))); ++ pImpl->persistor->insert(modulePackagePtr->getName(), path); ++ } + } + + Id +-- +2.40.1 + + +From dc8a7262f4955160172a32e54eb1db4a644471fa Mon Sep 17 00:00:00 2001 +From: Jaroslav Mracek +Date: Tue, 21 Mar 2023 11:28:43 +0100 +Subject: [PATCH] Backport: Add repoid to solver errors for RPMs + (RhBug:2179413) + +Repoid is very useful to find a source of the issue. It tells which +repositories contains problematic packages. + +https://bugzilla.redhat.com/show_bug.cgi?id=2179413 +--- + libdnf/goal/Goal.cpp | 101 +++++++++++++---------- + libdnf/module/ModulePackageContainer.cpp | 2 +- + tests/hawkey/test_goal.cpp | 14 ++-- + 3 files changed, 64 insertions(+), 53 deletions(-) + +diff --git a/libdnf/goal/Goal.cpp b/libdnf/goal/Goal.cpp +index 6b2f91a2..b7710303 100644 +--- a/libdnf/goal/Goal.cpp ++++ b/libdnf/goal/Goal.cpp +@@ -83,8 +83,8 @@ enum {RULE_DISTUPGRADE=1, RULE_INFARCH, RULE_UPDATE, RULE_JOB, RULE_JOB_UNSUPPOR + }; + + static const std::map PKG_PROBLEMS_DICT = { +- {RULE_DISTUPGRADE, M_(" does not belong to a distupgrade repository")}, +- {RULE_INFARCH, M_(" has inferior architecture")}, ++ {RULE_DISTUPGRADE, M_("%s from %s does not belong to a distupgrade repository")}, ++ {RULE_INFARCH, M_("%s from %s has inferior architecture")}, + {RULE_UPDATE, M_("problem with installed package ")}, + {RULE_JOB, M_("conflicting requests")}, + {RULE_JOB_UNSUPPORTED, M_("unsupported request")}, +@@ -94,24 +94,24 @@ static const std::map PKG_PROBLEMS_DICT = { + {RULE_PKG, M_("some dependency problem")}, + {RULE_BEST_1, M_("cannot install the best update candidate for package ")}, + {RULE_BEST_2, M_("cannot install the best candidate for the job")}, +- {RULE_PKG_NOT_INSTALLABLE_1, M_("package %s is filtered out by modular filtering")}, +- {RULE_PKG_NOT_INSTALLABLE_2, M_("package %s does not have a compatible architecture")}, +- {RULE_PKG_NOT_INSTALLABLE_3, M_("package %s is not installable")}, +- {RULE_PKG_NOT_INSTALLABLE_4, M_("package %s is filtered out by exclude filtering")}, +- {RULE_PKG_NOTHING_PROVIDES_DEP, M_("nothing provides %s needed by %s")}, +- {RULE_PKG_SAME_NAME, M_("cannot install both %s and %s")}, +- {RULE_PKG_CONFLICTS, M_("package %s conflicts with %s provided by %s")}, +- {RULE_PKG_OBSOLETES, M_("package %s obsoletes %s provided by %s")}, +- {RULE_PKG_INSTALLED_OBSOLETES, M_("installed package %s obsoletes %s provided by %s")}, +- {RULE_PKG_IMPLICIT_OBSOLETES, M_("package %s implicitly obsoletes %s provided by %s")}, +- {RULE_PKG_REQUIRES, M_("package %s requires %s, but none of the providers can be installed")}, +- {RULE_PKG_SELF_CONFLICT, M_("package %s conflicts with %s provided by itself")}, +- {RULE_YUMOBS, M_("both package %s and %s obsolete %s")} ++ {RULE_PKG_NOT_INSTALLABLE_1, M_("package %s from %s is filtered out by modular filtering")}, ++ {RULE_PKG_NOT_INSTALLABLE_2, M_("package %s from %s does not have a compatible architecture")}, ++ {RULE_PKG_NOT_INSTALLABLE_3, M_("package %s from %s is not installable")}, ++ {RULE_PKG_NOT_INSTALLABLE_4, M_("package %s from %s is filtered out by exclude filtering")}, ++ {RULE_PKG_NOTHING_PROVIDES_DEP, M_("nothing provides %s needed by %s from %s")}, ++ {RULE_PKG_SAME_NAME, M_("cannot install both %s from %s and %s from %s")}, ++ {RULE_PKG_CONFLICTS, M_("package %s from %s conflicts with %s provided by %s from %s")}, ++ {RULE_PKG_OBSOLETES, M_("package %s from %s obsoletes %s provided by %s from %s")}, ++ {RULE_PKG_INSTALLED_OBSOLETES, M_("installed package %s obsoletes %s provided by %s from %s")}, ++ {RULE_PKG_IMPLICIT_OBSOLETES, M_("package %s from %s implicitly obsoletes %s provided by %s from %s")}, ++ {RULE_PKG_REQUIRES, M_("package %s from %s requires %s, but none of the providers can be installed")}, ++ {RULE_PKG_SELF_CONFLICT, M_("package %s from %s conflicts with %s provided by itself")}, ++ {RULE_YUMOBS, M_("both package %s from %s and %s from %s obsolete %s")} + }; + + static const std::map MODULE_PROBLEMS_DICT = { +- {RULE_DISTUPGRADE, M_(" does not belong to a distupgrade repository")}, +- {RULE_INFARCH, M_(" has inferior architecture")}, ++ {RULE_DISTUPGRADE, M_("%s from %s does not belong to a distupgrade repository")}, ++ {RULE_INFARCH, M_("%s from %s has inferior architecture")}, + {RULE_UPDATE, M_("problem with installed module ")}, + {RULE_JOB, M_("conflicting requests")}, + {RULE_JOB_UNSUPPORTED, M_("unsupported request")}, +@@ -121,19 +121,19 @@ static const std::map MODULE_PROBLEMS_DICT = { + {RULE_PKG, M_("some dependency problem")}, + {RULE_BEST_1, M_("cannot install the best update candidate for module ")}, + {RULE_BEST_2, M_("cannot install the best candidate for the job")}, +- {RULE_PKG_NOT_INSTALLABLE_1, M_("module %s is disabled")}, +- {RULE_PKG_NOT_INSTALLABLE_2, M_("module %s does not have a compatible architecture")}, +- {RULE_PKG_NOT_INSTALLABLE_3, M_("module %s is not installable")}, +- {RULE_PKG_NOT_INSTALLABLE_4, M_("module %s is disabled")}, +- {RULE_PKG_NOTHING_PROVIDES_DEP, M_("nothing provides %s needed by module %s")}, +- {RULE_PKG_SAME_NAME, M_("cannot install both modules %s and %s")}, +- {RULE_PKG_CONFLICTS, M_("module %s conflicts with %s provided by %s")}, +- {RULE_PKG_OBSOLETES, M_("module %s obsoletes %s provided by %s")}, +- {RULE_PKG_INSTALLED_OBSOLETES, M_("installed module %s obsoletes %s provided by %s")}, +- {RULE_PKG_IMPLICIT_OBSOLETES, M_("module %s implicitly obsoletes %s provided by %s")}, +- {RULE_PKG_REQUIRES, M_("module %s requires %s, but none of the providers can be installed")}, +- {RULE_PKG_SELF_CONFLICT, M_("module %s conflicts with %s provided by itself")}, +- {RULE_YUMOBS, M_("both module %s and %s obsolete %s")} ++ {RULE_PKG_NOT_INSTALLABLE_1, M_("module %s from %s is disabled")}, ++ {RULE_PKG_NOT_INSTALLABLE_2, M_("module %s from %s does not have a compatible architecture")}, ++ {RULE_PKG_NOT_INSTALLABLE_3, M_("module %s from %s is not installable")}, ++ {RULE_PKG_NOT_INSTALLABLE_4, M_("module %s from %s is disabled")}, ++ {RULE_PKG_NOTHING_PROVIDES_DEP, M_("nothing provides %s needed by module %s from %s")}, ++ {RULE_PKG_SAME_NAME, M_("cannot install both modules %s from %s and %s from %s")}, ++ {RULE_PKG_CONFLICTS, M_("module %s from %s conflicts with %s provided by %s from %s")}, ++ {RULE_PKG_OBSOLETES, M_("module %s from %s obsoletes %s provided by %s from %s")}, ++ {RULE_PKG_INSTALLED_OBSOLETES, M_("installed module %s obsoletes %s provided by %s from %s")}, ++ {RULE_PKG_IMPLICIT_OBSOLETES, M_("module %s from %s implicitly obsoletes %s provided by %s from %s")}, ++ {RULE_PKG_REQUIRES, M_("module %s from %s requires %s, but none of the providers can be installed")}, ++ {RULE_PKG_SELF_CONFLICT, M_("module %s from %s conflicts with %s provided by itself")}, ++ {RULE_YUMOBS, M_("both module %s from %s and %s from %s obsolete %s")} + }; + + static std::string +@@ -147,9 +147,11 @@ libdnf_problemruleinfo2str(libdnf::PackageSet * modularExclude, Solver *solv, So + Solvable *ss; + switch (type) { + case SOLVER_RULE_DISTUPGRADE: +- return solvid2str(pool, source) + TM_(problemDict.at(RULE_DISTUPGRADE), 1); ++ return tfm::format(TM_(problemDict.at(RULE_DISTUPGRADE), 1), solvid2str(pool, source).c_str(), ++ pool_id2solvable(pool, source)->repo->name); + case SOLVER_RULE_INFARCH: +- return solvid2str(pool, source) + TM_(problemDict.at(RULE_INFARCH), 1); ++ return tfm::format(TM_(problemDict.at(RULE_DISTUPGRADE), 1), solvid2str(pool, source).c_str(), ++ pool_id2solvable(pool, source)->repo->name); + case SOLVER_RULE_UPDATE: + return std::string(TM_(problemDict.at(RULE_UPDATE), 1)) + solvid2str(pool, source); + case SOLVER_RULE_JOB: +@@ -172,44 +174,53 @@ libdnf_problemruleinfo2str(libdnf::PackageSet * modularExclude, Solver *solv, So + ss = pool->solvables + source; + if (pool_disabled_solvable(pool, ss)) { + if (modularExclude && modularExclude->has(source)) { +- return tfm::format(TM_(problemDict.at(RULE_PKG_NOT_INSTALLABLE_1), 1), solvid2str(pool, source).c_str()); ++ return tfm::format(TM_(problemDict.at(RULE_PKG_NOT_INSTALLABLE_1), 1), ++ solvid2str(pool, source).c_str(), pool_id2solvable(pool, source)->repo->name); + } else { +- return tfm::format(TM_(problemDict.at(RULE_PKG_NOT_INSTALLABLE_4), 1), solvid2str(pool, source).c_str()); ++ return tfm::format(TM_(problemDict.at(RULE_PKG_NOT_INSTALLABLE_4), 1), ++ solvid2str(pool, source).c_str(), pool_id2solvable(pool, source)->repo->name); + } + } + if (ss->arch && ss->arch != ARCH_SRC && ss->arch != ARCH_NOSRC && + pool->id2arch && (ss->arch > pool->lastarch || !pool->id2arch[ss->arch])) +- return tfm::format(TM_(problemDict.at(RULE_PKG_NOT_INSTALLABLE_2), 1), solvid2str(pool, source).c_str()); +- return tfm::format(TM_(problemDict.at(RULE_PKG_NOT_INSTALLABLE_3), 1), solvid2str(pool, source).c_str()); ++ return tfm::format(TM_(problemDict.at(RULE_PKG_NOT_INSTALLABLE_2), 1), solvid2str(pool, source).c_str(), ++ pool_id2solvable(pool, source)->repo->name); ++ return tfm::format(TM_(problemDict.at(RULE_PKG_NOT_INSTALLABLE_3), 1), solvid2str(pool, source).c_str(), ++ pool_id2solvable(pool, source)->repo->name); + case SOLVER_RULE_PKG_NOTHING_PROVIDES_DEP: + return tfm::format(TM_(problemDict.at(RULE_PKG_NOTHING_PROVIDES_DEP), 1), pool_dep2str(pool, dep), +- solvid2str(pool, source).c_str()); ++ solvid2str(pool, source).c_str(), pool_id2solvable(pool, source)->repo->name); + case SOLVER_RULE_PKG_SAME_NAME: + return tfm::format(TM_(problemDict.at(RULE_PKG_SAME_NAME), 1), solvid2str(pool, source).c_str(), +- solvid2str(pool, target).c_str()); ++ pool_id2solvable(pool, source)->repo->name, solvid2str(pool, target).c_str(), ++ pool_id2solvable(pool, target)->repo->name); + case SOLVER_RULE_PKG_CONFLICTS: + return tfm::format(TM_(problemDict.at(RULE_PKG_CONFLICTS), 1), solvid2str(pool, source).c_str(), +- pool_dep2str(pool, dep), solvid2str(pool, target).c_str()); ++ pool_id2solvable(pool, source)->repo->name, pool_dep2str(pool, dep), ++ solvid2str(pool, target).c_str(), pool_id2solvable(pool, target)->repo->name); + case SOLVER_RULE_PKG_OBSOLETES: + return tfm::format(TM_(problemDict.at(RULE_PKG_OBSOLETES), 1), solvid2str(pool, source).c_str(), +- pool_dep2str(pool, dep), solvid2str(pool, target).c_str()); ++ pool_id2solvable(pool, source)->repo->name, pool_dep2str(pool, dep), ++ solvid2str(pool, target).c_str(), pool_id2solvable(pool, target)->repo->name); + case SOLVER_RULE_PKG_INSTALLED_OBSOLETES: + return tfm::format(TM_(problemDict.at(RULE_PKG_INSTALLED_OBSOLETES), 1), + solvid2str(pool, source).c_str(), pool_dep2str(pool, dep), +- solvid2str(pool, target).c_str()); ++ solvid2str(pool, target).c_str(), pool_id2solvable(pool, target)->repo->name); + case SOLVER_RULE_PKG_IMPLICIT_OBSOLETES: + return tfm::format(TM_(problemDict.at(RULE_PKG_IMPLICIT_OBSOLETES), 1), + solvid2str(pool, source).c_str(), pool_dep2str(pool, dep), +- solvid2str(pool, target).c_str()); ++ pool_id2solvable(pool, source)->repo->name, solvid2str(pool, target).c_str(), ++ pool_id2solvable(pool, target)->repo->name); + case SOLVER_RULE_PKG_REQUIRES: + return tfm::format(TM_(problemDict.at(RULE_PKG_REQUIRES), 1), solvid2str(pool, source).c_str(), +- pool_dep2str(pool, dep)); ++ pool_id2solvable(pool, source)->repo->name, pool_dep2str(pool, dep)); + case SOLVER_RULE_PKG_SELF_CONFLICT: + return tfm::format(TM_(problemDict.at(RULE_PKG_SELF_CONFLICT), 1), solvid2str(pool, source).c_str(), +- pool_dep2str(pool, dep)); ++ pool_id2solvable(pool, source)->repo->name, pool_dep2str(pool, dep)); + case SOLVER_RULE_YUMOBS: + return tfm::format(TM_(problemDict.at(RULE_YUMOBS), 1), solvid2str(pool, source).c_str(), +- solvid2str(pool, target).c_str(), pool_dep2str(pool, dep)); ++ pool_id2solvable(pool, source)->repo->name, solvid2str(pool, target).c_str(), ++ pool_id2solvable(pool, target)->repo->name, pool_dep2str(pool, dep)); + default: + return solver_problemruleinfo2str(solv, type, source, target, dep); + } +diff --git a/libdnf/module/ModulePackageContainer.cpp b/libdnf/module/ModulePackageContainer.cpp +index 546d5837..0dbece4d 100644 +--- a/libdnf/module/ModulePackageContainer.cpp ++++ b/libdnf/module/ModulePackageContainer.cpp +@@ -341,7 +341,7 @@ ModulePackageContainer::add(const std::string &fileContent, const std::string & + + // add all modules to repository and pass ownership to module container + g_autofree gchar * path = g_build_filename(pImpl->installRoot.c_str(), "/etc/dnf/modules.d", NULL); +- auto packages = md.getAllModulePackages(pImpl->moduleSack, r, repoID); ++ auto packages = md.getAllModulePackages(pImpl->moduleSack, repo, repoID); + for(auto const& modulePackagePtr: packages) { + std::unique_ptr modulePackage(modulePackagePtr); + pImpl->modules.insert(std::make_pair(modulePackage->getId(), std::move(modulePackage))); +diff --git a/tests/hawkey/test_goal.cpp b/tests/hawkey/test_goal.cpp +index f22e1c80..b2d7af9f 100644 +--- a/tests/hawkey/test_goal.cpp ++++ b/tests/hawkey/test_goal.cpp +@@ -593,11 +593,11 @@ START_TEST(test_goal_describe_problem_rules) + auto problems = goal->describeProblemRules(0, true); + const char *expected[] = { + "conflicting requests", +- "nothing provides goodbye needed by hello-1-1.noarch" ++ "nothing provides goodbye needed by hello-1-1.noarch from main" + }; +- fail_unless(problems.size() == 2); +- fail_unless(problems[0] == expected[0]); +- fail_unless(problems[1] == expected[1]); ++ ck_assert_int_eq(problems.size(), 2); ++ ck_assert_str_eq(problems[0].c_str(), expected[0]); ++ ck_assert_str_eq(problems[1].c_str(), expected[1]); + + g_object_unref(pkg); + hy_goal_free(goal); +@@ -860,10 +860,10 @@ START_TEST(test_goal_lock) + + auto problems = goal->describeProblemRules(0, true); + const char *expected[] = { +- "package bloop-ext-2.0-1.noarch requires bloop = 2.0-1, but none of the providers can be installed", +- "cannot install both bloop-2.0-1.noarch and bloop-1.0-1.noarch", ++ "package bloop-ext-2.0-1.noarch from updates requires bloop = 2.0-1, but none of the providers can be installed", ++ "cannot install both bloop-2.0-1.noarch from updates and bloop-1.0-1.noarch from @System", + "conflicting requests", +- "package bloop-ext-1.0-1.noarch is filtered out by exclude filtering" ++ "package bloop-ext-1.0-1.noarch from updates is filtered out by exclude filtering" + }; + ck_assert_int_eq(problems.size(), 4); + ck_assert_str_eq(problems[0].c_str(), expected[0]); +-- +2.40.1 + diff --git a/SOURCES/0045-conf-Support-proxy-_none_-in-main-config-RhBug-21557.patch b/SOURCES/0045-conf-Support-proxy-_none_-in-main-config-RhBug-21557.patch new file mode 100644 index 0000000..3214ab9 --- /dev/null +++ b/SOURCES/0045-conf-Support-proxy-_none_-in-main-config-RhBug-21557.patch @@ -0,0 +1,47 @@ +From a5fe0e0eb6457ca51fabe8123d7407951cb8fcba Mon Sep 17 00:00:00 2001 +From: Jaroslav Rohel +Date: Wed, 24 May 2023 12:35:29 +0200 +Subject: [PATCH] conf: Support "proxy=_none_" in main config (RhBug:2155713) + +It has the same meaning as "proxy=". Introduced for compatibility with yum. +Yum does not support a proxy option with an empty value. Instead, it has +the special value "_none_". The value "_none_" is case insensitive. + +Support for "proxy=_none_" in the repository configuration was added some +time ago - in commit ea749e6238cdb54fe3b5add67875ab5912d2e766 + += changelog = +msg: Support "proxy=_none_" in main config +type: enhancement +resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2155713 +--- + libdnf/conf/ConfigMain.cpp | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +diff --git a/libdnf/conf/ConfigMain.cpp b/libdnf/conf/ConfigMain.cpp +index a6645d70..a775cf8c 100644 +--- a/libdnf/conf/ConfigMain.cpp ++++ b/libdnf/conf/ConfigMain.cpp +@@ -476,7 +476,18 @@ ConfigMain::Impl::Impl(Config & owner) + }, nullptr, true + ); + +- owner.optBinds().add("proxy", proxy); ++ owner.optBinds().add("proxy", proxy, ++ [&](Option::Priority priority, const std::string & value){ ++ auto tmpValue(value); ++ for (auto & ch : tmpValue) ++ ch = std::tolower(ch); ++ if (tmpValue == "_none_") ++ proxy.set(priority, ""); ++ else ++ proxy.set(priority, value); ++ }, nullptr, false ++ ); ++ + owner.optBinds().add("proxy_username", proxy_username); + owner.optBinds().add("proxy_password", proxy_password); + owner.optBinds().add("proxy_auth_method", proxy_auth_method); +-- +2.40.1 + diff --git a/SOURCES/0046-Update-translations-RHEL-8.9.patch b/SOURCES/0046-Update-translations-RHEL-8.9.patch new file mode 100644 index 0000000..88a40f8 --- /dev/null +++ b/SOURCES/0046-Update-translations-RHEL-8.9.patch @@ -0,0 +1,2618 @@ +From 31e7378627eb85e7cc8a9cd77e69be436c75aee6 Mon Sep 17 00:00:00 2001 +From: Marek Blaha +Date: Fri, 8 Sep 2023 14:42:40 +0200 +Subject: [PATCH] Update translations RHEL 8.9 + +--- + po/fr.po | 335 +++++++++++++++++++++++++++++-------------- + po/ja.po | 405 ++++++++++++++++++++++++++++++---------------------- + po/ko.po | 366 ++++++++++++++++++++++++++++++----------------- + po/zh_CN.po | 309 ++++++++++++++++++++++++++------------- + 4 files changed, 909 insertions(+), 506 deletions(-) + +diff --git a/po/fr.po b/po/fr.po +index c1aa4199..46995578 100644 +--- a/po/fr.po ++++ b/po/fr.po +@@ -12,11 +12,10 @@ msgid "" + msgstr "" + "Project-Id-Version: PACKAGE VERSION\n" + "Report-Msgid-Bugs-To: \n" +-"POT-Creation-Date: 2023-02-28 09:11+0100\n" ++"POT-Creation-Date: 2023-08-29 13:10+0200\n" + "PO-Revision-Date: 2022-11-06 17:19+0000\n" + "Last-Translator: blutch112 \n" +-"Language-Team: French \n" ++"Language-Team: French \n" + "Language: fr\n" + "MIME-Version: 1.0\n" + "Content-Type: text/plain; charset=UTF-8\n" +@@ -125,8 +124,8 @@ msgstr "Ne peut pas activer plus de flux du module '%s' en même temps" + msgid "" + "Cannot enable module '%1$s' stream '%2$s': State of module already modified" + msgstr "" +-"Impossible d'activer le flux de module '%1$s' stream '%2$s' : état du module " +-"déjà modifié" ++"Impossible d'activer le flux de module '%1$s' stream '%2$s' : état du module" ++" déjà modifié" + + #: libdnf/dnf-context.cpp:3259 + #, c-format +@@ -149,7 +148,8 @@ msgstr "Impossible de résoudre le paramètre ’%s’" + #: libdnf/dnf-context.cpp:3303 + #, c-format + msgid "" +-"Only module name is required. Ignoring unneeded information in argument: '%s'" ++"Only module name is required. Ignoring unneeded information in argument: " ++"'%s'" + msgstr "" + "Seul le nom du module est nécessaire. Les paramètres inutiles ont été " + "ignorés : ’%s’" +@@ -210,24 +210,19 @@ msgstr "Des problèmes sont apparus pour la demande de désactivation du module" + #: libdnf/dnf-context.cpp:3633 + #, c-format + msgid "" +-"The operation would result in switching of module '%s' stream '%s' to stream " +-"'%s'" ++"The operation would result in switching of module '%s' stream '%s' to stream" ++" '%s'" + msgstr "" +-"Le résultat de l’opération sera le basculement du flux « %s » du module « %s " +-"» vers le flux « %s »" ++"Le résultat de l’opération sera le basculement du flux « %s » du module « %s" ++" » vers le flux « %s »" + + #: libdnf/dnf-context.cpp:3637 + msgid "" + "It is not possible to switch enabled streams of a module.\n" +-"It is recommended to remove all installed content from the module, and reset " +-"the module using 'microdnf module reset ' command. After you " +-"reset the module, you can install the other stream." ++"It is recommended to remove all installed content from the module, and reset the module using 'microdnf module reset ' command. After you reset the module, you can install the other stream." + msgstr "" + "Il n’est pas possible de basculer les flux actifs d’un module. \n" +-"Il est recommandé de retirer tout contenu installé par le module, et de " +-"réinitialiser le mode en utilisant la commande 'microdnf module reset " +-"’. Après la réinitialisation du module, vous pouvez installer " +-"les autres flux." ++"Il est recommandé de retirer tout contenu installé par le module, et de réinitialiser le mode en utilisant la commande 'microdnf module reset ’. Après la réinitialisation du module, vous pouvez installer les autres flux." + + #: libdnf/dnf-goal.cpp:85 + msgid "Could not depsolve transaction; " +@@ -371,7 +366,8 @@ msgstr "n’a pas pu créer le fichier temporaire %s" + #: libdnf/dnf-sack.cpp:667 + #, c-format + msgid "" +-"While writing extension cache %s (%d): repowriter write failed: %i, error: %s" ++"While writing extension cache %s (%d): repowriter write failed: %i, error: " ++"%s" + msgstr "" + "Lors de l'écriture du cache d'extension %s (%d) : écriture repowriter ayant " + "échoué : %i, erreur : %s" +@@ -507,7 +503,8 @@ msgstr "N’a pas pu obtenir la taille libre du système de fichiers pour %s" + #, c-format + msgid "Not enough free space in %1$s: needed %2$s, available %3$s" + msgstr "" +-"Pas suffisamment d’espace libre dans %1$s : a besoin de %2$s, disponible %3$s" ++"Pas suffisamment d’espace libre dans %1$s : a besoin de %2$s, disponible " ++"%3$s" + + #: libdnf/dnf-transaction.cpp:1195 + msgid "failed to set root" +@@ -549,15 +546,18 @@ msgstr "" + #: libdnf/goal/Goal.cpp:75 + msgid "Ill-formed Selector used for the operation, incorrect comparison type" + msgstr "" +-"Sélecteur Ill-formed utilisé pour l’opération, type de comparaison incorrecte" ++"Sélecteur Ill-formed utilisé pour l’opération, type de comparaison " ++"incorrecte" + +-#: libdnf/goal/Goal.cpp:86 libdnf/goal/Goal.cpp:113 +-msgid " does not belong to a distupgrade repository" +-msgstr " n’appartient pas à un dépôt distupgrade" ++#: libdnf/goal/Goal.cpp:86 ++#, c-format ++msgid "%s from %s does not belong to a distupgrade repository" ++msgstr "%s de %s n’appartient pas à un référentiel distupgrade" + +-#: libdnf/goal/Goal.cpp:87 libdnf/goal/Goal.cpp:114 +-msgid " has inferior architecture" +-msgstr " a une architecture inférieure" ++#: libdnf/goal/Goal.cpp:87 ++#, c-format ++msgid "%s from %s has inferior architecture" ++msgstr "%s de %s a une architecture inférieure" + + #: libdnf/goal/Goal.cpp:88 + msgid "problem with installed package " +@@ -598,69 +598,81 @@ msgstr "installation impossible du meilleur candidat pour la tâche" + + #: libdnf/goal/Goal.cpp:97 + #, c-format +-msgid "package %s is filtered out by modular filtering" +-msgstr "le paquet %s a été filtré par filtrage modulaire" ++msgid "package %s from %s is filtered out by modular filtering" ++msgstr "le paquet %s de %s a été filtré par filtrage modulaire" + + #: libdnf/goal/Goal.cpp:98 + #, c-format +-msgid "package %s does not have a compatible architecture" +-msgstr "le paquet %s n’a pas d’architecture compatible" ++msgid "package %s from %s does not have a compatible architecture" ++msgstr "le paquet %s de %s n’a pas d’architecture compatible" + + #: libdnf/goal/Goal.cpp:99 + #, c-format +-msgid "package %s is not installable" +-msgstr "le paquet %s n’est pas installable" ++msgid "package %s from %s is not installable" ++msgstr "le paquet %s de %s n’est pas installable" + + #: libdnf/goal/Goal.cpp:100 + #, c-format +-msgid "package %s is filtered out by exclude filtering" +-msgstr "le paquet %s a été filtré en excluant le filtrage" ++msgid "package %s from %s is filtered out by exclude filtering" ++msgstr "le paquet %s de %s a été filtré en excluant le filtrage" + + #: libdnf/goal/Goal.cpp:101 + #, c-format +-msgid "nothing provides %s needed by %s" +-msgstr "rien de fournit %s rendu nécessaire par %s" ++msgid "nothing provides %s needed by %s from %s" ++msgstr "rien de fournit %s rendu nécessaire par %s de %s" + + #: libdnf/goal/Goal.cpp:102 + #, c-format +-msgid "cannot install both %s and %s" +-msgstr "installation impossible à la fois de %s et %s" ++msgid "cannot install both %s from %s and %s from %s" ++msgstr "impossible d’installer à la fois %s de %s et %s de %s" + + #: libdnf/goal/Goal.cpp:103 + #, c-format +-msgid "package %s conflicts with %s provided by %s" +-msgstr "le paquet %s est en conflit avec %s fourni par %s" ++msgid "package %s from %s conflicts with %s provided by %s from %s" ++msgstr "le paquet %s de %s entre en conflit avec %s fourni par %s de %s" + + #: libdnf/goal/Goal.cpp:104 + #, c-format +-msgid "package %s obsoletes %s provided by %s" +-msgstr "le paquet %s rend obsolète %s fourni par %s" ++msgid "package %s from %s obsoletes %s provided by %s from %s" ++msgstr "le paquet %s de %s rend obsolète %sfourni par %s de %s" + + #: libdnf/goal/Goal.cpp:105 + #, c-format +-msgid "installed package %s obsoletes %s provided by %s" +-msgstr "le paquet installé %s rend obsolète %s fourni par %s" ++msgid "installed package %s obsoletes %s provided by %s from %s" ++msgstr "le paquet installé %s rend obsolète %s fourni par %s de %s" + + #: libdnf/goal/Goal.cpp:106 + #, c-format +-msgid "package %s implicitly obsoletes %s provided by %s" +-msgstr "le paquet %s rend implicitement obsolète %s fourni par %s" ++msgid "package %s from %s implicitly obsoletes %s provided by %s from %s" ++msgstr "le paquet %s de %s rend implicitement obsolète %s fourni par %s de %s" + + #: libdnf/goal/Goal.cpp:107 + #, c-format +-msgid "package %s requires %s, but none of the providers can be installed" ++msgid "" ++"package %s from %s requires %s, but none of the providers can be installed" + msgstr "" +-"le paquet %s nécessite %s, mais aucun fournisseur ne peut être installé" ++"le paquet %s de %s nécessite %s, mais aucun fournisseur ne peut être " ++"installé" + + #: libdnf/goal/Goal.cpp:108 + #, c-format +-msgid "package %s conflicts with %s provided by itself" +-msgstr "le paquet %s est en conflit avec %s fourni par lui-même" ++msgid "package %s from %s conflicts with %s provided by itself" ++msgstr "le paquet %s de %s est en conflit avec%s fourni par lui-même" + + #: libdnf/goal/Goal.cpp:109 + #, c-format +-msgid "both package %s and %s obsolete %s" +-msgstr "à la fois le paquet %s et %s rendent obsolète %s" ++msgid "both package %s from %s and %s from %s obsolete %s" ++msgstr "les deux paquets %s de %s et %s de %s rendent %s obsolète" ++ ++#: libdnf/goal/Goal.cpp:113 ++#, c-format ++msgid "%s from %s does not belong to a distupgrade repository" ++msgstr "%s de %s n’appartient pas à un référentiel distupgrade" ++ ++#: libdnf/goal/Goal.cpp:114 ++#, c-format ++msgid "%s from %s has inferior architecture" ++msgstr "%s de %s a une architecture inférieure" + + #: libdnf/goal/Goal.cpp:115 + msgid "problem with installed module " +@@ -678,101 +690,102 @@ msgstr "" + + #: libdnf/goal/Goal.cpp:124 libdnf/goal/Goal.cpp:127 + #, c-format +-msgid "module %s is disabled" +-msgstr "le module %s est désactivé" ++msgid "module %s from %s is disabled" ++msgstr "module %s de %s désactivé" + + #: libdnf/goal/Goal.cpp:125 + #, c-format +-msgid "module %s does not have a compatible architecture" +-msgstr "le module %s n’a pas d’architecture compatible" ++msgid "module %s from %s does not have a compatible architecture" ++msgstr "le module %s de %s n’a pas d’architecture compatible" + + #: libdnf/goal/Goal.cpp:126 + #, c-format +-msgid "module %s is not installable" +-msgstr "le module %s n’est pas installable" ++msgid "module %s from %s is not installable" ++msgstr "le module %s de %s n’est pas installable" + + #: libdnf/goal/Goal.cpp:128 + #, c-format +-msgid "nothing provides %s needed by module %s" +-msgstr "rien de fournit %s rendu nécessaire par le module %s" ++msgid "nothing provides %s needed by module %s from %s" ++msgstr "rien ne produit %s qui est requis par le module %s de %s" + + #: libdnf/goal/Goal.cpp:129 + #, c-format +-msgid "cannot install both modules %s and %s" +-msgstr "installation impossible à la fois des modules %s et %s" ++msgid "cannot install both modules %s from %s and %s from %s" ++msgstr "impossible d’installer à la fois les modules %s de %s et %s de %s" + + #: libdnf/goal/Goal.cpp:130 + #, c-format +-msgid "module %s conflicts with %s provided by %s" +-msgstr "le module %s est en conflit avec %s fourni par %s" ++msgid "module %s from %s conflicts with %s provided by %s from %s" ++msgstr "le module %s de %s entre en conflit avec %s fourni par %s de %s" + + #: libdnf/goal/Goal.cpp:131 + #, c-format +-msgid "module %s obsoletes %s provided by %s" +-msgstr "le module %s rend obsolète %s fourni par %s" ++msgid "module %s from %s obsoletes %s provided by %s from %s" ++msgstr "le module %s de %s rend %s obsolète qui est fourni par %s de %s" + + #: libdnf/goal/Goal.cpp:132 + #, c-format +-msgid "installed module %s obsoletes %s provided by %s" +-msgstr "le module installé %s rend obsolète %s fourni par %s" ++msgid "installed module %s obsoletes %s provided by %s from %s" ++msgstr "le module installé %s rend obsolète %s fourni par %s de %s" + + #: libdnf/goal/Goal.cpp:133 + #, c-format +-msgid "module %s implicitly obsoletes %s provided by %s" +-msgstr "le module %s rend implicitement obsolète %s fourni par %s" ++msgid "module %s from %s implicitly obsoletes %s provided by %s from %s" ++msgstr "le module %s de %s rend implicitement obsolète %s fourni par %s de %s" + + #: libdnf/goal/Goal.cpp:134 + #, c-format +-msgid "module %s requires %s, but none of the providers can be installed" ++msgid "" ++"module %s from %s requires %s, but none of the providers can be installed" + msgstr "" +-"le module %s nécessite %s, mais aucun fournisseur ne peut être installé" ++"le module %s de %s requiert %s, mais aucun fournisseur ne peut être installé" + + #: libdnf/goal/Goal.cpp:135 + #, c-format +-msgid "module %s conflicts with %s provided by itself" +-msgstr "le module %s est en conflit avec %s fourni par lui-même" ++msgid "module %s from %s conflicts with %s provided by itself" ++msgstr "le module %s de %s entre en conflit avec %s fourni par lui-même" + + #: libdnf/goal/Goal.cpp:136 + #, c-format +-msgid "both module %s and %s obsolete %s" +-msgstr "à la fois le module %s et %s rendent obsolète %s" ++msgid "both module %s from %s and %s from %s obsolete %s" ++msgstr "les deux modules %s de %s et %s de %s rendent %s obsolète" + +-#: libdnf/goal/Goal.cpp:1051 ++#: libdnf/goal/Goal.cpp:1062 + msgid "no solver set" + msgstr "aucun solveur défini" + +-#: libdnf/goal/Goal.cpp:1056 ++#: libdnf/goal/Goal.cpp:1067 + #, c-format + msgid "failed to make %s absolute" + msgstr "n’a pas pu rendre %s absolu" + +-#: libdnf/goal/Goal.cpp:1063 ++#: libdnf/goal/Goal.cpp:1074 + #, c-format + msgid "failed writing debugdata to %1$s: %2$s" + msgstr "échec de l’écriture des debugdata dans %1$s : %2$s" + +-#: libdnf/goal/Goal.cpp:1075 ++#: libdnf/goal/Goal.cpp:1086 + msgid "no solv in the goal" + msgstr "pas de solv dans l’objectif" + +-#: libdnf/goal/Goal.cpp:1077 ++#: libdnf/goal/Goal.cpp:1088 + msgid "no solution, cannot remove protected package" + msgstr "aucune solution, n’a pas pu supprimer le package protégé" + +-#: libdnf/goal/Goal.cpp:1080 ++#: libdnf/goal/Goal.cpp:1091 + msgid "no solution possible" + msgstr "aucune solution n’est possible" + +-#: libdnf/goal/Goal.cpp:1206 ++#: libdnf/goal/Goal.cpp:1217 + msgid "Problem: " + msgstr "Problème : " + +-#: libdnf/goal/Goal.cpp:1211 ++#: libdnf/goal/Goal.cpp:1222 + #, c-format + msgid "Problem %d: " + msgstr "Probléme %d : " + +-#: libdnf/goal/Goal.cpp:1538 ++#: libdnf/goal/Goal.cpp:1549 + msgid "" + "The operation would result in removing the following protected packages: " + msgstr "" +@@ -782,8 +795,8 @@ msgstr "" + #, c-format + msgid "Libsolv's solv_toolversion is: %zu long but we expect max of: %zu" + msgstr "" +-"La solv_toolversion de Libsolv est : %zu long mais nous attendons un maximum " +-"de : %zu" ++"La solv_toolversion de Libsolv est : %zu long mais nous attendons un maximum" ++" de : %zu" + + #: libdnf/hy-iutil.cpp:408 + #, c-format +@@ -840,66 +853,67 @@ msgstr "Aucun identifiant de plateforme n'a été détecté" + msgid "Cannot enable multiple streams for module '%s'" + msgstr "Impossible d’activer les flux pour le module « %s »" + +-#: libdnf/module/ModulePackageContainer.cpp:295 ++#: libdnf/module/ModulePackageContainer.cpp:288 + #, c-format + msgid "Conflicting defaults with repo '%s': %s" + msgstr "Valeurs par défaut en conflit avec le dépôt « %s » : %s" + +-#: libdnf/module/ModulePackageContainer.cpp:841 ++#: libdnf/module/ModulePackageContainer.cpp:847 + msgid "Installing module profiles:\n" + msgstr "Installation des profils de module :\n" + +-#: libdnf/module/ModulePackageContainer.cpp:856 ++#: libdnf/module/ModulePackageContainer.cpp:862 + msgid "Disabling module profiles:\n" + msgstr "Désactivation des profils de module :\n" + +-#: libdnf/module/ModulePackageContainer.cpp:871 ++#: libdnf/module/ModulePackageContainer.cpp:877 + msgid "Enabling module streams:\n" + msgstr "Activation des flux de modules :\n" + +-#: libdnf/module/ModulePackageContainer.cpp:885 ++#: libdnf/module/ModulePackageContainer.cpp:891 + msgid "Switching module streams:\n" + msgstr "Basculement des flux de modules :\n" + +-#: libdnf/module/ModulePackageContainer.cpp:903 ++#: libdnf/module/ModulePackageContainer.cpp:909 + msgid "Disabling modules:\n" + msgstr "Désactivation des modules :\n" + +-#: libdnf/module/ModulePackageContainer.cpp:914 ++#: libdnf/module/ModulePackageContainer.cpp:920 + msgid "Resetting modules:\n" + msgstr "Réinitialisation des modules :\n" + +-#: libdnf/module/ModulePackageContainer.cpp:1638 ++#: libdnf/module/ModulePackageContainer.cpp:1644 + #, c-format + msgid "Unable to load modular Fail-Safe data at '%s'" + msgstr "Impossible de charger les données de sécurité à « %s »" + +-#: libdnf/module/ModulePackageContainer.cpp:1644 ++#: libdnf/module/ModulePackageContainer.cpp:1650 + #, c-format + msgid "Unable to load modular Fail-Safe data for module '%s:%s'" + msgstr "" + "Impossible de charger les données de sécurité modulaires pour le module " + "« %s : %s »" + +-#: libdnf/module/ModulePackageContainer.cpp:1702 ++#: libdnf/module/ModulePackageContainer.cpp:1708 + #, c-format + msgid "Unable to create directory \"%s\" for modular Fail Safe data: %s" + msgstr "" + "Impossible de créer le dossier « %s » pour les données de sécurité " + "modulaires : %s" + +-#: libdnf/module/ModulePackageContainer.cpp:1718 ++#: libdnf/module/ModulePackageContainer.cpp:1724 + #, c-format + msgid "Unable to save a modular Fail Safe data to '%s'" + msgstr "" + "Impossible d’enregistrer les données de sécurité modulaires vers « %s »" + +-#: libdnf/module/ModulePackageContainer.cpp:1741 ++#: libdnf/module/ModulePackageContainer.cpp:1747 + #, c-format + msgid "Unable to remove a modular Fail Safe data in '%s'" +-msgstr "Impossible de supprimer les données de sécurité modulaires dans « %s »" ++msgstr "" ++"Impossible de supprimer les données de sécurité modulaires dans « %s »" + +-#: libdnf/module/ModulePackageContainer.cpp:1773 ++#: libdnf/module/ModulePackageContainer.cpp:1779 + #, c-format + msgid "" + "Unable to apply modular obsoletes to '%s:%s' because target module '%s' is " +@@ -984,8 +998,8 @@ msgid "" + "operator instead." + msgstr "" + "L’utilisation de l’opérateur « == » dans reldeps peut entraîner un " +-"comportement indéfini. Il est déprécié et le support sera abandonné dans les " +-"prochaines versions. Utilisez plutôt l’opérateur « = »." ++"comportement indéfini. Il est déprécié et le support sera abandonné dans les" ++" prochaines versions. Utilisez plutôt l’opérateur « = »." + + #: libdnf/repo/Repo.cpp:321 + #, c-format +@@ -1006,8 +1020,8 @@ msgstr "repo '%s' : 'basecachedir' n'est pas fixé" + + #: libdnf/repo/Repo.cpp:512 + msgid "" +-"Maximum download speed is lower than minimum. Please change configuration of " +-"minrate or throttle" ++"Maximum download speed is lower than minimum. Please change configuration of" ++" minrate or throttle" + msgstr "" + "La vitesse de téléchargement maximale est plus basse que le minimum. " + "Veuillez modifier les paramètres minrate ou throttle" +@@ -1219,6 +1233,114 @@ msgid "Can't add console output to unsaved transaction" + msgstr "" + "Ne peut pas ajouter une sortie de console à une transaction non enregistrée" + ++#~ msgid " does not belong to a distupgrade repository" ++#~ msgstr " n’appartient pas à un dépôt distupgrade" ++ ++#~ msgid " has inferior architecture" ++#~ msgstr " a une architecture inférieure" ++ ++#, c-format ++#~ msgid "package %s is filtered out by modular filtering" ++#~ msgstr "le paquet %s a été filtré par filtrage modulaire" ++ ++#, c-format ++#~ msgid "package %s does not have a compatible architecture" ++#~ msgstr "le paquet %s n’a pas d’architecture compatible" ++ ++#, c-format ++#~ msgid "package %s is not installable" ++#~ msgstr "le paquet %s n’est pas installable" ++ ++#, c-format ++#~ msgid "package %s is filtered out by exclude filtering" ++#~ msgstr "le paquet %s a été filtré en excluant le filtrage" ++ ++#, c-format ++#~ msgid "nothing provides %s needed by %s" ++#~ msgstr "rien de fournit %s rendu nécessaire par %s" ++ ++#, c-format ++#~ msgid "cannot install both %s and %s" ++#~ msgstr "installation impossible à la fois de %s et %s" ++ ++#, c-format ++#~ msgid "package %s conflicts with %s provided by %s" ++#~ msgstr "le paquet %s est en conflit avec %s fourni par %s" ++ ++#, c-format ++#~ msgid "package %s obsoletes %s provided by %s" ++#~ msgstr "le paquet %s rend obsolète %s fourni par %s" ++ ++#, c-format ++#~ msgid "installed package %s obsoletes %s provided by %s" ++#~ msgstr "le paquet installé %s rend obsolète %s fourni par %s" ++ ++#, c-format ++#~ msgid "package %s implicitly obsoletes %s provided by %s" ++#~ msgstr "le paquet %s rend implicitement obsolète %s fourni par %s" ++ ++#, c-format ++#~ msgid "package %s requires %s, but none of the providers can be installed" ++#~ msgstr "" ++#~ "le paquet %s nécessite %s, mais aucun fournisseur ne peut être installé" ++ ++#, c-format ++#~ msgid "package %s conflicts with %s provided by itself" ++#~ msgstr "le paquet %s est en conflit avec %s fourni par lui-même" ++ ++#, c-format ++#~ msgid "both package %s and %s obsolete %s" ++#~ msgstr "à la fois le paquet %s et %s rendent obsolète %s" ++ ++#, c-format ++#~ msgid "module %s is disabled" ++#~ msgstr "le module %s est désactivé" ++ ++#, c-format ++#~ msgid "module %s does not have a compatible architecture" ++#~ msgstr "le module %s n’a pas d’architecture compatible" ++ ++#, c-format ++#~ msgid "module %s is not installable" ++#~ msgstr "le module %s n’est pas installable" ++ ++#, c-format ++#~ msgid "nothing provides %s needed by module %s" ++#~ msgstr "rien de fournit %s rendu nécessaire par le module %s" ++ ++#, c-format ++#~ msgid "cannot install both modules %s and %s" ++#~ msgstr "installation impossible à la fois des modules %s et %s" ++ ++#, c-format ++#~ msgid "module %s conflicts with %s provided by %s" ++#~ msgstr "le module %s est en conflit avec %s fourni par %s" ++ ++#, c-format ++#~ msgid "module %s obsoletes %s provided by %s" ++#~ msgstr "le module %s rend obsolète %s fourni par %s" ++ ++#, c-format ++#~ msgid "installed module %s obsoletes %s provided by %s" ++#~ msgstr "le module installé %s rend obsolète %s fourni par %s" ++ ++#, c-format ++#~ msgid "module %s implicitly obsoletes %s provided by %s" ++#~ msgstr "le module %s rend implicitement obsolète %s fourni par %s" ++ ++#, c-format ++#~ msgid "module %s requires %s, but none of the providers can be installed" ++#~ msgstr "" ++#~ "le module %s nécessite %s, mais aucun fournisseur ne peut être installé" ++ ++#, c-format ++#~ msgid "module %s conflicts with %s provided by itself" ++#~ msgstr "le module %s est en conflit avec %s fourni par lui-même" ++ ++#, c-format ++#~ msgid "both module %s and %s obsolete %s" ++#~ msgstr "à la fois le module %s et %s rendent obsolète %s" ++ + #~ msgid "failed to add solv" + #~ msgstr "n’a pu ajouter solv" + +@@ -1233,6 +1355,3 @@ msgstr "" + + #~ msgid "repo_add_repomdxml/rpmmd() has failed." + #~ msgstr "repo_add_repomdxml/rpmmd() a échoué." +- +-#~ msgid "Bad id for repo: %s, byte = %s %d" +-#~ msgstr "ID erroné pour le dépôt : %s, byte = %s %d" +diff --git a/po/ja.po b/po/ja.po +index 1aa5dd09..5a165467 100644 +--- a/po/ja.po ++++ b/po/ja.po +@@ -7,11 +7,10 @@ msgid "" + msgstr "" + "Project-Id-Version: PACKAGE VERSION\n" + "Report-Msgid-Bugs-To: \n" +-"POT-Creation-Date: 2023-02-28 09:11+0100\n" ++"POT-Creation-Date: 2023-08-29 13:10+0200\n" + "PO-Revision-Date: 2022-09-06 07:19+0000\n" + "Last-Translator: Transtats \n" +-"Language-Team: Japanese \n" ++"Language-Team: Japanese \n" + "Language: ja\n" + "MIME-Version: 1.0\n" + "Content-Type: text/plain; charset=UTF-8\n" +@@ -119,9 +118,7 @@ msgstr "モジュール '%s' から、さらにストリームを同時に有効 + #, c-format + msgid "" + "Cannot enable module '%1$s' stream '%2$s': State of module already modified" +-msgstr "" +-"モジュール '%1$s' ストリーム '%2$s' を有効にできません。モジュールの状態はす" +-"でに変更されています" ++msgstr "モジュール '%1$s' ストリーム '%2$s' を有効にできません。モジュールの状態はすでに変更されています" + + #: libdnf/dnf-context.cpp:3259 + #, c-format +@@ -144,21 +141,19 @@ msgstr "引数 '%s' を解決できません" + #: libdnf/dnf-context.cpp:3303 + #, c-format + msgid "" +-"Only module name is required. Ignoring unneeded information in argument: '%s'" ++"Only module name is required. Ignoring unneeded information in argument: " ++"'%s'" + msgstr "モジュール名のみが必要です。引数の不必要な情報は無視します: '%s'" + + #: libdnf/dnf-context.cpp:3317 + #, c-format + msgid "Cannot reset module '%s': State of module already modified" +-msgstr "" +-"モジュール '%s' をリセットできません。モジュールの状態はすでに変更されていま" +-"す" ++msgstr "モジュール '%s' をリセットできません。モジュールの状態はすでに変更されています" + + #: libdnf/dnf-context.cpp:3328 + #, c-format + msgid "Cannot disable module '%s': State of module already modified" +-msgstr "" +-"モジュール '%s' を無効にできません。モジュールの状態はすでに変更されています" ++msgstr "モジュール '%s' を無効にできません。モジュールの状態はすでに変更されています" + + #: libdnf/dnf-context.cpp:3359 libdnf/dnf-context.cpp:3451 + #: libdnf/dnf-context.cpp:3564 +@@ -175,8 +170,7 @@ msgstr "引数の不要な情報は無視します: '%s'" + msgid "" + "Problem during enablement of dependency tree for module '%1$s' stream " + "'%2$s': %3$s" +-msgstr "" +-"モジュール '%1$s' ストリーム '%2$s' の依存関係ツリーの有効化中に問題: %3$s" ++msgstr "モジュール '%1$s' ストリーム '%2$s' の依存関係ツリーの有効化中に問題: %3$s" + + #: libdnf/dnf-context.cpp:3426 + msgid "Problems appeared for module enable request" +@@ -203,23 +197,17 @@ msgstr "モジュール無効化リクエストに発生する問題" + #: libdnf/dnf-context.cpp:3633 + #, c-format + msgid "" +-"The operation would result in switching of module '%s' stream '%s' to stream " +-"'%s'" +-msgstr "" +-"オペレーションは、モジュール '%s' ストリーム '%s' を ストリーム '%s' へと切り" +-"替える結果となります" ++"The operation would result in switching of module '%s' stream '%s' to stream" ++" '%s'" ++msgstr "オペレーションは、モジュール '%s' ストリーム '%s' を ストリーム '%s' へと切り替える結果となります" + + #: libdnf/dnf-context.cpp:3637 + msgid "" + "It is not possible to switch enabled streams of a module.\n" +-"It is recommended to remove all installed content from the module, and reset " +-"the module using 'microdnf module reset ' command. After you " +-"reset the module, you can install the other stream." ++"It is recommended to remove all installed content from the module, and reset the module using 'microdnf module reset ' command. After you reset the module, you can install the other stream." + msgstr "" + "有効化されたモジュールのストリームの切り替えはできません。\n" +-"モジュールからすべてのインストールされたコンテンツを削除し、'microdnf module " +-"reset ' コマンドを使用してモジュールをリセットすることを推奨しま" +-"す。モジュールのリセット後に、別のストリームをインストールできます。" ++"モジュールからすべてのインストールされたコンテンツを削除し、'microdnf module reset ' コマンドを使用してモジュールをリセットすることを推奨します。モジュールのリセット後に、別のストリームをインストールできます。" + + #: libdnf/dnf-goal.cpp:85 + msgid "Could not depsolve transaction; " +@@ -246,9 +234,7 @@ msgstr " 問題: %s\n" + msgid "" + "No available modular metadata for modular package '%s'; cannot be installed " + "on the system" +-msgstr "" +-"モジュラーパッケージ '%s' のモジュラーメタデータは利用不可です; システムにイ" +-"ンストールはできません" ++msgstr "モジュラーパッケージ '%s' のモジュラーメタデータは利用不可です; システムにインストールはできません" + + #: libdnf/dnf-rpmts.cpp:121 libdnf/dnf-rpmts.cpp:166 + #, c-format +@@ -287,8 +273,7 @@ msgstr "トランザクションの実行中にエラーが発生しました: % + + #: libdnf/dnf-rpmts.cpp:283 + msgid "Error running transaction and no problems were reported!" +-msgstr "" +-"トランザクションの実行中にエラーが発生しましたが、問題は報告されませんでした!" ++msgstr "トランザクションの実行中にエラーが発生しましたが、問題は報告されませんでした!" + + #: libdnf/dnf-rpmts.cpp:346 + msgid "Fatal error, run database recovery" +@@ -336,9 +321,7 @@ msgstr "tmp ファイルを開くことに失敗しました: %s" + #: libdnf/dnf-sack.cpp:551 + #, c-format + msgid "While writing primary cache %s repowriter write failed: %i, error: %s" +-msgstr "" +-"プライマリーキャッシュの %s repowriter 書き込み中に %i エラーが発生しました。" +-"エラー: %s" ++msgstr "プライマリーキャッシュの %s repowriter 書き込み中に %i エラーが発生しました。エラー: %s" + + #: libdnf/dnf-sack.cpp:561 + #, c-format +@@ -363,10 +346,9 @@ msgstr "一時ファイル %s を作成できません" + #: libdnf/dnf-sack.cpp:667 + #, c-format + msgid "" +-"While writing extension cache %s (%d): repowriter write failed: %i, error: %s" +-msgstr "" +-"拡張キャッシュ %s (%d) の書き込み中: repowriter の書き込みに失敗: %i、エ" +-"ラー: %s" ++"While writing extension cache %s (%d): repowriter write failed: %i, error: " ++"%s" ++msgstr "拡張キャッシュ %s (%d) の書き込み中: repowriter の書き込みに失敗: %i、エラー: %s" + + #: libdnf/dnf-sack.cpp:677 + #, c-format +@@ -461,9 +443,7 @@ msgstr "パッケージ %s を確実にしようとする場合、ソースは + #: libdnf/dnf-transaction.cpp:326 + #, c-format + msgid "Failed to ensure %1$s as repo %2$s not found(%3$i repos loaded)" +-msgstr "" +-"repo %2$s が見つからないため、%1$s を確実にすることに失敗しました (%3$i repo " +-"はロード済み)" ++msgstr "repo %2$s が見つからないため、%1$s を確実にすることに失敗しました (%3$i repo はロード済み)" + + #: libdnf/dnf-transaction.cpp:367 + msgid "Failed to check untrusted: " +@@ -477,8 +457,7 @@ msgstr "%s にダウンロードしたファイルが見つかりませんでし + #: libdnf/dnf-transaction.cpp:397 + #, c-format + msgid "package %1$s cannot be verified and repo %2$s is GPG enabled: %3$s" +-msgstr "" +-"パッケージ %1$s は確認できず、repo %2$s は GPG が有効になっています: %3$s" ++msgstr "パッケージ %1$s は確認できず、repo %2$s は GPG が有効になっています: %3$s" + + #: libdnf/dnf-transaction.cpp:831 libdnf/dnf-transaction.cpp:903 + msgid "Failed to get value for CacheDir" +@@ -497,8 +476,7 @@ msgstr "%s に filesystem をフリーサイズで取得することに失敗し + #: libdnf/dnf-transaction.cpp:935 + #, c-format + msgid "Not enough free space in %1$s: needed %2$s, available %3$s" +-msgstr "" +-"%1$s に十分なスペースがありません: %2$s 必要で、利用可能なのは %3$s です" ++msgstr "%1$s に十分なスペースがありません: %2$s 必要で、利用可能なのは %3$s です" + + #: libdnf/dnf-transaction.cpp:1195 + msgid "failed to set root" +@@ -517,9 +495,7 @@ msgstr "トランザクションの実行中にエラー %i" + #: libdnf/dnf-transaction.cpp:1472 + #, c-format + msgid "Transaction did not go to writing phase, but returned no error(%i)" +-msgstr "" +-"トランザクションは書き込みフェーズまで行きませんでしたが、エラー(%i) は返しま" +-"せんでした" ++msgstr "トランザクションは書き込みフェーズまで行きませんでしたが、エラー(%i) は返しませんでした" + + #: libdnf/dnf-utils.cpp:111 libdnf/hy-iutil.cpp:485 + #, c-format +@@ -539,13 +515,15 @@ msgstr "不適格な Selector、フィルター内に複数の一致するオブ + msgid "Ill-formed Selector used for the operation, incorrect comparison type" + msgstr "操作に使用される不適格な Selector、間違った比較タイプ" + +-#: libdnf/goal/Goal.cpp:86 libdnf/goal/Goal.cpp:113 +-msgid " does not belong to a distupgrade repository" +-msgstr " はdistupgradeレポジトリーに属していません" ++#: libdnf/goal/Goal.cpp:86 ++#, c-format ++msgid "%s from %s does not belong to a distupgrade repository" ++msgstr "%s の %s はdistupgradeレポジトリーに属していません" + +-#: libdnf/goal/Goal.cpp:87 libdnf/goal/Goal.cpp:114 +-msgid " has inferior architecture" +-msgstr " は下位アーキテクチャがあります" ++#: libdnf/goal/Goal.cpp:87 ++#, c-format ++msgid "%s from %s has inferior architecture" ++msgstr "%s の %s は下位アーキテクチャがあります" + + #: libdnf/goal/Goal.cpp:88 + msgid "problem with installed package " +@@ -586,72 +564,79 @@ msgstr "ジョブの最良アップデート候補をインストールできま + + #: libdnf/goal/Goal.cpp:97 + #, c-format +-msgid "package %s is filtered out by modular filtering" +-msgstr "パッケージ %s はモジュラーフィルタリングに一致しません" ++msgid "package %s from %s is filtered out by modular filtering" ++msgstr "%s のパッケージ %s はモジュラーフィルタリングに一致しません" + + #: libdnf/goal/Goal.cpp:98 + #, c-format +-msgid "package %s does not have a compatible architecture" +-msgstr "パッケージ %s は互換性のあるアーキテクチャーがありません" ++msgid "package %s from %s does not have a compatible architecture" ++msgstr "%s のパッケージ %s は互換性のあるアーキテクチャーがありません" + + #: libdnf/goal/Goal.cpp:99 + #, c-format +-msgid "package %s is not installable" +-msgstr "パッケージ %s はインストール不可です" ++msgid "package %s from %s is not installable" ++msgstr "%s のパッケージ %s はインストール不可です" + + #: libdnf/goal/Goal.cpp:100 + #, c-format +-msgid "package %s is filtered out by exclude filtering" +-msgstr "パッケージ %s は除外フィルタリングに一致しません" ++msgid "package %s from %s is filtered out by exclude filtering" ++msgstr "%s のパッケージ %s は除外フィルタリングに一致しません" + + #: libdnf/goal/Goal.cpp:101 + #, c-format +-msgid "nothing provides %s needed by %s" +-msgstr "%s が提供されません %s に必要です" ++msgid "nothing provides %s needed by %s from %s" ++msgstr "%s が提供されません。%s の %s に必要です" + + #: libdnf/goal/Goal.cpp:102 + #, c-format +-msgid "cannot install both %s and %s" +-msgstr "%s と %s どちらもインストールできません" ++msgid "cannot install both %s from %s and %s from %s" ++msgstr "%s の %s および %s の %s の両方をインストールすることはできません" + + #: libdnf/goal/Goal.cpp:103 + #, c-format +-msgid "package %s conflicts with %s provided by %s" +-msgstr "パッケージ %s は %s と競合しています。これは %s により提供されます" ++msgid "package %s from %s conflicts with %s provided by %s from %s" ++msgstr "%s のパッケージ %s は、%s の %s で提供される %s と競合しています" + + #: libdnf/goal/Goal.cpp:104 + #, c-format +-msgid "package %s obsoletes %s provided by %s" +-msgstr "パッケージ %s は %s を廃止しました。これは %s により提供されます" ++msgid "package %s from %s obsoletes %s provided by %s from %s" ++msgstr "%s のパッケージ %s により、%s の %s で提供される %s が廃止されました" + + #: libdnf/goal/Goal.cpp:105 + #, c-format +-msgid "installed package %s obsoletes %s provided by %s" +-msgstr "" +-"インストール済パッケージ %s は %s を廃止しました。これは %s により提供されま" +-"す" ++msgid "installed package %s obsoletes %s provided by %s from %s" ++msgstr "インストール済パッケージ %s により、%s の %s で提供される %s が廃止されました" + + #: libdnf/goal/Goal.cpp:106 + #, c-format +-msgid "package %s implicitly obsoletes %s provided by %s" +-msgstr "パッケージ %s は %s を暗に廃止しました。これは %s により提供されます" ++msgid "package %s from %s implicitly obsoletes %s provided by %s from %s" ++msgstr "%s のパッケージ %s により、%s の %s で提供される %s が廃止されました" + + #: libdnf/goal/Goal.cpp:107 + #, c-format +-msgid "package %s requires %s, but none of the providers can be installed" +-msgstr "" +-"パッケージ %s には %s が必要ですが、どのプロバイダーからもインストールできま" +-"せん" ++msgid "" ++"package %s from %s requires %s, but none of the providers can be installed" ++msgstr "%s のパッケージ %s には、%s が必要ですが、どのプロバイダーからもインストールできません" + + #: libdnf/goal/Goal.cpp:108 + #, c-format +-msgid "package %s conflicts with %s provided by itself" +-msgstr "パッケージ %s は自己提供される %s と競合しています" ++msgid "package %s from %s conflicts with %s provided by itself" ++msgstr "%s のパッケージ %s は、自身で提供される %s と競合しています" + + #: libdnf/goal/Goal.cpp:109 + #, c-format +-msgid "both package %s and %s obsolete %s" +-msgstr "パッケージ %s と %s 両方は %s を廃止しました" ++msgid "both package %s from %s and %s from %s obsolete %s" ++msgstr "%s の %s パッケージと %s の %s パッケージにより、%s が廃止されました" ++ ++#: libdnf/goal/Goal.cpp:113 ++#, c-format ++msgid "%s from %s does not belong to a distupgrade repository" ++msgstr "%s の %s は distupgrade レポジトリーに属していません" ++ ++#: libdnf/goal/Goal.cpp:114 ++#, c-format ++msgid "%s from %s has inferior architecture" ++msgstr "%s の %s には、下位アーキテクチャーがあります" + + #: libdnf/goal/Goal.cpp:115 + msgid "problem with installed module " +@@ -668,104 +653,101 @@ msgstr "モジュールの最良アップデート候補をインストールで + + #: libdnf/goal/Goal.cpp:124 libdnf/goal/Goal.cpp:127 + #, c-format +-msgid "module %s is disabled" +-msgstr "モジュール %s は無効です" ++msgid "module %s from %s is disabled" ++msgstr "%s のモジュール %s が無効になっています" + + #: libdnf/goal/Goal.cpp:125 + #, c-format +-msgid "module %s does not have a compatible architecture" +-msgstr "モジュール %s は互換性のあるアーキテクチャーがありません" ++msgid "module %s from %s does not have a compatible architecture" ++msgstr "%s のモジュール %s には、互換性のあるアーキテクチャーがありません" + + #: libdnf/goal/Goal.cpp:126 + #, c-format +-msgid "module %s is not installable" +-msgstr "モジュール %s はインストール不可です" ++msgid "module %s from %s is not installable" ++msgstr "%s のモジュール %s はインストール不可です" + + #: libdnf/goal/Goal.cpp:128 + #, c-format +-msgid "nothing provides %s needed by module %s" +-msgstr "%s が提供されませんモジュール %s に必要です" ++msgid "nothing provides %s needed by module %s from %s" ++msgstr "%s のモジュール %s が必要な %s は何も提供されません" + + #: libdnf/goal/Goal.cpp:129 + #, c-format +-msgid "cannot install both modules %s and %s" +-msgstr "モジュール %s と %s どちらもインストールできません" ++msgid "cannot install both modules %s from %s and %s from %s" ++msgstr "%s の %s および %s の %s の両方のモジュールをインストールすることはできません" + + #: libdnf/goal/Goal.cpp:130 + #, c-format +-msgid "module %s conflicts with %s provided by %s" +-msgstr "モジュール %s は %s と競合しています。これは %s により提供されます" ++msgid "module %s from %s conflicts with %s provided by %s from %s" ++msgstr "%s のモジュール %s は、%s の %s で提供される %s と競合しています" + + #: libdnf/goal/Goal.cpp:131 + #, c-format +-msgid "module %s obsoletes %s provided by %s" +-msgstr "モジュール %s は %s を廃止しました。これは %s により提供されます" ++msgid "module %s from %s obsoletes %s provided by %s from %s" ++msgstr "%s のモジュール %s により、%s の %s で提供される %s が廃止されました" + + #: libdnf/goal/Goal.cpp:132 + #, c-format +-msgid "installed module %s obsoletes %s provided by %s" +-msgstr "" +-"インストール済モジュール %s は %s を廃止しました。これは %s により提供されま" +-"す" ++msgid "installed module %s obsoletes %s provided by %s from %s" ++msgstr "インストール済モジュール %s により、%s の %s で提供される %s が廃止されました" + + #: libdnf/goal/Goal.cpp:133 + #, c-format +-msgid "module %s implicitly obsoletes %s provided by %s" +-msgstr "モジュール %s は %s を暗に廃止しました。これは %s により提供されます" ++msgid "module %s from %s implicitly obsoletes %s provided by %s from %s" ++msgstr "%s のモジュール %s により、%s の %s で提供される %s が廃止されました" + + #: libdnf/goal/Goal.cpp:134 + #, c-format +-msgid "module %s requires %s, but none of the providers can be installed" +-msgstr "" +-"モジュール %s には %s が必要ですが、どのプロバイダーからもインストールできま" +-"せん" ++msgid "" ++"module %s from %s requires %s, but none of the providers can be installed" ++msgstr "%s のモジュール %s には、%s が必要ですが、どのプロバイダーからもインストールできません" + + #: libdnf/goal/Goal.cpp:135 + #, c-format +-msgid "module %s conflicts with %s provided by itself" +-msgstr "モジュール %s は自己提供される %s と競合しています" ++msgid "module %s from %s conflicts with %s provided by itself" ++msgstr "%s のモジュール %s は、自身で提供される %s と競合しています" + + #: libdnf/goal/Goal.cpp:136 + #, c-format +-msgid "both module %s and %s obsolete %s" +-msgstr "モジュール %s と %s 両方は %s を廃止しました" ++msgid "both module %s from %s and %s from %s obsolete %s" ++msgstr "%s の %s モジュールと %s の %s モジュールの両方により、%s が廃止されました" + +-#: libdnf/goal/Goal.cpp:1051 ++#: libdnf/goal/Goal.cpp:1062 + msgid "no solver set" + msgstr "設定されたソルバーはありません" + +-#: libdnf/goal/Goal.cpp:1056 ++#: libdnf/goal/Goal.cpp:1067 + #, c-format + msgid "failed to make %s absolute" + msgstr "%s を絶対的にすることに失敗しました" + +-#: libdnf/goal/Goal.cpp:1063 ++#: libdnf/goal/Goal.cpp:1074 + #, c-format + msgid "failed writing debugdata to %1$s: %2$s" + msgstr "debugdata を %1$s へ書き込むことに失敗しました: %2$s" + +-#: libdnf/goal/Goal.cpp:1075 ++#: libdnf/goal/Goal.cpp:1086 + msgid "no solv in the goal" + msgstr "目標に solv がありません" + +-#: libdnf/goal/Goal.cpp:1077 ++#: libdnf/goal/Goal.cpp:1088 + msgid "no solution, cannot remove protected package" + msgstr "ソリューションがなく、保護されたパッケージを削除できません" + +-#: libdnf/goal/Goal.cpp:1080 ++#: libdnf/goal/Goal.cpp:1091 + msgid "no solution possible" + msgstr "可能なソリューションがありません" + +-#: libdnf/goal/Goal.cpp:1206 ++#: libdnf/goal/Goal.cpp:1217 + msgid "Problem: " + msgstr "問題: " + +-#: libdnf/goal/Goal.cpp:1211 ++#: libdnf/goal/Goal.cpp:1222 + #, c-format + msgid "Problem %d: " + msgstr "問題 %d: " + +-#: libdnf/goal/Goal.cpp:1538 ++#: libdnf/goal/Goal.cpp:1549 + msgid "" + "The operation would result in removing the following protected packages: " + msgstr "操作は結果的に以下の保護されたパッケージを削除します: " +@@ -827,70 +809,66 @@ msgstr "有効な Platform ID が検出されませんでした" + msgid "Cannot enable multiple streams for module '%s'" + msgstr "モジュール '%s' の複数ストリームを有効化できません" + +-#: libdnf/module/ModulePackageContainer.cpp:295 ++#: libdnf/module/ModulePackageContainer.cpp:288 + #, c-format + msgid "Conflicting defaults with repo '%s': %s" + msgstr "repo '%s' のデフォルトが競合: %s" + +-#: libdnf/module/ModulePackageContainer.cpp:841 ++#: libdnf/module/ModulePackageContainer.cpp:847 + msgid "Installing module profiles:\n" + msgstr "モジュールプロファイルのインストール中:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:856 ++#: libdnf/module/ModulePackageContainer.cpp:862 + msgid "Disabling module profiles:\n" + msgstr "モジュールプロファイルの無効化中:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:871 ++#: libdnf/module/ModulePackageContainer.cpp:877 + msgid "Enabling module streams:\n" + msgstr "モジュールストリームの有効化中:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:885 ++#: libdnf/module/ModulePackageContainer.cpp:891 + msgid "Switching module streams:\n" + msgstr "モジュールストリームの切り替え中:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:903 ++#: libdnf/module/ModulePackageContainer.cpp:909 + msgid "Disabling modules:\n" + msgstr "モジュールの無効化:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:914 ++#: libdnf/module/ModulePackageContainer.cpp:920 + msgid "Resetting modules:\n" + msgstr "モジュールの再設定中:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:1638 ++#: libdnf/module/ModulePackageContainer.cpp:1644 + #, c-format + msgid "Unable to load modular Fail-Safe data at '%s'" + msgstr "'%s' のモジュラーフェイルセーフデータをロードできません" + +-#: libdnf/module/ModulePackageContainer.cpp:1644 ++#: libdnf/module/ModulePackageContainer.cpp:1650 + #, c-format + msgid "Unable to load modular Fail-Safe data for module '%s:%s'" + msgstr "モジュール '%s:%s' のモジュラーフェイルセーフデータをロードできません" + +-#: libdnf/module/ModulePackageContainer.cpp:1702 ++#: libdnf/module/ModulePackageContainer.cpp:1708 + #, c-format + msgid "Unable to create directory \"%s\" for modular Fail Safe data: %s" +-msgstr "" +-"ディレクトリー \"%s\" を作成できません。対象モジュラーフェイルセーフデータ: " +-"%s" ++msgstr "ディレクトリー \"%s\" を作成できません。対象モジュラーフェイルセーフデータ: %s" + +-#: libdnf/module/ModulePackageContainer.cpp:1718 ++#: libdnf/module/ModulePackageContainer.cpp:1724 + #, c-format + msgid "Unable to save a modular Fail Safe data to '%s'" + msgstr "'%s' のモジュラーフェイルセーフデータを保存できません" + +-#: libdnf/module/ModulePackageContainer.cpp:1741 ++#: libdnf/module/ModulePackageContainer.cpp:1747 + #, c-format + msgid "Unable to remove a modular Fail Safe data in '%s'" + msgstr "'%s' のモジュラーフェイルセーフデータを削除できません" + +-#: libdnf/module/ModulePackageContainer.cpp:1773 ++#: libdnf/module/ModulePackageContainer.cpp:1779 + #, c-format + msgid "" + "Unable to apply modular obsoletes to '%s:%s' because target module '%s' is " + "disabled" +-msgstr "" +-"ターゲットモジュール '%s' が無効であるため、モジュラーの廃止を '%s:%s' に適用" +-"できません" ++msgstr "ターゲットモジュール '%s' が無効であるため、モジュラーの廃止を '%s:%s' に適用できません" + + #: libdnf/module/modulemd/ModuleMetadata.cpp:86 + #, c-format +@@ -920,8 +898,7 @@ msgstr "ストリームのアップグレードに失敗しました: %s" + #: libdnf/module/modulemd/ModuleMetadata.cpp:212 + #, c-format + msgid "Cannot retrieve module obsoletes because no stream matching %s: %s" +-msgstr "" +-"%s に一致するストリームがないため、モジュールの廃止を取得できません: %s" ++msgstr "%s に一致するストリームがないため、モジュールの廃止を取得できません: %s" + + #: libdnf/plugin/plugin.cpp:46 + #, c-format +@@ -964,9 +941,9 @@ msgid "" + "deprecated and the support will be dropped in future versions. Use '=' " + "operator instead." + msgstr "" +-"reldeps で '==' 演算子を使用すると、未定義の動作が発生する可能性があります。" +-"これは非推奨で、将来のバージョンではサポートされなくなります。代わりに '=' 演" +-"算子を使用してください。" ++"reldeps で '==' " ++"演算子を使用すると、未定義の動作が発生する可能性があります。これは非推奨で、将来のバージョンではサポートされなくなります。代わりに '=' " ++"演算子を使用してください。" + + #: libdnf/repo/Repo.cpp:321 + #, c-format +@@ -976,9 +953,7 @@ msgstr "リポジトリー %s にはミラーまたは baseurl セットがあ + #: libdnf/repo/Repo.cpp:330 + #, c-format + msgid "Repository '%s' has unsupported type: 'type=%s', skipping." +-msgstr "" +-"リポジトリー '%s' にはサポートされていないタイプがあります: 'type=%s'、スキッ" +-"ピング。" ++msgstr "リポジトリー '%s' にはサポートされていないタイプがあります: 'type=%s'、スキッピング。" + + #: libdnf/repo/Repo.cpp:489 libdnf/repo/Repo.cpp:610 libdnf/repo/Repo.cpp:641 + #: libdnf/repo/Repo.cpp:1387 +@@ -988,23 +963,18 @@ msgstr "repo '%s': 'basecachedir' が設定されていません" + + #: libdnf/repo/Repo.cpp:512 + msgid "" +-"Maximum download speed is lower than minimum. Please change configuration of " +-"minrate or throttle" +-msgstr "" +-"ダウンロードの最高速度は、最低速度よりも低いです。minrate またはスロットルの" +-"設定を変更してください" ++"Maximum download speed is lower than minimum. Please change configuration of" ++" minrate or throttle" ++msgstr "ダウンロードの最高速度は、最低速度よりも低いです。minrate またはスロットルの設定を変更してください" + + #: libdnf/repo/Repo.cpp:546 + #, c-format + msgid "repo '%s': 'proxy_username' is set but not 'proxy_password'" +-msgstr "" +-"repo '%s': 'proxy_username' は設定済みですが、'proxy_password' は設定されてい" +-"ません" ++msgstr "repo '%s': 'proxy_username' は設定済みですが、'proxy_password' は設定されていません" + + #: libdnf/repo/Repo.cpp:548 + msgid "'proxy_username' is set but not 'proxy_password'" +-msgstr "" +-"'proxy_username' は設定済みですが、'proxy_password' は設定されていません" ++msgstr "'proxy_username' は設定済みですが、'proxy_password' は設定されていません" + + #: libdnf/repo/Repo.cpp:629 + #, c-format +@@ -1054,8 +1024,7 @@ msgstr "復元中: repo '%s' はスキップされました、metalink はあり + #: libdnf/repo/Repo.cpp:1186 + #, c-format + msgid "reviving: repo '%s' skipped, no usable hash." +-msgstr "" +-"復元中: repo '%s' はスキップされました、使用可能なハッシュはありません。" ++msgstr "復元中: repo '%s' はスキップされました、使用可能なハッシュはありません。" + + #: libdnf/repo/Repo.cpp:1209 + #, c-format +@@ -1105,8 +1074,7 @@ msgstr "repo: キャッシュを使用: %s" + #: libdnf/repo/Repo.cpp:1338 + #, c-format + msgid "Cache-only enabled but no cache for '%s'" +-msgstr "" +-"キャッシュオンリーが有効になっていますが、'%s' に対するキャッシュはありません" ++msgstr "キャッシュオンリーが有効になっていますが、'%s' に対するキャッシュはありません" + + #: libdnf/repo/Repo.cpp:1342 + #, c-format +@@ -1170,8 +1138,7 @@ msgstr "完了したトランザクションにトランザクションアイテ + + #: libdnf/transaction/Transformer.cpp:76 + msgid "Database Corrupted: no row 'version' in table 'config'" +-msgstr "" +-"データベースが破損しています。テーブル 'config' の行 'version' がありません" ++msgstr "データベースが破損しています。テーブル 'config' の行 'version' がありません" + + #: libdnf/transaction/Transformer.cpp:681 + msgid "Transformer: can't open history persist dir" +@@ -1194,6 +1161,112 @@ msgstr "TransactionItem の状態は設定されていません: %s" + msgid "Can't add console output to unsaved transaction" + msgstr "未保存のトランザクションにコンソールの出力を追加できません" + ++#~ msgid " does not belong to a distupgrade repository" ++#~ msgstr " はdistupgradeレポジトリーに属していません" ++ ++#~ msgid " has inferior architecture" ++#~ msgstr " は下位アーキテクチャがあります" ++ ++#, c-format ++#~ msgid "package %s is filtered out by modular filtering" ++#~ msgstr "パッケージ %s はモジュラーフィルタリングに一致しません" ++ ++#, c-format ++#~ msgid "package %s does not have a compatible architecture" ++#~ msgstr "パッケージ %s は互換性のあるアーキテクチャーがありません" ++ ++#, c-format ++#~ msgid "package %s is not installable" ++#~ msgstr "パッケージ %s はインストール不可です" ++ ++#, c-format ++#~ msgid "package %s is filtered out by exclude filtering" ++#~ msgstr "パッケージ %s は除外フィルタリングに一致しません" ++ ++#, c-format ++#~ msgid "nothing provides %s needed by %s" ++#~ msgstr "%s が提供されません %s に必要です" ++ ++#, c-format ++#~ msgid "cannot install both %s and %s" ++#~ msgstr "%s と %s どちらもインストールできません" ++ ++#, c-format ++#~ msgid "package %s conflicts with %s provided by %s" ++#~ msgstr "パッケージ %s は %s と競合しています。これは %s により提供されます" ++ ++#, c-format ++#~ msgid "package %s obsoletes %s provided by %s" ++#~ msgstr "パッケージ %s は %s を廃止しました。これは %s により提供されます" ++ ++#, c-format ++#~ msgid "installed package %s obsoletes %s provided by %s" ++#~ msgstr "インストール済パッケージ %s は %s を廃止しました。これは %s により提供されます" ++ ++#, c-format ++#~ msgid "package %s implicitly obsoletes %s provided by %s" ++#~ msgstr "パッケージ %s は %s を暗に廃止しました。これは %s により提供されます" ++ ++#, c-format ++#~ msgid "package %s requires %s, but none of the providers can be installed" ++#~ msgstr "パッケージ %s には %s が必要ですが、どのプロバイダーからもインストールできません" ++ ++#, c-format ++#~ msgid "package %s conflicts with %s provided by itself" ++#~ msgstr "パッケージ %s は自己提供される %s と競合しています" ++ ++#, c-format ++#~ msgid "both package %s and %s obsolete %s" ++#~ msgstr "パッケージ %s と %s 両方は %s を廃止しました" ++ ++#, c-format ++#~ msgid "module %s is disabled" ++#~ msgstr "モジュール %s は無効です" ++ ++#, c-format ++#~ msgid "module %s does not have a compatible architecture" ++#~ msgstr "モジュール %s は互換性のあるアーキテクチャーがありません" ++ ++#, c-format ++#~ msgid "module %s is not installable" ++#~ msgstr "モジュール %s はインストール不可です" ++ ++#, c-format ++#~ msgid "nothing provides %s needed by module %s" ++#~ msgstr "%s が提供されませんモジュール %s に必要です" ++ ++#, c-format ++#~ msgid "cannot install both modules %s and %s" ++#~ msgstr "モジュール %s と %s どちらもインストールできません" ++ ++#, c-format ++#~ msgid "module %s conflicts with %s provided by %s" ++#~ msgstr "モジュール %s は %s と競合しています。これは %s により提供されます" ++ ++#, c-format ++#~ msgid "module %s obsoletes %s provided by %s" ++#~ msgstr "モジュール %s は %s を廃止しました。これは %s により提供されます" ++ ++#, c-format ++#~ msgid "installed module %s obsoletes %s provided by %s" ++#~ msgstr "インストール済モジュール %s は %s を廃止しました。これは %s により提供されます" ++ ++#, c-format ++#~ msgid "module %s implicitly obsoletes %s provided by %s" ++#~ msgstr "モジュール %s は %s を暗に廃止しました。これは %s により提供されます" ++ ++#, c-format ++#~ msgid "module %s requires %s, but none of the providers can be installed" ++#~ msgstr "モジュール %s には %s が必要ですが、どのプロバイダーからもインストールできません" ++ ++#, c-format ++#~ msgid "module %s conflicts with %s provided by itself" ++#~ msgstr "モジュール %s は自己提供される %s と競合しています" ++ ++#, c-format ++#~ msgid "both module %s and %s obsolete %s" ++#~ msgstr "モジュール %s と %s 両方は %s を廃止しました" ++ + #~ msgid "failed to add solv" + #~ msgstr "solv の追加に失敗しました" + +@@ -1201,14 +1274,10 @@ msgstr "未保存のトランザクションにコンソールの出力を追加 + #~ msgstr "write_main() はデータの書き込みに失敗しました: %i" + + #~ msgid "write_main() failed to re-load written solv file" +-#~ msgstr "" +-#~ "write_main() は、書き込みされた solv ファイルの再ロードに失敗しました" ++#~ msgstr "write_main() は、書き込みされた solv ファイルの再ロードに失敗しました" + + #~ msgid "write_ext(%1$d) has failed: %2$d" + #~ msgstr "write_ext(%1$d) は失敗しました: %2$d" + + #~ msgid "repo_add_repomdxml/rpmmd() has failed." + #~ msgstr "repo_add_repomdxml/rpmmd() は失敗しました。" +- +-#~ msgid "Bad id for repo: %s, byte = %s %d" +-#~ msgstr "repo に対する不正な id: %s, byte = %s %d" +diff --git a/po/ko.po b/po/ko.po +index 777b79f0..45c58c06 100644 +--- a/po/ko.po ++++ b/po/ko.po +@@ -8,11 +8,10 @@ msgid "" + msgstr "" + "Project-Id-Version: PACKAGE VERSION\n" + "Report-Msgid-Bugs-To: \n" +-"POT-Creation-Date: 2023-02-28 09:11+0100\n" ++"POT-Creation-Date: 2023-08-29 13:10+0200\n" + "PO-Revision-Date: 2022-11-03 02:19+0000\n" + "Last-Translator: 김인수 \n" +-"Language-Team: Korean \n" ++"Language-Team: Korean \n" + "Language: ko\n" + "MIME-Version: 1.0\n" + "Content-Type: text/plain; charset=UTF-8\n" +@@ -95,12 +94,12 @@ msgstr "주어진 값 [%d] 허용 된 값보다 커야합니다 [%d]." + #: libdnf/conf/OptionPath.cpp:78 + #, c-format + msgid "given path '%s' is not absolute." +-msgstr "주어진 경로 '%s절대적이지 않다." ++msgstr "주어진 경로 '%s절대적이지 않음" + + #: libdnf/conf/OptionPath.cpp:82 + #, c-format + msgid "given path '%s' does not exist." +-msgstr "주어진 경로 '%s' 존재하지 않는다." ++msgstr "주어진 경로 '%s' 존재하지 않음." + + #: libdnf/conf/OptionSeconds.cpp:52 + #, c-format +@@ -120,9 +119,7 @@ msgstr "동시에 모듈 '%s’에서 다른 스트림을 활성화 할 수 없 + #, c-format + msgid "" + "Cannot enable module '%1$s' stream '%2$s': State of module already modified" +-msgstr "" +-"모듈 '%1$s' 스트림 '%2$s 을 활성화 할 수 없습니다: 모듈 상태가 이미 변경되었" +-"습니다" ++msgstr "모듈 '%1$s' 스트림 '%2$s 을 활성화 할 수 없습니다: 모듈 상태가 이미 변경되었습니다" + + #: libdnf/dnf-context.cpp:3259 + #, c-format +@@ -145,7 +142,8 @@ msgstr "인수 %s를 해결 할 수 없습니다" + #: libdnf/dnf-context.cpp:3303 + #, c-format + msgid "" +-"Only module name is required. Ignoring unneeded information in argument: '%s'" ++"Only module name is required. Ignoring unneeded information in argument: " ++"'%s'" + msgstr "모듈 이름만 필요합니다. 인수에서 불필요한 정보를 무시합니다: '%s'" + + #: libdnf/dnf-context.cpp:3317 +@@ -173,9 +171,7 @@ msgstr "인수: '%s'에 불필요한 정보를 무시하기" + msgid "" + "Problem during enablement of dependency tree for module '%1$s' stream " + "'%2$s': %3$s" +-msgstr "" +-"모듈 '%1$s' 스트림 '%2$s': %3$s 위해 의존성 트리의 활성화하는 중에 발생하는 " +-"문제" ++msgstr "모듈 '%1$s' 스트림 '%2$s': %3$s 위해 의존성 트리의 활성화하는 중에 발생하는 문제" + + #: libdnf/dnf-context.cpp:3426 + msgid "Problems appeared for module enable request" +@@ -202,21 +198,17 @@ msgstr "모듈 비활성화 요청을 위해 나타난 문제" + #: libdnf/dnf-context.cpp:3633 + #, c-format + msgid "" +-"The operation would result in switching of module '%s' stream '%s' to stream " +-"'%s'" ++"The operation would result in switching of module '%s' stream '%s' to stream" ++" '%s'" + msgstr "이 동작은 모듈 '%s'' 스트림 ‘%s'에서 스트림 '%s'로의 전환 결과입니다" + + #: libdnf/dnf-context.cpp:3637 + msgid "" + "It is not possible to switch enabled streams of a module.\n" +-"It is recommended to remove all installed content from the module, and reset " +-"the module using 'microdnf module reset ' command. After you " +-"reset the module, you can install the other stream." ++"It is recommended to remove all installed content from the module, and reset the module using 'microdnf module reset ' command. After you reset the module, you can install the other stream." + msgstr "" + "활성화된 모듈 스트림을 전환 할 수 없습니다.\n" +-"설치된 모든 내용을 모듈에서 제거하고 ‘' 명령을 사용하여 모듈을 " +-"재설정하는 것이 좋습니다. 모듈을 재설정한 후, 다른 스트림을 설치 할 수 있습니" +-"다." ++"설치된 모든 내용을 모듈에서 제거하고 ‘' 명령을 사용하여 모듈을 재설정하는 것이 좋습니다. 모듈을 재설정한 후, 다른 스트림을 설치 할 수 있습니다." + + #: libdnf/dnf-goal.cpp:85 + msgid "Could not depsolve transaction; " +@@ -243,9 +235,7 @@ msgstr " 문제: %s\n" + msgid "" + "No available modular metadata for modular package '%s'; cannot be installed " + "on the system" +-msgstr "" +-"모듈러 꾸러미 '%s'에 사용 가능한 모듈러 메타데이터가 없으며; 시스템에 설치 " +-"할 수 없습니다" ++msgstr "모듈러 패키지 '%s'에 사용 가능한 모듈러 메타데이터가 없으며; 시스템에 설치 할 수 없습니다" + + #: libdnf/dnf-rpmts.cpp:121 libdnf/dnf-rpmts.cpp:166 + #, c-format +@@ -284,8 +274,7 @@ msgstr "연결 실행 오류 : %s" + + #: libdnf/dnf-rpmts.cpp:283 + msgid "Error running transaction and no problems were reported!" +-msgstr "" +-"연결을 실행하는 중 오류가 발생했으며 아무런 문제도 보고되지 않았습니다!" ++msgstr "연결을 실행하는 중 오류가 발생했으며 아무런 문제도 보고되지 않았습니다!" + + #: libdnf/dnf-rpmts.cpp:346 + msgid "Fatal error, run database recovery" +@@ -294,7 +283,7 @@ msgstr "치명적인 오류, 데이터베이스 복구 실행" + #: libdnf/dnf-rpmts.cpp:355 + #, c-format + msgid "failed to find package %s" +-msgstr "꾸러미를 찾지 못했습니다. %s" ++msgstr "패키지를 찾지 못했습니다. %s" + + #: libdnf/dnf-rpmts.cpp:401 + #, c-format +@@ -358,7 +347,8 @@ msgstr "임시 파일을 만들 수 없습니다. %s" + #: libdnf/dnf-sack.cpp:667 + #, c-format + msgid "" +-"While writing extension cache %s (%d): repowriter write failed: %i, error: %s" ++"While writing extension cache %s (%d): repowriter write failed: %i, error: " ++"%s" + msgstr "확장 캐쉬 %s (%d)를 쓰는 동안: repowriter 쓰기가 실패함: %i, 오류: %s" + + #: libdnf/dnf-sack.cpp:677 +@@ -449,7 +439,7 @@ msgstr "이미 100 %% 상태 [%s]" + #: libdnf/dnf-transaction.cpp:300 + #, c-format + msgid "Sources not set when trying to ensure package %s" +-msgstr "꾸러미 %s를 확인 하려고 할 때 원천이 설정되지 않았습니다" ++msgstr "패키지를 만들 때 소스가 설정되지 않았습니다. %s" + + #: libdnf/dnf-transaction.cpp:326 + #, c-format +@@ -468,7 +458,7 @@ msgstr "에 대한 내려받기 파일 %s 찾을 수 없음" + #: libdnf/dnf-transaction.cpp:397 + #, c-format + msgid "package %1$s cannot be verified and repo %2$s is GPG enabled: %3$s" +-msgstr "꾸러미 %1$s 확인 및 복구 할 수 없습니다. %2$s GPG 사용 설정 됨 : %3$s" ++msgstr "패키지 %1$s 확인 및 복구 할 수 없습니다. %2$s GPG 사용 설정 됨 : %3$s" + + #: libdnf/dnf-transaction.cpp:831 libdnf/dnf-transaction.cpp:903 + msgid "Failed to get value for CacheDir" +@@ -526,17 +516,19 @@ msgstr "잘못된 형식의 선택기, 필터에 일치하는 개체가 여러 + msgid "Ill-formed Selector used for the operation, incorrect comparison type" + msgstr "조작에 잘못 형성된 선택자, 잘못된 비교 유형" + +-#: libdnf/goal/Goal.cpp:86 libdnf/goal/Goal.cpp:113 +-msgid " does not belong to a distupgrade repository" +-msgstr " distupgrade 저장소에 속하지 않습니다" ++#: libdnf/goal/Goal.cpp:86 ++#, c-format ++msgid "%s from %s does not belong to a distupgrade repository" ++msgstr "%s /%s distupgrade 저장소에 속하지 않습니다" + +-#: libdnf/goal/Goal.cpp:87 libdnf/goal/Goal.cpp:114 +-msgid " has inferior architecture" +-msgstr " 하위 구조" ++#: libdnf/goal/Goal.cpp:87 ++#, c-format ++msgid "%s from %s has inferior architecture" ++msgstr "%s /%s 하위 아키텍처" + + #: libdnf/goal/Goal.cpp:88 + msgid "problem with installed package " +-msgstr "설치된 꾸러미 문제 " ++msgstr "설치된 패키지 문제 " + + #: libdnf/goal/Goal.cpp:89 libdnf/goal/Goal.cpp:116 + msgid "conflicting requests" +@@ -553,7 +545,7 @@ msgstr "요청이 없습니다 " + #: libdnf/goal/Goal.cpp:92 + #, c-format + msgid "package %s does not exist" +-msgstr "꾸러미 %s가 존재하지 않습니다" ++msgstr "패키지 %s가 존재하지 않습니다" + + #: libdnf/goal/Goal.cpp:93 libdnf/goal/Goal.cpp:120 + msgid " is provided by the system" +@@ -565,7 +557,7 @@ msgstr "종속성 문제" + + #: libdnf/goal/Goal.cpp:95 + msgid "cannot install the best update candidate for package " +-msgstr "꾸러미에 가장 적합한 최신화 선택을 설치 할 수 없습니다 " ++msgstr "패키지에 가장 적합한 최신화 선택을 설치 할 수 없습니다 " + + #: libdnf/goal/Goal.cpp:96 libdnf/goal/Goal.cpp:123 + msgid "cannot install the best candidate for the job" +@@ -573,68 +565,79 @@ msgstr "작업에 가장 적합한 선택을 설치 할 수 없습니다" + + #: libdnf/goal/Goal.cpp:97 + #, c-format +-msgid "package %s is filtered out by modular filtering" +-msgstr "꾸러미 %s가 모듈식으로 걸러 제거됩니다" ++msgid "package %s from %s is filtered out by modular filtering" ++msgstr "패키지 %s (%s에서)가 모듈식 필터링에 의해 필터링됩니다." + + #: libdnf/goal/Goal.cpp:98 + #, c-format +-msgid "package %s does not have a compatible architecture" +-msgstr "꾸러미 %s에 호환 구조가 없습니다" ++msgid "package %s from %s does not have a compatible architecture" ++msgstr "패키지 %s (%s에서)에 호환되는 구조가 없습니다" + + #: libdnf/goal/Goal.cpp:99 + #, c-format +-msgid "package %s is not installable" +-msgstr "꾸러미 %s 가 설치 할 수 없습니다" ++msgid "package %s from %s is not installable" ++msgstr "패키지 %s (%s에서)를 설치할 수 없습니다" + + #: libdnf/goal/Goal.cpp:100 + #, c-format +-msgid "package %s is filtered out by exclude filtering" +-msgstr "꾸러미 %s가 걸러지는 것에서 제외되었습니다" ++msgid "package %s from %s is filtered out by exclude filtering" ++msgstr "패키지 %s (%s에서)가 제외 필터링을 통해 필터링됩니다" + + #: libdnf/goal/Goal.cpp:101 + #, c-format +-msgid "nothing provides %s needed by %s" +-msgstr "%s에 필요한 %s가 제공되지 않았습니다" ++msgid "nothing provides %s needed by %s from %s" ++msgstr "%s (%s에서)에 필요한 %s이 제공되지 않습니다" + + #: libdnf/goal/Goal.cpp:102 + #, c-format +-msgid "cannot install both %s and %s" +-msgstr "%s 와 %s 모두 설치 할 수 없습니다" ++msgid "cannot install both %s from %s and %s from %s" ++msgstr "%s (%s에서) 및 %s (%s에서) 모두 설치할 수 없습니다" + + #: libdnf/goal/Goal.cpp:103 + #, c-format +-msgid "package %s conflicts with %s provided by %s" +-msgstr "꾸러미 %s은 %s에서 제공된 %s와 충돌합니다" ++msgid "package %s from %s conflicts with %s provided by %s from %s" ++msgstr "패키지 %s (%s에서)가 %s (%s에서)에 의해 제공된 %s와 충돌합니다" + + #: libdnf/goal/Goal.cpp:104 + #, c-format +-msgid "package %s obsoletes %s provided by %s" +-msgstr "꾸러미 %s가 %s에의해 제공된 %s를 폐기합니다" ++msgid "package %s from %s obsoletes %s provided by %s from %s" ++msgstr "패키지 %s (%s에서)가 %s (%s에서)에 의해 제공된 %s를 폐기합니다" + + #: libdnf/goal/Goal.cpp:105 + #, c-format +-msgid "installed package %s obsoletes %s provided by %s" +-msgstr "설치된 꾸러미 %s는 %s에 의해 %s 폐기되었습니다" ++msgid "installed package %s obsoletes %s provided by %s from %s" ++msgstr "설치된 패키지 %s가 %s (%s에서)에 의해 제공된 %s를 폐기합니다" + + #: libdnf/goal/Goal.cpp:106 + #, c-format +-msgid "package %s implicitly obsoletes %s provided by %s" +-msgstr "꾸러미 %s가 %s에 의해 %s가 암시적으로 폐기되었습니다" ++msgid "package %s from %s implicitly obsoletes %s provided by %s from %s" ++msgstr "패키지 %s (%s에서)가 %s (%s에서)에 의해 제공된 %s를 암시적으로 폐기합니다" + + #: libdnf/goal/Goal.cpp:107 + #, c-format +-msgid "package %s requires %s, but none of the providers can be installed" +-msgstr "꾸러미 %s는 %s가 필요하지만, 공급자가 없어 설치 할 수 없습니다" ++msgid "" ++"package %s from %s requires %s, but none of the providers can be installed" ++msgstr "패키지 %s (%s에서)는 %s이 필요하지만, 공급자가 없어 설치 할 수 없습니다" + + #: libdnf/goal/Goal.cpp:108 + #, c-format +-msgid "package %s conflicts with %s provided by itself" +-msgstr "꾸러미 %s가 자체적으로 제공된 %s와 충돌합니다" ++msgid "package %s from %s conflicts with %s provided by itself" ++msgstr "패키지 %s (%s에서)가 자체적으로 제공된 %s와 충돌합니다" + + #: libdnf/goal/Goal.cpp:109 + #, c-format +-msgid "both package %s and %s obsolete %s" +-msgstr "꾸러미 %s 와 %s 는 모두 %s에서 폐기되었습니다" ++msgid "both package %s from %s and %s from %s obsolete %s" ++msgstr "패키지 %s (%s에서) 및 %s (%s에서) 모두 %s을/를 폐기합니다" ++ ++#: libdnf/goal/Goal.cpp:113 ++#, c-format ++msgid "%s from %s does not belong to a distupgrade repository" ++msgstr "%s (%s에서)은/는 distupgrade 저장소에 속하지 않습니다" ++ ++#: libdnf/goal/Goal.cpp:114 ++#, c-format ++msgid "%s from %s has inferior architecture" ++msgstr "%s (%s에서)은/는 하위 아키텍처" + + #: libdnf/goal/Goal.cpp:115 + msgid "problem with installed module " +@@ -651,103 +654,104 @@ msgstr "모듈에 가장 적합한 최신화 추천을 설치 할 수 없습니 + + #: libdnf/goal/Goal.cpp:124 libdnf/goal/Goal.cpp:127 + #, c-format +-msgid "module %s is disabled" +-msgstr "모듈 %s를 사용할 수 없습니다" ++msgid "module %s from %s is disabled" ++msgstr "모듈 %s (%s에서)이/가 비활성화됨" + + #: libdnf/goal/Goal.cpp:125 + #, c-format +-msgid "module %s does not have a compatible architecture" +-msgstr "모듈 %s 에 호환되는 구조가 없습니다" ++msgid "module %s from %s does not have a compatible architecture" ++msgstr "패키지 %s (%s에서)에 호환되는 아키텍처가 없습니다" + + #: libdnf/goal/Goal.cpp:126 + #, c-format +-msgid "module %s is not installable" +-msgstr "모듈 %s 를 설치 할 수 없습니다" ++msgid "module %s from %s is not installable" ++msgstr "패키지 %s (%s에서)를 설치할 수 없습니다" + + #: libdnf/goal/Goal.cpp:128 + #, c-format +-msgid "nothing provides %s needed by module %s" +-msgstr "모듈 %s 에 필요한 %s 가 제공되지 않았습니다" ++msgid "nothing provides %s needed by module %s from %s" ++msgstr "%s (%s에서)에 필요한 %s이 제공되지 않습니다" + + #: libdnf/goal/Goal.cpp:129 + #, c-format +-msgid "cannot install both modules %s and %s" +-msgstr "모듈 %s 와 %s를 모두 설치 할 수 없습니다" ++msgid "cannot install both modules %s from %s and %s from %s" ++msgstr "모듈 %s (%s에서) 및 %s (%s에서) 모두 설치할 수 없습니다" + + #: libdnf/goal/Goal.cpp:130 + #, c-format +-msgid "module %s conflicts with %s provided by %s" +-msgstr "모듈 %s가 %s에 의해 제공된 %s와 충돌합니다" ++msgid "module %s from %s conflicts with %s provided by %s from %s" ++msgstr "모듈 %s (%s에서)이 %s (%s에서)에 의해 제공된 %s와 충돌합니다" + + #: libdnf/goal/Goal.cpp:131 + #, c-format +-msgid "module %s obsoletes %s provided by %s" +-msgstr "모듈 %s가 %s에 의해 제공된 %s를 폐기하였습니다" ++msgid "module %s from %s obsoletes %s provided by %s from %s" ++msgstr "모듈 %s (%s에서)이 %s (%s에서)에 의해 제공된 %s를 폐기합니다" + + #: libdnf/goal/Goal.cpp:132 + #, c-format +-msgid "installed module %s obsoletes %s provided by %s" +-msgstr "설치된 모듈 %s 가 %s의해 제공된 %s를 폐기합니다" ++msgid "installed module %s obsoletes %s provided by %s from %s" ++msgstr "설치된 모듈 %s 가 %s의해 제공된 %s (%s에서)를 폐기합니다" + + #: libdnf/goal/Goal.cpp:133 + #, c-format +-msgid "module %s implicitly obsoletes %s provided by %s" +-msgstr "모듈 %s가 %s 에 의해 %s를 암시적으로 폐기되었습니다" ++msgid "module %s from %s implicitly obsoletes %s provided by %s from %s" ++msgstr "모듈 %s (%s에서)이 %s (%s에서)에 의해 제공된 %s를 암시적으로 폐기합니다" + + #: libdnf/goal/Goal.cpp:134 + #, c-format +-msgid "module %s requires %s, but none of the providers can be installed" +-msgstr "모듈 %s 에 %s 가 필요하지만 공급 업체가 없어 설치 할 수 없습니다" ++msgid "" ++"module %s from %s requires %s, but none of the providers can be installed" ++msgstr "모듈 %s (%s에서)은 %s이 필요하지만, 공급자가 없어 설치 할 수 없습니다" + + #: libdnf/goal/Goal.cpp:135 + #, c-format +-msgid "module %s conflicts with %s provided by itself" +-msgstr "모듈 %s가 자체적으로 제공된 %s와 충돌합니다" ++msgid "module %s from %s conflicts with %s provided by itself" ++msgstr "모듈 %s (%s에서)이 (에서)에 의해 제공된 %s와 충돌합니다" + + #: libdnf/goal/Goal.cpp:136 + #, c-format +-msgid "both module %s and %s obsolete %s" +-msgstr "모듈 %s와 %s가 %s에서 폐기되었습니다" ++msgid "both module %s from %s and %s from %s obsolete %s" ++msgstr "모듈 %s (%s에서) 및 %s (%s에서) 모두 %s을/를 폐기합니다" + +-#: libdnf/goal/Goal.cpp:1051 ++#: libdnf/goal/Goal.cpp:1062 + msgid "no solver set" + msgstr "solver 설정 없음" + +-#: libdnf/goal/Goal.cpp:1056 ++#: libdnf/goal/Goal.cpp:1067 + #, c-format + msgid "failed to make %s absolute" + msgstr "%s 절대값을 생성을 실패하였습니다" + +-#: libdnf/goal/Goal.cpp:1063 ++#: libdnf/goal/Goal.cpp:1074 + #, c-format + msgid "failed writing debugdata to %1$s: %2$s" + msgstr "%1$s: %2$s에 디버그자료 쓰기를 실패했습니다" + +-#: libdnf/goal/Goal.cpp:1075 ++#: libdnf/goal/Goal.cpp:1086 + msgid "no solv in the goal" +-msgstr "목표에 solv가 없다" ++msgstr "목표에 solv가 없음" + +-#: libdnf/goal/Goal.cpp:1077 ++#: libdnf/goal/Goal.cpp:1088 + msgid "no solution, cannot remove protected package" +-msgstr "해결책 없음, 보호 된 꾸러미를 제거 할 수 없음" ++msgstr "해결책 없음, 보안된 패키지를 제거 할 수 없음" + +-#: libdnf/goal/Goal.cpp:1080 ++#: libdnf/goal/Goal.cpp:1091 + msgid "no solution possible" + msgstr "해결책 없음" + +-#: libdnf/goal/Goal.cpp:1206 ++#: libdnf/goal/Goal.cpp:1217 + msgid "Problem: " + msgstr "문제: " + +-#: libdnf/goal/Goal.cpp:1211 ++#: libdnf/goal/Goal.cpp:1222 + #, c-format + msgid "Problem %d: " + msgstr "문제 %d: " + +-#: libdnf/goal/Goal.cpp:1538 ++#: libdnf/goal/Goal.cpp:1549 + msgid "" + "The operation would result in removing the following protected packages: " +-msgstr "이 작업으로 인해 다음과 같은 보호 꾸러미가 제거됩니다. " ++msgstr "이 작업으로 인해 다음과 같은 보안 패키지가 제거됩니다. " + + #: libdnf/hy-iutil.cpp:181 + #, c-format +@@ -781,11 +785,11 @@ msgstr "잘못된 형식의 기반 모듈: %s" + + #: libdnf/module/ModulePackage.cpp:575 + msgid "Multiple module platforms provided by available packages\n" +-msgstr "사용 가능한 꾸러미로 제공되는 다중 모듈 기반\n" ++msgstr "사용 가능한 패키지로 제공되는 다중 모듈 기반\n" + + #: libdnf/module/ModulePackage.cpp:588 + msgid "Multiple module platforms provided by installed packages\n" +-msgstr "설치된 꾸러미로 제공되는 다중 모듈 기반\n" ++msgstr "설치된 패키지로 제공되는 다중 모듈 기반\n" + + #: libdnf/module/ModulePackage.cpp:615 + #, c-format +@@ -806,68 +810,66 @@ msgstr "유효한 기반(Platform) ID가 없습니다" + msgid "Cannot enable multiple streams for module '%s'" + msgstr "모듈 '%s’를 위해 다중 스트림을 활성화 할 수 없습니다" + +-#: libdnf/module/ModulePackageContainer.cpp:295 ++#: libdnf/module/ModulePackageContainer.cpp:288 + #, c-format + msgid "Conflicting defaults with repo '%s': %s" + msgstr "저장소 '%s: %s'와 기본 설정이 충돌합니다" + +-#: libdnf/module/ModulePackageContainer.cpp:841 ++#: libdnf/module/ModulePackageContainer.cpp:847 + msgid "Installing module profiles:\n" + msgstr "모듈 프로파일 설치:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:856 ++#: libdnf/module/ModulePackageContainer.cpp:862 + msgid "Disabling module profiles:\n" + msgstr "모듈 프로파일 비활성화:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:871 ++#: libdnf/module/ModulePackageContainer.cpp:877 + msgid "Enabling module streams:\n" + msgstr "모듈 스트림 활성화:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:885 ++#: libdnf/module/ModulePackageContainer.cpp:891 + msgid "Switching module streams:\n" + msgstr "모듈 스트림 전환:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:903 ++#: libdnf/module/ModulePackageContainer.cpp:909 + msgid "Disabling modules:\n" + msgstr "모듈 비활성화:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:914 ++#: libdnf/module/ModulePackageContainer.cpp:920 + msgid "Resetting modules:\n" + msgstr "모듈 재설정:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:1638 ++#: libdnf/module/ModulePackageContainer.cpp:1644 + #, c-format + msgid "Unable to load modular Fail-Safe data at '%s'" + msgstr "'%s'에서 모듈식 Fail-Safe 자료를 적재 할 수 없습니다" + +-#: libdnf/module/ModulePackageContainer.cpp:1644 ++#: libdnf/module/ModulePackageContainer.cpp:1650 + #, c-format + msgid "Unable to load modular Fail-Safe data for module '%s:%s'" + msgstr "모듈 '%s:%s'에 대해 모듈식 Fail-Safe 자료를 적재 할 수 없습니다" + +-#: libdnf/module/ModulePackageContainer.cpp:1702 ++#: libdnf/module/ModulePackageContainer.cpp:1708 + #, c-format + msgid "Unable to create directory \"%s\" for modular Fail Safe data: %s" + msgstr "모듈식 Fail-Safe 데이터에 대한 “%s\" 디렉토리를 만들 수 없습니다: %s" + +-#: libdnf/module/ModulePackageContainer.cpp:1718 ++#: libdnf/module/ModulePackageContainer.cpp:1724 + #, c-format + msgid "Unable to save a modular Fail Safe data to '%s'" + msgstr "모듈식 Fail Safe 자료를 '%s'에 저장 할 수 없습니다" + +-#: libdnf/module/ModulePackageContainer.cpp:1741 ++#: libdnf/module/ModulePackageContainer.cpp:1747 + #, c-format + msgid "Unable to remove a modular Fail Safe data in '%s'" + msgstr "'%s'에서 모듈식 Fail Safe 자료를 제거 할 수 없습니다" + +-#: libdnf/module/ModulePackageContainer.cpp:1773 ++#: libdnf/module/ModulePackageContainer.cpp:1779 + #, c-format + msgid "" + "Unable to apply modular obsoletes to '%s:%s' because target module '%s' is " + "disabled" +-msgstr "" +-"'%s:%s'에 사용되지 않는 모듈을 적용할 수 없습니다(대상 모듈 '%s'가 비활성화 " +-"되어 있기 때문에)" ++msgstr "'%s:%s'에 사용되지 않는 모듈을 적용할 수 없습니다(대상 모듈 '%s'가 비활성화 되어 있기 때문에)" + + #: libdnf/module/modulemd/ModuleMetadata.cpp:86 + #, c-format +@@ -940,9 +942,8 @@ msgid "" + "deprecated and the support will be dropped in future versions. Use '=' " + "operator instead." + msgstr "" +-"reldeps에 '=='연산자를 사용하면 정의되지 않은 동작이 발생할 수 있습니다. 이 " +-"연산자는 더 이상 사용되지 않으며, 향후 버전에서는 지원이 중단됩니다. 대신 " +-"'=' 연산자를 사용하세요." ++"reldeps에 '=='연산자를 사용하면 정의되지 않은 동작이 발생할 수 있습니다. 이 연산자는 더 이상 사용되지 않으며, 향후 " ++"버전에서는 지원이 중단됩니다. 대신 '=' 연산자를 사용하세요." + + #: libdnf/repo/Repo.cpp:321 + #, c-format +@@ -962,17 +963,14 @@ msgstr "repo '%s': 'basecachedir가 구성되어 있지 않습니다" + + #: libdnf/repo/Repo.cpp:512 + msgid "" +-"Maximum download speed is lower than minimum. Please change configuration of " +-"minrate or throttle" +-msgstr "" +-"최대 내려받기 속도는 최저보다 낮습니다. 최저속도나 변환 환경구성을 변경해 주" +-"세요" ++"Maximum download speed is lower than minimum. Please change configuration of" ++" minrate or throttle" ++msgstr "최대 내려받기 속도는 최저보다 낮습니다. 최저속도나 변환 환경구성을 변경해 주세요" + + #: libdnf/repo/Repo.cpp:546 + #, c-format + msgid "repo '%s': 'proxy_username' is set but not 'proxy_password'" +-msgstr "" +-"repo '%s': 'proxy_username' 는 구성되어 있지만 'proxy_password'가 없습니다" ++msgstr "repo '%s': 'proxy_username' 는 구성되어 있지만 'proxy_password'가 없습니다" + + #: libdnf/repo/Repo.cpp:548 + msgid "'proxy_username' is set but not 'proxy_password'" +@@ -1140,8 +1138,7 @@ msgstr "완료된 연결에서 연결 항목 최신화를 시도합니다" + + #: libdnf/transaction/Transformer.cpp:76 + msgid "Database Corrupted: no row 'version' in table 'config'" +-msgstr "" +-"데이타베이스가 오염되었습니다: 테이블 'config'에 'version' 행이 없습니다" ++msgstr "데이타베이스가 오염되었습니다: 테이블 'config'에 'version' 행이 없습니다" + + #: libdnf/transaction/Transformer.cpp:681 + msgid "Transformer: can't open history persist dir" +@@ -1164,6 +1161,112 @@ msgstr "TransactionItem 상태가 설정되지 않았습니다. %s" + msgid "Can't add console output to unsaved transaction" + msgstr "저장되지 않은 연결에 콘솔 출력을 추가 할 수 없습니다" + ++#~ msgid " does not belong to a distupgrade repository" ++#~ msgstr " distupgrade 저장소에 속하지 않습니다" ++ ++#~ msgid " has inferior architecture" ++#~ msgstr " 하위 구조" ++ ++#, c-format ++#~ msgid "package %s is filtered out by modular filtering" ++#~ msgstr "꾸러미 %s가 모듈식으로 걸러 제거됩니다" ++ ++#, c-format ++#~ msgid "package %s does not have a compatible architecture" ++#~ msgstr "꾸러미 %s에 호환 구조가 없습니다" ++ ++#, c-format ++#~ msgid "package %s is not installable" ++#~ msgstr "꾸러미 %s 가 설치 할 수 없습니다" ++ ++#, c-format ++#~ msgid "package %s is filtered out by exclude filtering" ++#~ msgstr "꾸러미 %s가 걸러지는 것에서 제외되었습니다" ++ ++#, c-format ++#~ msgid "nothing provides %s needed by %s" ++#~ msgstr "%s에 필요한 %s가 제공되지 않았습니다" ++ ++#, c-format ++#~ msgid "cannot install both %s and %s" ++#~ msgstr "%s 와 %s 모두 설치 할 수 없습니다" ++ ++#, c-format ++#~ msgid "package %s conflicts with %s provided by %s" ++#~ msgstr "꾸러미 %s은 %s에서 제공된 %s와 충돌합니다" ++ ++#, c-format ++#~ msgid "package %s obsoletes %s provided by %s" ++#~ msgstr "꾸러미 %s가 %s에의해 제공된 %s를 폐기합니다" ++ ++#, c-format ++#~ msgid "installed package %s obsoletes %s provided by %s" ++#~ msgstr "설치된 꾸러미 %s는 %s에 의해 %s 폐기되었습니다" ++ ++#, c-format ++#~ msgid "package %s implicitly obsoletes %s provided by %s" ++#~ msgstr "꾸러미 %s가 %s에 의해 %s가 암시적으로 폐기되었습니다" ++ ++#, c-format ++#~ msgid "package %s requires %s, but none of the providers can be installed" ++#~ msgstr "꾸러미 %s는 %s가 필요하지만, 공급자가 없어 설치 할 수 없습니다" ++ ++#, c-format ++#~ msgid "package %s conflicts with %s provided by itself" ++#~ msgstr "꾸러미 %s가 자체적으로 제공된 %s와 충돌합니다" ++ ++#, c-format ++#~ msgid "both package %s and %s obsolete %s" ++#~ msgstr "꾸러미 %s 와 %s 는 모두 %s에서 폐기되었습니다" ++ ++#, c-format ++#~ msgid "module %s is disabled" ++#~ msgstr "모듈 %s를 사용할 수 없습니다" ++ ++#, c-format ++#~ msgid "module %s does not have a compatible architecture" ++#~ msgstr "모듈 %s 에 호환되는 구조가 없습니다" ++ ++#, c-format ++#~ msgid "module %s is not installable" ++#~ msgstr "모듈 %s 를 설치 할 수 없습니다" ++ ++#, c-format ++#~ msgid "nothing provides %s needed by module %s" ++#~ msgstr "모듈 %s 에 필요한 %s 가 제공되지 않았습니다" ++ ++#, c-format ++#~ msgid "cannot install both modules %s and %s" ++#~ msgstr "모듈 %s 와 %s를 모두 설치 할 수 없습니다" ++ ++#, c-format ++#~ msgid "module %s conflicts with %s provided by %s" ++#~ msgstr "모듈 %s가 %s에 의해 제공된 %s와 충돌합니다" ++ ++#, c-format ++#~ msgid "module %s obsoletes %s provided by %s" ++#~ msgstr "모듈 %s가 %s에 의해 제공된 %s를 폐기하였습니다" ++ ++#, c-format ++#~ msgid "installed module %s obsoletes %s provided by %s" ++#~ msgstr "설치된 모듈 %s 가 %s의해 제공된 %s를 폐기합니다" ++ ++#, c-format ++#~ msgid "module %s implicitly obsoletes %s provided by %s" ++#~ msgstr "모듈 %s가 %s 에 의해 %s를 암시적으로 폐기되었습니다" ++ ++#, c-format ++#~ msgid "module %s requires %s, but none of the providers can be installed" ++#~ msgstr "모듈 %s 에 %s 가 필요하지만 공급 업체가 없어 설치 할 수 없습니다" ++ ++#, c-format ++#~ msgid "module %s conflicts with %s provided by itself" ++#~ msgstr "모듈 %s가 자체적으로 제공된 %s와 충돌합니다" ++ ++#, c-format ++#~ msgid "both module %s and %s obsolete %s" ++#~ msgstr "모듈 %s와 %s가 %s에서 폐기되었습니다" ++ + #~ msgid "failed to add solv" + #~ msgstr "solv를 추가하지 못했습니다" + +@@ -1175,6 +1278,3 @@ msgstr "저장되지 않은 연결에 콘솔 출력을 추가 할 수 없습니 + + #~ msgid "write_ext(%1$d) has failed: %2$d" + #~ msgstr "write_ext(%1$d) 실패하였습니다: %2$d" +- +-#~ msgid "repo_add_repomdxml/rpmmd() has failed." +-#~ msgstr "repo_add_repomdxml/rpmmd() 실패하였습니다." +diff --git a/po/zh_CN.po b/po/zh_CN.po +index 3c800f87..bc6d1262 100644 +--- a/po/zh_CN.po ++++ b/po/zh_CN.po +@@ -6,11 +6,10 @@ msgid "" + msgstr "" + "Project-Id-Version: PACKAGE VERSION\n" + "Report-Msgid-Bugs-To: \n" +-"POT-Creation-Date: 2023-02-28 09:11+0100\n" ++"POT-Creation-Date: 2023-08-29 13:10+0200\n" + "PO-Revision-Date: 2022-09-06 07:19+0000\n" + "Last-Translator: Transtats \n" +-"Language-Team: Chinese (Simplified) \n" ++"Language-Team: Chinese (Simplified) \n" + "Language: zh_CN\n" + "MIME-Version: 1.0\n" + "Content-Type: text/plain; charset=UTF-8\n" +@@ -141,7 +140,8 @@ msgstr "无法解析参数 '%s'" + #: libdnf/dnf-context.cpp:3303 + #, c-format + msgid "" +-"Only module name is required. Ignoring unneeded information in argument: '%s'" ++"Only module name is required. Ignoring unneeded information in argument: " ++"'%s'" + msgstr "只需要模块名。忽略参数 '%s' 中的无用信息" + + #: libdnf/dnf-context.cpp:3317 +@@ -196,20 +196,17 @@ msgstr "模块禁用请求时出现问题" + #: libdnf/dnf-context.cpp:3633 + #, c-format + msgid "" +-"The operation would result in switching of module '%s' stream '%s' to stream " +-"'%s'" ++"The operation would result in switching of module '%s' stream '%s' to stream" ++" '%s'" + msgstr "这个操作会把模块 '%s' 从流 '%s' 切换到流 '%s'" + + #: libdnf/dnf-context.cpp:3637 + msgid "" + "It is not possible to switch enabled streams of a module.\n" +-"It is recommended to remove all installed content from the module, and reset " +-"the module using 'microdnf module reset ' command. After you " +-"reset the module, you can install the other stream." ++"It is recommended to remove all installed content from the module, and reset the module using 'microdnf module reset ' command. After you reset the module, you can install the other stream." + msgstr "" + "无法切换一个模块已启用的流。 \n" +-"推荐从模块中删除所有已安装的内容,使用 'microdnf module reset ' " +-"命令重置模块。在重置模块后就可以安装其他流。" ++"推荐从模块中删除所有已安装的内容,使用 'microdnf module reset ' 命令重置模块。在重置模块后就可以安装其他流。" + + #: libdnf/dnf-goal.cpp:85 + msgid "Could not depsolve transaction; " +@@ -348,7 +345,8 @@ msgstr "不能创建临时文件 %s" + #: libdnf/dnf-sack.cpp:667 + #, c-format + msgid "" +-"While writing extension cache %s (%d): repowriter write failed: %i, error: %s" ++"While writing extension cache %s (%d): repowriter write failed: %i, error: " ++"%s" + msgstr "编写扩展缓存 %s (%d) 时: repowriter 写失败: %i,错误: %s" + + #: libdnf/dnf-sack.cpp:677 +@@ -516,13 +514,15 @@ msgstr "Ill-formed Selector,在过滤器中有多个匹配的对象" + msgid "Ill-formed Selector used for the operation, incorrect comparison type" + msgstr "这个操作使用了 Ill-formed Selector,不正确的比较类型" + +-#: libdnf/goal/Goal.cpp:86 libdnf/goal/Goal.cpp:113 +-msgid " does not belong to a distupgrade repository" +-msgstr " 不属于 distupgrade 仓库" ++#: libdnf/goal/Goal.cpp:86 ++#, c-format ++msgid "%s from %s does not belong to a distupgrade repository" ++msgstr "来自 %s 的 %s 不属于 distupgrade 仓库" + +-#: libdnf/goal/Goal.cpp:87 libdnf/goal/Goal.cpp:114 +-msgid " has inferior architecture" +-msgstr " 有 inferior 架构" ++#: libdnf/goal/Goal.cpp:87 ++#, c-format ++msgid "%s from %s has inferior architecture" ++msgstr "来自 %s 的 %s 具有 inferior 架构" + + #: libdnf/goal/Goal.cpp:88 + msgid "problem with installed package " +@@ -563,68 +563,79 @@ msgstr "无法为该任务安装最佳候选" + + #: libdnf/goal/Goal.cpp:97 + #, c-format +-msgid "package %s is filtered out by modular filtering" +-msgstr "软件包 %s 被模块过滤过滤掉" ++msgid "package %s from %s is filtered out by modular filtering" ++msgstr "来自 %s 的 %s 被模块过滤过滤掉" + + #: libdnf/goal/Goal.cpp:98 + #, c-format +-msgid "package %s does not have a compatible architecture" +-msgstr "软件包 %s 没有兼容的架构" ++msgid "package %s from %s does not have a compatible architecture" ++msgstr "来自 %s 的软件包 %s 没有兼容的架构" + + #: libdnf/goal/Goal.cpp:99 + #, c-format +-msgid "package %s is not installable" +-msgstr "软件包 %s 不可安装" ++msgid "package %s from %s is not installable" ++msgstr "来自 %s 的软件包 %s 不可安装" + + #: libdnf/goal/Goal.cpp:100 + #, c-format +-msgid "package %s is filtered out by exclude filtering" +-msgstr "软件包 %s 被排除过滤过滤掉" ++msgid "package %s from %s is filtered out by exclude filtering" ++msgstr "来自 %s 的软件包 %s 被排除过滤过滤掉" + + #: libdnf/goal/Goal.cpp:101 + #, c-format +-msgid "nothing provides %s needed by %s" +-msgstr "没有提供 %s 所需要的 %s" ++msgid "nothing provides %s needed by %s from %s" ++msgstr "没有提供来自 %s 的 %s 所需的 %s" + + #: libdnf/goal/Goal.cpp:102 + #, c-format +-msgid "cannot install both %s and %s" +-msgstr "无法同时安装 %s 和 %s" ++msgid "cannot install both %s from %s and %s from %s" ++msgstr "不能同时安装来自 %s 的 %s 和来自 %s 的 %s" + + #: libdnf/goal/Goal.cpp:103 + #, c-format +-msgid "package %s conflicts with %s provided by %s" +-msgstr "软件包 %s 与 %s(由 %s 提供)冲突" ++msgid "package %s from %s conflicts with %s provided by %s from %s" ++msgstr "来自 %s 的软件包 %s 与来自 %s 的 %s 所提供的 %s 冲突" + + #: libdnf/goal/Goal.cpp:104 + #, c-format +-msgid "package %s obsoletes %s provided by %s" +-msgstr "软件包 %s 淘汰了 %s 提供的 %s" ++msgid "package %s from %s obsoletes %s provided by %s from %s" ++msgstr "来自 %s 的软件包 %s 淘汰了由来自 %s 的 %s 所提供的 %s" + + #: libdnf/goal/Goal.cpp:105 + #, c-format +-msgid "installed package %s obsoletes %s provided by %s" +-msgstr "已安装的软件包 %s 淘汰了 %s 提供的 %s" ++msgid "installed package %s obsoletes %s provided by %s from %s" ++msgstr "已安装的软件包 %s 淘汰了由来自 %s 的 %s 所提供的 %s" + + #: libdnf/goal/Goal.cpp:106 + #, c-format +-msgid "package %s implicitly obsoletes %s provided by %s" +-msgstr "软件包 %s 隐式地淘汰了 %s 提供的 %s" ++msgid "package %s from %s implicitly obsoletes %s provided by %s from %s" ++msgstr "来自 %s 的软件包 %s 隐式地淘汰了由来自 %s 的 %s 所提供的 %s" + + #: libdnf/goal/Goal.cpp:107 + #, c-format +-msgid "package %s requires %s, but none of the providers can be installed" +-msgstr "软件包 %s 需要 %s,但没有提供者可以被安装" ++msgid "" ++"package %s from %s requires %s, but none of the providers can be installed" ++msgstr "来自 %s 的软件包 %s 需要 %s,但没有可以被安装的提供程序" + + #: libdnf/goal/Goal.cpp:108 + #, c-format +-msgid "package %s conflicts with %s provided by itself" +-msgstr "软件包 %s 与自己提供的 %s 冲突" ++msgid "package %s from %s conflicts with %s provided by itself" ++msgstr "来自 %s 的软件包 %s 与来自自己提供的 %s 冲突" + + #: libdnf/goal/Goal.cpp:109 + #, c-format +-msgid "both package %s and %s obsolete %s" +-msgstr "软件包 %s 和 %s 同时取代了 %s" ++msgid "both package %s from %s and %s from %s obsolete %s" ++msgstr "来自 %s 的 %s 和来自 %s 的 %s 软件包都淘汰了 %s" ++ ++#: libdnf/goal/Goal.cpp:113 ++#, c-format ++msgid "%s from %s does not belong to a distupgrade repository" ++msgstr "来自 %s 的 %s 不属于 distupgrade 仓库" ++ ++#: libdnf/goal/Goal.cpp:114 ++#, c-format ++msgid "%s from %s has inferior architecture" ++msgstr "来自 %s 的 %s 具有 inferior 架构" + + #: libdnf/goal/Goal.cpp:115 + msgid "problem with installed module " +@@ -641,100 +652,101 @@ msgstr "无法为模块安装最佳更新候选 " + + #: libdnf/goal/Goal.cpp:124 libdnf/goal/Goal.cpp:127 + #, c-format +-msgid "module %s is disabled" +-msgstr "模块 %s 被禁用" ++msgid "module %s from %s is disabled" ++msgstr "来自 %s 的模块 %s 被禁用" + + #: libdnf/goal/Goal.cpp:125 + #, c-format +-msgid "module %s does not have a compatible architecture" +-msgstr "模块 %s 没有兼容的架构" ++msgid "module %s from %s does not have a compatible architecture" ++msgstr "来自 %s 的模块 %s 没有兼容的架构" + + #: libdnf/goal/Goal.cpp:126 + #, c-format +-msgid "module %s is not installable" +-msgstr "模块 %s 不可安装" ++msgid "module %s from %s is not installable" ++msgstr "来自 %s 的模块 %s 不可安装" + + #: libdnf/goal/Goal.cpp:128 + #, c-format +-msgid "nothing provides %s needed by module %s" +-msgstr "没有提供模块 %s 所需要的 %s" ++msgid "nothing provides %s needed by module %s from %s" ++msgstr "没有提供来自 %s 的模块 %s 所需要的 %s" + + #: libdnf/goal/Goal.cpp:129 + #, c-format +-msgid "cannot install both modules %s and %s" +-msgstr "不能同时安装模块 %s 和 %s" ++msgid "cannot install both modules %s from %s and %s from %s" ++msgstr "不能同时安装来自 %s 的 %s 和来自 %s 的 %s 模块" + + #: libdnf/goal/Goal.cpp:130 + #, c-format +-msgid "module %s conflicts with %s provided by %s" +-msgstr "模块 %s 与 %s 提供的 %s 冲突" ++msgid "module %s from %s conflicts with %s provided by %s from %s" ++msgstr "来自 %s 的模块 %s 与来自 %s 的 %s 所提供的 %s 冲突" + + #: libdnf/goal/Goal.cpp:131 + #, c-format +-msgid "module %s obsoletes %s provided by %s" +-msgstr "模块 %s 淘汰了 %s 提供的 %s" ++msgid "module %s from %s obsoletes %s provided by %s from %s" ++msgstr "来自 %s 的模块 %s 淘汰了由来自 %s 的 %s 所提供的 %s" + + #: libdnf/goal/Goal.cpp:132 + #, c-format +-msgid "installed module %s obsoletes %s provided by %s" +-msgstr "已安装的模块 %s 淘汰了 %s 提供的 %s" ++msgid "installed module %s obsoletes %s provided by %s from %s" ++msgstr "已安装的模块 %s 淘汰了由来自 %s 的 %s 所提供的 %s" + + #: libdnf/goal/Goal.cpp:133 + #, c-format +-msgid "module %s implicitly obsoletes %s provided by %s" +-msgstr "模块 %s 隐式地淘汰了 %s 提供的 %s" ++msgid "module %s from %s implicitly obsoletes %s provided by %s from %s" ++msgstr "来自 %s 的模块 %s 隐式地淘汰了由来自 %s 的 %s 所提供的 %s" + + #: libdnf/goal/Goal.cpp:134 + #, c-format +-msgid "module %s requires %s, but none of the providers can be installed" +-msgstr "模块 %s 需要 %s,但无法安装任何提供程序" ++msgid "" ++"module %s from %s requires %s, but none of the providers can be installed" ++msgstr "来自 %s 的模块 %s 需要 %s,但没有可以被安装的提供程序" + + #: libdnf/goal/Goal.cpp:135 + #, c-format +-msgid "module %s conflicts with %s provided by itself" +-msgstr "模块 %s 与自己提供的 %s 冲突" ++msgid "module %s from %s conflicts with %s provided by itself" ++msgstr "来自 %s 的模块 %s 与自己提供的 %s 冲突" + + #: libdnf/goal/Goal.cpp:136 + #, c-format +-msgid "both module %s and %s obsolete %s" +-msgstr "模块 %s 和 %s 同时取代了 %s" ++msgid "both module %s from %s and %s from %s obsolete %s" ++msgstr "来自 %s 的 %s 和来自 %s 的 %s 软件包都淘汰了 %s" + +-#: libdnf/goal/Goal.cpp:1051 ++#: libdnf/goal/Goal.cpp:1062 + msgid "no solver set" + msgstr "无 solver 设置" + +-#: libdnf/goal/Goal.cpp:1056 ++#: libdnf/goal/Goal.cpp:1067 + #, c-format + msgid "failed to make %s absolute" + msgstr "无法使 %s 绝对" + +-#: libdnf/goal/Goal.cpp:1063 ++#: libdnf/goal/Goal.cpp:1074 + #, c-format + msgid "failed writing debugdata to %1$s: %2$s" + msgstr "把 debugdata 写入到 %1$s 失败: %2$s" + +-#: libdnf/goal/Goal.cpp:1075 ++#: libdnf/goal/Goal.cpp:1086 + msgid "no solv in the goal" + msgstr "在目标中没有 solv" + +-#: libdnf/goal/Goal.cpp:1077 ++#: libdnf/goal/Goal.cpp:1088 + msgid "no solution, cannot remove protected package" + msgstr "没有解决方案,不能删除保护的软件包" + +-#: libdnf/goal/Goal.cpp:1080 ++#: libdnf/goal/Goal.cpp:1091 + msgid "no solution possible" + msgstr "没有可能的解决方案" + +-#: libdnf/goal/Goal.cpp:1206 ++#: libdnf/goal/Goal.cpp:1217 + msgid "Problem: " + msgstr "问题: " + +-#: libdnf/goal/Goal.cpp:1211 ++#: libdnf/goal/Goal.cpp:1222 + #, c-format + msgid "Problem %d: " + msgstr "问题 %d: " + +-#: libdnf/goal/Goal.cpp:1538 ++#: libdnf/goal/Goal.cpp:1549 + msgid "" + "The operation would result in removing the following protected packages: " + msgstr "这个操作将会导致删除以下受保护的软件包: " +@@ -796,61 +808,61 @@ msgstr "没有检测到有效的 Platform ID" + msgid "Cannot enable multiple streams for module '%s'" + msgstr "无法为模块 '%s' 启用多个流" + +-#: libdnf/module/ModulePackageContainer.cpp:295 ++#: libdnf/module/ModulePackageContainer.cpp:288 + #, c-format + msgid "Conflicting defaults with repo '%s': %s" + msgstr "默认设置与存储库 '%s' 冲突 : %s" + +-#: libdnf/module/ModulePackageContainer.cpp:841 ++#: libdnf/module/ModulePackageContainer.cpp:847 + msgid "Installing module profiles:\n" + msgstr "安装模块配置档案:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:856 ++#: libdnf/module/ModulePackageContainer.cpp:862 + msgid "Disabling module profiles:\n" + msgstr "禁用模块配置档案:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:871 ++#: libdnf/module/ModulePackageContainer.cpp:877 + msgid "Enabling module streams:\n" + msgstr "启用模块流:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:885 ++#: libdnf/module/ModulePackageContainer.cpp:891 + msgid "Switching module streams:\n" + msgstr "切换模块流:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:903 ++#: libdnf/module/ModulePackageContainer.cpp:909 + msgid "Disabling modules:\n" + msgstr "禁用模块:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:914 ++#: libdnf/module/ModulePackageContainer.cpp:920 + msgid "Resetting modules:\n" + msgstr "重置模块:\n" + +-#: libdnf/module/ModulePackageContainer.cpp:1638 ++#: libdnf/module/ModulePackageContainer.cpp:1644 + #, c-format + msgid "Unable to load modular Fail-Safe data at '%s'" + msgstr "无法加载位于 '%s' 的模块 Fail-Safe 数据" + +-#: libdnf/module/ModulePackageContainer.cpp:1644 ++#: libdnf/module/ModulePackageContainer.cpp:1650 + #, c-format + msgid "Unable to load modular Fail-Safe data for module '%s:%s'" + msgstr "无法为模块 '%s:%s' 加载模块 Fail-Safe 数据" + +-#: libdnf/module/ModulePackageContainer.cpp:1702 ++#: libdnf/module/ModulePackageContainer.cpp:1708 + #, c-format + msgid "Unable to create directory \"%s\" for modular Fail Safe data: %s" + msgstr "无法为模块 Fail Safe 数据创建目录 \"%s\" : %s" + +-#: libdnf/module/ModulePackageContainer.cpp:1718 ++#: libdnf/module/ModulePackageContainer.cpp:1724 + #, c-format + msgid "Unable to save a modular Fail Safe data to '%s'" + msgstr "无法把模块 Fail Safe 数据保存到 '%s'" + +-#: libdnf/module/ModulePackageContainer.cpp:1741 ++#: libdnf/module/ModulePackageContainer.cpp:1747 + #, c-format + msgid "Unable to remove a modular Fail Safe data in '%s'" + msgstr "无法删除 '%s' 中的模块 Fail Safe 数据" + +-#: libdnf/module/ModulePackageContainer.cpp:1773 ++#: libdnf/module/ModulePackageContainer.cpp:1779 + #, c-format + msgid "" + "Unable to apply modular obsoletes to '%s:%s' because target module '%s' is " +@@ -928,8 +940,8 @@ msgid "" + "deprecated and the support will be dropped in future versions. Use '=' " + "operator instead." + msgstr "" +-"在 reldeps 中使用 '==' 操作符可能导致一个未定义的行为。这个操作符已被废弃,并" +-"且在未来的版本中会取消对它的支持。请使用 '=' 操作符代替。" ++"在 reldeps 中使用 '==' 操作符可能导致一个未定义的行为。这个操作符已被废弃,并且在未来的版本中会取消对它的支持。请使用 '=' " ++"操作符代替。" + + #: libdnf/repo/Repo.cpp:321 + #, c-format +@@ -949,8 +961,8 @@ msgstr "存储库 '%s': 'basecachedir' 没有设置" + + #: libdnf/repo/Repo.cpp:512 + msgid "" +-"Maximum download speed is lower than minimum. Please change configuration of " +-"minrate or throttle" ++"Maximum download speed is lower than minimum. Please change configuration of" ++" minrate or throttle" + msgstr "最大下载速度低于最小值。请修改 minrate 或 throttle 的配置" + + #: libdnf/repo/Repo.cpp:546 +@@ -1147,6 +1159,112 @@ msgstr "TransactionItem 状态没有设置:%s" + msgid "Can't add console output to unsaved transaction" + msgstr "无法向未保存的事务中添加控制台输出" + ++#~ msgid " does not belong to a distupgrade repository" ++#~ msgstr " 不属于 distupgrade 仓库" ++ ++#~ msgid " has inferior architecture" ++#~ msgstr " 有 inferior 架构" ++ ++#, c-format ++#~ msgid "package %s is filtered out by modular filtering" ++#~ msgstr "软件包 %s 被模块过滤过滤掉" ++ ++#, c-format ++#~ msgid "package %s does not have a compatible architecture" ++#~ msgstr "软件包 %s 没有兼容的架构" ++ ++#, c-format ++#~ msgid "package %s is not installable" ++#~ msgstr "软件包 %s 不可安装" ++ ++#, c-format ++#~ msgid "package %s is filtered out by exclude filtering" ++#~ msgstr "软件包 %s 被排除过滤过滤掉" ++ ++#, c-format ++#~ msgid "nothing provides %s needed by %s" ++#~ msgstr "没有提供 %s 所需要的 %s" ++ ++#, c-format ++#~ msgid "cannot install both %s and %s" ++#~ msgstr "无法同时安装 %s 和 %s" ++ ++#, c-format ++#~ msgid "package %s conflicts with %s provided by %s" ++#~ msgstr "软件包 %s 与 %s(由 %s 提供)冲突" ++ ++#, c-format ++#~ msgid "package %s obsoletes %s provided by %s" ++#~ msgstr "软件包 %s 淘汰了 %s 提供的 %s" ++ ++#, c-format ++#~ msgid "installed package %s obsoletes %s provided by %s" ++#~ msgstr "已安装的软件包 %s 淘汰了 %s 提供的 %s" ++ ++#, c-format ++#~ msgid "package %s implicitly obsoletes %s provided by %s" ++#~ msgstr "软件包 %s 隐式地淘汰了 %s 提供的 %s" ++ ++#, c-format ++#~ msgid "package %s requires %s, but none of the providers can be installed" ++#~ msgstr "软件包 %s 需要 %s,但没有提供者可以被安装" ++ ++#, c-format ++#~ msgid "package %s conflicts with %s provided by itself" ++#~ msgstr "软件包 %s 与自己提供的 %s 冲突" ++ ++#, c-format ++#~ msgid "both package %s and %s obsolete %s" ++#~ msgstr "软件包 %s 和 %s 同时取代了 %s" ++ ++#, c-format ++#~ msgid "module %s is disabled" ++#~ msgstr "模块 %s 被禁用" ++ ++#, c-format ++#~ msgid "module %s does not have a compatible architecture" ++#~ msgstr "模块 %s 没有兼容的架构" ++ ++#, c-format ++#~ msgid "module %s is not installable" ++#~ msgstr "模块 %s 不可安装" ++ ++#, c-format ++#~ msgid "nothing provides %s needed by module %s" ++#~ msgstr "没有提供模块 %s 所需要的 %s" ++ ++#, c-format ++#~ msgid "cannot install both modules %s and %s" ++#~ msgstr "不能同时安装模块 %s 和 %s" ++ ++#, c-format ++#~ msgid "module %s conflicts with %s provided by %s" ++#~ msgstr "模块 %s 与 %s 提供的 %s 冲突" ++ ++#, c-format ++#~ msgid "module %s obsoletes %s provided by %s" ++#~ msgstr "模块 %s 淘汰了 %s 提供的 %s" ++ ++#, c-format ++#~ msgid "installed module %s obsoletes %s provided by %s" ++#~ msgstr "已安装的模块 %s 淘汰了 %s 提供的 %s" ++ ++#, c-format ++#~ msgid "module %s implicitly obsoletes %s provided by %s" ++#~ msgstr "模块 %s 隐式地淘汰了 %s 提供的 %s" ++ ++#, c-format ++#~ msgid "module %s requires %s, but none of the providers can be installed" ++#~ msgstr "模块 %s 需要 %s,但无法安装任何提供程序" ++ ++#, c-format ++#~ msgid "module %s conflicts with %s provided by itself" ++#~ msgstr "模块 %s 与自己提供的 %s 冲突" ++ ++#, c-format ++#~ msgid "both module %s and %s obsolete %s" ++#~ msgstr "模块 %s 和 %s 同时取代了 %s" ++ + #~ msgid "failed to add solv" + #~ msgstr "添加 solv 失败" + +@@ -1161,6 +1279,3 @@ msgstr "无法向未保存的事务中添加控制台输出" + + #~ msgid "repo_add_repomdxml/rpmmd() has failed." + #~ msgstr "repo_add_repomdxml/rpmmd() 已失败。" +- +-#~ msgid "Bad id for repo: %s, byte = %s %d" +-#~ msgstr "repo 的 id 无效: %s, byte = %s %d" +-- +2.41.0 + diff --git a/SOURCES/0047-filterAdvisory-installed_solvables-sort-RhBug2212838.patch b/SOURCES/0047-filterAdvisory-installed_solvables-sort-RhBug2212838.patch new file mode 100644 index 0000000..f4a3d4a --- /dev/null +++ b/SOURCES/0047-filterAdvisory-installed_solvables-sort-RhBug2212838.patch @@ -0,0 +1,37 @@ +From d138dbf60588b73a8ee9499540c82a8950ba9432 Mon Sep 17 00:00:00 2001 +From: Aleš Matěj +Date: Tue, 27 Jun 2023 07:24:28 +0200 +Subject: [PATCH] filterAdvisory: match installed_solvables sort with lower_bound (RhBug:2212838) + +`std::lower_bound` expects that the range it operates on is sorted by +the provided comparator. + +`lower_bound()` is used on `installed_solvables` twice, first with +comparator `NameSolvableComparator` and later with +`SolvableCompareAdvisoryPkgNameArch` to cover both we need to sort +`installed_solvables` by name and arch. + +Otherwise this can lead to problems if multiple architectures of a pkg +are installed. + +For: https://bugzilla.redhat.com/show_bug.cgi?id=2212838 +--- + libdnf/sack/query.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libdnf/sack/query.cpp b/libdnf/sack/query.cpp +index b7b1560..7937770 100644 +--- a/libdnf/sack/query.cpp ++++ b/libdnf/sack/query.cpp +@@ -1903,7 +1903,7 @@ Query::Impl::filterAdvisory(const Filter & f, Map *m, int keyname) + while ((installed_id = installed.pImpl->result->next(installed_id)) != -1) { + installed_solvables.push_back(pool_id2solvable(pool, installed_id)); + } +- std::sort(installed_solvables.begin(), installed_solvables.end(), NameSolvableComparator); ++ std::sort(installed_solvables.begin(), installed_solvables.end(), NameArchSolvableComparator); + + Query obsoletes(sack, ExcludeFlags::IGNORE_EXCLUDES); + obsoletes.addFilter(HY_PKG, HY_EQ, resultPset); +-- +libgit2 1.6.4 + diff --git a/SOURCES/0048-Avoid-reinstal-installonly-packages-marked-for-ERASE.patch b/SOURCES/0048-Avoid-reinstal-installonly-packages-marked-for-ERASE.patch new file mode 100644 index 0000000..520da71 --- /dev/null +++ b/SOURCES/0048-Avoid-reinstal-installonly-packages-marked-for-ERASE.patch @@ -0,0 +1,99 @@ +From c32ce1071807176eb31d884d4185b20d944a28b9 Mon Sep 17 00:00:00 2001 +From: Aleš Matěj +Date: Mon, 25 Sep 2023 08:24:40 +0200 +Subject: [PATCH] Avoid reinstalling installonly packages marked for ERASE + +Without this patch reinstalling installonly pkg marked for ERASE might +be a valid smallest solution to our job. + +For example when user wants to install through a provide we select all +packages that provide it and put them inside a `job install oneof ...` +if one of the providers is also marked for ERASE due to installonly +limit libsolv might decide to reinstall it. + +To make sure it doesn't happen mark the available package also as ERASE. + +https://github.com/openSUSE/libsolv/issues/540 + +https://issues.redhat.com/browse/RHEL-1253 +(https://bugzilla.redhat.com/show_bug.cgi?id=2163474) +--- + libdnf/goal/Goal.cpp | 35 +++++++++++++++++++++++++++++++++-- + 1 file changed, 33 insertions(+), 2 deletions(-) + +diff --git a/libdnf/goal/Goal.cpp b/libdnf/goal/Goal.cpp +index b771030..6939d8a 100644 +--- a/libdnf/goal/Goal.cpp ++++ b/libdnf/goal/Goal.cpp +@@ -639,6 +639,12 @@ erase_flags2libsolv(int flags) + return ret; + } + ++static bool ++NameSolvableComparator(const Solvable * first, const Solvable * second) ++{ ++ return first->name < second->name; ++} ++ + Goal::Goal(const Goal & goal_src) : pImpl(new Impl(*goal_src.pImpl)) {} + + Goal::Impl::Impl(const Goal::Impl & goal_src) +@@ -1324,10 +1330,24 @@ Goal::Impl::limitInstallonlyPackages(Solver *solv, Queue *job) + for (int i = 0; i < onlies->count; ++i) { + Id p, pp; + IdQueue q, installing; ++ std::vector available_unused_providers; + ++ // Add all providers of installonly provides that are marked for install ++ // to `q` IdQueue those that are not marked for install and are not already ++ // installed are added to available_unused_providers. + FOR_PKG_PROVIDES(p, pp, onlies->elements[i]) +- if (solver_get_decisionlevel(solv, p) > 0) ++ // According to libsolv-bindings the decision level is positive for installs ++ // and negative for conflicts (conflicts with another package or dependency ++ // conflicts = dependencies cannot be met). ++ if (solver_get_decisionlevel(solv, p) > 0) { + q.pushBack(p); ++ } else { ++ Solvable *s = pool_id2solvable(pool, p); ++ if (s->repo != pool->installed) { ++ available_unused_providers.push_back(s); ++ } ++ } ++ + if (q.size() <= (int) dnf_sack_get_installonly_limit(sack)) { + continue; + } +@@ -1345,17 +1365,28 @@ Goal::Impl::limitInstallonlyPackages(Solver *solv, Queue *job) + + struct InstallonliesSortCallback s_cb = {pool, dnf_sack_running_kernel(sack)}; + solv_sort(q.data(), q.size(), sizeof(q[0]), sort_packages, &s_cb); ++ std::sort(available_unused_providers.begin(), available_unused_providers.end(), NameSolvableComparator); + IdQueue same_names; + while (q.size() > 0) { + same_name_subqueue(pool, q.getQueue(), same_names.getQueue()); + if (same_names.size() <= (int) dnf_sack_get_installonly_limit(sack)) + continue; + reresolve = 1; + for (int j = 0; j < same_names.size(); ++j) { + Id id = same_names[j]; + Id action = SOLVER_ERASE; +- if (j < (int) dnf_sack_get_installonly_limit(sack)) ++ if (j < (int) dnf_sack_get_installonly_limit(sack)) { + action = SOLVER_INSTALL; ++ } else { ++ // We want to avoid reinstalling packages marked for ERASE, therefore ++ // if some unused provider is also available we need to mark it ERASE as well. ++ Solvable *s = pool_id2solvable(pool, id); ++ auto low = std::lower_bound(available_unused_providers.begin(), available_unused_providers.end(), s, NameSolvableComparator); ++ while (low != available_unused_providers.end() && (*low)->name == s->name) { ++ queue_push2(job, SOLVER_ERASE | SOLVER_SOLVABLE, pool_solvable2id(pool, *low)); ++ ++low; ++ } ++ } + queue_push2(job, action | SOLVER_SOLVABLE, id); + } + } +-- +libgit2 1.6.4 + diff --git a/SOURCES/0049-PGP-Set-a-default-creation-SELinux-labels-on-GnuPG-d.patch b/SOURCES/0049-PGP-Set-a-default-creation-SELinux-labels-on-GnuPG-d.patch new file mode 100644 index 0000000..8c11b8b --- /dev/null +++ b/SOURCES/0049-PGP-Set-a-default-creation-SELinux-labels-on-GnuPG-d.patch @@ -0,0 +1,335 @@ +From 8752006f5f9c11bca3f04c99b463fd167caf0ddd Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= +Date: Wed, 4 Oct 2023 16:38:12 +0200 +Subject: [PATCH] PGP: Set a default creation SELinux labels on GnuPG + directories +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +libdnf used to precreate the directory in /run/user to make sure +a GnuPG agent executed by GPGME library places its socket there. + +The directories there are normally created and removed by systemd +(logind PAM session). libdnf created them for a case when a package +manager is invoked out of systemd session, before the super user logs +in. E.g. by a timer job to cache repository metadata. + +A problem was when this out-of-session process was a SELinux-confined +process creating files with its own SELinux label different from a DNF +program. Then the directory was created with a SELinux label different +from the one expected by systemd and when logging out a corresponding +user, the mismatching label clashed with systemd. + +The same issue was with temporary GnuPG home directories created by +libdnf under /tmp. + +This patch fixes both the isseus by restoring a SELinux label of those +directories to the label defined in a default SELinux file context +database. + +Obviously the database cannot have a record for a nonspecific +/tmp/tmpdir.XXXXXX (a mkdtemp() template) directory names. Therefore +I changed their names to more specific /tmp/libdnf.XXXXXX. Once +a SELinux policy updates the database, directories under /tmp will get +a correct label. + +There is yet another problem with accessing /var/cache/dnf/*/pubring, +but that seems to be pure SELinux policy problem. + +This patch adds a new -DENABLE_SELINUX=OFF CMake option to disable the +new dependency on libselinux. A default behavior is to support SELinux. + +Implementation details: + +I used selabel_lookup() + setfscreatecon() + mkdtemp() ++ setfscreatecon() sequence instead of mkdtemp() ++ selinux_restorecon() sequence because the later polutes stderr if +a SELinux policy does not define the default context. One could +supress stderr messages with selinux_set_callback(), but its effect +cannot be restored. + +I also kept the sequence in one function and reused it for creating +/run/user/$PID directories because the code is simpler than spliting +the function into three parts. + +https://issues.redhat.com/browse/RHEL-6421 +Signed-off-by: Petr Písař +--- + CMakeLists.txt | 7 +++ + libdnf.spec | 11 +++- + libdnf/CMakeLists.txt | 4 ++ + libdnf/repo/Repo.cpp | 121 +++++++++++++++++++++++++++++++++++++----- + 4 files changed, 129 insertions(+), 14 deletions(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index d895b2bf..e5829e6a 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -34,6 +34,7 @@ option(WITH_MAN "Enables hawkey man page generation" ON) + option(WITH_ZCHUNK "Build with zchunk support" ON) + option(ENABLE_RHSM_SUPPORT "Build with Red Hat Subscription Manager support?" OFF) + option(ENABLE_SOLV_URPMREORDER "Build with support for URPM-like solution reordering?" OFF) ++option(ENABLE_SELINUX "Restore SELinux labels on GnuPG directories" ON) + + + # build options - debugging +@@ -83,6 +84,12 @@ if(ENABLE_RHSM_SUPPORT) + include_directories(${RHSM_INCLUDE_DIRS}) + endif() + ++if(ENABLE_SELINUX) ++ pkg_check_modules(SELINUX REQUIRED libselinux) ++ include_directories(${SELINUX_INCLUDE_DIRS}) ++ add_definitions(-DENABLE_SELINUX=1) ++endif() ++ + + # glibc: check if fnmatch.h has FNM_CASEFOLD symbol + include(CheckSymbolExists) +diff --git a/libdnf.spec b/libdnf.spec +index aa51dd28..df482f54 100644 +--- a/libdnf.spec ++++ b/libdnf.spec +@@ -42,6 +42,8 @@ + %bcond_with rhsm + %endif + ++%bcond_without selinux ++ + %if 0%{?rhel} + %bcond_with zchunk + %else +@@ -84,6 +86,9 @@ BuildRequires: pkgconfig(sqlite3) + BuildRequires: pkgconfig(json-c) + BuildRequires: pkgconfig(cppunit) + BuildRequires: pkgconfig(libcrypto) ++%if %{with selinux} ++BuildRequires: pkgconfig(libselinux) ++%endif + BuildRequires: pkgconfig(modulemd-2.0) >= %{libmodulemd_version} + BuildRequires: pkgconfig(smartcols) + BuildRequires: gettext +@@ -205,7 +210,8 @@ pushd build-py2 + %define __builddir build-py2 + %endif + %cmake -DPYTHON_DESIRED:FILEPATH=%{__python2} -DWITH_MAN=OFF ../ %{!?with_zchunk:-DWITH_ZCHUNK=OFF} %{!?with_valgrind:-DDISABLE_VALGRIND=1} %{_cmake_opts} -DLIBDNF_MAJOR_VERSION=%{libdnf_major_version} -DLIBDNF_MINOR_VERSION=%{libdnf_minor_version} -DLIBDNF_MICRO_VERSION=%{libdnf_micro_version} \ +- -DWITH_SANITIZERS=%{?with_sanitizers:ON}%{!?with_sanitizers:OFF} ++ -DWITH_SANITIZERS=%{?with_sanitizers:ON}%{!?with_sanitizers:OFF} \ ++ -DENABLE_SELINUX=%{?with_selinux:ON}%{!?with_selinux:OFF} + %make_build + popd + %endif +@@ -219,7 +225,8 @@ pushd build-py3 + %define __builddir build-py3 + %endif + %cmake -DPYTHON_DESIRED:FILEPATH=%{__python3} -DWITH_GIR=0 -DWITH_MAN=0 -Dgtkdoc=0 ../ %{!?with_zchunk:-DWITH_ZCHUNK=OFF} %{!?with_valgrind:-DDISABLE_VALGRIND=1} %{_cmake_opts} -DLIBDNF_MAJOR_VERSION=%{libdnf_major_version} -DLIBDNF_MINOR_VERSION=%{libdnf_minor_version} -DLIBDNF_MICRO_VERSION=%{libdnf_micro_version} \ +- -DWITH_SANITIZERS=%{?with_sanitizers:ON}%{!?with_sanitizers:OFF} ++ -DWITH_SANITIZERS=%{?with_sanitizers:ON}%{!?with_sanitizers:OFF} \ ++ -DENABLE_SELINUX=%{?with_selinux:ON}%{!?with_selinux:OFF} + %make_build + popd + %endif +diff --git a/libdnf/CMakeLists.txt b/libdnf/CMakeLists.txt +index 998a6f94..10b15230 100644 +--- a/libdnf/CMakeLists.txt ++++ b/libdnf/CMakeLists.txt +@@ -89,6 +89,10 @@ if(ENABLE_RHSM_SUPPORT) + target_link_libraries(libdnf ${RHSM_LIBRARIES}) + endif() + ++if(ENABLE_SELINUX) ++ target_link_libraries(libdnf ${SELINUX_LIBRARIES}) ++endif() ++ + set(DNF_SO_VERSION 2) + set_target_properties(libdnf PROPERTIES OUTPUT_NAME "dnf") + set_target_properties(libdnf PROPERTIES SOVERSION ${DNF_SO_VERSION}) +diff --git a/libdnf/repo/Repo.cpp b/libdnf/repo/Repo.cpp +index d61a24a5..68b82ccc 100644 +--- a/libdnf/repo/Repo.cpp ++++ b/libdnf/repo/Repo.cpp +@@ -51,6 +51,11 @@ + + #include + ++#if ENABLE_SELINUX ++#include ++#include ++#endif ++ + #include + #include + #include +@@ -649,6 +654,78 @@ std::unique_ptr Repo::Impl::lrHandleInitRemote(const char *destdir) + return h; + } + ++/* ++ * @brief Create a temporary directory. ++ * ++ * Creates a temporary directory with 0700 mode attempting to set a proper ++ * SELinux file context. Encountered errors are logged at debug level to ++ * a global logger. ++ * ++ * @param name_template As an input value it is a template according to ++ * mkdtemp(3). As an output value it will contain the created directory name. ++ * ++ * @return 0 if the directory was created, -1 if it wasn't. SELinux failures ++ * are not considered an error. ++ */ ++static int create_temporary_directory(char *name_template) { ++ auto logger(Log::getLogger()); ++ int retval = 0; ++#if ENABLE_SELINUX ++ char *old_default_context = NULL; ++ char *new_default_context = NULL; ++ int old_default_context_was_retrieved= 0; ++ struct selabel_handle *labeling_handle = NULL; ++ ++ /* A purpose of this piece of code is to deal with applications whose ++ * security policy overrides a file context for temporary files but don't ++ * know that libdnf executes GnuPG which expects a default file context. */ ++ if (0 == getfscreatecon(&old_default_context)) { ++ old_default_context_was_retrieved = 1; ++ } else { ++ logger->debug(tfm::format("Failed to retrieve a default SELinux context")); ++ } ++ ++ labeling_handle = selabel_open(SELABEL_CTX_FILE, NULL, 0); ++ if (NULL == labeling_handle) { ++ logger->debug(tfm::format("Failed to open a SELinux labeling handle: %s", ++ strerror(errno))); ++ } else { ++ if (selabel_lookup(labeling_handle, &new_default_context, name_template, 0700)) { ++ /* Here we could hard-code "system_u:object_r:user_tmp_t:s0", but ++ * that value should be really defined in default file context ++ * SELinux policy. Only log that the policy is incpomplete. */ ++ logger->debug(tfm::format("Failed to look up a default SELinux label for \"%s\"", ++ name_template)); ++ } else { ++ if (setfscreatecon(new_default_context)) { ++ logger->debug(tfm::format("Failed to set default SELinux context to \"%s\"", ++ new_default_context)); ++ } ++ freecon(new_default_context); ++ } ++ selabel_close(labeling_handle); ++ } ++#endif ++ ++ /* mkdtemp() assures 0700 mode. */ ++ if (NULL == mkdtemp(name_template)) { ++ logger->debug(tfm::format("Failed to create a directory \"%s\": %s", ++ name_template, strerror(errno))); ++ retval = -1; ++ } ++ ++#if ENABLE_SELINUX ++ if (old_default_context_was_retrieved) { ++ if (setfscreatecon(old_default_context)) { ++ logger->debug(tfm::format("Failed to restore a default SELinux context")); ++ } ++ } ++ freecon(old_default_context); ++#endif ++ ++ return retval; ++} ++ + static void gpgImportKey(gpgme_ctx_t context, int keyFd) + { + auto logger(Log::getLogger()); +@@ -703,8 +780,8 @@ static std::vector rawkey2infos(int fd) { + std::unique_ptr::type> context(ctx); + + // set GPG home dir +- char tmpdir[] = "/tmp/tmpdir.XXXXXX"; +- mkdtemp(tmpdir); ++ char tmpdir[] = "/tmp/libdnf.XXXXXX"; ++ create_temporary_directory(tmpdir); + Finalizer tmpDirRemover([&tmpdir](){ + dnf_remove_recursive(tmpdir, NULL); + }); +@@ -853,6 +930,13 @@ std::vector Repo::Impl::retrieve(const std::string & url) + * would cause a race condition with calling gpgme_release(), see [2], [3], + * [4]. + * ++ * Current solution precreating /run/user/$UID showed problematic when this ++ * library was used out of a systemd-logind session from a programm with an ++ * unexpected SELinux context. Then /run/user/$UID, normally maintained by ++ * systemd, was assigned a SELinux label unexpected by systemd causing errors ++ * on a user logout [5]. We remedy it by restoring the label according to ++ * a file context policy. ++ * + * Since the agent doesn't clean up its sockets properly, by creating this + * directory we make sure they are in a place that is not causing trouble with + * container images. +@@ -861,14 +945,27 @@ std::vector Repo::Impl::retrieve(const std::string & url) + * [2] https://bugzilla.redhat.com/show_bug.cgi?id=1769831 + * [3] https://github.com/rpm-software-management/microdnf/issues/50 + * [4] https://bugzilla.redhat.com/show_bug.cgi?id=1781601 ++ * [5] https://issues.redhat.com/browse/RHEL-6421 + */ + static void ensure_socket_dir_exists() { + auto logger(Log::getLogger()); ++ char tmpdir[] = "/run/user/libdnf.XXXXXX"; + std::string dirname = "/run/user/" + std::to_string(getuid()); +- int res = mkdir(dirname.c_str(), 0700); +- if (res != 0 && errno != EEXIST) { +- logger->debug(tfm::format("Failed to create directory \"%s\": %d - %s", +- dirname, errno, strerror(errno))); ++ ++ /* create_temporary_directory() assures 0700 mode and tries its best to ++ * correct a SELinux label. */ ++ if (create_temporary_directory(tmpdir)) { ++ return; ++ } ++ ++ /* Set the desired name. */ ++ if (rename(tmpdir, dirname.c_str())) { ++ if (errno != EEXIST && errno != ENOTEMPTY && errno != EBUSY) { ++ logger->debug(tfm::format("Failed to rename \"%s\" directory to \"%s\": %s", ++ tmpdir, dirname, strerror(errno))); ++ } ++ rmdir(tmpdir); ++ return; + } + } + +@@ -1151,8 +1248,8 @@ void Repo::Impl::addCountmeFlag(LrHandle *handle) { + bool Repo::Impl::isMetalinkInSync() + { + auto logger(Log::getLogger()); +- char tmpdir[] = "/tmp/tmpdir.XXXXXX"; +- mkdtemp(tmpdir); ++ char tmpdir[] = "/tmp/libdnf.XXXXXX"; ++ create_temporary_directory(tmpdir); + Finalizer tmpDirRemover([&tmpdir](){ + dnf_remove_recursive(tmpdir, NULL); + }); +@@ -1221,8 +1318,8 @@ bool Repo::Impl::isRepomdInSync() + { + auto logger(Log::getLogger()); + LrYumRepo *yum_repo; +- char tmpdir[] = "/tmp/tmpdir.XXXXXX"; +- mkdtemp(tmpdir); ++ char tmpdir[] = "/tmp/libdnf.XXXXXX"; ++ create_temporary_directory(tmpdir); + Finalizer tmpDirRemover([&tmpdir](){ + dnf_remove_recursive(tmpdir, NULL); + }); +@@ -1260,8 +1357,8 @@ void Repo::Impl::fetch(const std::string & destdir, std::unique_ptr && + throw RepoError(tfm::format(_("Cannot create repo destination directory \"%s\": %s"), + destdir, errTxt)); + } +- auto tmpdir = destdir + "/tmpdir.XXXXXX"; +- if (!mkdtemp(&tmpdir.front())) { ++ auto tmpdir = destdir + "/libdnf.XXXXXX"; ++ if (create_temporary_directory(&tmpdir.front())) { + const char * errTxt = strerror(errno); + throw RepoError(tfm::format(_("Cannot create repo temporary directory \"%s\": %s"), + tmpdir.c_str(), errTxt)); +-- +2.41.0 + diff --git a/SPECS/libdnf.spec b/SPECS/libdnf.spec new file mode 100644 index 0000000..1ff6026 --- /dev/null +++ b/SPECS/libdnf.spec @@ -0,0 +1,909 @@ +%global libsolv_version 0.7.20-3 +%global libmodulemd_version 2.11.2-2 +%global librepo_version 1.13.1 +%global dnf_conflict 4.3.0 +%global swig_version 3.0.12 +%global libdnf_major_version 0 +%global libdnf_minor_version 63 +%global libdnf_micro_version 0 + +%define __cmake_in_source_build 1 + +# set sphinx package name according to distro +%global requires_python2_sphinx python2-sphinx +%global requires_python3_sphinx python3-sphinx +%if 0%{?rhel} == 7 + %global requires_python2_sphinx python-sphinx +%endif +%if 0%{?suse_version} + %global requires_python2_sphinx python2-Sphinx + %global requires_python3_sphinx python3-Sphinx +%endif + +%bcond_with valgrind + +# Do not build bindings for python3 for RHEL <= 7 +%if 0%{?rhel} && 0%{?rhel} <= 7 +%bcond_with python3 +%else +%bcond_without python3 +%endif + +%if 0%{?rhel} > 7 || 0%{?fedora} > 29 +# Disable python2 build by default +%bcond_with python2 +%else +%bcond_without python2 +%endif + +%if 0%{?rhel} && ! 0%{?centos} +%bcond_without rhsm +%else +%bcond_with rhsm +%endif + +%bcond_without selinux + +%if 0%{?rhel} +%bcond_with zchunk +%else +%bcond_without zchunk +%endif + +%bcond_with sanitizers + +%global _cmake_opts \\\ + -DENABLE_RHSM_SUPPORT=%{?with_rhsm:ON}%{!?with_rhsm:OFF} \\\ + %{nil} + +Name: libdnf +Version: %{libdnf_major_version}.%{libdnf_minor_version}.%{libdnf_micro_version} +Release: 19%{?dist} +Summary: Library providing simplified C and Python API to libsolv +License: LGPLv2+ +URL: https://github.com/rpm-software-management/libdnf +Source0: %{url}/archive/%{version}/%{name}-%{version}.tar.gz +Patch1: 0001-Revert-Improve-performance-for-module-query.patch +Patch2: 0002-Revert-Enhance-description-of-modular-solvables.patch +Patch3: 0003-Revert-Fix-typo-lates-latest.patch +Patch4: 0004-Revert-Remove-unused-code-bump-version.patch +Patch5: 0005-Revert-Report-a-new-type-of-the-module-resolve-error.patch +Patch6: 0006-Revert-Add-additional-fallback-for-module-resolve.patch +Patch7: 0007-Revert-Decide-how-to-handle-context-according-to-sta.patch +Patch8: 0008-Revert-Fix-load-update-FailSafe.patch +Patch9: 0009-Revert-Change-mechanism-of-module-conflicts.patch +Patch10: 0010-Revert-Call-addVersion2Modules-as-late-as-possible.patch +Patch11: 0011-Revert-Fix-modular-queries-with-the-new-solver.patch +Patch12: 0012-Revert-Add-compatible-layer-for-MdDocuments-v2.patch +Patch13: 0013-Revert-Add-an-alternative-constructor-for-ModulePack.patch +Patch14: 0014-Revert-Adjust-modular-solver-to-new-context-type.patch +Patch15: 0015-Revert-Change-usage-of-context-and-version-in-modula.patch +Patch16: 0016-Fix-failing-unittest-caused-by-the-revert-of-new-mod.patch +Patch17: 0017-Modify-unit-test-after-change-of-handling-advisories.patch +Patch18: 0018-Adjust-module-error-formatting-function-for-original.patch +Patch19: 0019-Remove-redundant-test.patch +Patch20: 0020-Fix-dnf_context_module_install-memory-leaks.patch +Patch21: 0021-covscan-remove-unused-vars-mark-private-func-static-return-values.patch +Patch22: 0022-hawkey-surrogateescape-error-handler-to-decode-UTF-8-strings-RhBug1893176.patch +Patch23: 0023-Turn-off-strict-validation-of-modulemd-documents-RhBug200485320071662007167.patch +Patch24: 0024-Add-unittest-for-setting-up-repo-with-empty-keyfile-RhBug1994614.patch +Patch25: 0025-Add-getLatestModules.patch +Patch26: 0026-context-Substitute-all-repository-config-options-RhB.patch +Patch27: 0027-Use-environment-variable-in-unittest-instead-of-ugly.patch +Patch28: 0028-Add-private-API-for-filling-reading-and-verifying-ne.patch +Patch29: 0029-Use-dnf-solv-userdata-to-check-versions-and-checksum.patch +Patch30: 0030-Update-unittest-to-test-the-new-private-dnf-solvfile.patch +Patch31: 0031-Increase-required-libsolv-version-for-cache-versioni.patch +Patch32: 0032-Add-more-specific-error-handling-for-loading-repomd-.patch +Patch33: 0033-libdnf-transaction-RPMItem-Fix-handling-transaction-.patch +Patch34: 0034-libdnf-transaction-TransactionItem-Set-short-action-.patch +Patch35: 0035-Do-not-print-errors-on-failovermethod-repo-option-Rh.patch +Patch36: 0036-sack-query.hpp-Add-a-missing-include.patch +Patch37: 0037-context-dnf_context_remove-accepts-package-spec-as-d.patch +Patch38: 0038-context-Fix-doc-dnf_context_install-remove-update-di.patch +Patch39: 0039-advisory-upgrade-filter-out-advPkgs-with-different-a.patch +Patch40: 0040-Add-obsoletes-to-filtering-for-advisory-candidates.patch +Patch41: 0041-Fix-listing-a-repository-without-cpeid-RhBug-2066334.patch +Patch42: 0042-Allow-change-of-arch-during-security-updates-with-no.patch +Patch43: 0043-Update-translations.patch +Patch44: 0044-Add_repoid_to_solver_error_messagase.patch +Patch45: 0045-conf-Support-proxy-_none_-in-main-config-RhBug-21557.patch +Patch46: 0046-Update-translations-RHEL-8.9.patch +Patch47: 0047-filterAdvisory-installed_solvables-sort-RhBug2212838.patch +Patch48: 0048-Avoid-reinstal-installonly-packages-marked-for-ERASE.patch +Patch49: 0049-PGP-Set-a-default-creation-SELinux-labels-on-GnuPG-d.patch + + +BuildRequires: cmake +BuildRequires: gcc +BuildRequires: gcc-c++ +BuildRequires: libsolv-devel >= %{libsolv_version} +BuildRequires: pkgconfig(librepo) >= %{librepo_version} +BuildRequires: pkgconfig(check) +%if %{with valgrind} +BuildRequires: valgrind +%endif +BuildRequires: pkgconfig(gio-unix-2.0) >= 2.46.0 +BuildRequires: pkgconfig(gtk-doc) +BuildRequires: rpm-devel >= 4.11.0 +%if %{with rhsm} +BuildRequires: pkgconfig(librhsm) >= 0.0.3 +%endif +%if %{with zchunk} +BuildRequires: pkgconfig(zck) >= 0.9.11 +%endif +BuildRequires: pkgconfig(sqlite3) +BuildRequires: pkgconfig(json-c) +BuildRequires: pkgconfig(cppunit) +BuildRequires: pkgconfig(libcrypto) +%if %{with selinux} +BuildRequires: pkgconfig(libselinux) +%endif +BuildRequires: pkgconfig(modulemd-2.0) >= %{libmodulemd_version} +BuildRequires: pkgconfig(smartcols) +BuildRequires: gettext +BuildRequires: gpgme-devel + +%if %{with sanitizers} +BuildRequires: libasan +BuildRequires: liblsan +BuildRequires: libubsan +%endif + +Requires: libmodulemd%{?_isa} >= %{libmodulemd_version} +Requires: libsolv%{?_isa} >= %{libsolv_version} +Requires: librepo%{?_isa} >= %{librepo_version} + +%if %{without python2} +# Obsoleted from here so we can track the fast growing version easily. +# We intentionally only obsolete and not provide, this is a broken upgrade +# prevention, not providing the removed functionality. +Obsoletes: python2-%{name} < %{version}-%{release} +Obsoletes: python2-hawkey < %{version}-%{release} +Obsoletes: python2-hawkey-debuginfo < %{version}-%{release} +Obsoletes: python2-libdnf-debuginfo < %{version}-%{release} +%endif + +%description +A Library providing simplified C and Python API to libsolv. + +%package devel +Summary: Development files for %{name} +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: libsolv-devel%{?_isa} >= %{libsolv_version} + +%description devel +Development files for %{name}. + +%if %{with python2} +%package -n python2-%{name} +%{?python_provide:%python_provide python2-%{name}} +Summary: Python 2 bindings for the libdnf library. +Requires: %{name}%{?_isa} = %{version}-%{release} +BuildRequires: python2-devel +%if !0%{?mageia} +BuildRequires: %{requires_python2_sphinx} +%endif +%if 0%{?rhel} == 7 +BuildRequires: swig3 >= %{swig_version} +%else +BuildRequires: swig >= %{swig_version} +%endif + +%description -n python2-%{name} +Python 2 bindings for the libdnf library. +%endif +# endif with python2 + +%if %{with python3} +%package -n python3-%{name} +%{?python_provide:%python_provide python3-%{name}} +Summary: Python 3 bindings for the libdnf library. +Requires: %{name}%{?_isa} = %{version}-%{release} +BuildRequires: python3-devel +BuildRequires: %{requires_python3_sphinx} +BuildRequires: swig >= %{swig_version} + +%description -n python3-%{name} +Python 3 bindings for the libdnf library. +%endif + +%if %{with python2} +%package -n python2-hawkey +Summary: Python 2 bindings for the hawkey library +%{?python_provide:%python_provide python2-hawkey} +BuildRequires: python2-devel +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: python2-%{name} = %{version}-%{release} +# Fix problem with hawkey - dnf version incompatibility +# Can be deleted for distros where only python2-dnf >= 2.0.0 +Conflicts: python2-dnf < %{dnf_conflict} +Conflicts: python-dnf < %{dnf_conflict} + +%description -n python2-hawkey +Python 2 bindings for the hawkey library. +%endif +# endif with python2 + +%if %{with python3} +%package -n python3-hawkey +Summary: Python 3 bindings for the hawkey library +%{?python_provide:%python_provide python3-hawkey} +BuildRequires: python3-devel +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: python3-%{name} = %{version}-%{release} +# Fix problem with hawkey - dnf version incompatibility +# Can be deleted for distros where only python3-dnf >= 2.0.0 +Conflicts: python3-dnf < %{dnf_conflict} +# Obsoletes F27 packages +Obsoletes: platform-python-hawkey < %{version}-%{release} + +%description -n python3-hawkey +Python 3 bindings for the hawkey library. +%endif + +%prep +%autosetup -S git -p1 +%if %{with python2} +mkdir build-py2 +%endif +%if %{with python3} +mkdir build-py3 +%endif + +%build +%if %{with python2} +pushd build-py2 + %if 0%{?mageia} || 0%{?suse_version} + cd .. + %define _cmake_builddir build-py2 + %define __builddir build-py2 + %endif + %cmake -DPYTHON_DESIRED:FILEPATH=%{__python2} -DWITH_MAN=OFF ../ %{!?with_zchunk:-DWITH_ZCHUNK=OFF} %{!?with_valgrind:-DDISABLE_VALGRIND=1} %{_cmake_opts} -DLIBDNF_MAJOR_VERSION=%{libdnf_major_version} -DLIBDNF_MINOR_VERSION=%{libdnf_minor_version} -DLIBDNF_MICRO_VERSION=%{libdnf_micro_version} \ + -DWITH_SANITIZERS=%{?with_sanitizers:ON}%{!?with_sanitizers:OFF} \ + -DENABLE_SELINUX=%{?with_selinux:ON}%{!?with_selinux:OFF} + %make_build +popd +%endif +# endif with python2 + +%if %{with python3} +pushd build-py3 + %if 0%{?mageia} || 0%{?suse_version} + cd .. + %define _cmake_builddir build-py3 + %define __builddir build-py3 + %endif + %cmake -DPYTHON_DESIRED:FILEPATH=%{__python3} -DWITH_GIR=0 -DWITH_MAN=0 -Dgtkdoc=0 ../ %{!?with_zchunk:-DWITH_ZCHUNK=OFF} %{!?with_valgrind:-DDISABLE_VALGRIND=1} %{_cmake_opts} -DLIBDNF_MAJOR_VERSION=%{libdnf_major_version} -DLIBDNF_MINOR_VERSION=%{libdnf_minor_version} -DLIBDNF_MICRO_VERSION=%{libdnf_micro_version} \ + -DWITH_SANITIZERS=%{?with_sanitizers:ON}%{!?with_sanitizers:OFF} \ + -DENABLE_SELINUX=%{?with_selinux:ON}%{!?with_selinux:OFF} + %make_build +popd +%endif + +%check +%if %{with python2} +pushd build-py2 + make ARGS="-V" test +popd +%endif +%if %{with python3} +# If we didn't run the general tests yet, do it now. +%if %{without python2} +pushd build-py3 + make ARGS="-V" test +popd +%else +# Otherwise, run just the Python tests, not all of +# them, since we have coverage of the core from the +# first build +pushd build-py3/python/hawkey/tests + make ARGS="-V" test +popd +%endif +%endif + +%install +%if %{with python2} +pushd build-py2 + %make_install +popd +%endif +%if %{with python3} +pushd build-py3 + %make_install +popd +%endif + +%find_lang %{name} + +%if (0%{?rhel} && 0%{?rhel} <= 7) || 0%{?suse_version} +%post -p /sbin/ldconfig +%postun -p /sbin/ldconfig +%else +%ldconfig_scriptlets +%endif + +%files -f %{name}.lang +%license COPYING +%doc README.md AUTHORS +%{_libdir}/%{name}.so.* +%dir %{_libdir}/libdnf/ +%dir %{_libdir}/libdnf/plugins/ +%{_libdir}/libdnf/plugins/README +%if %{with sanitizers} +%{_sysconfdir}/profile.d/dnf-sanitizers.sh +%endif + +%files devel +%doc %{_datadir}/gtk-doc/html/%{name}/ +%{_libdir}/%{name}.so +%{_libdir}/pkgconfig/%{name}.pc +%{_includedir}/%{name}/ + +%if %{with python2} +%files -n python2-%{name} +%{python2_sitearch}/%{name}/ +%endif + +%if %{with python3} +%files -n python3-%{name} +%{python3_sitearch}/%{name}/ +%endif + +%if %{with python2} +%files -n python2-hawkey +%{python2_sitearch}/hawkey/ +%endif + +%if %{with python3} +%files -n python3-hawkey +%{python3_sitearch}/hawkey/ +%endif + +%changelog +* Wed Oct 18 2023 Petr Pisar - 0.63.0-19 +- Set default SELinux labels on GnuPG directories (RHEL-6421) + +* Fri Oct 13 2023 Jaroslav Rohel - 0.63.0-18 +- filterAdvisory: match installed_solvables sort with lower_bound (RhBug:2212838, RHEL-1244) +- Avoid reinstalling installonly packages marked for ERASE (RhBug:2163474, RHEL-1253) + +* Fri Sep 08 2023 Marek Blaha - 0.63.0-17 +- Update translations + +* Wed May 31 2023 Nicola Sella - 0.63-0-16 +- Support "proxy=_none_" in main config (RhBug:2155713) + +* Wed May 17 2023 Jaroslav Rohel - 0.63.0-15 +- Add repoid to solver error messages (RhBug:2179409,2179413) + +* Wed Mar 08 2023 Marek Blaha - 0.63.0-14 +- Update translations + +* Wed Oct 26 2022 Nicola Sella - 0.63.0-13 +- Allow change of arch during security updates with noarch (RhBug:2124483) + +* Tue Sep 13 2022 Lukas Hrazky - 0.63.0-12 +- Fix listing a repository without cpeid (RhBug:2066334) + +* Thu Jul 21 2022 Lukas Hrazky - 0.63.0-11 +- Add obsoletes to filtering for advisory candidates + +* Tue Jun 14 2022 Lukas Hrazky - 0.63.0-10 +- Do not print errors on failovermethod repo option +- the dnf_context_remove() function accepts ``, doc updates +- advisory upgrade: filter out advPkgs with different arch + +* Wed May 04 2022 Lukas Hrazky - 0.63.0-8 +- Substitute all repository config options (fixes substitution of baseurl) +- Use solvfile userdata to store and check checksums and solv versions +- Fix handling transaction id in resolveTransactionItemReason +- Set short action for Reason Change + +* Fri Jan 14 2022 Pavla Kratochvilova - 0.63.0-7 +- Rebuild with new release number + +* Tue Jan 11 2022 Pavla Kratochvilova - 0.63.0-6 +- Add getLatestModules() + +* Mon Nov 29 2021 Pavla Kratochvilova - 0.63.0-5 +- Add unittest for setting up repo with empty keyfile (RhBug:1994614) + +* Tue Nov 09 2021 Pavla Kratochvilova - 0.63.0-4 +- Bump release number because of conflicting version of 8.5 build + +* Tue Nov 09 2021 Pavla Kratochvilova - 0.63.0-3 +- Turn off strict validation of modulemd documents (RhBug:2004853,2007166,2007167) + +* Tue Jul 27 2021 Pavla Kratochvilova - 0.63.0-2 +- Fix: dnf_context_module_install: memory leaks +- covscan: remove unused vars, mark private func static, return values +- DNF does not fail on non UTF-8 file names in a package + +* Wed May 19 2021 Pavla Kratochvilova - 0.63.0-1 +- Update to 0.62.0 +- Hardening: add signature check with rpmcliVerifySignatures (RhBug:1932079) +- Support allow_vendor_change setting in dnf context API +- Add a new option module_obsoletes +- Add new API applyObsoletes() function to apply modular obsoletes +- Do not allow 1 as installonly_limit value (RhBug:1926261) +- Add a config option to check TLS certificate revocation status (using OCSP stapling), defaults to false (RhBug:1814383) +- Swdb: Add a method to get the current transaction +- [context,API] Functions for accessing main/global configuration options +- [context,API] Function for adding setopt +- Add getter for modular obsoletes from ModuleMetadata +- Add ModulePackage.getStaticContext() and getRequires() +- Fix modular queries with the new solver +- Fix: Fully set ssl in newHandle function +- [conf] Add options for working with certificates used with proxy +- Modify module NSVCA parsing - context definition (RhBug:1926771) +- [context] Fix: dnf_package_is_installonly (RhBug:1928056) +- Add getApplicablePackages to advisory and isApplicable to advisorymodule +- Keep isAdvisoryApplicable to preserve API +- [context] Support config file option "proxy_auth_method", defaults "any" +- Support main config file options "installonlypkgs" and "protected_packages". Changes behaviour of microdnf and PackageKit. +- Properly handle multiple collections in updateinfo.xml (RhBug:1804234) +- Fix a crash when [media] section in .treeinfo is missing for bootable media (RhBug:1946024) +- Add new dnf_context_module_install() C API + +* Fri Feb 12 2021 Nicola Sella - 0.55.0-6 +- Fix removal step during modular enable in context part + +* Thu Feb 11 2021 Nicola Sella - 0.55.0-5 +- Add new option module_stream_switch + +* Mon Feb 08 2021 Nicola Sella - 0.55.0-4 +- [context] improve retrieving repository configuration +- Allow loading incomplete cache and loading ext solv files without its repodata + +* Fri Jan 29 2021 Nicola Sella - 0.55.0-3 +- Avoid multilib file conflict in config.h (RhBug:1918818) +- [modules] Add special handling for src artifacts (RhBug:1809314) + +* Fri Jan 15 2021 Nicola Sella - 0.55.0-2 +- Better msgs if "basecachedir" or "proxy_password" isn't set (RhBug:1888946) + +* Mon Nov 09 2020 Nicola Sella - 0.55.0-1 +- Add vendor to dnf API (RhBug:1876561) +- Add formatting function for solver error +- Add error types in ModulePackageContainer +- Implement module enable for context part +- Improve string formatting for translation +- Remove redundant printf and change logging info to notice (RhBug:1827424) +- Add allow_vendor_change option (RhBug:1788371) (RhBug:1788371) + +* Thu Aug 20 2020 Nicola Sella - 0.48.0-5 +- [covscan] Handle exception in a python binding by the proper function (RhBug:1870492) + +* Tue Jul 28 2020 Marek Blaha - 0.48.0-4 +- Update translations (RhBug:1820548) + +* Fri Jul 17 2020 Nicola Sella - 0.48.0-3 +- Add log file level main config option (RhBug:1802074) +- Accept '==' as an operator in reldeps (RhBug:1847946) + +* Wed Jun 10 2020 Ales Matej - 0.48.0-2 +- [history] Fix dnf history rollback when a package was removed (RhBug:1683134) + +* Wed Jun 03 2020 Nicola Sella - 0.48.0-1 +- Update to 0.48.0 +- swdb: Catch only SQLite3 exceptions and simplify the messages +- MergedTransaction list multiple comments (RhBug:1773679) +- Modify CMake to pull *.po files from weblate +- Optimize DependencyContainer creation from an existing queue +- fix a memory leak in dnf_package_get_requires() +- Fix memory leaks on g_build_filename() +- Fix memory leak in dnf_context_setup() +- Add `hy_goal_favor` and `hy_goal_disfavor` +- Define a cleanup function for `DnfPackageSet` +- dnf-repo: fix dnf_repo_get_public_keys double-free +- Do not cache RPMDB +- Use single-quotes around string literals used in SQL statements +- SQLite3: Do not close the database if it wasn't opened (RhBug:1761976) +- Don't create a new history DB connection for in-memory DB +- transaction/Swdb: Use a single logger variable in constructor +- utils: Add a safe version of pathExists() +- swdb: Handle the case when pathExists() fails on e.g. permission +- Repo: prepend "file://" if a local path is used as baseurl +- Move urlEncode() to utils +- utils: Add 'exclude' argument to urlEncode() +- Encode package URL for downloading through librepo (RhBug:1817130) +- Replace std::runtime_error with libdnf::RepoError +- Fixes and error handling improvements of the File class +- [context] Use ConfigRepo for gpgkey and baseurl (RhBug:1807864) +- [context] support "priority" option in .repo config file (RhBug:1797265) + +* Fri Apr 03 2020 Ales Matej - 0.47.0-1 +- Update to 0.47.0 +- Allow excluding packages with "excludepkgs" and globs +- Make parsing of reldeps more strict (RhBug:1788107) +- Add expanding solvable provides for dependency matching (RhBug:1534123) +- DnfRepo: fix module_hotfixes keyfile priority level +- Add custom exceptions to libdnf interface +- Port to libmodulemd-2 API (RhBug:1693683) +- Add prereq_ignoreinst & regular_requires properties for pkg (RhBug:1543449) +- Reset active modules when no module enabled or default (RhBug:1767351) +- Add comment option to transaction (RhBug:1773679) +- Baseurl is not exclusive with mirrorlist/metalink (RhBug:1775184) +- Add new function to reset all modules in C API (dnf_context_reset_all_modules) +- Handle situation when an unprivileged user cannot create history database (RhBug:1634385) +- Add query filter: latest by priority +- Add setter for running kernel protection setting +- Add DNF_NO_PROTECTED flag to allow empty list of protected packages +- Config options: only first empty value clears existing (RhBug:1788154) +- [conf] Set useful default colors when color is enabled +- [context] Use installonly_limit from global config (RhBug:1256108) +- [context] Add API to get/set "install_weak_deps" +- [context] Adds support for includepkgs in repository configuration. +- [context] Adds support for excludepkgs, exclude, includepkgs, and disable_excludes in main configuration. +- [context] Added function dnf_transaction_set_dont_solve_goal +- [context] Added functions dnf_context_get/set_config_file_path +- [context] Respect "plugins" global conf value +- [context] Add API to disable/enable plugins +- [context] Create new repo instead of reusing old one (RhBug:1795004) +- [context] Error when main config file can't be opened (RhBug:1794864) +- [context] Add function function dnf_context_is_set_config_file_path +- [context] Support repositories defined in main configuration file + +* Tue Feb 18 2020 Ales Matej - 0.39.1-5 +- Fix filtering of packages by advisory (RhBug:1770125) + +* Fri Jan 31 2020 Marek Blaha - 0.39.1-4 +- [translations] Update translations from zanata (RhBug:1754965) + +* Mon Jan 13 2020 Ales Matej - 0.39.1-3 +- Add two new query filters: obsoletes_by_priority, upgrades_by_priority (RhBug:1769466) +- [context] Add wildcard support in dnf_context_repo_set_data (RhBug:1781420) +- Remove killGpgAgent function (RhBug:1781601) + +* Thu Dec 12 2019 Pavla Kratochvilova - 0.39.1-2 +- [user-agent] Stop checking os-release(5) data against a hard-coded whitelist (RhBug:1777255) + +* Mon Nov 25 2019 Ales Matej - 0.39.1-1 +- Update to 0.39.1 +- Report reason how package was excluded (RhBug:1649754) +- Additional Arm detection improvements (RhBug:1691430) +- Set skip_if_unavailable for media repos to skip their update (RhBug:1716067) +- Add support of xml:base for remote and local url in context (RhBug:1734350,1717865) + +* Wed Nov 13 2019 Ales Matej - 0.38.1-1 +- Update to 0.38.1 +- Change the best option default to false +- Use more descriptive message when failed to retrieve GPG key (RhBug:1605117) +- Add removeMetadataTypeFromDownload function to the API +- Context part of libdnf can now read vars (urlvars) from dirs and environment +- Throw exception immediately if file cannot be opened +- Add test when there is no primary metadata in compatible format (RhBug:1744960) +- Various improvements to countme features +- Don't abort on rpmdb checksum calculation failure +- Enable module dependency trees when using set_modules_enabled_by_pkgset() (RhBug:1762314) +- Resolve problem with --best and search in provides (RhBug:1737469) +- New method "Query::filterSubject()", replaces Solution::getBestSolution() +- The Solution class was removed +- Add query argument into get_best_query and get_best_solution +- Add module reset function into dnf_context +- Add method to get all repository metadata locations +- Catch NoModuleException in case of not existent value was used in persistor (RhBug:1761773) + +* Tue Oct 22 2019 Ales Matej - 0.35.5-1 +- Update to 0.35.5 +- Make libdnf own its plugin directory (RhBug:1714265) +- Set priority of dnf.conf.d drop-ins +- Fix toString() to not insert [] (RhBug:1584442) +- Fix handling large number of filenames on input (RhBug:1690915) +- Detect armv7 with crypto extension only on arm version >= 8 +- A new standardized User-Agent field consisting of the libdnf and OS version + (including the variant) (RhBug:1156007) +- Add basic countme support (RhBug:1647454) +- Fix crash in PackageKit (RhBug:1636803) +- Do not create @System.solv files (RhBug:1707995) +- Set LRO_CACHEDIR so zchunk works again (RhBug:1739867) +- Improve detection of extras packages by comparing (name, arch) pair instead + of full NEVRA (RhBuh:1684517) +- Improve handling multilib packages in the history command (RhBug:1728637) +- Repo download: use full error description into the exception text (RhBug:1741442) +- Properly close hawkey.log (RhBug:1594016) +- Fix dnf updateinfo --update to not list advisories for packages updatable + only from non-enabled modules +- Apply modular filtering by package name (RhBug:1702729) + +* Wed Oct 16 2019 Pavla Kratochvilova - 0.35.1-9 +- Prevent reinstalling modified packages with same NEVRA (RhBug:1728252,1644241,1760825) + +* Fri Sep 06 2019 Marek Blaha - 0.35.1-8 +- Enhanced fix of moving directories in minimal container (RhBug:1700341) + +* Thu Sep 05 2019 Jaroslav Mracek - 0.35.1-7 +- Remove patch to not fail when installing modular RPMs without modular metadata + +* Thu Sep 05 2019 Marek Blaha - 0.35.1-6 +- Fix moving directories in minimal container (RhBug:1700341) + +* Tue Aug 06 2019 Pavla Kratochvilova - 0.35.1-5 +- Add suport for query sequence conversions + +* Thu Aug 01 2019 Pavla Kratochvilova - 0.35.1-4 +- Fix typo in error message (RhBug:1726661) +- Update localizations from zanata (RhBug:1689991) +- Don't disable nonexistent but required repositories (RhBug:1689331) +- Ignore trailing blank lines of multiline value (RhBug:1722493) +- Re-size includes map before re-computation (RhBug:1725213) + +* Tue Jul 16 2019 Marek Blaha - 0.35.1-3 +- Fix attaching and detaching of libsolvRepo and repo_internalize_trigger() + (RhBug:1730224) + +* Thu Jul 04 2019 Pavla Kratochvilova - 0.35.1-2 +- Add patch to not fail when installing modular RPMs without modular metadata + +* Tue Jun 11 2019 Pavla Kratochvilova - 0.35.1-1 +- Update to 0.35.1 +- Skip invalid key files in "/etc/pki/rpm-gpg" with warning (RhBug:1644040) +- Enable timestamp preserving for downloaded data (RhBug:1688537) +- Fix 'database is locked' error (RhBug:1631533) +- Replace the 'Failed to synchronize cache' message (RhBug:1712055) +- Fix 'no such table: main.trans_cmdline' error (RhBug:1596540) +- Fix: skip_if_unavailable=true for local repositories (RhBug:1716313) +- Add support of modular FailSafe (RhBug:1623128) +- Add support of DNF main config file in context; used by PackageKit and + microdnf (RhBug:1689331) +- Exit gpg-agent after repokey import (RhBug:1650266) + +* Mon May 13 2019 Pavla Kratochvilova - 0.33.0-1 +- Update to 0.33.0 +- Enhance sorting for module list (RhBug:1590358) +- [DnfRepo] Add methods for alternative repository metadata type and download (RhBug:1656314) +- Remove installed profile on module enable or disable (RhBug:1653623) +- Enhance modular solver to handle enabled and default module streams differently (RhBug:1648839) +- Add support of wild cards for modules (RhBug:1644588) +- Exclude module pkgs that have conflict +- Enhance config parser to preserve order of data, and keep comments and format +- Improve ARM detection +- Add support for SHA-384 +- Return empty query if incorrect reldep (RhBug:1687135) +- ConfigParser: Improve compatibility with Python ConfigParser and dnf-plugin-spacewalk (RhBug:1692044) +- ConfigParser: Unify default set of string represenation of boolean values +- Fix segfault when interrupting dnf process (RhBug:1610456) +- Installroot now requires absolute path +- Support "_none_" value for repo option "proxy" (RhBug:1680272) +- Add support for Module advisories +- Add support for xml:base attribute from primary.xml (RhBug:1691315) +- Improve detection of Platform ID (RhBug:1688462) + +* Fri Apr 26 2019 Pavla Kratochvilova - 0.22.5-6 +- Rebuild for libsolv soname bump (in libsolve update to 0.7.4) + +* Wed Apr 03 2019 Jaroslav Mracek - 0.22.5-5 +- Backport patches to set default to skip_if_unavailable to false (RhBug:1692452) + +* Tue Feb 12 2019 Jaroslav Mracek - 0.22.5-4 +- Backport patch to exclude module pkgs that have conflict (RhBug:1670496) + +* Fri Feb 08 2019 Jaroslav Mracek - 0.22.5-3 +- Backport patches to add support for modular updateinfoxml applicability + +* Wed Feb 06 2019 Pavla Kratochvilova - 0.22.5-2 +- Add patch: Add best as default behavior (RhBug1670776) + +* Mon Dec 17 2018 Daniel Mach - 0.22.4-1 +- Enhance LIBDNF plugins support +- [repo] Check whether metadata cache is expired (RhBug:1539620,1648274) +- [sack] Implement dnf_sack_get_rpmdb_version() + +* Fri Nov 23 2018 Jaroslav Mracek - 0.22.3-1 +- Permanently disable Python2 build for Fedora 30+ +- Update to 0.22.3 +- Modify solver_describe_decision to report cleaned (RhBug:1486749) +- [swdb] create persistent WAL files (RhBug:1640235) +- Relocate ModuleContainer save hook (RhBug:1632518) +- [transaction] Fix transaction item lookup for obsoleted packages (RhBug: 1642796) +- Fix memory leaks and memory allocations +- [repo] Possibility to extend downloaded repository metadata + +* Wed Oct 24 2018 Jaroslav Mracek - 0.22.0-2 +- Add patch Modify-solver_describe_decision-to-report-cleaned-RhBug1486749 +- Add patch swdb-create-persistent-WAL-files-RhBug1640235 +- Add patch Relocate-ModuleContainer-save-hook-RhBug1632518 +- Add patch Test-if-sack-is-present-and-run-save-module-persistor-RhBug1632518 + +* Mon Oct 15 2018 Jaroslav Mracek - 0.22.0-1 +- Fix segfault in repo_internalize_trigger (RhBug:1375895) +- Change sorting of installonly packages (RhBug:1627685) +- [swdb] Fixed pattern searching in history db (RhBug:1635542) +- Check correctly gpg for repomd when refresh is used (RhBug:1636743) +- [conf] Provide additional VectorString methods for compatibility with Python list. +- [plugins] add plugin loading and hooks into libdnf + +* Tue Sep 25 2018 Jaroslav Mracek - 0.20.0-1 +- [module] Report module solver errors +- [module] Enhance module commands and errors +- [transaction] Fixed several problems with SWDB +- Remove unneeded regex URL tests (RhBug:1598336) +- Allow quoted values in ini files (RhBug:1624056) +- Filter out not unique set of solver problems (RhBug:1564369) +- Resolves: rhbz#1614531 - dnf 3.2 does not depsolve correctly +- Resolves: rhbz#1614346 - dnf rollback doesn't work after install/downgrade/upgrade +- bug 1605274 - DNF crashes on * in installation repository URL +- Resolves: rhbz#1623383 - dnf.exceptions.ConfigError: Error parsing ... + +* Mon Sep 10 2018 Jaroslav Mracek - 0.19.1-1 +- Fix compilation errors on gcc-4.8.5 +- [module] Allow module queries on disabled modules (RhBug:1627081) + +* Fri Sep 07 2018 Jaroslav Mracek - 0.19.0-1 +- [query] Reldeps can contain a space char (RhBug:1612462) +- [transaction] Avoid adding duplicates via Transaction::addItem() +- Fix compilation errors on gcc-4.8.5 +- [module] Make available ModuleProfile using SWIG +- [module] Redesign module disable and reset + +* Fri Aug 31 2018 Daniel Mach - 0.18.0-1 +- [repo] Implement GPG key import +- [repo] Introduce Repo class replacing dnf.repo.Repo +- [context] Fix memory corruption in dnf_context +- [rhsm] Fix: RHSM don't write .repo file with same content (RhBug:1600452) +- [module] Create /etc/dnf/modules.d if it doesn't exist. +- [module] Forward C++ exceptions to bindings. + +* Thu Aug 16 2018 Daniel Mach - 0.17.2-2 +- [module] Create /etc/dnf/modules.d if it doesn't exist. +- [module] Forward C++ exceptions to bindings. + +* Mon Aug 13 2018 Daniel Mach - 0.17.2-1 +- [sqlite3] Change db locking mode to DEFAULT. +- [doc] Add libsmartcols-devel to devel deps. + +* Mon Aug 13 2018 Daniel Mach - 0.17.1-1 +- [module] Solve a problem in python constructor of NSVCAP if no version. +- [translations] Update translations from zanata. +- [transaction] Fix crash after using dnf.comps.CompsQuery and forking the process in Anaconda. +- [module] Support for resetting module state. +- [output] Introduce wrapper for smartcols. + +* Tue Aug 07 2018 Daniel Mach - 0.17.0-1 +- [conf] Add module_platform_id option. +- [module] Add ModulePackageContainer class. +- [module] Add ModulePersistor class. +- [sack] Module filtering made available in python API +- [sack] Module auto-enabling according to installed packages + +* Fri Jul 27 2018 Daniel Mach - 0.16.1-1 +- [module] Implement 'module_hotfixes' conf option to skip filtering RPMs from hotfix repos. +- [goal] Fix distupgrade filter, allow downgrades. +- [context] Allow to set module platform in context. +- [module] Introduce proper modular dependency solving. +- [module] Platform pseudo-module based on /etc/os-release. +- [goal] Add Goal::listSuggested(). +- [l10n] Support for translations, add gettext build dependency. + +* Sun Jul 22 2018 Daniel Mach - 0.16.0-1 +- Fix RHSM plugin +- Add support for logging +- Bump minimal libmodulemd version to 1.6.1 + +* Mon Jul 09 2018 Igor Gnatenko - 0.15.2-2 +- Fix librhsm support logic + +* Fri Jun 29 2018 Jaroslav Mracek - 0.15.2-1 +- Update to 0.15.1 +- Resolves: rhbz#1595487 + +* Fri Jun 29 2018 Igor Gnatenko - 0.15.1-2 +- Restore proper ldconfig_scriptlets + +* Tue Jun 26 2018 Jaroslav Mracek - 0.15.1-1 +- Update to 0.15.1 + +* Fri Jun 15 2018 Miro Hrončok - 0.11.1-6 +- Rebuilt for Python 3.7 + +* Wed Feb 07 2018 Fedora Release Engineering - 0.11.1-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Tue Jan 30 2018 Igor Gnatenko - 0.11.1-4 +- Switch to %%ldconfig_scriptlets + +* Tue Nov 07 2017 Igor Gnatenko - 0.11.1-3 +- Use better Obsoletes for platform-python + +* Fri Nov 03 2017 Igor Gnatenko - 0.11.1-2 +- Remove platform-python subpackage + +* Mon Oct 16 2017 Jaroslav Mracek - 0.11.1-1 +- Rerelease of 0.11.1-1 +- Improvement query performance +- Run file query in hy_subject_get_best_solution only for files (arguments that start with ``/`` or + ``*/``) +- Resolves: rhbz#1498207 - DNF crash during upgrade installation F26 -> F27 + +* Tue Oct 10 2017 Igor Gnatenko - 0.11.0-1 +- Update to 0.11.0 + +* Mon Oct 02 2017 Jaroslav Mracek - 0.10.1-2 +- Rerelease of 0.10.1-1 + +* Wed Sep 27 2017 Jaroslav Mracek - 0.10.1-1 +- Update to 0.10.1 +- It improves query performance with name and arch filters. Also nevra filter will now + handle string with or without epoch. +- Additionally for python bindings it renames NEVRA._has_just_name() to NEVRA.has_just_name() due + to movement of code into c part of library. +- Resolves: rhbz#1260242 - --exclude does not affect dnf remove's removal of requirements +- Resolves: rhbz#1485881 - DNF claims it cannot install package, which have been already installed +- Resolves: rhbz#1361187 - [abrt] python-ipython-console: filter_updown(): python3.5 killed by SIGABRT + +* Fri Sep 15 2017 Igor Gnatenko - 0.9.3-8 +- Disable platform python on old releases + +* Tue Aug 15 2017 Lumír Balhar - 0.9.3-7 +- Add platform-python subpackage + +* Fri Aug 11 2017 Igor Gnatenko - 0.9.3-6 +- Rebuilt after RPM update (№ 3) + +* Thu Aug 10 2017 Igor Gnatenko - 0.9.3-5 +- Rebuilt for RPM soname bump + +* Thu Aug 10 2017 Igor Gnatenko - 0.9.3-4 +- Rebuilt for RPM soname bump + +* Thu Aug 03 2017 Fedora Release Engineering - 0.9.3-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Wed Jul 26 2017 Fedora Release Engineering - 0.9.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Mon Jul 24 2017 Jaroslav Mracek - 0.9.3-1 +- Update to 0.9.3 + +* Sat Jul 01 2017 Igor Gnatenko - 0.9.2-1 +- Update to 0.9.2 + +* Mon Jun 12 2017 Jaroslav Mracek - 0.9.1-1 +- Update to 0.9.1 + +* Mon May 22 2017 Jaroslav Mracek - 0.9.0-1 +- Update to 0.9.0 + +* Tue May 02 2017 Jaroslav Mracek - 0.8.2-1 +- Update to 0.8.2 + +* Fri Mar 24 2017 Igor Gnatenko - 0.8.1-1 +- Update to 0.8.1 + +* Tue Mar 21 2017 Jaroslav Mracek - 0.8.0-1 +- Update to 0.8.0 + +* Mon Feb 20 2017 Igor Gnatenko - 0.7.4-1 +- Update to 0.7.4 + +* Fri Feb 10 2017 Igor Gnatenko - 0.7.3-1 +- Update to 0.7.3 + +* Wed Feb 08 2017 Igor Gnatenko - 0.7.2-1 +- 0.7.2 + +* Fri Jan 06 2017 Igor Gnatenko - 0.7.1-1 +- 0.7.1 + +* Wed Dec 21 2016 Peter Robinson 0.7.0-0.7gitf9b798c +- Rebuild for Python 3.6 + +* Mon Dec 19 2016 Igor Gnatenko - 0.7.0-0.6gitf9b798c +- Use new upstream URL + +* Tue Dec 13 2016 Stratakis Charalampos - 0.7.0-0.5gitf9b798c +- Rebuild for Python 3.6 + +* Tue Dec 06 2016 Martin Hatina - 0.7.0-0.4gitf9b798c +- Increase conflict version of dnf + +* Thu Dec 01 2016 Igor Gnatenko - 0.7.0-0.3gitf9b798c +- Update to latest snapshot + +* Fri Nov 04 2016 Igor Gnatenko - 0.7.0-0.2git8bd77f8 +- Update to latest snapshot + +* Thu Sep 29 2016 Igor Gnatenko - 0.7.0-0.1git179c0a6 +- Initial package