From 582247a02082eb1eedb5d0113e83447d18dfa58a Mon Sep 17 00:00:00 2001 From: MSVSphere Packaging Team Date: Mon, 11 Dec 2023 16:26:51 +0300 Subject: [PATCH 1/2] import libdnf-0.63.0-17.el8_9 --- ...Add_repoid_to_solver_error_messagase.patch | 317 ++ ...xy-_none_-in-main-config-RhBug-21557.patch | 47 + .../0046-Update-translations-RHEL-8.9.patch | 2618 +++++++++++++++++ SPECS/libdnf.spec | 14 +- 4 files changed, 2995 insertions(+), 1 deletion(-) create mode 100644 SOURCES/0044-Add_repoid_to_solver_error_messagase.patch create mode 100644 SOURCES/0045-conf-Support-proxy-_none_-in-main-config-RhBug-21557.patch create mode 100644 SOURCES/0046-Update-translations-RHEL-8.9.patch 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/SPECS/libdnf.spec b/SPECS/libdnf.spec index 45247bb..eb78569 100644 --- a/SPECS/libdnf.spec +++ b/SPECS/libdnf.spec @@ -56,7 +56,7 @@ Name: libdnf Version: %{libdnf_major_version}.%{libdnf_minor_version}.%{libdnf_micro_version} -Release: 14%{?dist} +Release: 17%{?dist} Summary: Library providing simplified C and Python API to libsolv License: LGPLv2+ URL: https://github.com/rpm-software-management/libdnf @@ -104,6 +104,9 @@ 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 BuildRequires: cmake @@ -349,9 +352,18 @@ popd %endif %changelog +* Fri Sep 08 2023 Marek Blaha - 0.63.0-17 +- Update translations + * Wed Jul 26 2023 MSVSphere Packaging Team - 0.63.0-14 - Rebuilt for MSVSphere 8.8 +* 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 From 5ce7e7b68e140c1e5746840f94e1391e81b43613 Mon Sep 17 00:00:00 2001 From: MSVSphere Packaging Team Date: Wed, 14 Aug 2024 03:15:01 +0300 Subject: [PATCH 2/2] import libdnf-0.63.0-20.el8_10 --- ...nstalled_solvables-sort-RhBug2212838.patch | 37 ++ ...nstallonly-packages-marked-for-ERASE.patch | 99 ++++++ ...t-creation-SELinux-labels-on-GnuPG-d.patch | 335 ++++++++++++++++++ ...o-perform-labeling-if-SELinux-is-dis.patch | 93 +++++ SPECS/libdnf.spec | 30 +- 5 files changed, 590 insertions(+), 4 deletions(-) create mode 100644 SOURCES/0047-filterAdvisory-installed_solvables-sort-RhBug2212838.patch create mode 100644 SOURCES/0048-Avoid-reinstal-installonly-packages-marked-for-ERASE.patch create mode 100644 SOURCES/0049-PGP-Set-a-default-creation-SELinux-labels-on-GnuPG-d.patch create mode 100644 SOURCES/0050-repo-Don-t-try-to-perform-labeling-if-SELinux-is-dis.patch 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/SOURCES/0050-repo-Don-t-try-to-perform-labeling-if-SELinux-is-dis.patch b/SOURCES/0050-repo-Don-t-try-to-perform-labeling-if-SELinux-is-dis.patch new file mode 100644 index 0000000..d26055d --- /dev/null +++ b/SOURCES/0050-repo-Don-t-try-to-perform-labeling-if-SELinux-is-dis.patch @@ -0,0 +1,93 @@ +From 8eac75556d0f53f3ba6cd12d2545bc8dbebb11f4 Mon Sep 17 00:00:00 2001 +From: Colin Walters +Date: Tue, 4 Jun 2024 06:57:19 -0400 +Subject: [PATCH] repo: Don't try to perform labeling if SELinux is disabled +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The default for container execution is that `/sys/fs/selinux` +is not mounted, and the libselinux library function `is_selinux_enabled` +should be used to dynamically check if the system should attempt to perform SELinux labeling. + +This is how it's done by rpm, ostree, and systemd for example. + +But this code unconditionally tries to label if it finds a policy, +which breaks in an obscure corner case +when executed inside a container that includes policy files (e.g. +fedora/rhel-bootc) but when we're not using overlayfs for the backend +(with BUILDAH_BACKEND=vfs). + +Signed-off-by: Petr Písař +--- + libdnf/repo/Repo.cpp | 50 +++++++++++++++++++++++--------------------- + 1 file changed, 26 insertions(+), 24 deletions(-) + +diff --git a/libdnf/repo/Repo.cpp b/libdnf/repo/Repo.cpp +index 68b82ccc..4f646f8c 100644 +--- a/libdnf/repo/Repo.cpp ++++ b/libdnf/repo/Repo.cpp +@@ -676,34 +676,36 @@ static int create_temporary_directory(char *name_template) { + 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")); +- } ++ if (is_selinux_enabled()) { ++ /* 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)); ++ 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 (setfscreatecon(new_default_context)) { +- logger->debug(tfm::format("Failed to set default SELinux context to \"%s\"", +- new_default_context)); ++ 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); + } +- freecon(new_default_context); ++ selabel_close(labeling_handle); + } +- selabel_close(labeling_handle); + } + #endif + +-- +2.45.2 + diff --git a/SPECS/libdnf.spec b/SPECS/libdnf.spec index eb78569..b3557c5 100644 --- a/SPECS/libdnf.spec +++ b/SPECS/libdnf.spec @@ -42,6 +42,8 @@ %bcond_with rhsm %endif +%bcond_without selinux + %if 0%{?rhel} %bcond_with zchunk %else @@ -56,7 +58,7 @@ Name: libdnf Version: %{libdnf_major_version}.%{libdnf_minor_version}.%{libdnf_micro_version} -Release: 17%{?dist} +Release: 20%{?dist} Summary: Library providing simplified C and Python API to libsolv License: LGPLv2+ URL: https://github.com/rpm-software-management/libdnf @@ -107,6 +109,10 @@ 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 +Patch50: 0050-repo-Don-t-try-to-perform-labeling-if-SELinux-is-dis.patch BuildRequires: cmake @@ -131,6 +137,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 @@ -252,7 +261,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 @@ -266,7 +276,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 @@ -352,10 +363,21 @@ popd %endif %changelog +* Mon Jun 24 2024 Petr Pisar - 0.63.0-20 +- Do not set a default SELinux creation context if SELinux appears to be + disabled (RHEL-43231) + +* 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 Jul 26 2023 MSVSphere Packaging Team - 0.63.0-14 +* Wed Jul 26 2023 MSVSphere Packaging Team - 0.63-0-16 - Rebuilt for MSVSphere 8.8 * Wed May 31 2023 Nicola Sella - 0.63-0-16