diff --git a/.dnf.metadata b/.dnf.metadata index 9125cc8..8fa9d1a 100644 --- a/.dnf.metadata +++ b/.dnf.metadata @@ -1 +1 @@ -5941a49cfd466aeed4ec882a33647912c2a89245 SOURCES/dnf-4.4.2.tar.gz +f9c31cf46094c4bbf021e1872a9eb72d8a3f2136 SOURCES/dnf-4.7.0.tar.gz diff --git a/.gitignore b/.gitignore index 378380e..912e1fc 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/dnf-4.4.2.tar.gz +SOURCES/dnf-4.7.0.tar.gz diff --git a/SOURCES/0001-Set-top-level-directory-for-unittest.patch b/SOURCES/0001-Set-top-level-directory-for-unittest.patch new file mode 100644 index 0000000..7bb4f80 --- /dev/null +++ b/SOURCES/0001-Set-top-level-directory-for-unittest.patch @@ -0,0 +1,26 @@ +From 6eff0fe7850624791f049a17a41d779915f30f94 Mon Sep 17 00:00:00 2001 +From: Pavla Kratochvilova +Date: Wed, 19 May 2021 12:58:30 +0200 +Subject: [PATCH] Set top-level directory for unittest + +In some build environments, the top-level directory is not added to +the sys.path and the tests fail. This fixes the issue. +--- + tests/CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt +index 77a4894..b7f4031 100644 +--- a/tests/CMakeLists.txt ++++ b/tests/CMakeLists.txt +@@ -1,6 +1,6 @@ + ADD_TEST( + NAME test +- COMMAND ${PYTHON_EXECUTABLE} -m unittest discover -s tests ++ COMMAND ${PYTHON_EXECUTABLE} -m unittest discover -s tests -t ${PROJECT_SOURCE_DIR} + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) + + # For libdnf built with sanitizers, has no effect otherwise. +-- +libgit2 1.0.1 + diff --git a/SOURCES/0001-tests-SQL-write-a-readonly-folder.patch b/SOURCES/0001-tests-SQL-write-a-readonly-folder.patch deleted file mode 100644 index 39780f4..0000000 --- a/SOURCES/0001-tests-SQL-write-a-readonly-folder.patch +++ /dev/null @@ -1,45 +0,0 @@ -From 66e08009b8254462cb2c454ff2320355633c20d6 Mon Sep 17 00:00:00 2001 -From: Nicola Sella -Date: Tue, 10 Nov 2020 12:11:17 +0100 -Subject: [PATCH 1/1] [tests] SQL write a readonly folder - -fixes on rhel8.4 for test_dnf_base and test_dnf_db_group -libdnf._error.Error: SQLite error on "/var/lib/dnf/history.sqlite": -Executing an SQL statement failed: attempt to write a readonly -database - -=changelog= -msg: fixes SQL write a readonly folder -type: bugfix ---- - tests/api/test_dnf_base.py | 1 + - tests/api/test_dnf_db_group.py | 1 + - 2 files changed, 2 insertions(+) - -diff --git a/tests/api/test_dnf_base.py b/tests/api/test_dnf_base.py -index b1cf49fb..ca71b75c 100644 ---- a/tests/api/test_dnf_base.py -+++ b/tests/api/test_dnf_base.py -@@ -14,6 +14,7 @@ from .common import TOUR_4_4 - class DnfBaseApiTest(TestCase): - def setUp(self): - self.base = dnf.Base(dnf.conf.Conf()) -+ self.base.conf.persistdir = "/tmp/tests" - - def tearDown(self): - self.base.close() -diff --git a/tests/api/test_dnf_db_group.py b/tests/api/test_dnf_db_group.py -index 447fd121..e1828cb4 100644 ---- a/tests/api/test_dnf_db_group.py -+++ b/tests/api/test_dnf_db_group.py -@@ -12,6 +12,7 @@ from .common import TestCase - class DnfRPMTransactionApiTest(TestCase): - def setUp(self): - self.base = dnf.Base(dnf.conf.Conf()) -+ self.base.conf.persistdir = "/tmp/tests" - self.base.fill_sack(False, False) - self.base.resolve() - self.rpmTrans = self.base.transaction --- -2.26.2 - diff --git a/SOURCES/0002-Revert-Fix-setopt-cachedir-writing-outside-of-installroot.patch b/SOURCES/0002-Revert-Fix-setopt-cachedir-writing-outside-of-installroot.patch deleted file mode 100644 index a844311..0000000 --- a/SOURCES/0002-Revert-Fix-setopt-cachedir-writing-outside-of-installroot.patch +++ /dev/null @@ -1,26 +0,0 @@ -From c2e4901cec947e5be2e5ff5afa22691841d00bdc Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hr=C3=A1zk=C3=BD?= -Date: Tue, 10 Nov 2020 13:46:57 +0100 -Subject: [PATCH] Revert "Fix --setopt=cachedir writing outside of installroot" - -This reverts commit 70fffff61f7a006d406b46adc592d21a685c12a8. - -The commit breaks resetting excludes with an empty --exclude= CLI switch -if the excludes were set in the config file. ---- - dnf/cli/cli.py | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/dnf/cli/cli.py b/dnf/cli/cli.py -index b5f7bca07b..5878c2aa15 100644 ---- a/dnf/cli/cli.py -+++ b/dnf/cli/cli.py -@@ -974,6 +974,8 @@ def configure(self, args, option_parser=None): - - self.base.configure_plugins() - -+ self.base.conf._configure_from_options(opts) -+ - self.command.configure() - - if self.base.conf.destdir: diff --git a/SOURCES/0003-Post-transaction-summary-is-logged-for-API-users-RhBug-1855158.patch b/SOURCES/0003-Post-transaction-summary-is-logged-for-API-users-RhBug-1855158.patch deleted file mode 100644 index d34928f..0000000 --- a/SOURCES/0003-Post-transaction-summary-is-logged-for-API-users-RhBug-1855158.patch +++ /dev/null @@ -1,567 +0,0 @@ -From 9ed390d08a9f2b66f4e352532fa526fc64e329d4 Mon Sep 17 00:00:00 2001 -From: Marek Blaha -Date: Tue, 28 Jul 2020 09:50:10 +0200 -Subject: [PATCH 1/3] Remove unused loops attribute from - DepSolveProgressCallBack - ---- - dnf/cli/output.py | 5 ----- - 1 file changed, 5 deletions(-) - -diff --git a/dnf/cli/output.py b/dnf/cli/output.py -index de188ffbd1..44d5f8b89f 100644 ---- a/dnf/cli/output.py -+++ b/dnf/cli/output.py -@@ -1987,10 +1987,6 @@ def historyInfoCmdPkgsAltered(self, old, pats=[]): - class DepSolveProgressCallBack(dnf.callback.Depsolve): - """Provides text output callback functions for Dependency Solver callback.""" - -- def __init__(self): -- """requires yum-cli log and errorlog functions as arguments""" -- self.loops = 0 -- - def pkg_added(self, pkg, mode): - """Print information about a package being added to the - transaction set. -@@ -2037,7 +2033,6 @@ def start(self): - process. - """ - logger.debug(_('--> Starting dependency resolution')) -- self.loops += 1 - - def end(self): - """Output a message stating that dependency resolution has finished.""" - -From 0ee646f4965c597f2832ed3df9d9f0e6546dcc54 Mon Sep 17 00:00:00 2001 -From: Marek Blaha -Date: Wed, 21 Oct 2020 11:47:43 +0200 -Subject: [PATCH 2/3] Remove unused parameter of _make_lists() - ---- - dnf/cli/output.py | 7 ++++--- - 1 file changed, 4 insertions(+), 3 deletions(-) - -diff --git a/dnf/cli/output.py b/dnf/cli/output.py -index 44d5f8b89f..af8a968770 100644 ---- a/dnf/cli/output.py -+++ b/dnf/cli/output.py -@@ -52,7 +52,8 @@ - - logger = logging.getLogger('dnf') - --def _make_lists(transaction, goal): -+ -+def _make_lists(transaction): - b = dnf.util.Bunch({ - 'downgraded': [], - 'erased': [], -@@ -1101,7 +1102,7 @@ def list_transaction(self, transaction, total_width=None): - # in order to display module changes when RPM transaction is empty - transaction = [] - -- list_bunch = _make_lists(transaction, self.base._goal) -+ list_bunch = _make_lists(transaction) - pkglist_lines = [] - data = {'n' : {}, 'v' : {}, 'r' : {}} - a_wid = 0 # Arch can't get "that big" ... so always use the max. -@@ -1488,7 +1489,7 @@ def _tsi_or_pkg_nevra_cmp(item1, item2): - return (item1.arch > item2.arch) - (item1.arch < item2.arch) - - out = '' -- list_bunch = _make_lists(transaction, self.base._goal) -+ list_bunch = _make_lists(transaction) - - skipped_conflicts, skipped_broken = self._skipped_packages( - report_problems=False, transaction=transaction) - -From 865b7183453684de6a25e77fddf5a2d11fbffba8 Mon Sep 17 00:00:00 2001 -From: Marek Blaha -Date: Wed, 21 Oct 2020 17:59:46 +0200 -Subject: [PATCH 3/3] Post transaction summary is logged for API users - (RhBug:1855158) - -Post transaction summary is always logged into /var/log/dnf.log. -When transaction is called from cli, the summary is also printed to -stdout in columns (as previously). - -= changelog = -msg: Packages installed/removed via DNF API are logged into dnf.log -type: enhancement -resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1855158 ---- - dnf/base.py | 46 ++++++++++++- - dnf/cli/cli.py | 8 ++- - dnf/cli/output.py | 167 ++++++++-------------------------------------- - dnf/util.py | 102 +++++++++++++++++++++++++++- - 4 files changed, 177 insertions(+), 146 deletions(-) - -diff --git a/dnf/base.py b/dnf/base.py -index 075e74265a..c0d7712605 100644 ---- a/dnf/base.py -+++ b/dnf/base.py -@@ -28,12 +28,12 @@ - import dnf - import libdnf.transaction - -+from copy import deepcopy - from dnf.comps import CompsQuery - from dnf.i18n import _, P_, ucd - from dnf.util import _parse_specs - from dnf.db.history import SwdbInterface - from dnf.yum import misc --from functools import reduce - try: - from collections.abc import Sequence - except ImportError: -@@ -549,7 +549,7 @@ def _ts(self): - if self.conf.ignorearch: - self._rpm_probfilter.add(rpm.RPMPROB_FILTER_IGNOREARCH) - -- probfilter = reduce(operator.or_, self._rpm_probfilter, 0) -+ probfilter = functools.reduce(operator.or_, self._rpm_probfilter, 0) - self._priv_ts.setProbFilter(probfilter) - return self._priv_ts - -@@ -890,6 +890,15 @@ def do_transaction(self, display=()): - self._plugins.unload_removed_plugins(self.transaction) - self._plugins.run_transaction() - -+ # log post transaction summary -+ def _pto_callback(action, tsis): -+ msgs = [] -+ for tsi in tsis: -+ msgs.append('{}: {}'.format(action, str(tsi))) -+ return msgs -+ for msg in dnf.util._post_transaction_output(self, self.transaction, _pto_callback): -+ logger.debug(msg) -+ - return tid - - def _trans_error_summary(self, errstring): -@@ -1311,7 +1320,7 @@ def _do_package_lists(self, pkgnarrow='all', patterns=None, showdups=None, - if patterns is None or len(patterns) == 0: - return list_fn(None) - yghs = map(list_fn, patterns) -- return reduce(lambda a, b: a.merge_lists(b), yghs) -+ return functools.reduce(lambda a, b: a.merge_lists(b), yghs) - - def _list_pattern(self, pkgnarrow, pattern, showdups, ignore_case, - reponame=None): -@@ -2579,6 +2588,37 @@ def setup_loggers(self): - """ - self._logging._setup_from_dnf_conf(self.conf, file_loggers_only=True) - -+ def _skipped_packages(self, report_problems, transaction): -+ """returns set of conflicting packages and set of packages with broken dependency that would -+ be additionally installed when --best and --allowerasing""" -+ if self._goal.actions & (hawkey.INSTALL | hawkey.UPGRADE | hawkey.UPGRADE_ALL): -+ best = True -+ else: -+ best = False -+ ng = deepcopy(self._goal) -+ params = {"allow_uninstall": self._allow_erasing, -+ "force_best": best, -+ "ignore_weak": True} -+ ret = ng.run(**params) -+ if not ret and report_problems: -+ msg = dnf.util._format_resolve_problems(ng.problem_rules()) -+ logger.warning(msg) -+ problem_conflicts = set(ng.problem_conflicts(available=True)) -+ problem_dependency = set(ng.problem_broken_dependency(available=True)) - problem_conflicts -+ -+ def _nevra(item): -+ return hawkey.NEVRA(name=item.name, epoch=item.epoch, version=item.version, -+ release=item.release, arch=item.arch) -+ -+ # Sometimes, pkg is not in transaction item, therefore, comparing by nevra -+ transaction_nevras = [_nevra(tsi) for tsi in transaction] -+ skipped_conflicts = set( -+ [pkg for pkg in problem_conflicts if _nevra(pkg) not in transaction_nevras]) -+ skipped_dependency = set( -+ [pkg for pkg in problem_dependency if _nevra(pkg) not in transaction_nevras]) -+ -+ return skipped_conflicts, skipped_dependency -+ - - def _msg_installed(pkg): - name = ucd(pkg) -diff --git a/dnf/cli/cli.py b/dnf/cli/cli.py -index 0bc2c119d0..334000362c 100644 ---- a/dnf/cli/cli.py -+++ b/dnf/cli/cli.py -@@ -252,8 +252,12 @@ def do_transaction(self, display=()): - trans = None - - if trans: -- msg = self.output.post_transaction_output(trans) -- logger.info(msg) -+ # the post transaction summary is already written to log during -+ # Base.do_transaction() so here only print the messages to the -+ # user arranged in columns -+ print() -+ print('\n'.join(self.output.post_transaction_output(trans))) -+ print() - for tsi in trans: - if tsi.state == libdnf.transaction.TransactionItemState_ERROR: - raise dnf.exceptions.Error(_('Transaction failed')) -diff --git a/dnf/cli/output.py b/dnf/cli/output.py -index af8a968770..6d729b63ba 100644 ---- a/dnf/cli/output.py -+++ b/dnf/cli/output.py -@@ -21,9 +21,7 @@ - from __future__ import print_function - from __future__ import unicode_literals - --from copy import deepcopy - import fnmatch --import functools - import hawkey - import itertools - import libdnf.transaction -@@ -53,51 +51,6 @@ - logger = logging.getLogger('dnf') - - --def _make_lists(transaction): -- b = dnf.util.Bunch({ -- 'downgraded': [], -- 'erased': [], -- 'erased_clean': [], -- 'erased_dep': [], -- 'installed': [], -- 'installed_group': [], -- 'installed_dep': [], -- 'installed_weak': [], -- 'reinstalled': [], -- 'upgraded': [], -- 'failed': [], -- }) -- -- for tsi in transaction: -- if tsi.state == libdnf.transaction.TransactionItemState_ERROR: -- b.failed.append(tsi) -- elif tsi.action == libdnf.transaction.TransactionItemAction_DOWNGRADE: -- b.downgraded.append(tsi) -- elif tsi.action == libdnf.transaction.TransactionItemAction_INSTALL: -- if tsi.reason == libdnf.transaction.TransactionItemReason_GROUP: -- b.installed_group.append(tsi) -- elif tsi.reason == libdnf.transaction.TransactionItemReason_DEPENDENCY: -- b.installed_dep.append(tsi) -- elif tsi.reason == libdnf.transaction.TransactionItemReason_WEAK_DEPENDENCY: -- b.installed_weak.append(tsi) -- else: -- # TransactionItemReason_USER -- b.installed.append(tsi) -- elif tsi.action == libdnf.transaction.TransactionItemAction_REINSTALL: -- b.reinstalled.append(tsi) -- elif tsi.action == libdnf.transaction.TransactionItemAction_REMOVE: -- if tsi.reason == libdnf.transaction.TransactionItemReason_CLEAN: -- b.erased_clean.append(tsi) -- elif tsi.reason == libdnf.transaction.TransactionItemReason_DEPENDENCY: -- b.erased_dep.append(tsi) -- else: -- b.erased.append(tsi) -- elif tsi.action == libdnf.transaction.TransactionItemAction_UPGRADE: -- b.upgraded.append(tsi) -- -- return b -- -- - def _spread_in_columns(cols_count, label, lst): - left = itertools.chain((label,), itertools.repeat('')) - lst_length = len(lst) -@@ -1057,37 +1010,6 @@ def list_group_transaction(self, comps, history, diff): - out[0:0] = self._banner(col_data, (_('Group'), _('Packages'), '', '')) - return '\n'.join(out) - -- def _skipped_packages(self, report_problems, transaction): -- """returns set of conflicting packages and set of packages with broken dependency that would -- be additionally installed when --best and --allowerasing""" -- if self.base._goal.actions & (hawkey.INSTALL | hawkey.UPGRADE | hawkey.UPGRADE_ALL): -- best = True -- else: -- best = False -- ng = deepcopy(self.base._goal) -- params = {"allow_uninstall": self.base._allow_erasing, -- "force_best": best, -- "ignore_weak": True} -- ret = ng.run(**params) -- if not ret and report_problems: -- msg = dnf.util._format_resolve_problems(ng.problem_rules()) -- logger.warning(msg) -- problem_conflicts = set(ng.problem_conflicts(available=True)) -- problem_dependency = set(ng.problem_broken_dependency(available=True)) - problem_conflicts -- -- def _nevra(item): -- return hawkey.NEVRA(name=item.name, epoch=item.epoch, version=item.version, -- release=item.release, arch=item.arch) -- -- # Sometimes, pkg is not in transaction item, therefore, comparing by nevra -- transaction_nevras = [_nevra(tsi) for tsi in transaction] -- skipped_conflicts = set( -- [pkg for pkg in problem_conflicts if _nevra(pkg) not in transaction_nevras]) -- skipped_dependency = set( -- [pkg for pkg in problem_dependency if _nevra(pkg) not in transaction_nevras]) -- -- return skipped_conflicts, skipped_dependency -- - def list_transaction(self, transaction, total_width=None): - """Return a string representation of the transaction in an - easy-to-read format. -@@ -1102,7 +1024,7 @@ def list_transaction(self, transaction, total_width=None): - # in order to display module changes when RPM transaction is empty - transaction = [] - -- list_bunch = _make_lists(transaction) -+ list_bunch = dnf.util._make_lists(transaction) - pkglist_lines = [] - data = {'n' : {}, 'v' : {}, 'r' : {}} - a_wid = 0 # Arch can't get "that big" ... so always use the max. -@@ -1271,7 +1193,7 @@ def format_line(group): - # show skipped conflicting packages - if not self.conf.best and self.base._goal.actions & forward_actions: - lines = [] -- skipped_conflicts, skipped_broken = self._skipped_packages( -+ skipped_conflicts, skipped_broken = self.base._skipped_packages( - report_problems=True, transaction=transaction) - skipped_broken = dict((str(pkg), pkg) for pkg in skipped_broken) - for pkg in sorted(skipped_conflicts): -@@ -1436,13 +1358,8 @@ def format_line(group): - max_msg_count, count, msg_pkgs)) - return ''.join(out) - -- def post_transaction_output(self, transaction): -- """Returns a human-readable summary of the results of the -- transaction. - -- :return: a string containing a human-readable summary of the -- results of the transaction -- """ -+ def _pto_callback(self, action, tsis): - # Works a bit like calcColumns, but we never overflow a column we just - # have a dynamic number of columns. - def _fits_in_cols(msgs, num): -@@ -1472,61 +1389,33 @@ def _fits_in_cols(msgs, num): - col_lens[col] *= -1 - return col_lens - -- def _tsi_or_pkg_nevra_cmp(item1, item2): -- """Compares two transaction items or packages by nevra. -- Used as a fallback when tsi does not contain package object. -- """ -- ret = (item1.name > item2.name) - (item1.name < item2.name) -- if ret != 0: -- return ret -- nevra1 = hawkey.NEVRA(name=item1.name, epoch=item1.epoch, version=item1.version, -- release=item1.release, arch=item1.arch) -- nevra2 = hawkey.NEVRA(name=item2.name, epoch=item2.epoch, version=item2.version, -- release=item2.release, arch=item2.arch) -- ret = nevra1.evr_cmp(nevra2, self.sack) -- if ret != 0: -- return ret -- return (item1.arch > item2.arch) - (item1.arch < item2.arch) -- -- out = '' -- list_bunch = _make_lists(transaction) -- -- skipped_conflicts, skipped_broken = self._skipped_packages( -- report_problems=False, transaction=transaction) -- skipped = skipped_conflicts.union(skipped_broken) -- -- for (action, tsis) in [(_('Upgraded'), list_bunch.upgraded), -- (_('Downgraded'), list_bunch.downgraded), -- (_('Installed'), list_bunch.installed + -- list_bunch.installed_group + -- list_bunch.installed_weak + -- list_bunch.installed_dep), -- (_('Reinstalled'), list_bunch.reinstalled), -- (_('Skipped'), skipped), -- (_('Removed'), list_bunch.erased + -- list_bunch.erased_dep + -- list_bunch.erased_clean), -- (_('Failed'), list_bunch.failed)]: -- if not tsis: -- continue -- msgs = [] -- out += '\n%s:\n' % action -- for tsi in sorted(tsis, key=functools.cmp_to_key(_tsi_or_pkg_nevra_cmp)): -- msgs.append(str(tsi)) -- for num in (8, 7, 6, 5, 4, 3, 2): -- cols = _fits_in_cols(msgs, num) -- if cols: -- break -- if not cols: -- cols = [-(self.term.columns - 2)] -- while msgs: -- current_msgs = msgs[:len(cols)] -- out += ' ' -- out += self.fmtColumns(zip(current_msgs, cols), end=u'\n') -- msgs = msgs[len(cols):] -- -+ if not tsis: -+ return '' -+ out = [] -+ msgs = [] -+ out.append('{}:'.format(action)) -+ for tsi in tsis: -+ msgs.append(str(tsi)) -+ for num in (8, 7, 6, 5, 4, 3, 2): -+ cols = _fits_in_cols(msgs, num) -+ if cols: -+ break -+ if not cols: -+ cols = [-(self.term.columns - 2)] -+ while msgs: -+ current_msgs = msgs[:len(cols)] -+ out.append(' {}'.format(self.fmtColumns(zip(current_msgs, cols)))) -+ msgs = msgs[len(cols):] - return out - -+ -+ def post_transaction_output(self, transaction): -+ """ -+ Return a human-readable summary of the transaction. Packages in sections -+ are arranged to columns. -+ """ -+ return dnf.util._post_transaction_output(self.base, transaction, self._pto_callback) -+ - def setup_progress_callbacks(self): - """Set up the progress callbacks and various - output bars based on debug level. -diff --git a/dnf/util.py b/dnf/util.py -index 8cf362706d..0beb04424d 100644 ---- a/dnf/util.py -+++ b/dnf/util.py -@@ -24,13 +24,14 @@ - - from .pycomp import PY3, basestring - from dnf.i18n import _, ucd --from functools import reduce - import argparse - import dnf - import dnf.callback - import dnf.const - import dnf.pycomp - import errno -+import functools -+import hawkey - import itertools - import locale - import logging -@@ -41,6 +42,7 @@ - import tempfile - import time - import libdnf.repo -+import libdnf.transaction - - logger = logging.getLogger('dnf') - -@@ -195,7 +197,7 @@ def group_by_filter(fn, iterable): - def splitter(acc, item): - acc[not bool(fn(item))].append(item) - return acc -- return reduce(splitter, iterable, ([], [])) -+ return functools.reduce(splitter, iterable, ([], [])) - - def insert_if(item, iterable, condition): - """Insert an item into an iterable by a condition.""" -@@ -504,3 +506,99 @@ def __setattr__(self, what, val): - def setter(item): - setattr(item, what, val) - return list(map(setter, self)) -+ -+ -+def _make_lists(transaction): -+ b = Bunch({ -+ 'downgraded': [], -+ 'erased': [], -+ 'erased_clean': [], -+ 'erased_dep': [], -+ 'installed': [], -+ 'installed_group': [], -+ 'installed_dep': [], -+ 'installed_weak': [], -+ 'reinstalled': [], -+ 'upgraded': [], -+ 'failed': [], -+ }) -+ -+ for tsi in transaction: -+ if tsi.state == libdnf.transaction.TransactionItemState_ERROR: -+ b.failed.append(tsi) -+ elif tsi.action == libdnf.transaction.TransactionItemAction_DOWNGRADE: -+ b.downgraded.append(tsi) -+ elif tsi.action == libdnf.transaction.TransactionItemAction_INSTALL: -+ if tsi.reason == libdnf.transaction.TransactionItemReason_GROUP: -+ b.installed_group.append(tsi) -+ elif tsi.reason == libdnf.transaction.TransactionItemReason_DEPENDENCY: -+ b.installed_dep.append(tsi) -+ elif tsi.reason == libdnf.transaction.TransactionItemReason_WEAK_DEPENDENCY: -+ b.installed_weak.append(tsi) -+ else: -+ # TransactionItemReason_USER -+ b.installed.append(tsi) -+ elif tsi.action == libdnf.transaction.TransactionItemAction_REINSTALL: -+ b.reinstalled.append(tsi) -+ elif tsi.action == libdnf.transaction.TransactionItemAction_REMOVE: -+ if tsi.reason == libdnf.transaction.TransactionItemReason_CLEAN: -+ b.erased_clean.append(tsi) -+ elif tsi.reason == libdnf.transaction.TransactionItemReason_DEPENDENCY: -+ b.erased_dep.append(tsi) -+ else: -+ b.erased.append(tsi) -+ elif tsi.action == libdnf.transaction.TransactionItemAction_UPGRADE: -+ b.upgraded.append(tsi) -+ -+ return b -+ -+ -+def _post_transaction_output(base, transaction, action_callback): -+ """Returns a human-readable summary of the results of the -+ transaction. -+ -+ :param action_callback: function generating output for specific action. It -+ takes two parameters - action as a string and list of affected packages for -+ this action -+ :return: a list of lines containing a human-readable summary of the -+ results of the transaction -+ """ -+ def _tsi_or_pkg_nevra_cmp(item1, item2): -+ """Compares two transaction items or packages by nevra. -+ Used as a fallback when tsi does not contain package object. -+ """ -+ ret = (item1.name > item2.name) - (item1.name < item2.name) -+ if ret != 0: -+ return ret -+ nevra1 = hawkey.NEVRA(name=item1.name, epoch=item1.epoch, version=item1.version, -+ release=item1.release, arch=item1.arch) -+ nevra2 = hawkey.NEVRA(name=item2.name, epoch=item2.epoch, version=item2.version, -+ release=item2.release, arch=item2.arch) -+ ret = nevra1.evr_cmp(nevra2, base.sack) -+ if ret != 0: -+ return ret -+ return (item1.arch > item2.arch) - (item1.arch < item2.arch) -+ -+ list_bunch = dnf.util._make_lists(transaction) -+ -+ skipped_conflicts, skipped_broken = base._skipped_packages( -+ report_problems=False, transaction=transaction) -+ skipped = skipped_conflicts.union(skipped_broken) -+ -+ out = [] -+ for (action, tsis) in [(_('Upgraded'), list_bunch.upgraded), -+ (_('Downgraded'), list_bunch.downgraded), -+ (_('Installed'), list_bunch.installed + -+ list_bunch.installed_group + -+ list_bunch.installed_weak + -+ list_bunch.installed_dep), -+ (_('Reinstalled'), list_bunch.reinstalled), -+ (_('Skipped'), skipped), -+ (_('Removed'), list_bunch.erased + -+ list_bunch.erased_dep + -+ list_bunch.erased_clean), -+ (_('Failed'), list_bunch.failed)]: -+ out.extend(action_callback( -+ action, sorted(tsis, key=functools.cmp_to_key(_tsi_or_pkg_nevra_cmp)))) -+ -+ return out diff --git a/SOURCES/0004-Log-scriptlets-output-also-for-API-users-RhBug-1847340.patch b/SOURCES/0004-Log-scriptlets-output-also-for-API-users-RhBug-1847340.patch deleted file mode 100644 index 8447353..0000000 --- a/SOURCES/0004-Log-scriptlets-output-also-for-API-users-RhBug-1847340.patch +++ /dev/null @@ -1,130 +0,0 @@ -From df64fd36d7fefe39a96fea3f41e35785bebd37ec Mon Sep 17 00:00:00 2001 -From: Marek Blaha -Date: Wed, 2 Dec 2020 16:33:26 +0100 -Subject: [PATCH 1/2] Log scriptlets output also for API users (RhBug:1847340) - -Messages logged into /var/log/dnf.rpm.log are now the same for both -command line and API usage. - -https://bugzilla.redhat.com/show_bug.cgi?id=1847340 ---- - dnf/cli/output.py | 7 +------ - dnf/yum/rpmtrans.py | 9 ++++++++- - 2 files changed, 9 insertions(+), 7 deletions(-) - -diff --git a/dnf/cli/output.py b/dnf/cli/output.py -index 51d6829ca6..86260661fc 100644 ---- a/dnf/cli/output.py -+++ b/dnf/cli/output.py -@@ -2151,12 +2151,7 @@ def error(self, message): - pass - - def scriptout(self, msgs): -- """Print messages originating from a package script. -- -- :param msgs: the messages coming from the script -- """ -- if msgs: -- self.rpm_logger.info(ucd(msgs)) -+ pass - - def _makefmt(self, percent, ts_done, ts_total, progress=True, - pkgname=None, wid1=15): -diff --git a/dnf/yum/rpmtrans.py b/dnf/yum/rpmtrans.py -index 447639a476..d6c549d2ed 100644 ---- a/dnf/yum/rpmtrans.py -+++ b/dnf/yum/rpmtrans.py -@@ -113,7 +113,10 @@ def progress(self, package, action, ti_done, ti_total, ts_done, ts_total): - pass - - def scriptout(self, msgs): -- """msgs is the messages that were output (if any).""" -+ """Hook for reporting an rpm scriptlet output. -+ -+ :param msgs: the scriptlet output -+ """ - pass - - def error(self, message): -@@ -156,6 +159,10 @@ def filelog(self, package, action): - msg = '%s: %s' % (action_str, package) - self.rpm_logger.log(dnf.logging.SUBDEBUG, msg) - -+ def scriptout(self, msgs): -+ if msgs: -+ self.rpm_logger.info(ucd(msgs)) -+ - - class RPMTransaction(object): - def __init__(self, base, test=False, displays=()): - -From ee6ffcf640180b2b08d2db50b4b81d2bdefb1f2f Mon Sep 17 00:00:00 2001 -From: Marek Blaha -Date: Thu, 3 Dec 2020 10:08:09 +0100 -Subject: [PATCH 2/2] Straighten inheritance of *Display classes - ---- - dnf/cli/output.py | 15 +++------------ - dnf/yum/rpmtrans.py | 2 +- - 2 files changed, 4 insertions(+), 13 deletions(-) - -diff --git a/dnf/cli/output.py b/dnf/cli/output.py -index 86260661fc..de188ffbd1 100644 ---- a/dnf/cli/output.py -+++ b/dnf/cli/output.py -@@ -37,7 +37,7 @@ - from dnf.cli.format import format_number, format_time - from dnf.i18n import _, C_, P_, ucd, fill_exact_width, textwrap_fill, exact_width, select_short_long - from dnf.pycomp import xrange, basestring, long, unicode, sys_maxsize --from dnf.yum.rpmtrans import LoggingTransactionDisplay -+from dnf.yum.rpmtrans import TransactionDisplay - from dnf.db.history import MergedTransactionWrapper - import dnf.base - import dnf.callback -@@ -2071,7 +2071,7 @@ def short_id(id): - return self.output.userconfirm() - - --class CliTransactionDisplay(LoggingTransactionDisplay): -+class CliTransactionDisplay(TransactionDisplay): - """A YUM specific callback class for RPM operations.""" - - width = property(lambda self: dnf.cli.term._term_width()) -@@ -2093,7 +2093,7 @@ def progress(self, package, action, ti_done, ti_total, ts_done, ts_total): - :param package: the package involved in the event - :param action: the type of action that is taking place. Valid - values are given by -- :func:`rpmtrans.LoggingTransactionDisplay.action.keys()` -+ :func:`rpmtrans.TransactionDisplay.action.keys()` - :param ti_done: a number representing the amount of work - already done in the current transaction - :param ti_total: a number representing the total amount of work -@@ -2144,15 +2144,6 @@ def _out_progress(self, ti_done, ti_total, ts_done, ts_total, - if ti_done == ti_total: - print(" ") - -- def filelog(self, package, action): -- pass -- -- def error(self, message): -- pass -- -- def scriptout(self, msgs): -- pass -- - def _makefmt(self, percent, ts_done, ts_total, progress=True, - pkgname=None, wid1=15): - l = len(str(ts_total)) -diff --git a/dnf/yum/rpmtrans.py b/dnf/yum/rpmtrans.py -index d6c549d2ed..51fa921d3e 100644 ---- a/dnf/yum/rpmtrans.py -+++ b/dnf/yum/rpmtrans.py -@@ -143,7 +143,7 @@ def error(self, message): - dnf.util._terminal_messenger('print', message, sys.stderr) - - --class LoggingTransactionDisplay(ErrorTransactionDisplay): -+class LoggingTransactionDisplay(TransactionDisplay): - ''' - Base class for a RPMTransaction display callback class - ''' diff --git a/SOURCES/0005-dnf-history-operations-that-work-with-comps-correctly.patch b/SOURCES/0005-dnf-history-operations-that-work-with-comps-correctly.patch deleted file mode 100644 index 233a2fc..0000000 --- a/SOURCES/0005-dnf-history-operations-that-work-with-comps-correctly.patch +++ /dev/null @@ -1,1411 +0,0 @@ -From b9a8226185f3ab58e3551b315af2b11a8b2f2ebe Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hr=C3=A1zk=C3=BD?= -Date: Tue, 8 Sep 2020 17:02:59 +0200 -Subject: [PATCH 01/17] Add a get_current() method to SwdbInterface - -The method returns the transaction that is currently being created in -Swdb, before it is stored to sqlite. ---- - VERSION.cmake | 2 +- - dnf.spec | 2 +- - dnf/db/history.py | 3 +++ - 3 files changed, 5 insertions(+), 2 deletions(-) - -diff --git a/dnf/db/history.py b/dnf/db/history.py -index 4d355f95..994cdb01 100644 ---- a/dnf/db/history.py -+++ b/dnf/db/history.py -@@ -381,6 +381,9 @@ class SwdbInterface(object): - prev_trans.altered_gt_rpmdb = True - return result[::-1] - -+ def get_current(self): -+ return TransactionWrapper(self.swdb.getCurrent()) -+ - def set_reason(self, pkg, reason): - """Set reason for package""" - rpm_item = self.rpm._pkg_to_swdb_rpm_item(pkg) --- -2.26.2 - - -From 3bcf90aadfea98da1397b570fcb3ecc20a89c15d Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hr=C3=A1zk=C3=BD?= -Date: Fri, 2 Oct 2020 15:52:19 +0200 -Subject: [PATCH 02/17] transaction-sr: Prefer installing from the original - transaction repository - -In case a package exists in the same repo_id as from which it was -originally installed, prefer the package from that repo when replaying -the transaction. - -Makes a difference in e.g. the system-upgrade plugin, where it ensures -the package is installed from the same repo from which it was downloaded -during the download step. ---- - dnf/transaction_sr.py | 13 +++++++++++++ - 1 file changed, 13 insertions(+) - -diff --git a/dnf/transaction_sr.py b/dnf/transaction_sr.py -index 9b9b0749..45ca2ef7 100644 ---- a/dnf/transaction_sr.py -+++ b/dnf/transaction_sr.py -@@ -257,6 +257,7 @@ class TransactionReplay(object): - try: - action = pkg_data["action"] - nevra = pkg_data["nevra"] -+ repo_id = pkg_data["repo_id"] - reason = libdnf.transaction.StringToTransactionItemReason(pkg_data["reason"]) - except KeyError as e: - raise TransactionError( -@@ -282,6 +283,18 @@ class TransactionReplay(object): - epoch = parsed_nevra.epoch if parsed_nevra.epoch is not None else 0 - query = query_na.filter(epoch=epoch, version=parsed_nevra.version, release=parsed_nevra.release) - -+ # In case the package is found in the same repo as in the original -+ # transaction, limit the query to that plus installed packages. IOW -+ # remove packages with the same NEVRA in case they are found in -+ # multiple repos and the repo the package came from originally is one -+ # of them. -+ # This can e.g. make a difference in the system-upgrade plugin, in case -+ # the same NEVRA is in two repos, this makes sure the same repo is used -+ # for both download and upgrade steps of the plugin. -+ query_repo = query.filter(reponame=repo_id) -+ if query_repo: -+ query = query_repo.union(query.installed()) -+ - if not query: - self._raise_or_warn(self._skip_unavailable, _('Cannot find rpm nevra "{nevra}".').format(nevra=nevra)) - return --- -2.26.2 - - -From acfd6310131769f33165c8de1d064889a80fc259 Mon Sep 17 00:00:00 2001 -From: Daniel Mach -Date: Tue, 24 Nov 2020 10:57:21 +0100 -Subject: [PATCH 03/17] transaction_sr: Enable loading transactions from dict - ---- - dnf/cli/commands/history.py | 2 +- - dnf/transaction_sr.py | 42 +++++++++++++++++++++++++------------ - 2 files changed, 30 insertions(+), 14 deletions(-) - -diff --git a/dnf/cli/commands/history.py b/dnf/cli/commands/history.py -index e381f902..0a6dad9b 100644 ---- a/dnf/cli/commands/history.py -+++ b/dnf/cli/commands/history.py -@@ -270,7 +270,7 @@ class HistoryCommand(commands.Command): - - self.replay = TransactionReplay( - self.base, -- self.opts.transaction_filename, -+ filename=self.opts.transaction_filename, - ignore_installed = self.opts.ignore_installed, - ignore_extras = self.opts.ignore_extras, - skip_unavailable = self.opts.skip_unavailable -diff --git a/dnf/transaction_sr.py b/dnf/transaction_sr.py -index 45ca2ef7..e6b06665 100644 ---- a/dnf/transaction_sr.py -+++ b/dnf/transaction_sr.py -@@ -187,21 +187,23 @@ class TransactionReplay(object): - def __init__( - self, - base, -- fn, -+ filename="", -+ data=None, - ignore_extras=False, - ignore_installed=False, - skip_unavailable=False - ): - """ - :param base: the dnf base -- :param fn: the filename to load the transaction from -+ :param filename: the filename to load the transaction from (conflicts with the 'data' argument) -+ :param data: the dictionary to load the transaction from (conflicts with the 'filename' argument) - :param ignore_extras: whether to ignore extra package pulled into the transaction - :param ignore_installed: whether to ignore installed versions of packages - :param skip_unavailable: whether to skip transaction packages that aren't available - """ - - self._base = base -- self._filename = fn -+ self._filename = filename - self._ignore_installed = ignore_installed - self._ignore_extras = ignore_extras - self._skip_unavailable = skip_unavailable -@@ -213,25 +215,39 @@ class TransactionReplay(object): - self._nevra_reason_cache = {} - self._warnings = [] - -+ if filename and data: -+ raise ValueError(_("Conflicting TransactionReplay arguments have been specified: filename, data")) -+ elif filename: -+ self._load_from_file(filename) -+ else: -+ self._load_from_data(data) -+ -+ -+ def _load_from_file(self, fn): -+ self._filename = fn - with open(fn, "r") as f: - try: -- self._replay_data = json.load(f) -+ replay_data = json.load(f) - except json.decoder.JSONDecodeError as e: - raise TransactionFileError(fn, str(e) + ".") - - try: -- self._verify_toplevel_json(self._replay_data) -+ self._load_from_data(replay_data) -+ except TransactionError as e: -+ raise TransactionFileError(fn, e) - -- self._rpms = self._replay_data.get("rpms", []) -- self._assert_type(self._rpms, list, "rpms", "array") -+ def _load_from_data(self, data): -+ self._replay_data = data -+ self._verify_toplevel_json(self._replay_data) - -- self._groups = self._replay_data.get("groups", []) -- self._assert_type(self._groups, list, "groups", "array") -+ self._rpms = self._replay_data.get("rpms", []) -+ self._assert_type(self._rpms, list, "rpms", "array") - -- self._environments = self._replay_data.get("environments", []) -- self._assert_type(self._environments, list, "environments", "array") -- except TransactionError as e: -- raise TransactionFileError(fn, e) -+ self._groups = self._replay_data.get("groups", []) -+ self._assert_type(self._groups, list, "groups", "array") -+ -+ self._environments = self._replay_data.get("environments", []) -+ self._assert_type(self._environments, list, "environments", "array") - - def _raise_or_warn(self, warn_only, msg): - if warn_only: --- -2.26.2 - - -From 90d4a2fd72b30b295adcb6da66b8043a70561b33 Mon Sep 17 00:00:00 2001 -From: Daniel Mach -Date: Fri, 20 Nov 2020 19:36:49 +0100 -Subject: [PATCH 04/17] transaction_sr: Store exception attributes for future - use - ---- - dnf/transaction_sr.py | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/dnf/transaction_sr.py b/dnf/transaction_sr.py -index e6b06665..36787de4 100644 ---- a/dnf/transaction_sr.py -+++ b/dnf/transaction_sr.py -@@ -55,6 +55,10 @@ class TransactionFileError(dnf.exceptions.Error): - :param errors: a list of error classes or a string with an error description - """ - -+ # store args in case someone wants to read them from a caught exception -+ self.filename = filename -+ self.errors = errors -+ - if isinstance(errors, (list, tuple)): - if len(errors) > 1: - msg = _('Errors in "{filename}":').format(filename=filename) --- -2.26.2 - - -From 0ffa7ed9ea73035acaec2c4f916d967701fddda2 Mon Sep 17 00:00:00 2001 -From: Daniel Mach -Date: Fri, 20 Nov 2020 19:04:59 +0100 -Subject: [PATCH 05/17] transaction_sr: Handle serialize_transaction(None) - ---- - dnf/transaction_sr.py | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/dnf/transaction_sr.py b/dnf/transaction_sr.py -index 36787de4..41ddee1f 100644 ---- a/dnf/transaction_sr.py -+++ b/dnf/transaction_sr.py -@@ -120,6 +120,9 @@ def serialize_transaction(transaction): - groups = [] - environments = [] - -+ if transaction is None: -+ return data -+ - for tsi in transaction.packages(): - if tsi.is_package(): - rpms.append({ --- -2.26.2 - - -From c4bae459caef1d5128bd7ed43fcbb749608449f4 Mon Sep 17 00:00:00 2001 -From: Daniel Mach -Date: Mon, 23 Nov 2020 16:23:53 +0100 -Subject: [PATCH 06/17] transaction_sr: Skip preferred repo lookup if repoid is - empty - ---- - dnf/transaction_sr.py | 7 ++++--- - 1 file changed, 4 insertions(+), 3 deletions(-) - -diff --git a/dnf/transaction_sr.py b/dnf/transaction_sr.py -index 41ddee1f..9926bebd 100644 ---- a/dnf/transaction_sr.py -+++ b/dnf/transaction_sr.py -@@ -314,9 +314,10 @@ class TransactionReplay(object): - # This can e.g. make a difference in the system-upgrade plugin, in case - # the same NEVRA is in two repos, this makes sure the same repo is used - # for both download and upgrade steps of the plugin. -- query_repo = query.filter(reponame=repo_id) -- if query_repo: -- query = query_repo.union(query.installed()) -+ if repo_id: -+ query_repo = query.filter(reponame=repo_id) -+ if query_repo: -+ query = query_repo.union(query.installed()) - - if not query: - self._raise_or_warn(self._skip_unavailable, _('Cannot find rpm nevra "{nevra}".').format(nevra=nevra)) --- -2.26.2 - - -From 3f82f871170be871ce8ec9d509306d751890ac9e Mon Sep 17 00:00:00 2001 -From: Daniel Mach -Date: Fri, 20 Nov 2020 17:44:28 +0100 -Subject: [PATCH 07/17] history: Refactor redo code to use transaction - store/replay - -= changelog = -msg: Support comps groups in history redo -type: enhancement -resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1657123 -resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1809565 -resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1809639 ---- - dnf/cli/commands/history.py | 40 +++++++++++++++---------------------- - 1 file changed, 16 insertions(+), 24 deletions(-) - -diff --git a/dnf/cli/commands/history.py b/dnf/cli/commands/history.py -index 0a6dad9b..c28a136a 100644 ---- a/dnf/cli/commands/history.py -+++ b/dnf/cli/commands/history.py -@@ -120,6 +120,10 @@ class HistoryCommand(commands.Command): - if not self.opts.transactions: - raise dnf.cli.CliError(_('No transaction ID or package name given.')) - elif self.opts.transactions_action in ['redo', 'undo', 'rollback']: -+ demands.available_repos = True -+ demands.resolving = True -+ demands.root_user = True -+ - self._require_one_transaction_id = True - if not self.opts.transactions: - msg = _('No transaction ID or package name given.') -@@ -157,28 +161,16 @@ class HistoryCommand(commands.Command): - old = self.base.history_get_transaction(extcmds) - if old is None: - return 1, ['Failed history redo'] -- tm = dnf.util.normalize_time(old.beg_timestamp) -- print('Repeating transaction %u, from %s' % (old.tid, tm)) -- self.output.historyInfoCmdPkgsAltered(old) -- -- for i in old.packages(): -- pkgs = list(self.base.sack.query().filter(nevra=str(i), reponame=i.from_repo)) -- if i.action in dnf.transaction.FORWARD_ACTIONS: -- if not pkgs: -- logger.info(_('No package %s available.'), -- self.output.term.bold(ucd(str(i)))) -- return 1, ['An operation cannot be redone'] -- pkg = pkgs[0] -- self.base.install(str(pkg)) -- elif i.action == libdnf.transaction.TransactionItemAction_REMOVE: -- if not pkgs: -- # package was removed already, we can skip removing it again -- continue -- pkg = pkgs[0] -- self.base.remove(str(pkg)) -- -- self.base.resolve() -- self.base.do_transaction() -+ -+ data = serialize_transaction(old) -+ self.replay = TransactionReplay( -+ self.base, -+ data=data, -+ ignore_installed=True, -+ ignore_extras=True, -+ skip_unavailable=self.opts.skip_unavailable -+ ) -+ self.replay.run() - - def _hcmd_undo(self, extcmds): - try: -@@ -326,13 +318,13 @@ class HistoryCommand(commands.Command): - raise dnf.exceptions.Error(strs[0]) - - def run_resolved(self): -- if self.opts.transactions_action != "replay": -+ if self.opts.transactions_action not in ("replay", "redo"): - return - - self.replay.post_transaction() - - def run_transaction(self): -- if self.opts.transactions_action != "replay": -+ if self.opts.transactions_action not in ("replay", "redo"): - return - - warnings = self.replay.get_warnings() --- -2.26.2 - - -From d1b78ba8449b319121b5208c5b39609b1c6b61de Mon Sep 17 00:00:00 2001 -From: Daniel Mach -Date: Fri, 20 Nov 2020 19:07:50 +0100 -Subject: [PATCH 08/17] history: Refactor rollback code to use transaction - store/replay - -= changelog = -msg: Support comps groups in history rollback -type: enhancement -resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1657123 -resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1809565 -resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1809639 ---- - dnf/cli/cli.py | 56 ----------------------------- - dnf/cli/commands/history.py | 72 ++++++++++++++++++++++++++++++++++--- - 2 files changed, 67 insertions(+), 61 deletions(-) - -diff --git a/dnf/cli/cli.py b/dnf/cli/cli.py -index cd720a97..36671fd8 100644 ---- a/dnf/cli/cli.py -+++ b/dnf/cli/cli.py -@@ -627,62 +627,6 @@ class BaseCli(dnf.Base): - logger.critical(_('Found more than one transaction ID!')) - return old[0] - -- def history_rollback_transaction(self, extcmd): -- """Rollback given transaction.""" -- old = self.history_get_transaction((extcmd,)) -- if old is None: -- return 1, ['Failed history rollback, no transaction'] -- last = self.history.last() -- if last is None: -- return 1, ['Failed history rollback, no last?'] -- if old.tid == last.tid: -- return 0, ['Rollback to current, nothing to do'] -- -- mobj = None -- for trans in self.history.old(list(range(old.tid + 1, last.tid + 1))): -- if trans.altered_lt_rpmdb: -- logger.warning(_('Transaction history is incomplete, before %u.'), trans.tid) -- elif trans.altered_gt_rpmdb: -- logger.warning(_('Transaction history is incomplete, after %u.'), trans.tid) -- -- if mobj is None: -- mobj = dnf.db.history.MergedTransactionWrapper(trans) -- else: -- mobj.merge(trans) -- -- tm = dnf.util.normalize_time(old.beg_timestamp) -- print("Rollback to transaction %u, from %s" % (old.tid, tm)) -- print(self.output.fmtKeyValFill(" Undoing the following transactions: ", -- ", ".join((str(x) for x in mobj.tids())))) -- self.output.historyInfoCmdPkgsAltered(mobj) # :todo -- --# history = dnf.history.open_history(self.history) # :todo --# m = libdnf.transaction.MergedTransaction() -- --# return -- --# operations = dnf.history.NEVRAOperations() --# for id_ in range(old.tid + 1, last.tid + 1): --# operations += history.transaction_nevra_ops(id_) -- -- try: -- self._history_undo_operations(mobj, old.tid + 1, True, strict=self.conf.strict) -- except dnf.exceptions.PackagesNotInstalledError as err: -- raise -- logger.info(_('No package %s installed.'), -- self.output.term.bold(ucd(err.pkg_spec))) -- return 1, ['A transaction cannot be undone'] -- except dnf.exceptions.PackagesNotAvailableError as err: -- raise -- logger.info(_('No package %s available.'), -- self.output.term.bold(ucd(err.pkg_spec))) -- return 1, ['A transaction cannot be undone'] -- except dnf.exceptions.MarkingError: -- raise -- assert False -- else: -- return 2, ["Rollback to transaction %u" % (old.tid,)] -- - def history_undo_transaction(self, extcmd): - """Undo given transaction.""" - old = self.history_get_transaction((extcmd,)) -diff --git a/dnf/cli/commands/history.py b/dnf/cli/commands/history.py -index c28a136a..a450aaab 100644 ---- a/dnf/cli/commands/history.py -+++ b/dnf/cli/commands/history.py -@@ -20,6 +20,7 @@ from __future__ import print_function - from __future__ import unicode_literals - - import libdnf -+import hawkey - - from dnf.i18n import _, ucd - from dnf.cli import commands -@@ -33,6 +34,7 @@ import dnf.util - import json - import logging - import os -+import sys - - - logger = logging.getLogger('dnf') -@@ -179,10 +181,70 @@ class HistoryCommand(commands.Command): - return 1, [str(err)] - - def _hcmd_rollback(self, extcmds): -+ old = self.base.history_get_transaction(extcmds) -+ if old is None: -+ return 1, ['Failed history rollback'] -+ last = self.base.history.last() -+ -+ merged_trans = None -+ if old.tid != last.tid: -+ # history.old([]) returns all transactions and we don't want that -+ # so skip merging the transactions when trying to rollback to the last transaction -+ # which is the current system state and rollback is not applicable -+ for trans in self.base.history.old(list(range(old.tid + 1, last.tid + 1))): -+ if trans.altered_lt_rpmdb: -+ logger.warning(_('Transaction history is incomplete, before %u.'), trans.tid) -+ elif trans.altered_gt_rpmdb: -+ logger.warning(_('Transaction history is incomplete, after %u.'), trans.tid) -+ -+ if merged_trans is None: -+ merged_trans = dnf.db.history.MergedTransactionWrapper(trans) -+ else: -+ merged_trans.merge(trans) -+ -+ return self._revert_transaction(merged_trans) -+ -+ def _revert_transaction(self, trans): -+ action_map = { -+ "Install": "Removed", -+ "Removed": "Install", -+ "Upgrade": "Downgraded", -+ "Upgraded": "Downgrade", -+ "Downgrade": "Upgraded", -+ "Downgraded": "Upgrade", -+ "Reinstalled": "Reinstall", -+ "Reinstall": "Reinstalled", -+ "Obsoleted": "Install", -+ "Obsolete": "Obsoleted", -+ } -+ -+ data = serialize_transaction(trans) -+ -+ # revert actions in the serialized transaction data to perform rollback/undo -+ for content_type in ("rpms", "groups", "environments"): -+ for ti in data.get(content_type, []): -+ ti["action"] = action_map[ti["action"]] -+ -+ if ti["action"] == "Install" and ti.get("reason", None) == "clean": -+ ti["reason"] = "dependency" -+ -+ if ti.get("repo_id") == hawkey.SYSTEM_REPO_NAME: -+ # erase repo_id, because it's not possible to perform forward actions from the @System repo -+ ti["repo_id"] = None -+ -+ self.replay = TransactionReplay( -+ self.base, -+ data=data, -+ ignore_installed=True, -+ ignore_extras=True, -+ skip_unavailable=self.opts.skip_unavailable -+ ) - try: -- return self.base.history_rollback_transaction(extcmds[0]) -- except dnf.exceptions.Error as err: -- return 1, [str(err)] -+ self.replay.run() -+ except dnf.transaction_sr.TransactionFileError as ex: -+ for error in ex.errors: -+ print(str(error), file=sys.stderr) -+ raise dnf.exceptions.PackageNotFoundError(_('no package matched')) - - def _hcmd_userinstalled(self): - """Execute history userinstalled command.""" -@@ -318,13 +380,13 @@ class HistoryCommand(commands.Command): - raise dnf.exceptions.Error(strs[0]) - - def run_resolved(self): -- if self.opts.transactions_action not in ("replay", "redo"): -+ if self.opts.transactions_action not in ("replay", "redo", "rollback"): - return - - self.replay.post_transaction() - - def run_transaction(self): -- if self.opts.transactions_action not in ("replay", "redo"): -+ if self.opts.transactions_action not in ("replay", "redo", "rollback"): - return - - warnings = self.replay.get_warnings() --- -2.26.2 - - -From a59a57ce456682e85e86ee362aab4eecc19dbc81 Mon Sep 17 00:00:00 2001 -From: Daniel Mach -Date: Thu, 3 Dec 2020 15:56:52 +0100 -Subject: [PATCH 09/17] history: Refactor undo code to use transaction - store/replay - -= changelog = -msg: Support comps groups in history undo -type: enhancement -resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1657123 -resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1809565 -resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1809639 ---- - dnf/cli/cli.py | 28 ---------------------------- - dnf/cli/commands/history.py | 12 ++++++------ - 2 files changed, 6 insertions(+), 34 deletions(-) - -diff --git a/dnf/cli/cli.py b/dnf/cli/cli.py -index 36671fd8..e4fd39c6 100644 ---- a/dnf/cli/cli.py -+++ b/dnf/cli/cli.py -@@ -627,34 +627,6 @@ class BaseCli(dnf.Base): - logger.critical(_('Found more than one transaction ID!')) - return old[0] - -- def history_undo_transaction(self, extcmd): -- """Undo given transaction.""" -- old = self.history_get_transaction((extcmd,)) -- if old is None: -- return 1, ['Failed history undo'] -- -- tm = dnf.util.normalize_time(old.beg_timestamp) -- msg = _("Undoing transaction {}, from {}").format(old.tid, ucd(tm)) -- logger.info(msg) -- self.output.historyInfoCmdPkgsAltered(old) # :todo -- -- -- mobj = dnf.db.history.MergedTransactionWrapper(old) -- -- try: -- self._history_undo_operations(mobj, old.tid, strict=self.conf.strict) -- except dnf.exceptions.PackagesNotInstalledError as err: -- logger.info(_('No package %s installed.'), -- self.output.term.bold(ucd(err.pkg_spec))) -- return 1, ['An operation cannot be undone'] -- except dnf.exceptions.PackagesNotAvailableError as err: -- logger.info(_('No package %s available.'), -- self.output.term.bold(ucd(err.pkg_spec))) -- return 1, ['An operation cannot be undone'] -- except dnf.exceptions.MarkingError: -- raise -- else: -- return 2, ["Undoing transaction %u" % (old.tid,)] - - class Cli(object): - def __init__(self, base): -diff --git a/dnf/cli/commands/history.py b/dnf/cli/commands/history.py -index a450aaab..d60d3f25 100644 ---- a/dnf/cli/commands/history.py -+++ b/dnf/cli/commands/history.py -@@ -175,10 +175,10 @@ class HistoryCommand(commands.Command): - self.replay.run() - - def _hcmd_undo(self, extcmds): -- try: -- return self.base.history_undo_transaction(extcmds[0]) -- except dnf.exceptions.Error as err: -- return 1, [str(err)] -+ old = self.base.history_get_transaction(extcmds) -+ if old is None: -+ return 1, ['Failed history undo'] -+ return self._revert_transaction(old) - - def _hcmd_rollback(self, extcmds): - old = self.base.history_get_transaction(extcmds) -@@ -380,13 +380,13 @@ class HistoryCommand(commands.Command): - raise dnf.exceptions.Error(strs[0]) - - def run_resolved(self): -- if self.opts.transactions_action not in ("replay", "redo", "rollback"): -+ if self.opts.transactions_action not in ("replay", "redo", "rollback", "undo"): - return - - self.replay.post_transaction() - - def run_transaction(self): -- if self.opts.transactions_action not in ("replay", "redo", "rollback"): -+ if self.opts.transactions_action not in ("replay", "redo", "rollback", "undo"): - return - - warnings = self.replay.get_warnings() --- -2.26.2 - - -From 5a0b6cc00420fd6559a1fd611de1417ea90b1bfc Mon Sep 17 00:00:00 2001 -From: Daniel Mach -Date: Fri, 20 Nov 2020 19:54:54 +0100 -Subject: [PATCH 10/17] Remove Base._history_undo_operations() as it was - replaced with transaction_sr code - ---- - dnf/base.py | 59 ----------------------------------------------------- - 1 file changed, 59 deletions(-) - -diff --git a/dnf/base.py b/dnf/base.py -index ec41ab01..a2955051 100644 ---- a/dnf/base.py -+++ b/dnf/base.py -@@ -2218,65 +2218,6 @@ class Base(object): - for prefix in ['/bin/', '/sbin/', '/usr/bin/', '/usr/sbin/']] - return self.sack.query().filterm(file__glob=binary_provides), binary_provides - -- def _history_undo_operations(self, operations, first_trans, rollback=False, strict=True): -- """Undo the operations on packages by their NEVRAs. -- -- :param operations: a NEVRAOperations to be undone -- :param first_trans: first transaction id being undone -- :param rollback: True if transaction is performing a rollback -- :param strict: if True, raise an exception on any errors -- """ -- -- # map actions to their opposites -- action_map = { -- libdnf.transaction.TransactionItemAction_DOWNGRADE: None, -- libdnf.transaction.TransactionItemAction_DOWNGRADED: libdnf.transaction.TransactionItemAction_UPGRADE, -- libdnf.transaction.TransactionItemAction_INSTALL: libdnf.transaction.TransactionItemAction_REMOVE, -- libdnf.transaction.TransactionItemAction_OBSOLETE: None, -- libdnf.transaction.TransactionItemAction_OBSOLETED: libdnf.transaction.TransactionItemAction_INSTALL, -- libdnf.transaction.TransactionItemAction_REINSTALL: None, -- # reinstalls are skipped as they are considered as no-operation from history perspective -- libdnf.transaction.TransactionItemAction_REINSTALLED: None, -- libdnf.transaction.TransactionItemAction_REMOVE: libdnf.transaction.TransactionItemAction_INSTALL, -- libdnf.transaction.TransactionItemAction_UPGRADE: None, -- libdnf.transaction.TransactionItemAction_UPGRADED: libdnf.transaction.TransactionItemAction_DOWNGRADE, -- libdnf.transaction.TransactionItemAction_REASON_CHANGE: None, -- } -- -- failed = False -- for ti in operations.packages(): -- try: -- action = action_map[ti.action] -- except KeyError: -- raise RuntimeError(_("Action not handled: {}".format(action))) -- -- if action is None: -- continue -- -- if action == libdnf.transaction.TransactionItemAction_REMOVE: -- query = self.sack.query().installed().filterm(nevra_strict=str(ti)) -- if not query: -- logger.error(_('No package %s installed.'), ucd(str(ti))) -- failed = True -- continue -- else: -- query = self.sack.query().filterm(nevra_strict=str(ti)) -- if not query: -- logger.error(_('No package %s available.'), ucd(str(ti))) -- failed = True -- continue -- -- if action == libdnf.transaction.TransactionItemAction_REMOVE: -- for pkg in query: -- self._goal.erase(pkg) -- else: -- selector = dnf.selector.Selector(self.sack) -- selector.set(pkg=query) -- self._goal.install(select=selector, optional=(not strict)) -- -- if strict and failed: -- raise dnf.exceptions.PackageNotFoundError(_('no package matched')) -- - def _merge_update_filters(self, q, pkg_spec=None, warning=True): - """ - Merge Queries in _update_filters and return intersection with q Query --- -2.26.2 - - -From c5a02f21d1a7b3be9ace78364ce234d853118574 Mon Sep 17 00:00:00 2001 -From: Daniel Mach -Date: Wed, 2 Dec 2020 08:57:15 +0100 -Subject: [PATCH 11/17] history: Move history methods from BaseCli to - HistoryCommand - ---- - dnf/cli/cli.py | 19 ------------- - dnf/cli/commands/history.py | 53 +++++++++++++++---------------------- - 2 files changed, 22 insertions(+), 50 deletions(-) - -diff --git a/dnf/cli/cli.py b/dnf/cli/cli.py -index e4fd39c6..3080ae64 100644 ---- a/dnf/cli/cli.py -+++ b/dnf/cli/cli.py -@@ -608,25 +608,6 @@ class BaseCli(dnf.Base): - return False - return True - -- def _history_get_transactions(self, extcmds): -- if not extcmds: -- logger.critical(_('No transaction ID given')) -- return None -- -- old = self.history.old(extcmds) -- if not old: -- logger.critical(_('Not found given transaction ID')) -- return None -- return old -- -- def history_get_transaction(self, extcmds): -- old = self._history_get_transactions(extcmds) -- if old is None: -- return None -- if len(old) > 1: -- logger.critical(_('Found more than one transaction ID!')) -- return old[0] -- - - class Cli(object): - def __init__(self, base): -diff --git a/dnf/cli/commands/history.py b/dnf/cli/commands/history.py -index d60d3f25..dfd954ee 100644 ---- a/dnf/cli/commands/history.py -+++ b/dnf/cli/commands/history.py -@@ -34,7 +34,6 @@ import dnf.util - import json - import logging - import os --import sys - - - logger = logging.getLogger('dnf') -@@ -160,10 +159,7 @@ class HistoryCommand(commands.Command): - return dnf.cli.commands.Command.get_error_output(self, error) - - def _hcmd_redo(self, extcmds): -- old = self.base.history_get_transaction(extcmds) -- if old is None: -- return 1, ['Failed history redo'] -- -+ old = self._history_get_transaction(extcmds) - data = serialize_transaction(old) - self.replay = TransactionReplay( - self.base, -@@ -174,16 +170,27 @@ class HistoryCommand(commands.Command): - ) - self.replay.run() - -+ def _history_get_transactions(self, extcmds): -+ if not extcmds: -+ raise dnf.cli.CliError(_('No transaction ID given')) -+ -+ old = self.base.history.old(extcmds) -+ if not old: -+ raise dnf.cli.CliError(_('Transaction ID "{0}" not found.').format(extcmds[0])) -+ return old -+ -+ def _history_get_transaction(self, extcmds): -+ old = self._history_get_transactions(extcmds) -+ if len(old) > 1: -+ raise dnf.cli.CliError(_('Found more than one transaction ID!')) -+ return old[0] -+ - def _hcmd_undo(self, extcmds): -- old = self.base.history_get_transaction(extcmds) -- if old is None: -- return 1, ['Failed history undo'] -+ old = self._history_get_transaction(extcmds) - return self._revert_transaction(old) - - def _hcmd_rollback(self, extcmds): -- old = self.base.history_get_transaction(extcmds) -- if old is None: -- return 1, ['Failed history rollback'] -+ old = self._history_get_transaction(extcmds) - last = self.base.history.last() - - merged_trans = None -@@ -239,12 +246,7 @@ class HistoryCommand(commands.Command): - ignore_extras=True, - skip_unavailable=self.opts.skip_unavailable - ) -- try: -- self.replay.run() -- except dnf.transaction_sr.TransactionFileError as ex: -- for error in ex.errors: -- print(str(error), file=sys.stderr) -- raise dnf.exceptions.PackageNotFoundError(_('no package matched')) -+ self.replay.run() - - def _hcmd_userinstalled(self): - """Execute history userinstalled command.""" -@@ -346,11 +348,8 @@ class HistoryCommand(commands.Command): - elif vcmd == 'userinstalled': - ret = self._hcmd_userinstalled() - elif vcmd == 'store': -- transactions = self.output.history.old(tids) -- if not transactions: -- raise dnf.cli.CliError(_('Transaction ID "{id}" not found.').format(id=tids[0])) -- -- data = serialize_transaction(transactions[0]) -+ tid = self._history_get_transaction(tids) -+ data = serialize_transaction(tid) - try: - filename = self.opts.output if self.opts.output is not None else "transaction.json" - -@@ -371,14 +370,6 @@ class HistoryCommand(commands.Command): - except OSError as e: - raise dnf.cli.CliError(_('Error storing transaction: {}').format(str(e))) - -- if ret is None: -- return -- (code, strs) = ret -- if code == 2: -- self.cli.demands.resolving = True -- elif code != 0: -- raise dnf.exceptions.Error(strs[0]) -- - def run_resolved(self): - if self.opts.transactions_action not in ("replay", "redo", "rollback", "undo"): - return -@@ -393,7 +384,7 @@ class HistoryCommand(commands.Command): - if warnings: - logger.log( - dnf.logging.WARNING, -- _("Warning, the following problems occurred while replaying the transaction:") -+ _("Warning, the following problems occurred while running a transaction:") - ) - for w in warnings: - logger.log(dnf.logging.WARNING, " " + w) --- -2.26.2 - - -From 917f9f3b0fc418492293e08fa7db053b0c490d8f Mon Sep 17 00:00:00 2001 -From: Daniel Mach -Date: Thu, 10 Dec 2020 13:36:52 +0100 -Subject: [PATCH 12/17] transaction_sr: Simplify error reporting, unify with - history - ---- - dnf/transaction_sr.py | 20 +++++++++----------- - 1 file changed, 9 insertions(+), 11 deletions(-) - -diff --git a/dnf/transaction_sr.py b/dnf/transaction_sr.py -index 9926bebd..2122aba4 100644 ---- a/dnf/transaction_sr.py -+++ b/dnf/transaction_sr.py -@@ -57,21 +57,19 @@ class TransactionFileError(dnf.exceptions.Error): - - # store args in case someone wants to read them from a caught exception - self.filename = filename -- self.errors = errors -- - if isinstance(errors, (list, tuple)): -- if len(errors) > 1: -- msg = _('Errors in "{filename}":').format(filename=filename) -- for error in errors: -- msg += "\n " + str(error) -+ self.errors = errors -+ else: -+ self.errors = [errors] - -- super(TransactionFileError, self).__init__(msg) -- return -+ if filename: -+ msg = _('The following problems occurred while replaying the transaction from file "{filename}":').format(filename=filename) -+ else: -+ msg = _('The following problems occurred while running a transaction:') - -- else: -- errors = str(errors[0]) -+ for error in self.errors: -+ msg += "\n " + str(error) - -- msg = _('Error in "{filename}": {error}').format(filename=filename, error=errors) - super(TransactionFileError, self).__init__(msg) - - --- -2.26.2 - - -From d2fb741829445efee3187553cf7960f7bc2f643e Mon Sep 17 00:00:00 2001 -From: Daniel Mach -Date: Thu, 17 Dec 2020 16:37:01 +0100 -Subject: [PATCH 13/17] transaction_sr: TransactionFileError exception to - TransactionReplayError - ---- - dnf/transaction_sr.py | 20 ++++++++++---------- - 1 file changed, 10 insertions(+), 10 deletions(-) - -diff --git a/dnf/transaction_sr.py b/dnf/transaction_sr.py -index 2122aba4..e4974eb9 100644 ---- a/dnf/transaction_sr.py -+++ b/dnf/transaction_sr.py -@@ -48,7 +48,7 @@ class TransactionError(dnf.exceptions.Error): - super(TransactionError, self).__init__(msg) - - --class TransactionFileError(dnf.exceptions.Error): -+class TransactionReplayError(dnf.exceptions.Error): - def __init__(self, filename, errors): - """ - :param filename: The name of the transaction file being replayed -@@ -70,10 +70,10 @@ class TransactionFileError(dnf.exceptions.Error): - for error in self.errors: - msg += "\n " + str(error) - -- super(TransactionFileError, self).__init__(msg) -+ super(TransactionReplayError, self).__init__(msg) - - --class IncompatibleTransactionVersionError(TransactionFileError): -+class IncompatibleTransactionVersionError(TransactionReplayError): - def __init__(self, filename, msg): - super(IncompatibleTransactionVersionError, self).__init__(filename, msg) - -@@ -84,7 +84,7 @@ def _check_version(version, filename): - try: - major = int(major) - except ValueError as e: -- raise TransactionFileError( -+ raise TransactionReplayError( - filename, - _('Invalid major version "{major}", number expected.').format(major=major) - ) -@@ -92,7 +92,7 @@ def _check_version(version, filename): - try: - int(minor) # minor is unused, just check it's a number - except ValueError as e: -- raise TransactionFileError( -+ raise TransactionReplayError( - filename, - _('Invalid minor version "{minor}", number expected.').format(minor=minor) - ) -@@ -234,12 +234,12 @@ class TransactionReplay(object): - try: - replay_data = json.load(f) - except json.decoder.JSONDecodeError as e: -- raise TransactionFileError(fn, str(e) + ".") -+ raise TransactionReplayError(fn, str(e) + ".") - - try: - self._load_from_data(replay_data) - except TransactionError as e: -- raise TransactionFileError(fn, e) -+ raise TransactionReplayError(fn, e) - - def _load_from_data(self, data): - self._replay_data = data -@@ -268,7 +268,7 @@ class TransactionReplay(object): - fn = self._filename - - if "version" not in replay_data: -- raise TransactionFileError(fn, _('Missing key "{key}".'.format(key="version"))) -+ raise TransactionReplayError(fn, _('Missing key "{key}".'.format(key="version"))) - - self._assert_type(replay_data["version"], str, "version", "string") - -@@ -580,7 +580,7 @@ class TransactionReplay(object): - errors.append(e) - - if errors: -- raise TransactionFileError(fn, errors) -+ raise TransactionReplayError(fn, errors) - - def post_transaction(self): - """ -@@ -635,4 +635,4 @@ class TransactionReplay(object): - pass - - if errors: -- raise TransactionFileError(self._filename, errors) -+ raise TransactionReplayError(self._filename, errors) --- -2.26.2 - - -From 1182143e58d4fda530d5dfd19f0d9c9406e8eff3 Mon Sep 17 00:00:00 2001 -From: Daniel Mach -Date: Thu, 17 Dec 2020 16:55:39 +0100 -Subject: [PATCH 14/17] transaction_sr: Don't return if there's a mismatch in - actions - -When _ignore_installed == True, then an exception is raised anyway. -When _ignore_installed == False, get the requested package to the system -regardless the action. ---- - dnf/transaction_sr.py | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/dnf/transaction_sr.py b/dnf/transaction_sr.py -index e4974eb9..dae8d300 100644 ---- a/dnf/transaction_sr.py -+++ b/dnf/transaction_sr.py -@@ -334,7 +334,6 @@ class TransactionReplay(object): - if action == "Install" and query_na.installed() and not self._base._get_installonly_query(query_na): - self._raise_or_warn(self._ignore_installed, - _('Package "{na}" is already installed for action "{action}".').format(na=na, action=action)) -- return - - sltr = dnf.selector.Selector(self._base.sack).set(pkg=query) - self._base.goal.install(select=sltr, optional=not self._base.conf.strict) --- -2.26.2 - - -From ff32a3c68fa853b53084a1a4947f345062056f23 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hr=C3=A1zk=C3=BD?= -Date: Fri, 8 Jan 2021 13:37:45 +0100 -Subject: [PATCH 15/17] cli/output: Return number of listed packages from - listPkgs() - -Instead of an error status and message. ---- - dnf/cli/cli.py | 5 ++--- - dnf/cli/commands/history.py | 4 +++- - dnf/cli/output.py | 14 ++------------ - 3 files changed, 7 insertions(+), 16 deletions(-) - -diff --git a/dnf/cli/cli.py b/dnf/cli/cli.py -index 3080ae64..be737ed3 100644 ---- a/dnf/cli/cli.py -+++ b/dnf/cli/cli.py -@@ -505,7 +505,7 @@ class BaseCli(dnf.Base): - # XXX put this into the ListCommand at some point - if len(ypl.obsoletes) > 0 and basecmd == 'list': - # if we've looked up obsolete lists and it's a list request -- rop = [0, ''] -+ rop = len(ypl.obsoletes) - print(_('Obsoleting Packages')) - for obtup in sorted(ypl.obsoletesTuples, - key=operator.itemgetter(0)): -@@ -517,8 +517,7 @@ class BaseCli(dnf.Base): - rrap = self.output.listPkgs(ypl.recent, _('Recently Added Packages'), - basecmd, columns=columns) - if len(patterns) and \ -- rrap[0] and rop[0] and rup[0] and rep[0] and rap[0] and \ -- raep[0] and rip[0]: -+ rrap == 0 and rop == 0 and rup == 0 and rep == 0 and rap == 0 and raep == 0 and rip == 0: - raise dnf.exceptions.Error(_('No matching Packages to list')) - - def returnPkgLists(self, pkgnarrow='all', patterns=None, -diff --git a/dnf/cli/commands/history.py b/dnf/cli/commands/history.py -index dfd954ee..e9b91d0f 100644 ---- a/dnf/cli/commands/history.py -+++ b/dnf/cli/commands/history.py -@@ -251,7 +251,9 @@ class HistoryCommand(commands.Command): - def _hcmd_userinstalled(self): - """Execute history userinstalled command.""" - pkgs = tuple(self.base.iter_userinstalled()) -- return self.output.listPkgs(pkgs, 'Packages installed by user', 'nevra') -+ n_listed = self.output.listPkgs(pkgs, 'Packages installed by user', 'nevra') -+ if n_listed == 0: -+ raise dnf.cli.CliError(_('No packages to list')) - - def _args2transaction_ids(self): - """Convert commandline arguments to transaction ids""" -diff --git a/dnf/cli/output.py b/dnf/cli/output.py -index 6d729b63..6cfc9e22 100644 ---- a/dnf/cli/output.py -+++ b/dnf/cli/output.py -@@ -597,18 +597,10 @@ class Output(object): - number - '>' - highlighting used when the package has a higher version - number -- :return: (exit_code, [errors]) -- -- exit_code is:: -- -- 0 = we're done, exit -- 1 = we've errored, exit with error string -- -+ :return: number of packages listed - """ - if outputType in ['list', 'info', 'name', 'nevra']: -- thingslisted = 0 - if len(lst) > 0: -- thingslisted = 1 - print('%s' % description) - info_set = set() - if outputType == 'list': -@@ -645,9 +637,7 @@ class Output(object): - if info_set: - print("\n".join(sorted(info_set))) - -- if thingslisted == 0: -- return 1, [_('No packages to list')] -- return 0, [] -+ return len(lst) - - def userconfirm(self, msg=None, defaultyes_msg=None): - """Get a yes or no from the user, and default to No --- -2.26.2 - - -From 0226da7351eb97cd9c4c6739725b1f77d445764e Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hr=C3=A1zk=C3=BD?= -Date: Fri, 8 Jan 2021 13:44:27 +0100 -Subject: [PATCH 16/17] Clean up history command error handling - -The removal of `ret` value error handling which was removed previously was not -complete. Most of it is was no-op as no errors were really propagated through -it, but the `history userinstalled` command was still relying on it. - -The commit removes the last bit and replaces it with raising an exception. ---- - dnf/cli/commands/history.py | 17 ++++++++--------- - 1 file changed, 8 insertions(+), 9 deletions(-) - -diff --git a/dnf/cli/commands/history.py b/dnf/cli/commands/history.py -index e9b91d0f..7b38cb60 100644 ---- a/dnf/cli/commands/history.py -+++ b/dnf/cli/commands/history.py -@@ -187,7 +187,7 @@ class HistoryCommand(commands.Command): - - def _hcmd_undo(self, extcmds): - old = self._history_get_transaction(extcmds) -- return self._revert_transaction(old) -+ self._revert_transaction(old) - - def _hcmd_rollback(self, extcmds): - old = self._history_get_transaction(extcmds) -@@ -209,7 +209,7 @@ class HistoryCommand(commands.Command): - else: - merged_trans.merge(trans) - -- return self._revert_transaction(merged_trans) -+ self._revert_transaction(merged_trans) - - def _revert_transaction(self, trans): - action_map = { -@@ -321,7 +321,6 @@ class HistoryCommand(commands.Command): - - def run(self): - vcmd = self.opts.transactions_action -- ret = None - - if vcmd == 'replay': - self.base.read_comps(arch_filter=True) -@@ -338,17 +337,17 @@ class HistoryCommand(commands.Command): - tids, merged_tids = self._args2transaction_ids() - - if vcmd == 'list' and (tids or not self.opts.transactions): -- ret = self.output.historyListCmd(tids, reverse=self.opts.reverse) -+ self.output.historyListCmd(tids, reverse=self.opts.reverse) - elif vcmd == 'info' and (tids or not self.opts.transactions): -- ret = self.output.historyInfoCmd(tids, self.opts.transactions, merged_tids) -+ self.output.historyInfoCmd(tids, self.opts.transactions, merged_tids) - elif vcmd == 'undo': -- ret = self._hcmd_undo(tids) -+ self._hcmd_undo(tids) - elif vcmd == 'redo': -- ret = self._hcmd_redo(tids) -+ self._hcmd_redo(tids) - elif vcmd == 'rollback': -- ret = self._hcmd_rollback(tids) -+ self._hcmd_rollback(tids) - elif vcmd == 'userinstalled': -- ret = self._hcmd_userinstalled() -+ self._hcmd_userinstalled() - elif vcmd == 'store': - tid = self._history_get_transaction(tids) - data = serialize_transaction(tid) --- -2.26.2 - - -From 7e862711b3d7b9b444d966594630b49bf3761faf Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hr=C3=A1zk=C3=BD?= -Date: Mon, 23 Nov 2020 16:32:16 +0100 -Subject: [PATCH 17/17] Lazy-load base.comps instead of explicitly - -Loading base.comps was done by calling a method at arbitrary places in -the code, this is hard to maintain and get right. The method could be -inadvertedly called multiple times per dnf run too. - -Instead load the comps data lazily on first access. In case of the -shell, using "repo enable/disable" can cause the comps data to change -mid-run. Instead of explicitly reloading, clear the comps attribute and -let it be lazy-loaded again when needed. - -Closes: #1690 -Approved by: j-mracek ---- - dnf/base.py | 4 ++-- - dnf/cli/commands/group.py | 5 ----- - dnf/cli/commands/history.py | 2 -- - dnf/cli/commands/install.py | 1 - - dnf/cli/commands/remove.py | 1 - - dnf/cli/commands/repoquery.py | 1 - - dnf/cli/commands/shell.py | 3 +++ - dnf/cli/commands/upgrade.py | 1 - - tests/api/test_dnf_base.py | 4 +--- - 9 files changed, 6 insertions(+), 16 deletions(-) - -diff --git a/dnf/base.py b/dnf/base.py -index a2955051..39c21c33 100644 ---- a/dnf/base.py -+++ b/dnf/base.py -@@ -242,6 +242,8 @@ class Base(object): - @property - def comps(self): - # :api -+ if self._comps is None: -+ self.read_comps(arch_filter=True) - return self._comps - - @property -@@ -1881,7 +1883,6 @@ class Base(object): - no_match_module_specs = install_specs.grp_specs - - if no_match_module_specs: -- self.read_comps(arch_filter=True) - exclude_specs.grp_specs = self._expand_groups(exclude_specs.grp_specs) - self._install_groups(no_match_module_specs, exclude_specs, no_match_group_specs, strict) - -@@ -2084,7 +2085,6 @@ class Base(object): - msg = _('Not a valid form: %s') - logger.warning(msg, grp_spec) - elif grp_specs: -- self.read_comps(arch_filter=True) - if self.env_group_remove(grp_specs): - done = True - -diff --git a/dnf/cli/commands/group.py b/dnf/cli/commands/group.py -index bd17f80f..cf542799 100644 ---- a/dnf/cli/commands/group.py -+++ b/dnf/cli/commands/group.py -@@ -110,9 +110,6 @@ class GroupCommand(commands.Command): - - return installed, available - -- def _grp_setup(self): -- self.base.read_comps(arch_filter=True) -- - def _info(self, userlist): - for strng in userlist: - group_matched = False -@@ -370,8 +367,6 @@ class GroupCommand(commands.Command): - cmd = self.opts.subcmd - extcmds = self.opts.args - -- self._grp_setup() -- - if cmd == 'summary': - return self._summary(extcmds) - if cmd == 'list': -diff --git a/dnf/cli/commands/history.py b/dnf/cli/commands/history.py -index 7b38cb60..293d93fc 100644 ---- a/dnf/cli/commands/history.py -+++ b/dnf/cli/commands/history.py -@@ -323,8 +323,6 @@ class HistoryCommand(commands.Command): - vcmd = self.opts.transactions_action - - if vcmd == 'replay': -- self.base.read_comps(arch_filter=True) -- - self.replay = TransactionReplay( - self.base, - filename=self.opts.transaction_filename, -diff --git a/dnf/cli/commands/install.py b/dnf/cli/commands/install.py -index 38a90b61..b637af0b 100644 ---- a/dnf/cli/commands/install.py -+++ b/dnf/cli/commands/install.py -@@ -151,7 +151,6 @@ class InstallCommand(commands.Command): - return err_pkgs - - def _install_groups(self, grp_specs): -- self.base.read_comps(arch_filter=True) - try: - self.base.env_group_install(grp_specs, - tuple(self.base.conf.group_package_types), -diff --git a/dnf/cli/commands/remove.py b/dnf/cli/commands/remove.py -index f50dbd91..e455ba6e 100644 ---- a/dnf/cli/commands/remove.py -+++ b/dnf/cli/commands/remove.py -@@ -142,7 +142,6 @@ class RemoveCommand(commands.Command): - skipped_grps = self.opts.grp_specs - - if skipped_grps: -- self.base.read_comps(arch_filter=True) - for group in skipped_grps: - try: - if self.base.env_group_remove([group]): -diff --git a/dnf/cli/commands/repoquery.py b/dnf/cli/commands/repoquery.py -index 099a9312..b0d06a90 100644 ---- a/dnf/cli/commands/repoquery.py -+++ b/dnf/cli/commands/repoquery.py -@@ -632,7 +632,6 @@ class RepoQueryCommand(commands.Command): - print("\n".join(sorted(pkgs))) - - def _group_member_report(self, query): -- self.base.read_comps(arch_filter=True) - package_conf_dict = {} - for group in self.base.comps.groups: - package_conf_dict[group.id] = set([pkg.name for pkg in group.packages_iter()]) -diff --git a/dnf/cli/commands/shell.py b/dnf/cli/commands/shell.py -index 431fe502..18c886ff 100644 ---- a/dnf/cli/commands/shell.py -+++ b/dnf/cli/commands/shell.py -@@ -239,6 +239,9 @@ exit (or quit) exit the shell""") - if fill_sack: - self.base.fill_sack() - -+ # reset base._comps, as it has changed due to changing the repos -+ self.base._comps = None -+ - else: - self._help('repo') - -diff --git a/dnf/cli/commands/upgrade.py b/dnf/cli/commands/upgrade.py -index 44789c9a..f62cfcc1 100644 ---- a/dnf/cli/commands/upgrade.py -+++ b/dnf/cli/commands/upgrade.py -@@ -124,7 +124,6 @@ class UpgradeCommand(commands.Command): - - def _update_groups(self): - if self.skipped_grp_specs: -- self.base.read_comps(arch_filter=True) - self.base.env_group_upgrade(self.skipped_grp_specs) - return True - return False -diff --git a/tests/api/test_dnf_base.py b/tests/api/test_dnf_base.py -index ca71b75c..656bd225 100644 ---- a/tests/api/test_dnf_base.py -+++ b/tests/api/test_dnf_base.py -@@ -34,9 +34,7 @@ class DnfBaseApiTest(TestCase): - def test_comps(self): - # Base.comps - self.assertHasAttr(self.base, "comps") -- -- # blank initially -- self.assertEqual(self.base.comps, None) -+ self.assertHasType(self.base.comps, dnf.comps.Comps) - - self.base.read_comps() - self.assertHasType(self.base.comps, dnf.comps.Comps) --- -2.26.2 - diff --git a/SOURCES/0006-Remove-sourcepackages-from-install-upgrade-set.patch b/SOURCES/0006-Remove-sourcepackages-from-install-upgrade-set.patch deleted file mode 100644 index 1ef5a4e..0000000 --- a/SOURCES/0006-Remove-sourcepackages-from-install-upgrade-set.patch +++ /dev/null @@ -1,150 +0,0 @@ -From 8f3ce4868ac009976da7323ea39ebcd9a062e32d Mon Sep 17 00:00:00 2001 -From: Jaroslav Mracek -Date: Mon, 23 Nov 2020 17:00:01 +0100 -Subject: [PATCH 1/3] Remove source packages from install/upgrade set - (RhBug:1898548) - -It prevents Error: Will not install a source rpm package () - -https://bugzilla.redhat.com/show_bug.cgi?id=1898548 ---- - dnf/module/module_base.py | 16 ++++++++++------ - 1 file changed, 10 insertions(+), 6 deletions(-) - -diff --git a/dnf/module/module_base.py b/dnf/module/module_base.py -index 04701b9d..49c871c4 100644 ---- a/dnf/module/module_base.py -+++ b/dnf/module/module_base.py -@@ -140,20 +140,21 @@ class ModuleBase(object): - if fail_safe_repo_used: - raise dnf.exceptions.Error(_( - "Installing module from Fail-Safe repository is not allowed")) -- install_base_query = self.base.sack.query().filterm( -- nevra_strict=install_set_artefacts).apply() -+ # Remove source packages they cannot be installed or upgraded -+ base_no_source_query = self.base.sack.query().filterm(arch__neq=['src', 'nosrc']).apply() -+ install_base_query = base_no_source_query.filter(nevra_strict=install_set_artefacts) - - # add hot-fix packages - hot_fix_repos = [i.id for i in self.base.repos.iter_enabled() if i.module_hotfixes] -- hotfix_packages = self.base.sack.query().filterm(reponame=hot_fix_repos).filterm( -- name=install_dict.keys()) -+ hotfix_packages = base_no_source_query.filter( -+ reponame=hot_fix_repos, name=install_dict.keys()) - install_base_query = install_base_query.union(hotfix_packages) - - for pkg_name, set_specs in install_dict.items(): - query = install_base_query.filter(name=pkg_name) - if not query: - # package can also be non-modular or part of another stream -- query = self.base.sack.query().filterm(name=pkg_name) -+ query = base_no_source_query.filter(name=pkg_name) - if not query: - for spec in set_specs: - logger.error(_("Unable to resolve argument {}").format(spec)) -@@ -182,6 +183,9 @@ class ModuleBase(object): - fail_safe_repo = hawkey.MODULE_FAIL_SAFE_REPO_NAME - fail_safe_repo_used = False - -+ # Remove source packages they cannot be installed or upgraded -+ base_no_source_query = self.base.sack.query().filterm(arch__neq=['src', 'nosrc']).apply() -+ - for spec in module_specs: - module_list, nsvcap = self._get_modules(spec) - if not module_list: -@@ -221,7 +225,7 @@ class ModuleBase(object): - - if not upgrade_package_set: - logger.error(_("Unable to match profile in argument {}").format(spec)) -- query = self.base.sack.query().filterm(name=upgrade_package_set) -+ query = base_no_source_query.filter(name=upgrade_package_set) - if query: - sltr = dnf.selector.Selector(self.base.sack) - sltr.set(pkg=query) --- -2.26.2 - - -From c42680b292b2cca38b24fb18f46f06f800c1934f Mon Sep 17 00:00:00 2001 -From: Jaroslav Mracek -Date: Mon, 23 Nov 2020 17:04:05 +0100 -Subject: [PATCH 2/3] Remove all source packages from query - ---- - dnf/base.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/dnf/base.py b/dnf/base.py -index a2955051..a3d9b63f 100644 ---- a/dnf/base.py -+++ b/dnf/base.py -@@ -1550,7 +1550,7 @@ class Base(object): - if (comps_pkg.basearchonly): - query_args.update({'arch': basearch}) - q = self.sack.query().filterm(**query_args).apply() -- q.filterm(arch__neq="src") -+ q.filterm(arch__neq=["src", "nosrc"]) - if not q: - package_string = comps_pkg.name - if comps_pkg.basearchonly: --- -2.26.2 - - -From 1f68fa6dc59fb350e71a24e787135475f3fb5b4c Mon Sep 17 00:00:00 2001 -From: Jaroslav Mracek -Date: Mon, 23 Nov 2020 17:29:45 +0100 -Subject: [PATCH 3/3] Run tests with sack in tmp directory - ---- - tests/api/test_dnf_module_base.py | 17 +++++++++++------ - 1 file changed, 11 insertions(+), 6 deletions(-) - -diff --git a/tests/api/test_dnf_module_base.py b/tests/api/test_dnf_module_base.py -index aa47555b..18dd080d 100644 ---- a/tests/api/test_dnf_module_base.py -+++ b/tests/api/test_dnf_module_base.py -@@ -7,16 +7,26 @@ from __future__ import unicode_literals - import dnf - import dnf.module.module_base - -+import os -+import shutil -+import tempfile -+ - from .common import TestCase - - - class DnfModuleBaseApiTest(TestCase): - def setUp(self): - self.base = dnf.Base(dnf.conf.Conf()) -+ self._installroot = tempfile.mkdtemp(prefix="dnf_test_installroot_") -+ self.base.conf.installroot = self._installroot -+ self.base.conf.cachedir = os.path.join(self._installroot, "var/cache/dnf") -+ self.base._sack = dnf.sack._build_sack(self.base) - self.moduleBase = dnf.module.module_base.ModuleBase(self.base) - - def tearDown(self): - self.base.close() -+ if self._installroot.startswith("/tmp/"): -+ shutil.rmtree(self._installroot) - - def test_init(self): - moduleBase = dnf.module.module_base.ModuleBase(self.base) -@@ -51,12 +61,7 @@ class DnfModuleBaseApiTest(TestCase): - def test_install(self): - # ModuleBase.install() - self.assertHasAttr(self.moduleBase, "install") -- self.assertRaises( -- AttributeError, -- self.moduleBase.install, -- module_specs=[], -- strict=False, -- ) -+ self.moduleBase.install(module_specs=[], strict=False) - - def test_remove(self): - # ModuleBase.remove() --- -2.26.2 - diff --git a/SOURCES/0007-Fix-documentation-of-globs-not-supporting-curly-brackets.patch b/SOURCES/0007-Fix-documentation-of-globs-not-supporting-curly-brackets.patch deleted file mode 100644 index 2daa3b2..0000000 --- a/SOURCES/0007-Fix-documentation-of-globs-not-supporting-curly-brackets.patch +++ /dev/null @@ -1,30 +0,0 @@ -From f3c254581bcb0591a543aee0c7e031c3c9d0a9a1 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hr=C3=A1zk=C3=BD?= -Date: Mon, 11 Jan 2021 16:43:25 +0100 -Subject: [PATCH] Fix documentation of globs not supporting curly brackets - -= changelog = -msg: Fix documentation of globs not supporting curly brackets -type: bugfix -resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1913418 ---- - doc/command_ref.rst | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -diff --git a/doc/command_ref.rst b/doc/command_ref.rst -index bbce3ddcf4..d11e8dd502 100644 ---- a/doc/command_ref.rst -+++ b/doc/command_ref.rst -@@ -1763,8 +1763,10 @@ The following patterns are supported: - those two characters, inclusive, is matched. If the first character - following the ``[`` is a ``!`` or a ``^`` then any character not enclosed - is matched. --``{}`` -- Matches any of the comma separated list of enclosed strings. -+ -+Note: Curly brackets (``{}``) are not supported. You can still use them in -+shells that support them and let the shell do the expansion, but if quoted or -+escaped, dnf will not expand them. - - -------------- - NEVRA Matching diff --git a/SOURCES/0008-Module-switch-command.patch b/SOURCES/0008-Module-switch-command.patch deleted file mode 100644 index f464e15..0000000 --- a/SOURCES/0008-Module-switch-command.patch +++ /dev/null @@ -1,507 +0,0 @@ -From 6ed0458744090ab307da9d9118690372b2e66ca8 Mon Sep 17 00:00:00 2001 -From: Jaroslav Mracek -Date: Wed, 11 Nov 2020 12:47:21 +0100 -Subject: [PATCH 1/5] Make module_base better industrialized for method reuse - -It will allow to use internal for module switch command. ---- - dnf/module/module_base.py | 29 ++++++++++++++++++++--------- - 1 file changed, 20 insertions(+), 9 deletions(-) - -diff --git a/dnf/module/module_base.py b/dnf/module/module_base.py -index 49c871c4..0da4fab1 100644 ---- a/dnf/module/module_base.py -+++ b/dnf/module/module_base.py -@@ -323,7 +323,7 @@ class ModuleBase(object): - assert len(streamDict) == 1 - return moduleDict - -- def _resolve_specs_enable_update_sack(self, module_specs): -+ def _resolve_specs_enable(self, module_specs): - no_match_specs = [] - error_spec = [] - module_dicts = {} -@@ -339,6 +339,9 @@ class ModuleBase(object): - error_spec.append(spec) - logger.error(ucd(e)) - logger.error(_("Unable to resolve argument {}").format(spec)) -+ return no_match_specs, error_spec, module_dicts -+ -+ def _update_sack(self): - hot_fix_repos = [i.id for i in self.base.repos.iter_enabled() if i.module_hotfixes] - try: - solver_errors = self.base.sack.filter_modules( -@@ -347,6 +350,10 @@ class ModuleBase(object): - debugsolver=self.base.conf.debug_solver) - except hawkey.Exception as e: - raise dnf.exceptions.Error(ucd(e)) -+ return solver_errors -+ -+ def _enable_dependencies(self, module_dicts): -+ error_spec = [] - for spec, (nsvcap, moduleDict) in module_dicts.items(): - for streamDict in moduleDict.values(): - for modules in streamDict.values(): -@@ -357,6 +364,17 @@ class ModuleBase(object): - error_spec.append(spec) - logger.error(ucd(e)) - logger.error(_("Unable to resolve argument {}").format(spec)) -+ return error_spec -+ -+ def _resolve_specs_enable_update_sack(self, module_specs): -+ no_match_specs, error_spec, module_dicts = self._resolve_specs_enable(module_specs) -+ -+ solver_errors = self._update_sack() -+ -+ dependency_error_spec = self._enable_dependencies(module_dicts) -+ if dependency_error_spec: -+ error_spec.extend(dependency_error_spec) -+ - return no_match_specs, error_spec, solver_errors, module_dicts - - def _modules_reset_or_disable(self, module_specs, to_state): -@@ -379,14 +397,7 @@ class ModuleBase(object): - if to_state == STATE_DISABLED: - self.base._moduleContainer.disable(name) - -- hot_fix_repos = [i.id for i in self.base.repos.iter_enabled() if i.module_hotfixes] -- try: -- solver_errors = self.base.sack.filter_modules( -- self.base._moduleContainer, hot_fix_repos, self.base.conf.installroot, -- self.base.conf.module_platform_id, update_only=True, -- debugsolver=self.base.conf.debug_solver) -- except hawkey.Exception as e: -- raise dnf.exceptions.Error(ucd(e)) -+ solver_errors = self._update_sack() - return no_match_specs, solver_errors - - def _get_package_name_set_and_remove_profiles(self, module_list, nsvcap, remove=False): --- -2.26.2 - - -From e6473f4e6f17bb635e023b8905f29b318b8795bf Mon Sep 17 00:00:00 2001 -From: Jaroslav Mracek -Date: Wed, 11 Nov 2020 17:09:16 +0100 -Subject: [PATCH 2/5] Add module switch-to support (RhBug:1792020) - -It is a combination of module rpm distrosync, module profile switch and -module stream switch. - -= changelog = -msg: Add new `module switch-to` command for switching content -of module streams -type: enhancement -resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1792020 ---- - VERSION.cmake | 2 +- - dnf.spec | 2 +- - dnf/cli/commands/module.py | 24 ++++- - dnf/module/module_base.py | 182 ++++++++++++++++++++++++++++++++----- - 4 files changed, 185 insertions(+), 25 deletions(-) - -diff --git a/dnf/cli/commands/module.py b/dnf/cli/commands/module.py -index 5a6c0069..4cdc915e 100644 ---- a/dnf/cli/commands/module.py -+++ b/dnf/cli/commands/module.py -@@ -271,6 +271,28 @@ class ModuleCommand(commands.Command): - - logger.error(dnf.exceptions.MarkingErrors(no_match_group_specs=skipped_groups)) - -+ class SwitchToSubCommand(SubCommand): -+ -+ aliases = ('switch-to',) -+ summary = _('switch a module to a stream and distrosync rpm packages') -+ -+ def configure(self): -+ demands = self.cli.demands -+ demands.available_repos = True -+ demands.sack_activation = True -+ demands.resolving = True -+ demands.root_user = True -+ self.base.conf.module_stream_switch = True -+ -+ def run_on_module(self): -+ try: -+ self.module_base.switch_to(self.opts.module_spec, strict=self.base.conf.strict) -+ except dnf.exceptions.MarkingErrors as e: -+ if self.base.conf.strict: -+ if e.no_match_group_specs or e.error_group_specs: -+ raise e -+ logger.error(str(e)) -+ - class ProvidesSubCommand(SubCommand): - - aliases = ("provides", ) -@@ -319,7 +341,7 @@ class ModuleCommand(commands.Command): - - SUBCMDS = {ListSubCommand, InfoSubCommand, EnableSubCommand, - DisableSubCommand, ResetSubCommand, InstallSubCommand, UpdateSubCommand, -- RemoveSubCommand, ProvidesSubCommand, RepoquerySubCommand} -+ RemoveSubCommand, SwitchToSubCommand, ProvidesSubCommand, RepoquerySubCommand} - - SUBCMDS_NOT_REQUIRED_ARG = {ListSubCommand} - -diff --git a/dnf/module/module_base.py b/dnf/module/module_base.py -index 0da4fab1..03d54f72 100644 ---- a/dnf/module/module_base.py -+++ b/dnf/module/module_base.py -@@ -140,31 +140,140 @@ class ModuleBase(object): - if fail_safe_repo_used: - raise dnf.exceptions.Error(_( - "Installing module from Fail-Safe repository is not allowed")) -- # Remove source packages they cannot be installed or upgraded -- base_no_source_query = self.base.sack.query().filterm(arch__neq=['src', 'nosrc']).apply() -- install_base_query = base_no_source_query.filter(nevra_strict=install_set_artefacts) -+ __, profiles_errors = self._install_profiles_internal( -+ install_set_artefacts, install_dict, strict) -+ if profiles_errors: -+ error_specs.extend(profiles_errors) - -- # add hot-fix packages -- hot_fix_repos = [i.id for i in self.base.repos.iter_enabled() if i.module_hotfixes] -- hotfix_packages = base_no_source_query.filter( -- reponame=hot_fix_repos, name=install_dict.keys()) -- install_base_query = install_base_query.union(hotfix_packages) -+ if no_match_specs or error_specs or solver_errors: -+ raise dnf.exceptions.MarkingErrors(no_match_group_specs=no_match_specs, -+ error_group_specs=error_specs, -+ module_depsolv_errors=solver_errors) - -- for pkg_name, set_specs in install_dict.items(): -- query = install_base_query.filter(name=pkg_name) -- if not query: -- # package can also be non-modular or part of another stream -- query = base_no_source_query.filter(name=pkg_name) -- if not query: -- for spec in set_specs: -- logger.error(_("Unable to resolve argument {}").format(spec)) -- logger.error(_("No match for package {}").format(pkg_name)) -- error_specs.extend(set_specs) -- continue -- self.base._goal.group_members.add(pkg_name) -+ def switch_to(self, module_specs, strict=True): -+ # :api -+ no_match_specs, error_specs, module_dicts = self._resolve_specs_enable(module_specs) -+ # collect name of artifacts from new modules for distrosync -+ new_artifacts_names = set() -+ # collect name of artifacts from active modules for distrosync before sack update -+ active_artifacts_names = set() -+ src_arches = {"nosrc", "src"} -+ for spec, (nsvcap, moduledict) in module_dicts.items(): -+ for name in moduledict.keys(): -+ for module in self.base._moduleContainer.query(name, "", "", "", ""): -+ if self.base._moduleContainer.isModuleActive(module): -+ for artifact in module.getArtifacts(): -+ arch = artifact.rsplit(".", 1)[1] -+ if arch in src_arches: -+ continue -+ pkg_name = artifact.rsplit("-", 2)[0] -+ active_artifacts_names.add(pkg_name) -+ -+ solver_errors = self._update_sack() -+ -+ dependency_error_spec = self._enable_dependencies(module_dicts) -+ if dependency_error_spec: -+ error_specs.extend(dependency_error_spec) -+ -+ # -+ fail_safe_repo = hawkey.MODULE_FAIL_SAFE_REPO_NAME -+ install_dict = {} -+ install_set_artifacts = set() -+ fail_safe_repo_used = False -+ -+ # list of name: [profiles] for module profiles being removed -+ removed_profiles = self.base._moduleContainer.getRemovedProfiles() -+ -+ for spec, (nsvcap, moduledict) in module_dicts.items(): -+ for name, streamdict in moduledict.items(): -+ for stream, module_list in streamdict.items(): -+ install_module_list = [x for x in module_list -+ if self.base._moduleContainer.isModuleActive(x.getId())] -+ if not install_module_list: -+ "No active matches for argument '{0}' in module '{1}:{2}'" -+ logger.error(_("No active matches for argument '{0}' in module " -+ "'{1}:{2}'").format(spec, name, stream)) -+ error_specs.append(spec) -+ continue -+ profiles = [] -+ latest_module = self._get_latest(install_module_list) -+ if latest_module.getRepoID() == fail_safe_repo: -+ msg = _( -+ "Installing module '{0}' from Fail-Safe repository {1} is not allowed") -+ logger.critical(msg.format(latest_module.getNameStream(), fail_safe_repo)) -+ fail_safe_repo_used = True -+ if nsvcap.profile: -+ profiles.extend(latest_module.getProfiles(nsvcap.profile)) -+ if not profiles: -+ available_profiles = latest_module.getProfiles() -+ if available_profiles: -+ profile_names = ", ".join(sorted( -+ [profile.getName() for profile in available_profiles])) -+ msg = _("Unable to match profile for argument {}. Available " -+ "profiles for '{}:{}': {}").format( -+ spec, name, stream, profile_names) -+ else: -+ msg = _("Unable to match profile for argument {}").format(spec) -+ logger.error(msg) -+ no_match_specs.append(spec) -+ continue -+ elif name in removed_profiles: -+ -+ for profile in removed_profiles[name]: -+ module_profiles = latest_module.getProfiles(profile) -+ if not module_profiles: -+ logger.warning( -+ _("Installed profile '{0}' is not available in module " -+ "'{1}' stream '{2}'").format(profile, name, stream)) -+ continue -+ profiles.extend(module_profiles) -+ for profile in profiles: -+ self.base._moduleContainer.install(latest_module, profile.getName()) -+ for pkg_name in profile.getContent(): -+ install_dict.setdefault(pkg_name, set()).add(spec) -+ for module in install_module_list: -+ artifacts = module.getArtifacts() -+ install_set_artifacts.update(artifacts) -+ for artifact in artifacts: -+ arch = artifact.rsplit(".", 1)[1] -+ if arch in src_arches: -+ continue -+ pkg_name = artifact.rsplit("-", 2)[0] -+ new_artifacts_names.add(pkg_name) -+ if fail_safe_repo_used: -+ raise dnf.exceptions.Error(_( -+ "Installing module from Fail-Safe repository is not allowed")) -+ install_base_query, profiles_errors = self._install_profiles_internal( -+ install_set_artifacts, install_dict, strict) -+ if profiles_errors: -+ error_specs.extend(profiles_errors) -+ -+ # distrosync module name -+ all_names = set() -+ all_names.update(new_artifacts_names) -+ all_names.update(active_artifacts_names) -+ remove_query = self.base.sack.query().filterm(empty=True) -+ for pkg_name in all_names: -+ query = self.base.sack.query().filterm(name=pkg_name) -+ installed = query.installed() -+ if not installed: -+ continue -+ available = query.available() -+ if not available: -+ logger.warning(_("No packages available to distrosync for package name " -+ "'{}'").format(pkg_name)) -+ if pkg_name not in new_artifacts_names: -+ remove_query = remove_query.union(query) -+ continue -+ -+ only_new_module = query.intersection(install_base_query) -+ if only_new_module: -+ query = only_new_module - sltr = dnf.selector.Selector(self.base.sack) - sltr.set(pkg=query) -- self.base._goal.install(select=sltr, optional=(not strict)) -+ self.base._goal.distupgrade(select=sltr) -+ self.base._remove_if_unneeded(remove_query) -+ - if no_match_specs or error_specs or solver_errors: - raise dnf.exceptions.MarkingErrors(no_match_group_specs=no_match_specs, - error_group_specs=error_specs, -@@ -183,7 +292,7 @@ class ModuleBase(object): - fail_safe_repo = hawkey.MODULE_FAIL_SAFE_REPO_NAME - fail_safe_repo_used = False - -- # Remove source packages they cannot be installed or upgraded -+ # Remove source packages because they cannot be installed or upgraded - base_no_source_query = self.base.sack.query().filterm(arch__neq=['src', 'nosrc']).apply() - - for spec in module_specs: -@@ -694,6 +803,35 @@ class ModuleBase(object): - def _format_repoid(self, repo_name): - return "{}\n".format(self.base.output.term.bold(repo_name)) - -+ def _install_profiles_internal(self, install_set_artifacts, install_dict, strict): -+ # Remove source packages because they cannot be installed or upgraded -+ base_no_source_query = self.base.sack.query().filterm(arch__neq=['src', 'nosrc']).apply() -+ install_base_query = base_no_source_query.filter(nevra_strict=install_set_artifacts) -+ error_specs = [] -+ -+ # add hot-fix packages -+ hot_fix_repos = [i.id for i in self.base.repos.iter_enabled() if i.module_hotfixes] -+ hotfix_packages = base_no_source_query.filter( -+ reponame=hot_fix_repos, name=install_dict.keys()) -+ install_base_query = install_base_query.union(hotfix_packages) -+ -+ for pkg_name, set_specs in install_dict.items(): -+ query = install_base_query.filter(name=pkg_name) -+ if not query: -+ # package can also be non-modular or part of another stream -+ query = base_no_source_query.filter(name=pkg_name) -+ if not query: -+ for spec in set_specs: -+ logger.error(_("Unable to resolve argument {}").format(spec)) -+ logger.error(_("No match for package {}").format(pkg_name)) -+ error_specs.extend(set_specs) -+ continue -+ self.base._goal.group_members.add(pkg_name) -+ sltr = dnf.selector.Selector(self.base.sack) -+ sltr.set(pkg=query) -+ self.base._goal.install(select=sltr, optional=(not strict)) -+ return install_base_query, error_specs -+ - - def format_modular_solver_errors(errors): - msg = dnf.util._format_resolve_problems(errors) --- -2.26.2 - - -From df8c74679193bf27db584b3ad225997b2f5f4b87 Mon Sep 17 00:00:00 2001 -From: Jaroslav Mracek -Date: Thu, 12 Nov 2020 13:51:02 +0100 -Subject: [PATCH 3/5] [minor] Rename all variables with artefact to artifact - ---- - dnf/module/module_base.py | 10 +++++----- - 1 file changed, 5 insertions(+), 5 deletions(-) - -diff --git a/dnf/module/module_base.py b/dnf/module/module_base.py -index 03d54f72..7298c9a3 100644 ---- a/dnf/module/module_base.py -+++ b/dnf/module/module_base.py -@@ -73,7 +73,7 @@ class ModuleBase(object): - # - fail_safe_repo = hawkey.MODULE_FAIL_SAFE_REPO_NAME - install_dict = {} -- install_set_artefacts = set() -+ install_set_artifacts = set() - fail_safe_repo_used = False - for spec, (nsvcap, moduledict) in module_dicts.items(): - for name, streamdict in moduledict.items(): -@@ -136,12 +136,12 @@ class ModuleBase(object): - for pkg_name in profile.getContent(): - install_dict.setdefault(pkg_name, set()).add(spec) - for module in install_module_list: -- install_set_artefacts.update(module.getArtifacts()) -+ install_set_artifacts.update(module.getArtifacts()) - if fail_safe_repo_used: - raise dnf.exceptions.Error(_( - "Installing module from Fail-Safe repository is not allowed")) - __, profiles_errors = self._install_profiles_internal( -- install_set_artefacts, install_dict, strict) -+ install_set_artifacts, install_dict, strict) - if profiles_errors: - error_specs.extend(profiles_errors) - -@@ -326,8 +326,8 @@ class ModuleBase(object): - else: - for profile in latest_module.getProfiles(): - upgrade_package_set.update(profile.getContent()) -- for artefact in latest_module.getArtifacts(): -- subj = hawkey.Subject(artefact) -+ for artifact in latest_module.getArtifacts(): -+ subj = hawkey.Subject(artifact) - for nevra_obj in subj.get_nevra_possibilities( - forms=[hawkey.FORM_NEVRA]): - upgrade_package_set.add(nevra_obj.name) --- -2.26.2 - - -From 0818bb80fc0846f602f338a2119671be97c47217 Mon Sep 17 00:00:00 2001 -From: Jaroslav Mracek -Date: Thu, 12 Nov 2020 15:11:29 +0100 -Subject: [PATCH 4/5] [doc] Add description of dnf module switch-to - ---- - doc/command_ref.rst | 30 ++++++++++++++++++++++-------- - 1 file changed, 22 insertions(+), 8 deletions(-) - -diff --git a/doc/command_ref.rst b/doc/command_ref.rst -index 83879013..c12837ea 100644 ---- a/doc/command_ref.rst -+++ b/doc/command_ref.rst -@@ -979,15 +979,31 @@ Module subcommands take :ref:`\\ `... arg - In case no profile was provided, all default profiles get installed. - Module streams get enabled accordingly. - -- This command cannot be used for switching module streams. It is recommended to remove all -- installed content from the module and reset the module using the -- :ref:`reset ` command. After you reset the module, you can install -- the other stream. -+ This command cannot be used for switching module streams. Use the -+ :ref:`dnf module switch-to ` command for that. - - ``dnf [options] module update ...`` - Update packages associated with an active module stream, optionally restricted to a profile. - If the `profile_name` is provided, only the packages referenced by that profile will be updated. - -+.. _module_switch_to_command-label: -+ -+``dnf [options] module switch-to ...`` -+ Switch to or enable a module stream, change versions of installed packages to versions provided -+ by the new stream, and remove packages from the old stream that are no longer available. It also -+ updates installed profiles if they are available for the new stream. When a profile was -+ provided, it installs that profile and does not update any already installed profiles. -+ -+ This command can be used as a stronger version of the -+ :ref:`dnf module enable ` command, which not only enables modules, -+ but also does a `distrosync` to all modular packages in the enabled modules. -+ -+ It can also be used as a stronger version of the -+ :ref:`dnf module install ` command, but it requires to specify -+ profiles that are supposed to be installed, because `switch-to` command does not use `default -+ profiles`. The `switch-to` command doesn't only install profiles, it also makes a `distrosync` -+ to all modular packages in the installed module. -+ - ``dnf [options] module remove ...`` - Remove installed module profiles, including packages that were installed with the - :ref:`dnf module install ` command. Will not remove packages -@@ -1010,10 +1026,8 @@ Module subcommands take :ref:`\\ `... arg - of modular dependency issue the operation will be rejected. To perform the action anyway please use - \-\ :ref:`-skip-broken ` option. - -- This command cannot be used for switching module streams. It is recommended to remove all -- installed content from the module, and reset the module using the -- :ref:`reset ` command. After you reset the module, you can enable -- the other stream. -+ This command cannot be used for switching module streams. Use the -+ :ref:`dnf module switch-to ` command for that. - - .. _module_disable_command-label: - --- -2.26.2 - - -From 6b0b2b99e40c20706145e774626658825f5bc55d Mon Sep 17 00:00:00 2001 -From: Jaroslav Mracek -Date: Wed, 25 Nov 2020 12:34:30 +0100 -Subject: [PATCH 5/5] Do not use source rpms for module switch - -It prevents misleading message from libsolv that it tries to install -source rpm. ---- - dnf/module/module_base.py | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/dnf/module/module_base.py b/dnf/module/module_base.py -index 7298c9a3..02d5d5a3 100644 ---- a/dnf/module/module_base.py -+++ b/dnf/module/module_base.py -@@ -253,8 +253,10 @@ class ModuleBase(object): - all_names.update(new_artifacts_names) - all_names.update(active_artifacts_names) - remove_query = self.base.sack.query().filterm(empty=True) -+ base_no_source_query = self.base.sack.query().filterm(arch__neq=['src', 'nosrc']).apply() -+ - for pkg_name in all_names: -- query = self.base.sack.query().filterm(name=pkg_name) -+ query = base_no_source_query.filter(name=pkg_name) - installed = query.installed() - if not installed: - continue --- -2.26.2 - diff --git a/SOURCES/0009-yum.misc.decompress-to-handle-uncompressed-files-RhBug-1895059.patch b/SOURCES/0009-yum.misc.decompress-to-handle-uncompressed-files-RhBug-1895059.patch deleted file mode 100644 index 240495d..0000000 --- a/SOURCES/0009-yum.misc.decompress-to-handle-uncompressed-files-RhBug-1895059.patch +++ /dev/null @@ -1,107 +0,0 @@ -From de8bbccc4e035a9a9b5baa3aeb0dbf0cb12f1fe2 Mon Sep 17 00:00:00 2001 -From: Marek Blaha -Date: Wed, 9 Dec 2020 13:45:46 +0100 -Subject: [PATCH 1/1] yum.misc.decompress() to handle uncompressed files - (RhBug:1895059) - -The underlying libdnf function is capable to handle even uncompressed -files - so now uncompressed files are just copied to the destination. -Also unused fn_only parameter of the function was removed. - -This fixes issue with "reposync -m" command when the group metadata file -in the repository is a plain xml file (not compressed). - -https://bugzilla.redhat.com/show_bug.cgi?id=1895059 ---- - dnf/yum/misc.py | 60 +++++++++++++++++++++++++++---------------------- - 1 file changed, 33 insertions(+), 27 deletions(-) - -diff --git a/dnf/yum/misc.py b/dnf/yum/misc.py -index 0f922350..3e3905fe 100644 ---- a/dnf/yum/misc.py -+++ b/dnf/yum/misc.py -@@ -386,34 +386,39 @@ def getloginuid(): - _cached_getloginuid = _getloginuid() - return _cached_getloginuid - --def decompress(filename, dest=None, fn_only=False, check_timestamps=False): -- """take a filename and decompress it into the same relative location. -- if the file is not compressed just return the file""" -- -- ztype = None -- out = filename # If the file is not compressed, it returns the same file - -- dot_pos = filename.rfind('.') -- if dot_pos > 0: -- ext = filename[dot_pos:] -- if ext in ('.zck', '.xz', '.bz2', '.gz'): -- ztype = ext -- out = dest if dest else filename[:dot_pos] -- -- if ztype and not fn_only: -- if check_timestamps: -- fi = stat_f(filename) -- fo = stat_f(out) -- if fi and fo and fo.st_mtime == fi.st_mtime: -- return out -+def decompress(filename, dest=None, check_timestamps=False): -+ """take a filename and decompress it into the same relative location. -+ When the compression type is not recognized (or file is not compressed), -+ the content of the file is copied to the destination""" -+ -+ if dest: -+ out = dest -+ else: -+ out = None -+ dot_pos = filename.rfind('.') -+ if dot_pos > 0: -+ ext = filename[dot_pos:] -+ if ext in ('.zck', '.xz', '.bz2', '.gz', '.lzma', '.zst'): -+ out = filename[:dot_pos] -+ if out is None: -+ raise dnf.exceptions.MiscError("Could not determine destination filename") -+ -+ if check_timestamps: -+ fi = stat_f(filename) -+ fo = stat_f(out) -+ if fi and fo and fo.st_mtime == fi.st_mtime: -+ return out - -- try: -- libdnf.utils.decompress(filename, out, 0o644, ztype) -- except RuntimeError as e: -- raise dnf.exceptions.MiscError(str(e)) -+ try: -+ # libdnf.utils.decompress either decompress file to the destination or -+ # copy the content if the compression type is not recognized -+ libdnf.utils.decompress(filename, out, 0o644) -+ except RuntimeError as e: -+ raise dnf.exceptions.MiscError(str(e)) - -- if check_timestamps and fi: -- os.utime(out, (fi.st_mtime, fi.st_mtime)) -+ if check_timestamps and fi: -+ os.utime(out, (fi.st_mtime, fi.st_mtime)) - - return out - -@@ -424,13 +429,14 @@ def calculate_repo_gen_dest(filename, generated_name): - os.makedirs(dest, mode=0o755) - return dest + '/' + generated_name - --def repo_gen_decompress(filename, generated_name, cached=False): -+ -+def repo_gen_decompress(filename, generated_name): - """ This is a wrapper around decompress, where we work out a cached - generated name, and use check_timestamps. filename _must_ be from - a repo. and generated_name is the type of the file. """ - - dest = calculate_repo_gen_dest(filename, generated_name) -- return decompress(filename, dest=dest, check_timestamps=True, fn_only=cached) -+ return decompress(filename, dest=dest, check_timestamps=True) - - def read_in_items_from_dot_dir(thisglob, line_as_list=True): - """ Takes a glob of a dir (like /etc/foo.d/\\*.foo) returns a list of all --- -2.26.2 - diff --git a/SOURCES/0010-Make-log-rotated-permissions-match-initial-log-permissions-RhBug-1894344.patch b/SOURCES/0010-Make-log-rotated-permissions-match-initial-log-permissions-RhBug-1894344.patch deleted file mode 100644 index 3bfdafb..0000000 --- a/SOURCES/0010-Make-log-rotated-permissions-match-initial-log-permissions-RhBug-1894344.patch +++ /dev/null @@ -1,22 +0,0 @@ -From 04b1a90bb24b7e98d4e001c44f8b3f563ad5f0f6 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= -Date: Tue, 24 Nov 2020 14:31:21 +0100 -Subject: [PATCH] Make rotated log file (mode, owner, group) match previous log - settings (RhBug:1894344) - -https://bugzilla.redhat.com/show_bug.cgi?id=1894344 ---- - etc/logrotate.d/dnf | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/etc/logrotate.d/dnf b/etc/logrotate.d/dnf -index b96c6ff9b4..0ce2629f1b 100644 ---- a/etc/logrotate.d/dnf -+++ b/etc/logrotate.d/dnf -@@ -3,5 +3,5 @@ - notifempty - rotate 4 - weekly -- create 0600 root root -+ create - } diff --git a/SOURCES/0011-Add-new-attribute-for-Package--from-repo.patch b/SOURCES/0011-Add-new-attribute-for-Package--from-repo.patch deleted file mode 100644 index 49c2a1a..0000000 --- a/SOURCES/0011-Add-new-attribute-for-Package--from-repo.patch +++ /dev/null @@ -1,117 +0,0 @@ -From eb2aa8c14208da7a567a0d79a8baa9f5201640cd Mon Sep 17 00:00:00 2001 -From: Jaroslav Mracek -Date: Tue, 24 Nov 2020 09:17:41 +0100 -Subject: [PATCH 1/3] Add `from_repo` attribute for Package class - (RhBug:1898968,1879168) - -It as an alias for private attribute _from_repo. - -https://bugzilla.redhat.com/show_bug.cgi?id=1898968 -https://bugzilla.redhat.com/show_bug.cgi?id=1879168 ---- - dnf/cli/commands/repoquery.py | 2 +- - dnf/package.py | 7 +++++-- - doc/api_package.rst | 6 ++++++ - 3 files changed, 12 insertions(+), 3 deletions(-) - -diff --git a/dnf/cli/commands/repoquery.py b/dnf/cli/commands/repoquery.py -index 099a9312d9..a11b440525 100644 ---- a/dnf/cli/commands/repoquery.py -+++ b/dnf/cli/commands/repoquery.py -@@ -44,7 +44,7 @@ - QFORMAT_MATCH = re.compile(r'%(-?\d*?){([:.\w]+?)}') - - QUERY_TAGS = """\ --name, arch, epoch, version, release, reponame (repoid), evr, -+name, arch, epoch, version, release, reponame (repoid), from_repo, evr, - debug_name, source_name, source_debug_name, - installtime, buildtime, size, downloadsize, installsize, - provides, requires, obsoletes, conflicts, sourcerpm, -diff --git a/dnf/package.py b/dnf/package.py -index d44ce6706c..f647df6bff 100644 ---- a/dnf/package.py -+++ b/dnf/package.py -@@ -76,12 +76,15 @@ def _from_repo(self): - pkgrepo = None - if self._from_system: - pkgrepo = self.base.history.repo(self) -- else: -- pkgrepo = {} - if pkgrepo: - return '@' + pkgrepo - return self.reponame - -+ @property -+ def from_repo(self): -+ # :api -+ return self._from_repo -+ - @property - def _header(self): - return dnf.rpm._header(self.localPkg()) -diff --git a/doc/api_package.rst b/doc/api_package.rst -index 95df5d4b23..48ef8f1d22 100644 ---- a/doc/api_package.rst -+++ b/doc/api_package.rst -@@ -74,6 +74,12 @@ - - Files the package provides (list of strings). - -+ .. attribute:: from_repo -+ -+ For installed packages returns id of repository from which the package was installed prefixed -+ with '@' (if such information is available in the history database). Otherwise returns id of -+ repository the package belongs to (@System for installed packages of unknown origin) (string). -+ - .. attribute:: group - - Group of the package (string). - -From 1a933f8e036cd704fa6e7f77a8448263e93e540f Mon Sep 17 00:00:00 2001 -From: Jaroslav Mracek -Date: Tue, 24 Nov 2020 09:19:42 +0100 -Subject: [PATCH 2/3] Correct description of Package().reponane attribute - ---- - doc/api_package.rst | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/doc/api_package.rst b/doc/api_package.rst -index 48ef8f1d22..a78897babe 100644 ---- a/doc/api_package.rst -+++ b/doc/api_package.rst -@@ -138,7 +138,7 @@ - - .. attribute:: reponame - -- Id of repository the package was installed from (string). -+ Id of repository the package belongs to (@System for installed packages) (string). - - .. attribute:: requires - - -From 24cdb68776507fdae25bed0e82d80df3018aecfc Mon Sep 17 00:00:00 2001 -From: Jaroslav Mracek -Date: Tue, 24 Nov 2020 09:22:07 +0100 -Subject: [PATCH 3/3] Add unittest for new API - ---- - tests/api/test_dnf_package.py | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/tests/api/test_dnf_package.py b/tests/api/test_dnf_package.py -index 04cddc7ecc..5952352bb5 100644 ---- a/tests/api/test_dnf_package.py -+++ b/tests/api/test_dnf_package.py -@@ -163,6 +163,11 @@ def test_reponame(self): - self.assertHasAttr(self.package, "reponame") - self.assertHasType(self.package.reponame, str) - -+ def test_from_repo(self): -+ # Package.reponame -+ self.assertHasAttr(self.package, "from_repo") -+ self.assertHasType(self.package.from_repo, str) -+ - def test_requires(self): - # Package.requires - self.assertHasAttr(self.package, "requires") diff --git a/SOURCES/0012-Change-behaviour-of-Package-.from-repo.patch b/SOURCES/0012-Change-behaviour-of-Package-.from-repo.patch deleted file mode 100644 index b81646b..0000000 --- a/SOURCES/0012-Change-behaviour-of-Package-.from-repo.patch +++ /dev/null @@ -1,80 +0,0 @@ -From ca06d200d738fd6b23cb05b9776c9fd29288665f Mon Sep 17 00:00:00 2001 -From: Jaroslav Mracek -Date: Wed, 25 Nov 2020 13:00:22 +0100 -Subject: [PATCH 1/2] Change behaviour of Package().from_repo - -The change makes a difference between private attribute _from_repo and -API attribute. _from_repo is required for `dnf info` and we have to keep -it, but for API the magic handling behind could be confusing. ---- - dnf/package.py | 8 +++++++- - doc/api_package.rst | 5 ++--- - 2 files changed, 9 insertions(+), 4 deletions(-) - -diff --git a/dnf/package.py b/dnf/package.py -index f647df6bff..28ca5ef760 100644 ---- a/dnf/package.py -+++ b/dnf/package.py -@@ -73,6 +73,12 @@ def _from_system(self): - - @property - def _from_repo(self): -+ """ -+ For installed packages returns id of repository from which the package was installed -+ prefixed with '@' (if such information is available in the history database). Otherwise -+ returns id of repository the package belongs to (@System for installed packages of unknown -+ origin) -+ """ - pkgrepo = None - if self._from_system: - pkgrepo = self.base.history.repo(self) -@@ -83,7 +89,7 @@ def _from_repo(self): - @property - def from_repo(self): - # :api -- return self._from_repo -+ return self.base.history.repo(self) - - @property - def _header(self): -diff --git a/doc/api_package.rst b/doc/api_package.rst -index a78897babe..634f504ca6 100644 ---- a/doc/api_package.rst -+++ b/doc/api_package.rst -@@ -76,9 +76,8 @@ - - .. attribute:: from_repo - -- For installed packages returns id of repository from which the package was installed prefixed -- with '@' (if such information is available in the history database). Otherwise returns id of -- repository the package belongs to (@System for installed packages of unknown origin) (string). -+ For installed packages returns id of repository from which the package was installed if such -+ information is available in the history database. Otherwise returns an empty string (string). - - .. attribute:: group - - -From 895e61a1281db753dd28f01c20816e83c5316cdd Mon Sep 17 00:00:00 2001 -From: Jaroslav Mracek -Date: Thu, 26 Nov 2020 10:02:08 +0100 -Subject: [PATCH 2/2] fixup! Change behaviour of Package().from_repo - ---- - dnf/package.py | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/dnf/package.py b/dnf/package.py -index 28ca5ef760..baef04fa5b 100644 ---- a/dnf/package.py -+++ b/dnf/package.py -@@ -89,7 +89,9 @@ def _from_repo(self): - @property - def from_repo(self): - # :api -- return self.base.history.repo(self) -+ if self._from_system: -+ return self.base.history.repo(self) -+ return "" - - @property - def _header(self): diff --git a/SOURCES/0013-Package-add-a-get-header--method.patch b/SOURCES/0013-Package-add-a-get-header--method.patch deleted file mode 100644 index a5f8478..0000000 --- a/SOURCES/0013-Package-add-a-get-header--method.patch +++ /dev/null @@ -1,94 +0,0 @@ -From 38cc67385fb1b36aa0881bc5982bc58d75dac464 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hr=C3=A1zk=C3=BD?= -Date: Wed, 11 Nov 2020 18:45:11 +0100 -Subject: [PATCH] Package: add a get_header() method (RhBug:1876606) - -Adds get_header() method to the Package class, which returns the rpm -header of an installed package. - -= changelog = -msg: Add get_header() method to the Package class -type: enhancement -resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1876606 ---- - dnf/package.py | 24 ++++++++++++++++++++++++ - tests/test_package.py | 12 ++++++++++++ - 2 files changed, 36 insertions(+) - -diff --git a/dnf/package.py b/dnf/package.py -index baef04fa5b..836e0e4989 100644 ---- a/dnf/package.py -+++ b/dnf/package.py -@@ -26,11 +26,13 @@ - from dnf.i18n import _ - - import binascii -+import dnf.exceptions - import dnf.rpm - import dnf.yum.misc - import hawkey - import logging - import os -+import rpm - - logger = logging.getLogger("dnf") - -@@ -95,6 +97,11 @@ def from_repo(self): - - @property - def _header(self): -+ """ -+ Returns the header of a locally present rpm package file. As opposed to -+ self.get_header(), which retrieves the header of an installed package -+ from rpmdb. -+ """ - return dnf.rpm._header(self.localPkg()) - - @property -@@ -164,6 +171,23 @@ def debugsource_name(self): - src_name = self.source_name if self.source_name is not None else self.name - return src_name + self.DEBUGSOURCE_SUFFIX - -+ def get_header(self): -+ """ -+ Returns the rpm header of the package if it is installed. If not -+ installed, returns None. The header is not cached, it is retrieved from -+ rpmdb on every call. In case of a failure (e.g. when the rpmdb changes -+ between loading the data and calling this method), raises an instance -+ of PackageNotFoundError. -+ """ -+ if not self._from_system: -+ return None -+ -+ try: -+ # RPMDBI_PACKAGES stands for the header of the package -+ return next(self.base._ts.dbMatch(rpm.RPMDBI_PACKAGES, self.rpmdbid)) -+ except StopIteration: -+ raise dnf.exceptions.PackageNotFoundError("Package not found when attempting to retrieve header", str(self)) -+ - @property - def source_debug_name(self): - # :api -diff --git a/tests/test_package.py b/tests/test_package.py -index cd4872e631..514e5bf099 100644 ---- a/tests/test_package.py -+++ b/tests/test_package.py -@@ -68,6 +68,18 @@ def fn_getter(): - with self.assertRaises(IOError): - pkg._header - -+ # rpm.hdr() is not easy to construct with custom data, we just return a string -+ # instead, as we don't actually need an instance of rpm.hdr for the test -+ @mock.patch("rpm.TransactionSet.dbMatch", lambda self, a, b: iter(["package_header_test_data"])) -+ def test_get_header(self): -+ pkg = self.sack.query().installed().filter(name="pepper")[0] -+ header = pkg.get_header() -+ self.assertEqual(header, "package_header_test_data") -+ -+ pkg = self.sack.query().available().filter(name="pepper")[0] -+ header = pkg.get_header() -+ self.assertEqual(header, None) -+ - @mock.patch("dnf.package.Package.rpmdbid", long(3)) - def test_idx(self): - """ pkg.idx is an int. """ diff --git a/SOURCES/0014-Add-api-function-fill-sack-from-repos-in-cache-RhBug-1865803.patch b/SOURCES/0014-Add-api-function-fill-sack-from-repos-in-cache-RhBug-1865803.patch deleted file mode 100644 index d912d69..0000000 --- a/SOURCES/0014-Add-api-function-fill-sack-from-repos-in-cache-RhBug-1865803.patch +++ /dev/null @@ -1,115 +0,0 @@ -From b3542a96c6f77e5cc0b5217e586fcc56fde074d8 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= -Date: Wed, 2 Dec 2020 15:27:13 +0100 -Subject: [PATCH 1/2] Add api function: fill_sack_from_repos_in_cache - (RhBug:1865803) - -= changelog = -msg: Add api function fill_sack_from_repos_in_cache to allow loading a repo cache with repomd and (solv file or primary xml) only -type: enhancement -resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1865803 ---- - dnf.spec | 2 +- - dnf/base.py | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 63 insertions(+), 1 deletion(-) - -diff --git a/dnf/base.py b/dnf/base.py -index 075e74265a..a10b837340 100644 ---- a/dnf/base.py -+++ b/dnf/base.py -@@ -425,6 +425,68 @@ def fill_sack(self, load_system_repo=True, load_available_repos=True): - self._plugins.run_sack() - return self._sack - -+ def fill_sack_from_repos_in_cache(self, load_system_repo=True): -+ # :api -+ """ -+ Prepare Sack and Goal objects and also load all enabled repositories from cache only, -+ it doesn't download anything and it doesn't check if metadata are expired. -+ If there is not enough metadata present (repond.xml or both primary.xml and solv file -+ are missing) given repo is either skipped or it throws a RepoError exception depending -+ on skip_if_unavailable configuration. -+ """ -+ timer = dnf.logging.Timer('sack setup') -+ self.reset(sack=True, goal=True) -+ self._sack = dnf.sack._build_sack(self) -+ lock = dnf.lock.build_metadata_lock(self.conf.cachedir, self.conf.exit_on_lock) -+ with lock: -+ if load_system_repo is not False: -+ try: -+ # FIXME: If build_cache=True, @System.solv is incorrectly updated in install- -+ # remove loops -+ self._sack.load_system_repo(build_cache=False) -+ except IOError: -+ if load_system_repo != 'auto': -+ raise -+ -+ error_repos = [] -+ # Iterate over installed GPG keys and check their validity using DNSSEC -+ if self.conf.gpgkey_dns_verification: -+ dnf.dnssec.RpmImportedKeys.check_imported_keys_validity() -+ for repo in self.repos.iter_enabled(): -+ try: -+ repo._repo.loadCache(throwExcept=True, ignoreMissing=True) -+ mdload_flags = dict(load_filelists=True, -+ load_presto=repo.deltarpm, -+ load_updateinfo=True) -+ if repo.load_metadata_other: -+ mdload_flags["load_other"] = True -+ -+ self._sack.load_repo(repo._repo, **mdload_flags) -+ -+ logger.debug(_("%s: using metadata from %s."), repo.id, -+ dnf.util.normalize_time( -+ repo._repo.getMaxTimestamp())) -+ except (RuntimeError, hawkey.Exception) as e: -+ if repo.skip_if_unavailable is False: -+ raise dnf.exceptions.RepoError( -+ _("loading repo '{}' failure: {}").format(repo.id, e)) -+ else: -+ logger.debug(_("loading repo '{}' failure: {}").format(repo.id, e)) -+ error_repos.append(repo.id) -+ repo.disable() -+ if error_repos: -+ logger.warning( -+ _("Ignoring repositories: %s"), ', '.join(error_repos)) -+ -+ conf = self.conf -+ self._sack._configure(conf.installonlypkgs, conf.installonly_limit, conf.allow_vendor_change) -+ self._setup_excludes_includes() -+ timer() -+ self._goal = dnf.goal.Goal(self._sack) -+ self._goal.protect_running_kernel = conf.protect_running_kernel -+ self._plugins.run_sack() -+ return self._sack -+ - def _finalize_base(self): - self._tempfile_persistor = dnf.persistor.TempfilePersistor( - self.conf.cachedir) - -From 29ae53918d4a0b65a917aca2f8f43416fee15dfd Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= -Date: Thu, 10 Dec 2020 14:54:16 +0100 -Subject: [PATCH 2/2] Add api test for new fill_sack_from_repos_in_cache - ---- - tests/api/test_dnf_base.py | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/tests/api/test_dnf_base.py b/tests/api/test_dnf_base.py -index 656bd22584..335981897e 100644 ---- a/tests/api/test_dnf_base.py -+++ b/tests/api/test_dnf_base.py -@@ -107,6 +107,12 @@ def test_fill_sack(self): - - self.base.fill_sack(load_system_repo=False, load_available_repos=False) - -+ def test_fill_sack_from_repos_in_cache(self): -+ # Base.fill_sack_from_repos_in_cache(self, load_system_repo=True): -+ self.assertHasAttr(self.base, "fill_sack_from_repos_in_cache") -+ -+ self.base.fill_sack_from_repos_in_cache(load_system_repo=False) -+ - def test_close(self): - # Base.close() - self.assertHasAttr(self.base, "close") diff --git a/SOURCES/0015-Add-tests-and-docs-for-fill-sack-from-repos-in-cache-RhBug-1865803.patch b/SOURCES/0015-Add-tests-and-docs-for-fill-sack-from-repos-in-cache-RhBug-1865803.patch deleted file mode 100644 index 30dbab6..0000000 --- a/SOURCES/0015-Add-tests-and-docs-for-fill-sack-from-repos-in-cache-RhBug-1865803.patch +++ /dev/null @@ -1,366 +0,0 @@ -From a777ff01c79d5e0e2cf3ae7b0652795577253bc3 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= -Date: Thu, 14 Jan 2021 09:58:30 +0100 -Subject: [PATCH 1/3] Fix recreate script - ---- - tests/repos/rpm/recreate | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/tests/repos/rpm/recreate b/tests/repos/rpm/recreate -index da348d9799..0fbb9396bd 100755 ---- a/tests/repos/rpm/recreate -+++ b/tests/repos/rpm/recreate -@@ -1,6 +1,6 @@ - #!/bin/bash - --THISDIR="$( readlink -f "$( dirname "$0 )" )" -+THISDIR="$( readlink -f "$( dirname "$0" )" )" - cd "$THISDIR" - git rm -rf repodata/ - createrepo --no-database -o . .. - -From 5d4c0266f6967c7cd5f0e675b13fa3e9b395e4dd Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= -Date: Thu, 14 Jan 2021 10:28:53 +0100 -Subject: [PATCH 2/3] Add unit test for fill_sack_from_repos_in_cache - (RhBug:1865803) - -https://bugzilla.redhat.com/show_bug.cgi?id=1865803 ---- - tests/test_fill_sack_from_repos_in_cache.py | 262 ++++++++++++++++++++ - 1 file changed, 262 insertions(+) - create mode 100644 tests/test_fill_sack_from_repos_in_cache.py - -diff --git a/tests/test_fill_sack_from_repos_in_cache.py b/tests/test_fill_sack_from_repos_in_cache.py -new file mode 100644 -index 0000000000..24b0d4598d ---- /dev/null -+++ b/tests/test_fill_sack_from_repos_in_cache.py -@@ -0,0 +1,262 @@ -+# -*- coding: utf-8 -*- -+ -+# Copyright (C) 2012-2021 Red Hat, Inc. -+# -+# This copyrighted material is made available to anyone wishing to use, -+# modify, copy, or redistribute it subject to the terms and conditions of -+# the GNU General Public License v.2, or (at your option) any later version. -+# This program is distributed in the hope that it will be useful, but WITHOUT -+# ANY WARRANTY expressed or implied, including the implied warranties of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -+# Public License for more details. You should have received a copy of the -+# GNU General Public License along with this program; if not, write to the -+# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -+# 02110-1301, USA. Any Red Hat trademarks that are incorporated in the -+# source code or documentation are not subject to the GNU General Public -+# License and may only be used or replicated with the express permission of -+# Red Hat, Inc. -+# -+ -+from __future__ import absolute_import -+from __future__ import unicode_literals -+ -+import os -+import tempfile -+import glob -+import shutil -+import unittest -+ -+import dnf.exceptions -+import dnf.repo -+import dnf.sack -+ -+import hawkey -+ -+import tests.support -+from tests.support import mock -+ -+TEST_REPO_NAME = "test-repo" -+ -+ -+class FillSackFromReposInCacheTest(unittest.TestCase): -+ def _create_cache_for_repo(self, repopath, tmpdir): -+ conf = dnf.conf.MainConf() -+ conf.cachedir = os.path.join(tmpdir, "cache") -+ -+ base = dnf.Base(conf=conf) -+ -+ repoconf = dnf.repo.Repo(TEST_REPO_NAME, base.conf) -+ repoconf.baseurl = repopath -+ repoconf.enable() -+ -+ base.repos.add(repoconf) -+ -+ base.fill_sack(load_system_repo=False) -+ base.close() -+ -+ def _setUp_from_repo_path(self, original_repo_path): -+ self.tmpdir = tempfile.mkdtemp(prefix="dnf_test_") -+ -+ self.repo_copy_path = os.path.join(self.tmpdir, "repo") -+ shutil.copytree(original_repo_path, self.repo_copy_path) -+ -+ self._create_cache_for_repo(self.repo_copy_path, self.tmpdir) -+ -+ # Just to be sure remove repo (it shouldn't be used) -+ shutil.rmtree(self.repo_copy_path) -+ -+ # Prepare base for the actual test -+ conf = dnf.conf.MainConf() -+ conf.cachedir = os.path.join(self.tmpdir, "cache") -+ self.test_base = dnf.Base(conf=conf) -+ repoconf = dnf.repo.Repo(TEST_REPO_NAME, conf) -+ repoconf.baseurl = self.repo_copy_path -+ repoconf.enable() -+ self.test_base.repos.add(repoconf) -+ -+ def tearDown(self): -+ self.test_base.close() -+ shutil.rmtree(self.tmpdir) -+ -+ def test_with_solv_solvx_repomd(self): -+ self._setUp_from_repo_path(os.path.join(os.path.abspath(os.path.dirname(__file__)), "repos/rpm")) -+ -+ # Remove xml metadata except repomd -+ # repomd.xml is not compressed and doesn't end with .gz -+ repodata_without_repomd = glob.glob(os.path.join(self.tmpdir, "cache/test-repo-*/repodata/*.gz")) -+ for f in repodata_without_repomd: -+ os.remove(f) -+ -+ # Now we only have cache with just solv, solvx files and repomd.xml -+ -+ self.test_base.fill_sack_from_repos_in_cache(load_system_repo=False) -+ -+ q = self.test_base.sack.query() -+ packages = q.run() -+ self.assertEqual(len(packages), 9) -+ self.assertEqual(packages[0].evr, "4-4") -+ -+ # Use *-updateinfo.solvx -+ adv_pkgs = q.get_advisory_pkgs(hawkey.LT | hawkey.EQ | hawkey.GT) -+ adv_titles = set() -+ for pkg in adv_pkgs: -+ adv_titles.add(pkg.get_advisory(self.test_base.sack).title) -+ self.assertEqual(len(adv_titles), 3) -+ -+ def test_with_just_solv_repomd(self): -+ self._setUp_from_repo_path(os.path.join(os.path.abspath(os.path.dirname(__file__)), "repos/rpm")) -+ -+ # Remove xml metadata except repomd -+ # repomd.xml is not compressed and doesn't end with .gz -+ repodata_without_repomd = glob.glob(os.path.join(self.tmpdir, "cache/test-repo-*/repodata/*.gz")) -+ for f in repodata_without_repomd: -+ os.remove(f) -+ -+ # Remove solvx files -+ solvx = glob.glob(os.path.join(self.tmpdir, "cache/*.solvx")) -+ for f in solvx: -+ os.remove(f) -+ -+ # Now we only have cache with just solv files and repomd.xml -+ -+ self.test_base.fill_sack_from_repos_in_cache(load_system_repo=False) -+ -+ q = self.test_base.sack.query() -+ packages = q.run() -+ self.assertEqual(len(packages), 9) -+ self.assertEqual(packages[0].evr, "4-4") -+ -+ # No *-updateinfo.solvx -> we get no advisory packages -+ adv_pkgs = q.get_advisory_pkgs(hawkey.LT | hawkey.EQ | hawkey.GT) -+ self.assertEqual(len(adv_pkgs), 0) -+ -+ def test_with_xml_metadata(self): -+ self._setUp_from_repo_path(os.path.join(os.path.abspath(os.path.dirname(__file__)), "repos/rpm")) -+ -+ # Remove all solv and solvx files -+ solvx = glob.glob(os.path.join(self.tmpdir, "cache/*.solv*")) -+ for f in solvx: -+ os.remove(f) -+ -+ # Now we only have cache with just xml metadata -+ -+ self.test_base.fill_sack_from_repos_in_cache(load_system_repo=False) -+ -+ q = self.test_base.sack.query() -+ packages = q.run() -+ self.assertEqual(len(packages), 9) -+ self.assertEqual(packages[0].evr, "4-4") -+ -+ def test_exception_without_repomd(self): -+ self._setUp_from_repo_path(os.path.join(os.path.abspath(os.path.dirname(__file__)), "repos/rpm")) -+ -+ # Remove xml metadata -+ repodata_without_repomd = glob.glob(os.path.join(self.tmpdir, "cache/test-repo-*/repodata/*")) -+ for f in repodata_without_repomd: -+ os.remove(f) -+ -+ # Now we only have cache with just solv and solvx files -+ # Since we don't have repomd we cannot verify checksums -> fail (exception) -+ -+ self.assertRaises(dnf.exceptions.RepoError, -+ self.test_base.fill_sack_from_repos_in_cache, load_system_repo=False) -+ -+ def test_exception_with_just_repomd(self): -+ self._setUp_from_repo_path(os.path.join(os.path.abspath(os.path.dirname(__file__)), "repos/rpm")) -+ -+ # Remove xml metadata except repomd -+ # repomd.xml is not compressed and doesn't end with .gz -+ repodata_without_repomd = glob.glob(os.path.join(self.tmpdir, "cache/test-repo-*/repodata/*.gz")) -+ for f in repodata_without_repomd: -+ os.remove(f) -+ -+ # Remove all solv and solvx files -+ solvx = glob.glob(os.path.join(self.tmpdir, "cache/*.solv*")) -+ for f in solvx: -+ os.remove(f) -+ -+ # Now we only have cache with just repomd -+ # repomd is not enough, it doesn't contain the metadata it self -> fail (exception) -+ -+ self.assertRaises(dnf.exceptions.RepoError, -+ self.test_base.fill_sack_from_repos_in_cache, load_system_repo=False) -+ -+ def test_exception_with_checksum_mismatch_and_only_repomd(self): -+ self._setUp_from_repo_path(os.path.join(os.path.abspath(os.path.dirname(__file__)), "repos/rpm")) -+ -+ # Remove xml metadata except repomd -+ # repomd.xml is not compressed and doesn't end with .gz -+ repodata_without_repomd = glob.glob(os.path.join(self.tmpdir, "cache/test-repo-*/repodata/*.gz")) -+ for f in repodata_without_repomd: -+ os.remove(f) -+ -+ # Modify checksum of solv file so it doesn't match with repomd -+ solv = glob.glob(os.path.join(self.tmpdir, "cache/*.solv"))[0] -+ with open(solv, "a") as opensolv: -+ opensolv.write("appended text to change checksum") -+ -+ # Now we only have cache with solvx, modified solv file and just repomd -+ # Since we don't have original xml metadata we cannot regenerate solv -> fail (exception) -+ -+ self.assertRaises(dnf.exceptions.RepoError, -+ self.test_base.fill_sack_from_repos_in_cache, load_system_repo=False) -+ -+ def test_checksum_mistmatch_regenerates_solv(self): -+ self._setUp_from_repo_path(os.path.join(os.path.abspath(os.path.dirname(__file__)), "repos/rpm")) -+ -+ # Modify checksum of solv file so it doesn't match with repomd -+ solv = glob.glob(os.path.join(self.tmpdir, "cache/*.solv"))[0] -+ with open(solv, "a") as opensolv: -+ opensolv.write("appended text to change checksum") -+ -+ # Now we only have cache with solvx, modified solv file and xml metadata. -+ # Checksum mistmatch causes regeneration of solv file and repo works. -+ -+ self.test_base.fill_sack_from_repos_in_cache(load_system_repo=False) -+ -+ q = self.test_base.sack.query() -+ packages = q.run() -+ self.assertEqual(len(packages), 9) -+ self.assertEqual(packages[0].evr, "4-4") -+ -+ def test_with_modules_yaml(self): -+ self._setUp_from_repo_path(os.path.join(os.path.abspath(os.path.dirname(__file__)), -+ "modules/modules/_all/x86_64")) -+ -+ # Now we have full cache (also with modules.yaml) -+ -+ self.test_base.fill_sack_from_repos_in_cache(load_system_repo=False) -+ -+ q = self.test_base.sack.query() -+ packages = q.run() -+ self.assertEqual(len(packages), 8) -+ self.assertEqual(packages[0].evr, "2.02-0.40") -+ -+ self.module_base = dnf.module.module_base.ModuleBase(self.test_base) -+ modules, _ = self.module_base._get_modules("base-runtime*") -+ self.assertEqual(len(modules), 3) -+ self.assertEqual(modules[0].getFullIdentifier(), "base-runtime:f26:1::") -+ -+ def test_with_modular_repo_without_modules_yaml(self): -+ self._setUp_from_repo_path(os.path.join(os.path.abspath(os.path.dirname(__file__)), -+ "modules/modules/_all/x86_64")) -+ -+ # Remove xml and yaml metadata except repomd -+ # repomd.xml is not compressed and doesn't end with .gz -+ repodata_without_repomd = glob.glob(os.path.join(self.tmpdir, "cache/test-repo-*/repodata/*.gz")) -+ for f in repodata_without_repomd: -+ os.remove(f) -+ -+ # Now we have just solv, *-filenames.solvx and repomd.xml (modules.yaml are not processed into *-modules.solvx) -+ -+ self.test_base.fill_sack_from_repos_in_cache(load_system_repo=False) -+ -+ q = self.test_base.sack.query() -+ packages = q.run() -+ # We have many more packages because they are not hidden by modules -+ self.assertEqual(len(packages), 44) -+ self.assertEqual(packages[0].evr, "10.0-7") -+ -+ self.module_base = dnf.module.module_base.ModuleBase(self.test_base) -+ modules, _ = self.module_base._get_modules("base-runtime*") -+ self.assertEqual(len(modules), 0) - -From de6177dba3dc20191e275eec14672570a0c4f4a8 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= -Date: Thu, 14 Jan 2021 12:29:06 +0100 -Subject: [PATCH 3/3] Add docs and examples for fill_sack_from_repos_in_cache - (RhBug:1865803) - -https://bugzilla.redhat.com/show_bug.cgi?id=1865803 ---- - doc/api_base.rst | 41 +++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 41 insertions(+) - -diff --git a/doc/api_base.rst b/doc/api_base.rst -index 24ecb50e43..f0b1992e88 100644 ---- a/doc/api_base.rst -+++ b/doc/api_base.rst -@@ -111,6 +111,47 @@ - print("id: {}".format(repo.id)) - print("baseurl: {}".format(repo.baseurl)) - -+ .. method:: fill_sack_from_repos_in_cache(load_system_repo=True) -+ -+ Prepare Sack and Goal objects and load all enabled repositories from cache only, it doesn't download anything and it doesn't check if metadata are expired. -+ To successfully load a repository cache it requires repond.xml plus metadata (xml, yaml) or repond.xml plus generated cache files (solv, solvx). -+ If there is not enough metadata given repo is either skipped or it throws a :exc:`dnf.exceptions.RepoError` exception depending on :attr:`dnf.conf.Conf.skip_if_unavailable` configuration. -+ -+ All additional metadata are loaded if present but are not generally required. Note that some metadata like updateinfo.xml get processed into a solvx cache file and its sufficient to have either xml or solvx. Module metadata represented by modules.yaml are not processed therefore they are needed when they are defined in repomd.xml. -+ -+ Example of loading all configured repositories from cache and printing available packages' names:: -+ -+ #!/usr/bin/python3 -+ import dnf -+ -+ with dnf.Base() as base: -+ base.read_all_repos() -+ -+ base.fill_sack_from_repos_in_cache(load_system_repo=False) -+ -+ query = base.sack.query().available() -+ for pkg in query.run(): -+ print(pkg.name) -+ -+ Example of loading a single repository and printing available packages' names without reading repository configuration:: -+ -+ #!/usr/bin/python3 -+ import dnf -+ -+ with dnf.Base() as base: -+ repo = dnf.repo.Repo("rawhide", base.conf) -+ -+ # Repository cache is also identified by its source therefore to find it you need to -+ # set metalink, mirrorlist or baseurl to the same value from which it was created. -+ repo.metalink = "https://mirrors.fedoraproject.org/metalink?repo=rawhide&arch=x86_64" -+ -+ base.repos.add(repo) -+ -+ base.fill_sack_from_repos_in_cache(load_system_repo=False) -+ -+ query = base.sack.query().available() -+ for pkg in query.run(): -+ print(pkg.name) - - .. method:: do_transaction([display]) - diff --git a/SOURCES/0016-Run-tests-for-fill-sack-from-repos-in-cache-in-installroot..patch b/SOURCES/0016-Run-tests-for-fill-sack-from-repos-in-cache-in-installroot..patch deleted file mode 100644 index 2c8f13b..0000000 --- a/SOURCES/0016-Run-tests-for-fill-sack-from-repos-in-cache-in-installroot..patch +++ /dev/null @@ -1,43 +0,0 @@ -From 291071a937a1de398641f02002413678398e473c Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= -Date: Mon, 8 Feb 2021 08:25:46 +0100 -Subject: [PATCH] Run tests for fill_sack_from_repos_in_cache in installroot - (RhBug:1865803) - -This prevents loading data (like failsafe) from host. - -It also allows testing that there are no modules in the installroot not just -no base-runtime* in test_with_modular_repo_without_modules_yaml. - -https://bugzilla.redhat.com/show_bug.cgi?id=1865803 ---- - tests/test_fill_sack_from_repos_in_cache.py | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/tests/test_fill_sack_from_repos_in_cache.py b/tests/test_fill_sack_from_repos_in_cache.py -index 24b0d4598d..f27235bf84 100644 ---- a/tests/test_fill_sack_from_repos_in_cache.py -+++ b/tests/test_fill_sack_from_repos_in_cache.py -@@ -42,6 +42,7 @@ class FillSackFromReposInCacheTest(unittest.TestCase): - def _create_cache_for_repo(self, repopath, tmpdir): - conf = dnf.conf.MainConf() - conf.cachedir = os.path.join(tmpdir, "cache") -+ conf.installroot = os.path.join(tmpdir) - - base = dnf.Base(conf=conf) - -@@ -68,6 +69,7 @@ def _setUp_from_repo_path(self, original_repo_path): - # Prepare base for the actual test - conf = dnf.conf.MainConf() - conf.cachedir = os.path.join(self.tmpdir, "cache") -+ conf.installroot = os.path.join(self.tmpdir) - self.test_base = dnf.Base(conf=conf) - repoconf = dnf.repo.Repo(TEST_REPO_NAME, conf) - repoconf.baseurl = self.repo_copy_path -@@ -258,5 +260,5 @@ def test_with_modular_repo_without_modules_yaml(self): - self.assertEqual(packages[0].evr, "10.0-7") - - self.module_base = dnf.module.module_base.ModuleBase(self.test_base) -- modules, _ = self.module_base._get_modules("base-runtime*") -+ modules, _ = self.module_base._get_modules("*") - self.assertEqual(len(modules), 0) diff --git a/SOURCES/0017-Set-persistdir-for-fill-sack-from-repos-in-cache-tests-RhBug-1865803.patch b/SOURCES/0017-Set-persistdir-for-fill-sack-from-repos-in-cache-tests-RhBug-1865803.patch deleted file mode 100644 index b6dee78..0000000 --- a/SOURCES/0017-Set-persistdir-for-fill-sack-from-repos-in-cache-tests-RhBug-1865803.patch +++ /dev/null @@ -1,61 +0,0 @@ -From 40e762da5cd2d876b6424f4c25b77e8dc2422a0f Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= -Date: Mon, 8 Feb 2021 08:25:46 +0100 -Subject: [PATCH] Set persistdir and substitutions for - fill_sack_from_repos_in_cache tests (RhBug:1865803) - -Setting just installroot is not enough because persistdir is not -automatically prepended with installroot if set via API. - -Also assert exact package names which is more useful output in case the -test fails. - -https://bugzilla.redhat.com/show_bug.cgi?id=1865803 ---- - tests/test_fill_sack_from_repos_in_cache.py | 19 +++++++++++++++---- - 1 file changed, 15 insertions(+), 4 deletions(-) - -diff --git a/tests/test_fill_sack_from_repos_in_cache.py b/tests/test_fill_sack_from_repos_in_cache.py -index f27235bf84..23fd2a4337 100644 ---- a/tests/test_fill_sack_from_repos_in_cache.py -+++ b/tests/test_fill_sack_from_repos_in_cache.py -@@ -42,7 +42,10 @@ class FillSackFromReposInCacheTest(unittest.TestCase): - def _create_cache_for_repo(self, repopath, tmpdir): - conf = dnf.conf.MainConf() - conf.cachedir = os.path.join(tmpdir, "cache") -- conf.installroot = os.path.join(tmpdir) -+ conf.installroot = tmpdir -+ conf.persistdir = os.path.join(conf.installroot, conf.persistdir.lstrip("/")) -+ conf.substitutions["arch"] = "x86_64" -+ conf.substitutions["basearch"] = dnf.rpm.basearch(conf.substitutions["arch"]) - - base = dnf.Base(conf=conf) - -@@ -69,7 +72,10 @@ def _setUp_from_repo_path(self, original_repo_path): - # Prepare base for the actual test - conf = dnf.conf.MainConf() - conf.cachedir = os.path.join(self.tmpdir, "cache") -- conf.installroot = os.path.join(self.tmpdir) -+ conf.installroot = self.tmpdir -+ conf.persistdir = os.path.join(conf.installroot, conf.persistdir.lstrip("/")) -+ conf.substitutions["arch"] = "x86_64" -+ conf.substitutions["basearch"] = dnf.rpm.basearch(conf.substitutions["arch"]) - self.test_base = dnf.Base(conf=conf) - repoconf = dnf.repo.Repo(TEST_REPO_NAME, conf) - repoconf.baseurl = self.repo_copy_path -@@ -231,8 +237,13 @@ def test_with_modules_yaml(self): - - q = self.test_base.sack.query() - packages = q.run() -- self.assertEqual(len(packages), 8) -- self.assertEqual(packages[0].evr, "2.02-0.40") -+ -+ pkg_names = [] -+ for pkg in packages: -+ pkg_names.append(pkg.name) -+ -+ self.assertEqual(pkg_names, ['grub2', 'httpd', 'httpd', 'httpd-doc', 'httpd-doc', 'httpd-provides-name-doc', -+ 'httpd-provides-name-version-release-doc', 'libnghttp2']) - - self.module_base = dnf.module.module_base.ModuleBase(self.test_base) - modules, _ = self.module_base._get_modules("base-runtime*") diff --git a/SOURCES/0018-Allow-stream-switching-if-option-enabled.patch b/SOURCES/0018-Allow-stream-switching-if-option-enabled.patch deleted file mode 100644 index 0fd4828..0000000 --- a/SOURCES/0018-Allow-stream-switching-if-option-enabled.patch +++ /dev/null @@ -1,56 +0,0 @@ -From 9ceb74f77479910f7844a9a87d4b7623687076be Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= -Date: Fri, 24 Jul 2020 07:59:38 +0200 -Subject: [PATCH] Allow stream switching if option enabled - -= changelog = -msg: New config option module_allow_stream_switch allows switching enabled streams -type: enhancement ---- - dnf.spec | 2 +- - dnf/cli/cli.py | 19 ++++++++++--------- - 2 files changed, 11 insertions(+), 10 deletions(-) - -diff --git a/dnf.spec b/dnf.spec -index 0e63b2b422..04f6f104c7 100644 ---- a/dnf.spec -+++ b/dnf.spec -@@ -2,7 +2,7 @@ - %undefine __cmake_in_source_build - - # default dependencies --%global hawkey_version 0.54.4 -+%global hawkey_version 0.55.0 - %global libcomps_version 0.1.8 - %global libmodulemd_version 1.4.0 - %global rpm_version 4.14.0 -diff --git a/dnf/cli/cli.py b/dnf/cli/cli.py -index be737ed3b7..29d7373fa3 100644 ---- a/dnf/cli/cli.py -+++ b/dnf/cli/cli.py -@@ -166,15 +166,16 @@ def do_transaction(self, display=()): - :return: history database transaction ID or None - """ - if dnf.base.WITH_MODULES: -- switchedModules = dict(self._moduleContainer.getSwitchedStreams()) -- if switchedModules: -- report_module_switch(switchedModules) -- msg = _("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 '{prog} module reset ' command. After " -- "you reset the module, you can install the other stream.").format( -- prog=dnf.util.MAIN_PROG) -- raise dnf.exceptions.Error(msg) -+ if not self.conf.module_stream_switch: -+ switchedModules = dict(self._moduleContainer.getSwitchedStreams()) -+ if switchedModules: -+ report_module_switch(switchedModules) -+ msg = _("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 '{prog} module reset ' command. After " -+ "you reset the module, you can install the other stream.").format( -+ prog=dnf.util.MAIN_PROG) -+ raise dnf.exceptions.Error(msg) - - trans = self.transaction - pkg_str = self.output.list_transaction(trans) diff --git a/SOURCES/0019-Update-translations.patch b/SOURCES/0019-Update-translations.patch deleted file mode 100644 index f6d9c68..0000000 --- a/SOURCES/0019-Update-translations.patch +++ /dev/null @@ -1,12740 +0,0 @@ -From c01dc4f6a6cdc7297b9ffacc6fe96142f02e4d54 Mon Sep 17 00:00:00 2001 -From: Marek Blaha -Date: Mon, 8 Mar 2021 16:22:58 +0100 -Subject: [PATCH] Update translations - ---- - po/CMakeLists.txt | 1 + - po/dnf.pot | 943 +++++++++++++++++++------------------- - po/fr.po | 1042 ++++++++++++++++++++++-------------------- - po/ja.po | 1112 +++++++++++++++++++++++---------------------- - po/ko.po | 965 ++++++++++++++++++++------------------- - po/zh_CN.po | 1086 +++++++++++++++++++++---------------------- - 6 files changed, 2649 insertions(+), 2500 deletions(-) - -diff --git a/po/CMakeLists.txt b/po/CMakeLists.txt -index 1e17f342..40d020dd 100644 ---- a/po/CMakeLists.txt -+++ b/po/CMakeLists.txt -@@ -15,6 +15,7 @@ if (GIT_FOUND) - OUTPUT_VARIABLE CURRENT_BRANCH - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - ) -+ set(CURRENT_BRANCH "rhel-8") - - # output _weblate-clone is never created so the clonning of weblate repo is always processed - # and fresh *.po files are used -diff --git a/po/dnf.pot b/po/dnf.pot -index f7101537..18d8c5ba 100644 ---- a/po/dnf.pot -+++ b/po/dnf.pot -@@ -8,7 +8,7 @@ msgid "" - msgstr "" - "Project-Id-Version: PACKAGE VERSION\n" - "Report-Msgid-Bugs-To: \n" --"POT-Creation-Date: 2020-10-05 09:18-0400\n" -+"POT-Creation-Date: 2021-02-22 09:22+0100\n" - "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" - "Last-Translator: FULL NAME \n" - "Language-Team: LANGUAGE \n" -@@ -73,7 +73,7 @@ msgstr "" - msgid "Unknown configuration option: %s = %s in %s" - msgstr "" - --#: dnf/automatic/main.py:237 dnf/cli/cli.py:299 -+#: dnf/automatic/main.py:237 dnf/cli/cli.py:304 - msgid "GPG check FAILED" - msgstr "" - -@@ -86,9 +86,10 @@ msgid "Started dnf-automatic." - msgstr "" - - #: dnf/automatic/main.py:308 --#, python-format --msgid "Sleep for %s seconds" --msgstr "" -+msgid "Sleep for {} second" -+msgid_plural "Sleep for {} seconds" -+msgstr[0] "" -+msgstr[1] "" - - #: dnf/automatic/main.py:315 - msgid "System is off-line." -@@ -100,7 +101,7 @@ msgstr "" - msgid "Error: %s" - msgstr "" - --#: dnf/base.py:146 -+#: dnf/base.py:146 dnf/base.py:472 dnf/base.py:474 - msgid "loading repo '{}' failure: {}" - msgstr "" - -@@ -108,237 +109,237 @@ msgstr "" - msgid "Loading repository '{}' has failed" - msgstr "" - --#: dnf/base.py:320 -+#: dnf/base.py:322 - msgid "Metadata timer caching disabled when running on metered connection." - msgstr "" - --#: dnf/base.py:325 -+#: dnf/base.py:327 - msgid "Metadata timer caching disabled when running on a battery." - msgstr "" - --#: dnf/base.py:330 -+#: dnf/base.py:332 - msgid "Metadata timer caching disabled." - msgstr "" - --#: dnf/base.py:335 -+#: dnf/base.py:337 - msgid "Metadata cache refreshed recently." - msgstr "" - --#: dnf/base.py:341 dnf/cli/commands/__init__.py:91 -+#: dnf/base.py:343 dnf/cli/commands/__init__.py:91 - msgid "There are no enabled repositories in \"{}\"." - msgstr "" - --#: dnf/base.py:348 -+#: dnf/base.py:350 - #, python-format - msgid "%s: will never be expired and will not be refreshed." - msgstr "" - --#: dnf/base.py:350 -+#: dnf/base.py:352 - #, python-format - msgid "%s: has expired and will be refreshed." - msgstr "" - - #. expires within the checking period: --#: dnf/base.py:354 -+#: dnf/base.py:356 - #, python-format - msgid "%s: metadata will expire after %d seconds and will be refreshed now" - msgstr "" - --#: dnf/base.py:358 -+#: dnf/base.py:360 - #, python-format - msgid "%s: will expire after %d seconds." - msgstr "" - - #. performs the md sync --#: dnf/base.py:364 -+#: dnf/base.py:366 - msgid "Metadata cache created." - msgstr "" - --#: dnf/base.py:397 -+#: dnf/base.py:399 dnf/base.py:466 - #, python-format - msgid "%s: using metadata from %s." - msgstr "" - --#: dnf/base.py:409 -+#: dnf/base.py:411 dnf/base.py:479 - #, python-format - msgid "Ignoring repositories: %s" - msgstr "" - --#: dnf/base.py:412 -+#: dnf/base.py:414 - #, python-format - msgid "Last metadata expiration check: %s ago on %s." - msgstr "" - --#: dnf/base.py:443 -+#: dnf/base.py:507 - msgid "" - "The downloaded packages were saved in cache until the next successful " - "transaction." - msgstr "" - --#: dnf/base.py:445 -+#: dnf/base.py:509 - #, python-format - msgid "You can remove cached packages by executing '%s'." - msgstr "" - --#: dnf/base.py:535 -+#: dnf/base.py:599 - #, python-format - msgid "Invalid tsflag in config file: %s" - msgstr "" - --#: dnf/base.py:591 -+#: dnf/base.py:655 - #, python-format - msgid "Failed to add groups file for repository: %s - %s" - msgstr "" - --#: dnf/base.py:823 -+#: dnf/base.py:887 - msgid "Running transaction check" - msgstr "" - --#: dnf/base.py:831 -+#: dnf/base.py:895 - msgid "Error: transaction check vs depsolve:" - msgstr "" - --#: dnf/base.py:837 -+#: dnf/base.py:901 - msgid "Transaction check succeeded." - msgstr "" - --#: dnf/base.py:840 -+#: dnf/base.py:904 - msgid "Running transaction test" - msgstr "" - --#: dnf/base.py:850 dnf/base.py:992 -+#: dnf/base.py:914 dnf/base.py:1065 - msgid "RPM: {}" - msgstr "" - --#: dnf/base.py:851 -+#: dnf/base.py:915 - msgid "Transaction test error:" - msgstr "" - --#: dnf/base.py:862 -+#: dnf/base.py:926 - msgid "Transaction test succeeded." - msgstr "" - --#: dnf/base.py:883 -+#: dnf/base.py:947 - msgid "Running transaction" - msgstr "" - --#: dnf/base.py:911 -+#: dnf/base.py:984 - msgid "Disk Requirements:" - msgstr "" - --#: dnf/base.py:914 -+#: dnf/base.py:987 - #, python-brace-format - msgid "At least {0}MB more space needed on the {1} filesystem." - msgid_plural "At least {0}MB more space needed on the {1} filesystem." - msgstr[0] "" - msgstr[1] "" - --#: dnf/base.py:921 -+#: dnf/base.py:994 - msgid "Error Summary" - msgstr "" - --#: dnf/base.py:947 -+#: dnf/base.py:1020 - #, python-brace-format - msgid "RPMDB altered outside of {prog}." - msgstr "" - --#: dnf/base.py:993 dnf/base.py:1001 -+#: dnf/base.py:1066 dnf/base.py:1074 - msgid "Could not run transaction." - msgstr "" - --#: dnf/base.py:996 -+#: dnf/base.py:1069 - msgid "Transaction couldn't start:" - msgstr "" - --#: dnf/base.py:1010 -+#: dnf/base.py:1083 - #, python-format - msgid "Failed to remove transaction file %s" - msgstr "" - --#: dnf/base.py:1092 -+#: dnf/base.py:1165 - msgid "Some packages were not downloaded. Retrying." - msgstr "" - --#: dnf/base.py:1122 -+#: dnf/base.py:1195 - #, python-format - msgid "Delta RPMs reduced %.1f MB of updates to %.1f MB (%d.1%% saved)" - msgstr "" - --#: dnf/base.py:1125 -+#: dnf/base.py:1198 - #, python-format - msgid "" - "Failed Delta RPMs increased %.1f MB of updates to %.1f MB (%d.1%% wasted)" - msgstr "" - --#: dnf/base.py:1167 -+#: dnf/base.py:1240 - msgid "Cannot add local packages, because transaction job already exists" - msgstr "" - --#: dnf/base.py:1181 -+#: dnf/base.py:1254 - msgid "Could not open: {}" - msgstr "" - --#: dnf/base.py:1219 -+#: dnf/base.py:1292 - #, python-format - msgid "Public key for %s is not installed" - msgstr "" - --#: dnf/base.py:1223 -+#: dnf/base.py:1296 - #, python-format - msgid "Problem opening package %s" - msgstr "" - --#: dnf/base.py:1231 -+#: dnf/base.py:1304 - #, python-format - msgid "Public key for %s is not trusted" - msgstr "" - --#: dnf/base.py:1235 -+#: dnf/base.py:1308 - #, python-format - msgid "Package %s is not signed" - msgstr "" - --#: dnf/base.py:1265 -+#: dnf/base.py:1338 - #, python-format - msgid "Cannot remove %s" - msgstr "" - --#: dnf/base.py:1269 -+#: dnf/base.py:1342 - #, python-format - msgid "%s removed" - msgstr "" - --#: dnf/base.py:1549 -+#: dnf/base.py:1622 - msgid "No match for group package \"{}\"" - msgstr "" - --#: dnf/base.py:1635 -+#: dnf/base.py:1708 - #, python-format - msgid "Adding packages from group '%s': %s" - msgstr "" - --#: dnf/base.py:1658 dnf/cli/cli.py:219 dnf/cli/commands/__init__.py:442 -+#: dnf/base.py:1731 dnf/cli/cli.py:220 dnf/cli/commands/__init__.py:442 - #: dnf/cli/commands/__init__.py:499 dnf/cli/commands/__init__.py:592 - #: dnf/cli/commands/__init__.py:641 dnf/cli/commands/install.py:80 - #: dnf/cli/commands/install.py:103 dnf/cli/commands/install.py:110 - msgid "Nothing to do." - msgstr "" - --#: dnf/base.py:1676 -+#: dnf/base.py:1749 - msgid "No groups marked for removal." - msgstr "" - --#: dnf/base.py:1710 -+#: dnf/base.py:1783 - msgid "No group marked for upgrade." - msgstr "" - --#: dnf/base.py:1925 -+#: dnf/base.py:1997 - #, python-format - msgid "Package %s not installed, cannot downgrade it." - msgstr "" - --#: dnf/base.py:1927 dnf/base.py:1946 dnf/base.py:1959 dnf/base.py:1980 --#: dnf/base.py:2029 dnf/base.py:2037 dnf/base.py:2172 dnf/cli/cli.py:411 -+#: dnf/base.py:1999 dnf/base.py:2018 dnf/base.py:2031 dnf/base.py:2052 -+#: dnf/base.py:2101 dnf/base.py:2109 dnf/base.py:2243 dnf/cli/cli.py:416 - #: dnf/cli/commands/__init__.py:425 dnf/cli/commands/__init__.py:482 - #: dnf/cli/commands/__init__.py:586 dnf/cli/commands/__init__.py:633 - #: dnf/cli/commands/__init__.py:711 dnf/cli/commands/install.py:147 -@@ -348,141 +349,127 @@ msgstr "" - msgid "No match for argument: %s" - msgstr "" - --#: dnf/base.py:1934 -+#: dnf/base.py:2006 - #, python-format - msgid "Package %s of lower version already installed, cannot downgrade it." - msgstr "" - --#: dnf/base.py:1957 -+#: dnf/base.py:2029 - #, python-format - msgid "Package %s not installed, cannot reinstall it." - msgstr "" - --#: dnf/base.py:1972 -+#: dnf/base.py:2044 - #, python-format - msgid "File %s is a source package and cannot be updated, ignoring." - msgstr "" - --#: dnf/base.py:1978 -+#: dnf/base.py:2050 - #, python-format - msgid "Package %s not installed, cannot update it." - msgstr "" - --#: dnf/base.py:1987 -+#: dnf/base.py:2059 - #, python-format - msgid "" - "The same or higher version of %s is already installed, cannot update it." - msgstr "" - --#: dnf/base.py:2026 dnf/cli/commands/reinstall.py:81 -+#: dnf/base.py:2098 dnf/cli/commands/reinstall.py:81 - #, python-format - msgid "Package %s available, but not installed." - msgstr "" - --#: dnf/base.py:2032 -+#: dnf/base.py:2104 - #, python-format - msgid "Package %s available, but installed for different architecture." - msgstr "" - --#: dnf/base.py:2057 dnf/base.py:2250 dnf/cli/cli.py:668 dnf/cli/cli.py:699 -+#: dnf/base.py:2129 - #, python-format - msgid "No package %s installed." - msgstr "" - --#: dnf/base.py:2075 dnf/cli/commands/install.py:136 -+#: dnf/base.py:2147 dnf/cli/commands/install.py:136 - #: dnf/cli/commands/remove.py:133 - #, python-format - msgid "Not a valid form: %s" - msgstr "" - --#: dnf/base.py:2091 dnf/cli/commands/__init__.py:681 --#: dnf/cli/commands/remove.py:163 -+#: dnf/base.py:2162 dnf/cli/commands/__init__.py:681 -+#: dnf/cli/commands/remove.py:162 - msgid "No packages marked for removal." - msgstr "" - --#: dnf/base.py:2179 dnf/cli/cli.py:422 -+#: dnf/base.py:2250 dnf/cli/cli.py:427 - #, python-format - msgid "Packages for argument %s available, but not installed." - msgstr "" - --#: dnf/base.py:2184 -+#: dnf/base.py:2255 - #, python-format - msgid "Package %s of lowest version already installed, cannot downgrade it." - msgstr "" - --#: dnf/base.py:2242 --msgid "Action not handled: {}" --msgstr "" -- --#: dnf/base.py:2256 dnf/cli/cli.py:419 dnf/cli/cli.py:673 dnf/cli/cli.py:703 --#: dnf/cli/commands/group.py:400 dnf/cli/commands/history.py:169 --#, python-format --msgid "No package %s available." --msgstr "" -- --#: dnf/base.py:2269 --msgid "no package matched" --msgstr "" -- --#: dnf/base.py:2290 -+#: dnf/base.py:2302 - msgid "No security updates needed, but {} update available" - msgstr "" - --#: dnf/base.py:2292 -+#: dnf/base.py:2304 - msgid "No security updates needed, but {} updates available" - msgstr "" - --#: dnf/base.py:2296 -+#: dnf/base.py:2308 - msgid "No security updates needed for \"{}\", but {} update available" - msgstr "" - --#: dnf/base.py:2298 -+#: dnf/base.py:2310 - msgid "No security updates needed for \"{}\", but {} updates available" - msgstr "" - - #. raise an exception, because po.repoid is not in self.repos --#: dnf/base.py:2319 -+#: dnf/base.py:2331 - #, python-format - msgid "Unable to retrieve a key for a commandline package: %s" - msgstr "" - --#: dnf/base.py:2327 -+#: dnf/base.py:2339 - #, python-format - msgid ". Failing package is: %s" - msgstr "" - --#: dnf/base.py:2328 -+#: dnf/base.py:2340 - #, python-format - msgid "GPG Keys are configured as: %s" - msgstr "" - --#: dnf/base.py:2340 -+#: dnf/base.py:2352 - #, python-format - msgid "GPG key at %s (0x%s) is already installed" - msgstr "" - --#: dnf/base.py:2373 -+#: dnf/base.py:2385 - msgid "The key has been approved." - msgstr "" - --#: dnf/base.py:2376 -+#: dnf/base.py:2388 - msgid "The key has been rejected." - msgstr "" - --#: dnf/base.py:2409 -+#: dnf/base.py:2421 - #, python-format - msgid "Key import failed (code %d)" - msgstr "" - --#: dnf/base.py:2411 -+#: dnf/base.py:2423 - msgid "Key imported successfully" - msgstr "" - --#: dnf/base.py:2415 -+#: dnf/base.py:2427 - msgid "Didn't install any keys" - msgstr "" - --#: dnf/base.py:2418 -+#: dnf/base.py:2430 - #, python-format - msgid "" - "The GPG keys listed for the \"%s\" repository are already installed but they " -@@ -490,49 +477,49 @@ msgid "" - "Check that the correct key URLs are configured for this repository." - msgstr "" - --#: dnf/base.py:2429 -+#: dnf/base.py:2441 - msgid "Import of key(s) didn't help, wrong key(s)?" - msgstr "" - --#: dnf/base.py:2482 -+#: dnf/base.py:2494 - msgid " * Maybe you meant: {}" - msgstr "" - --#: dnf/base.py:2514 -+#: dnf/base.py:2526 - msgid "Package \"{}\" from local repository \"{}\" has incorrect checksum" - msgstr "" - --#: dnf/base.py:2517 -+#: dnf/base.py:2529 - msgid "Some packages from local repository have incorrect checksum" - msgstr "" - --#: dnf/base.py:2520 -+#: dnf/base.py:2532 - msgid "Package \"{}\" from repository \"{}\" has incorrect checksum" - msgstr "" - --#: dnf/base.py:2523 -+#: dnf/base.py:2535 - msgid "" - "Some packages have invalid cache, but cannot be downloaded due to \"--" - "cacheonly\" option" - msgstr "" - --#: dnf/base.py:2541 dnf/base.py:2561 -+#: dnf/base.py:2553 dnf/base.py:2573 - msgid "No match for argument" - msgstr "" - --#: dnf/base.py:2549 dnf/base.py:2569 -+#: dnf/base.py:2561 dnf/base.py:2581 - msgid "All matches were filtered out by exclude filtering for argument" - msgstr "" - --#: dnf/base.py:2551 -+#: dnf/base.py:2563 - msgid "All matches were filtered out by modular filtering for argument" - msgstr "" - --#: dnf/base.py:2567 -+#: dnf/base.py:2579 - msgid "All matches were installed from a different repository for argument" - msgstr "" - --#: dnf/base.py:2583 -+#: dnf/base.py:2626 - #, python-format - msgid "Package %s is already installed." - msgstr "" -@@ -552,8 +539,8 @@ msgstr "" - msgid "Cannot read file \"%s\": %s" - msgstr "" - --#: dnf/cli/aliases.py:115 dnf/cli/aliases.py:129 dnf/cli/cli.py:902 --#: dnf/cli/cli.py:906 dnf/cli/commands/alias.py:108 -+#: dnf/cli/aliases.py:115 dnf/cli/aliases.py:129 dnf/cli/cli.py:803 -+#: dnf/cli/cli.py:807 dnf/cli/commands/alias.py:108 - #, python-format - msgid "Config error: %s" - msgstr "" -@@ -584,7 +571,7 @@ msgid "" - "stream '{2}'" - msgstr "" - --#: dnf/cli/cli.py:172 -+#: dnf/cli/cli.py:173 - #, python-brace-format - msgid "" - "It is not possible to switch enabled streams of a module.\n" -@@ -593,199 +580,178 @@ msgid "" - "reset the module, you can install the other stream." - msgstr "" - --#: dnf/cli/cli.py:210 -+#: dnf/cli/cli.py:211 - #, python-brace-format - msgid "{prog} will only download packages for the transaction." - msgstr "" - --#: dnf/cli/cli.py:213 -+#: dnf/cli/cli.py:214 - #, python-brace-format - msgid "" - "{prog} will only download packages, install gpg keys, and check the " - "transaction." - msgstr "" - --#: dnf/cli/cli.py:217 -+#: dnf/cli/cli.py:218 - msgid "Operation aborted." - msgstr "" - --#: dnf/cli/cli.py:224 -+#: dnf/cli/cli.py:225 - msgid "Downloading Packages:" - msgstr "" - --#: dnf/cli/cli.py:230 -+#: dnf/cli/cli.py:231 - msgid "Error downloading packages:" - msgstr "" - --#: dnf/cli/cli.py:258 -+#: dnf/cli/cli.py:263 - msgid "Transaction failed" - msgstr "" - --#: dnf/cli/cli.py:281 -+#: dnf/cli/cli.py:286 - msgid "" - "Refusing to automatically import keys when running unattended.\n" - "Use \"-y\" to override." - msgstr "" - --#: dnf/cli/cli.py:331 -+#: dnf/cli/cli.py:336 - msgid "Changelogs for {}" - msgstr "" - --#: dnf/cli/cli.py:364 dnf/cli/cli.py:505 dnf/cli/cli.py:511 -+#: dnf/cli/cli.py:369 dnf/cli/cli.py:510 dnf/cli/cli.py:516 - msgid "Obsoleting Packages" - msgstr "" - --#: dnf/cli/cli.py:393 -+#: dnf/cli/cli.py:398 - msgid "No packages marked for distribution synchronization." - msgstr "" - --#: dnf/cli/cli.py:428 -+#: dnf/cli/cli.py:424 dnf/cli/commands/group.py:395 -+#, python-format -+msgid "No package %s available." -+msgstr "" -+ -+#: dnf/cli/cli.py:433 - msgid "No packages marked for downgrade." - msgstr "" - --#: dnf/cli/cli.py:479 -+#: dnf/cli/cli.py:484 - msgid "Installed Packages" - msgstr "" - --#: dnf/cli/cli.py:487 -+#: dnf/cli/cli.py:492 - msgid "Available Packages" - msgstr "" - --#: dnf/cli/cli.py:491 -+#: dnf/cli/cli.py:496 - msgid "Autoremove Packages" - msgstr "" - --#: dnf/cli/cli.py:493 -+#: dnf/cli/cli.py:498 - msgid "Extra Packages" - msgstr "" - --#: dnf/cli/cli.py:497 -+#: dnf/cli/cli.py:502 - msgid "Available Upgrades" - msgstr "" - --#: dnf/cli/cli.py:513 -+#: dnf/cli/cli.py:518 - msgid "Recently Added Packages" - msgstr "" - --#: dnf/cli/cli.py:518 -+#: dnf/cli/cli.py:522 - msgid "No matching Packages to list" - msgstr "" - --#: dnf/cli/cli.py:599 -+#: dnf/cli/cli.py:603 - msgid "No Matches found" - msgstr "" - --#: dnf/cli/cli.py:609 --msgid "No transaction ID given" --msgstr "" -- --#: dnf/cli/cli.py:614 --msgid "Not found given transaction ID" --msgstr "" -- --#: dnf/cli/cli.py:623 --msgid "Found more than one transaction ID!" --msgstr "" -- --#: dnf/cli/cli.py:640 --#, python-format --msgid "Transaction history is incomplete, before %u." --msgstr "" -- --#: dnf/cli/cli.py:642 --#, python-format --msgid "Transaction history is incomplete, after %u." --msgstr "" -- --#: dnf/cli/cli.py:689 --msgid "Undoing transaction {}, from {}" --msgstr "" -- --#: dnf/cli/cli.py:769 dnf/cli/commands/shell.py:237 -+#: dnf/cli/cli.py:670 dnf/cli/commands/shell.py:237 - #, python-format - msgid "Unknown repo: '%s'" - msgstr "" - --#: dnf/cli/cli.py:783 -+#: dnf/cli/cli.py:684 - #, python-format - msgid "No repository match: %s" - msgstr "" - --#: dnf/cli/cli.py:817 -+#: dnf/cli/cli.py:718 - msgid "" - "This command has to be run with superuser privileges (under the root user on " - "most systems)." - msgstr "" - --#: dnf/cli/cli.py:847 -+#: dnf/cli/cli.py:748 - #, python-format - msgid "No such command: %s. Please use %s --help" - msgstr "" - --#: dnf/cli/cli.py:850 -+#: dnf/cli/cli.py:751 - #, python-format, python-brace-format - msgid "" - "It could be a {PROG} plugin command, try: \"{prog} install 'dnf-" - "command(%s)'\"" - msgstr "" - --#: dnf/cli/cli.py:854 -+#: dnf/cli/cli.py:755 - #, python-brace-format - msgid "" - "It could be a {prog} plugin command, but loading of plugins is currently " - "disabled." - msgstr "" - --#: dnf/cli/cli.py:912 -+#: dnf/cli/cli.py:813 - msgid "" - "--destdir or --downloaddir must be used with --downloadonly or download or " - "system-upgrade command." - msgstr "" - --#: dnf/cli/cli.py:918 -+#: dnf/cli/cli.py:819 - msgid "" - "--enable, --set-enabled and --disable, --set-disabled must be used with " - "config-manager command." - msgstr "" - --#: dnf/cli/cli.py:1000 -+#: dnf/cli/cli.py:901 - msgid "" - "Warning: Enforcing GPG signature check globally as per active RPM security " - "policy (see 'gpgcheck' in dnf.conf(5) for how to squelch this message)" - msgstr "" - --#: dnf/cli/cli.py:1020 -+#: dnf/cli/cli.py:921 - msgid "Config file \"{}\" does not exist" - msgstr "" - --#: dnf/cli/cli.py:1040 -+#: dnf/cli/cli.py:941 - msgid "" - "Unable to detect release version (use '--releasever' to specify release " - "version)" - msgstr "" - --#: dnf/cli/cli.py:1127 dnf/cli/commands/repoquery.py:471 -+#: dnf/cli/cli.py:1028 dnf/cli/commands/repoquery.py:471 - msgid "argument {}: not allowed with argument {}" - msgstr "" - --#: dnf/cli/cli.py:1134 -+#: dnf/cli/cli.py:1035 - #, python-format - msgid "Command \"%s\" already defined" - msgstr "" - --#: dnf/cli/cli.py:1154 -+#: dnf/cli/cli.py:1055 - msgid "Excludes in dnf.conf: " - msgstr "" - --#: dnf/cli/cli.py:1157 -+#: dnf/cli/cli.py:1058 - msgid "Includes in dnf.conf: " - msgstr "" - --#: dnf/cli/cli.py:1160 -+#: dnf/cli/cli.py:1061 - msgid "Excludes in repo " - msgstr "" - --#: dnf/cli/cli.py:1163 -+#: dnf/cli/cli.py:1064 - msgid "Includes in repo " - msgstr "" - -@@ -831,7 +797,7 @@ msgid "show all packages (default)" - msgstr "" - - #: dnf/cli/commands/__init__.py:171 dnf/cli/commands/__init__.py:743 --#: dnf/cli/commands/module.py:351 -+#: dnf/cli/commands/module.py:373 - msgid "show only available packages" - msgstr "" - -@@ -1157,78 +1123,78 @@ msgstr "" - msgid "No group data available for configured repositories." - msgstr "" - --#: dnf/cli/commands/group.py:129 -+#: dnf/cli/commands/group.py:126 - #, python-format - msgid "Warning: Group %s does not exist." - msgstr "" - --#: dnf/cli/commands/group.py:170 -+#: dnf/cli/commands/group.py:167 - msgid "Warning: No groups match:" - msgstr "" - --#: dnf/cli/commands/group.py:182 dnf/cli/commands/group.py:193 --#: dnf/cli/output.py:1226 -+#: dnf/cli/commands/group.py:179 dnf/cli/commands/group.py:190 -+#: dnf/cli/output.py:1139 - msgid "" - msgstr "" - --#: dnf/cli/commands/group.py:199 -+#: dnf/cli/commands/group.py:196 - msgid "Available Environment Groups:" - msgstr "" - --#: dnf/cli/commands/group.py:201 -+#: dnf/cli/commands/group.py:198 - msgid "Installed Environment Groups:" - msgstr "" - --#: dnf/cli/commands/group.py:208 dnf/cli/commands/group.py:294 -+#: dnf/cli/commands/group.py:205 dnf/cli/commands/group.py:291 - msgid "Installed Groups:" - msgstr "" - --#: dnf/cli/commands/group.py:215 dnf/cli/commands/group.py:301 -+#: dnf/cli/commands/group.py:212 dnf/cli/commands/group.py:298 - msgid "Installed Language Groups:" - msgstr "" - --#: dnf/cli/commands/group.py:225 dnf/cli/commands/group.py:308 -+#: dnf/cli/commands/group.py:222 dnf/cli/commands/group.py:305 - msgid "Available Groups:" - msgstr "" - --#: dnf/cli/commands/group.py:232 dnf/cli/commands/group.py:315 -+#: dnf/cli/commands/group.py:229 dnf/cli/commands/group.py:312 - msgid "Available Language Groups:" - msgstr "" - --#: dnf/cli/commands/group.py:322 -+#: dnf/cli/commands/group.py:319 - msgid "include optional packages from group" - msgstr "" - --#: dnf/cli/commands/group.py:325 -+#: dnf/cli/commands/group.py:322 - msgid "show also hidden groups" - msgstr "" - --#: dnf/cli/commands/group.py:327 -+#: dnf/cli/commands/group.py:324 - msgid "show only installed groups" - msgstr "" - --#: dnf/cli/commands/group.py:329 -+#: dnf/cli/commands/group.py:326 - msgid "show only available groups" - msgstr "" - --#: dnf/cli/commands/group.py:331 -+#: dnf/cli/commands/group.py:328 - msgid "show also ID of groups" - msgstr "" - --#: dnf/cli/commands/group.py:333 -+#: dnf/cli/commands/group.py:330 - msgid "available subcommands: {} (default), {}" - msgstr "" - --#: dnf/cli/commands/group.py:337 -+#: dnf/cli/commands/group.py:334 - msgid "argument for group subcommand" - msgstr "" - --#: dnf/cli/commands/group.py:346 -+#: dnf/cli/commands/group.py:343 - #, python-format - msgid "Invalid groups sub-command, use: %s." - msgstr "" - --#: dnf/cli/commands/group.py:403 -+#: dnf/cli/commands/group.py:398 - msgid "Unable to find a mandatory group package." - msgstr "" - -@@ -1272,69 +1238,90 @@ msgstr "" - msgid "More than one argument given as transaction file name." - msgstr "" - --#: dnf/cli/commands/history.py:122 dnf/cli/commands/history.py:126 -+#: dnf/cli/commands/history.py:122 dnf/cli/commands/history.py:130 - msgid "No transaction ID or package name given." - msgstr "" - --#: dnf/cli/commands/history.py:138 -+#: dnf/cli/commands/history.py:142 - #, python-format - msgid "You don't have access to the history DB: %s" - msgstr "" - --#: dnf/cli/commands/history.py:147 -+#: dnf/cli/commands/history.py:151 - #, python-format - msgid "" - "Cannot undo transaction %s, doing so would result in an inconsistent package " - "database." - msgstr "" - --#: dnf/cli/commands/history.py:152 -+#: dnf/cli/commands/history.py:156 - #, python-format - msgid "" - "Cannot rollback transaction %s, doing so would result in an inconsistent " - "package database." - msgstr "" - --#: dnf/cli/commands/history.py:222 -+#: dnf/cli/commands/history.py:175 -+msgid "No transaction ID given" -+msgstr "" -+ -+#: dnf/cli/commands/history.py:179 -+#, python-brace-format -+msgid "Transaction ID \"{0}\" not found." -+msgstr "" -+ -+#: dnf/cli/commands/history.py:185 -+msgid "Found more than one transaction ID!" -+msgstr "" -+ -+#: dnf/cli/commands/history.py:203 -+#, python-format -+msgid "Transaction history is incomplete, before %u." -+msgstr "" -+ -+#: dnf/cli/commands/history.py:205 -+#, python-format -+msgid "Transaction history is incomplete, after %u." -+msgstr "" -+ -+#: dnf/cli/commands/history.py:256 -+msgid "No packages to list" -+msgstr "" -+ -+#: dnf/cli/commands/history.py:279 - msgid "" - "Invalid transaction ID range definition '{}'.\n" - "Use '..'." - msgstr "" - --#: dnf/cli/commands/history.py:226 -+#: dnf/cli/commands/history.py:283 - msgid "" - "Can't convert '{}' to transaction ID.\n" - "Use '', 'last', 'last-'." - msgstr "" - --#: dnf/cli/commands/history.py:255 -+#: dnf/cli/commands/history.py:312 - msgid "No transaction which manipulates package '{}' was found." - msgstr "" - --#: dnf/cli/commands/history.py:305 --#, python-brace-format --msgid "Transaction ID \"{id}\" not found." --msgstr "" -- --#: dnf/cli/commands/history.py:313 -+#: dnf/cli/commands/history.py:357 - msgid "{} exists, overwrite?" - msgstr "" - --#: dnf/cli/commands/history.py:316 -+#: dnf/cli/commands/history.py:360 - msgid "Not overwriting {}, exiting." - msgstr "" - --#: dnf/cli/commands/history.py:323 -+#: dnf/cli/commands/history.py:367 - msgid "Transaction saved to {}." - msgstr "" - --#: dnf/cli/commands/history.py:326 -+#: dnf/cli/commands/history.py:370 - msgid "Error storing transaction: {}" - msgstr "" - --#: dnf/cli/commands/history.py:350 --msgid "" --"Warning, the following problems occurred while replaying the transaction:" -+#: dnf/cli/commands/history.py:386 -+msgid "Warning, the following problems occurred while running a transaction:" - msgstr "" - - #: dnf/cli/commands/install.py:47 -@@ -1354,7 +1341,7 @@ msgstr "" - msgid "Not a valid rpm file path: %s" - msgstr "" - --#: dnf/cli/commands/install.py:167 -+#: dnf/cli/commands/install.py:166 - #, python-brace-format - msgid "There are following alternatives for \"{0}\": {1}" - msgstr "" -@@ -1394,7 +1381,7 @@ msgid "%s marked as group installed." - msgstr "" - - #: dnf/cli/commands/mark.py:85 dnf/cli/commands/shell.py:129 --#: dnf/cli/commands/shell.py:237 dnf/cli/commands/shell.py:279 -+#: dnf/cli/commands/shell.py:237 dnf/cli/commands/shell.py:282 - msgid "Error:" - msgstr "" - -@@ -1450,42 +1437,46 @@ msgid "Package {} belongs to multiple modules, skipping" - msgstr "" - - #: dnf/cli/commands/module.py:277 -+msgid "switch a module to a stream and distrosync rpm packages" -+msgstr "" -+ -+#: dnf/cli/commands/module.py:299 - msgid "list modular packages" - msgstr "" - --#: dnf/cli/commands/module.py:292 -+#: dnf/cli/commands/module.py:314 - msgid "list packages belonging to a module" - msgstr "" - --#: dnf/cli/commands/module.py:327 -+#: dnf/cli/commands/module.py:349 - msgid "Interact with Modules." - msgstr "" - --#: dnf/cli/commands/module.py:340 -+#: dnf/cli/commands/module.py:362 - msgid "show only enabled modules" - msgstr "" - --#: dnf/cli/commands/module.py:343 -+#: dnf/cli/commands/module.py:365 - msgid "show only disabled modules" - msgstr "" - --#: dnf/cli/commands/module.py:346 -+#: dnf/cli/commands/module.py:368 - msgid "show only installed modules or packages" - msgstr "" - --#: dnf/cli/commands/module.py:349 -+#: dnf/cli/commands/module.py:371 - msgid "show profile content" - msgstr "" - --#: dnf/cli/commands/module.py:354 -+#: dnf/cli/commands/module.py:376 - msgid "remove all modular packages" - msgstr "" - --#: dnf/cli/commands/module.py:364 -+#: dnf/cli/commands/module.py:386 - msgid "Module specification" - msgstr "" - --#: dnf/cli/commands/module.py:386 -+#: dnf/cli/commands/module.py:408 - msgid "{} {} {}: too few arguments" - msgstr "" - -@@ -1960,22 +1951,22 @@ msgstr "" - msgid "Keyword to search for" - msgstr "" - --#: dnf/cli/commands/search.py:61 dnf/cli/output.py:506 -+#: dnf/cli/commands/search.py:61 dnf/cli/output.py:460 - msgctxt "long" - msgid "Name" - msgstr "" - --#: dnf/cli/commands/search.py:62 dnf/cli/output.py:559 -+#: dnf/cli/commands/search.py:62 dnf/cli/output.py:513 - msgctxt "long" - msgid "Summary" - msgstr "" - --#: dnf/cli/commands/search.py:63 dnf/cli/output.py:569 -+#: dnf/cli/commands/search.py:63 dnf/cli/output.py:523 - msgctxt "long" - msgid "Description" - msgstr "" - --#: dnf/cli/commands/search.py:64 dnf/cli/output.py:562 -+#: dnf/cli/commands/search.py:64 dnf/cli/output.py:516 - msgid "URL" - msgstr "" - -@@ -2087,16 +2078,16 @@ msgid "" - "exit (or quit) exit the shell" - msgstr "" - --#: dnf/cli/commands/shell.py:259 -+#: dnf/cli/commands/shell.py:262 - #, python-format - msgid "Error: Cannot open %s for reading" - msgstr "" - --#: dnf/cli/commands/shell.py:281 dnf/cli/main.py:187 -+#: dnf/cli/commands/shell.py:284 dnf/cli/main.py:187 - msgid "Complete!" - msgstr "" - --#: dnf/cli/commands/shell.py:291 -+#: dnf/cli/commands/shell.py:294 - msgid "Leaving Shell" - msgstr "" - -@@ -2287,8 +2278,8 @@ msgstr "" - msgid "Files" - msgstr "" - --#: dnf/cli/commands/updateinfo.py:359 dnf/cli/output.py:1499 --#: dnf/cli/output.py:1772 dnf/cli/output.py:1774 -+#: dnf/cli/commands/updateinfo.py:359 dnf/cli/output.py:1652 -+#: dnf/cli/output.py:1654 dnf/util.py:591 - msgid "Installed" - msgstr "" - -@@ -2609,13 +2600,13 @@ msgstr "" - #. Translators: This is abbreviated 'Name'. Should be no longer - #. than 12 characters. You can use the full version if it is short - #. enough in your language. --#: dnf/cli/output.py:505 -+#: dnf/cli/output.py:459 - msgctxt "short" - msgid "Name" - msgstr "" - - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:511 -+#: dnf/cli/output.py:465 - msgid "Epoch" - msgstr "" - -@@ -2623,38 +2614,38 @@ msgstr "" - #. use the full (unabbreviated) term 'Version' if you think that - #. the translation to your language is not too long and will - #. always fit to limited space. --#: dnf/cli/output.py:512 dnf/cli/output.py:1335 -+#: dnf/cli/output.py:466 dnf/cli/output.py:1248 - msgctxt "short" - msgid "Version" - msgstr "" - - #. Translators: This is the full (unabbreviated) term 'Version'. --#: dnf/cli/output.py:513 dnf/cli/output.py:1337 -+#: dnf/cli/output.py:467 dnf/cli/output.py:1250 - msgctxt "long" - msgid "Version" - msgstr "" - - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:516 -+#: dnf/cli/output.py:470 - msgid "Release" - msgstr "" - - #. Translators: This is abbreviated 'Architecture', used when - #. we have not enough space to display the full word. --#: dnf/cli/output.py:517 dnf/cli/output.py:1326 -+#: dnf/cli/output.py:471 dnf/cli/output.py:1239 - msgctxt "short" - msgid "Arch" - msgstr "" - - #. Translators: This is the full word 'Architecture', used when - #. we have enough space. --#: dnf/cli/output.py:518 dnf/cli/output.py:1329 -+#: dnf/cli/output.py:472 dnf/cli/output.py:1242 - msgctxt "long" - msgid "Architecture" - msgstr "" - - #. Translators: This is the full (unabbreviated) term 'Size'. --#: dnf/cli/output.py:520 dnf/cli/output.py:1352 -+#: dnf/cli/output.py:474 dnf/cli/output.py:1265 - msgctxt "long" - msgid "Size" - msgstr "" -@@ -2663,32 +2654,32 @@ msgstr "" - #. not be longer than 5 characters. If the term 'Size' in your - #. language is not longer than 5 characters then you can use it - #. unabbreviated. --#: dnf/cli/output.py:520 dnf/cli/output.py:1350 -+#: dnf/cli/output.py:474 dnf/cli/output.py:1263 - msgctxt "short" - msgid "Size" - msgstr "" - - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:524 -+#: dnf/cli/output.py:478 - msgid "Source" - msgstr "" - - #. Translators: This is abbreviated 'Repository', used when - #. we have not enough space to display the full word. --#: dnf/cli/output.py:525 dnf/cli/output.py:1341 -+#: dnf/cli/output.py:479 dnf/cli/output.py:1254 - msgctxt "short" - msgid "Repo" - msgstr "" - - #. Translators: This is the full word 'Repository', used when - #. we have enough space. --#: dnf/cli/output.py:526 dnf/cli/output.py:1344 -+#: dnf/cli/output.py:480 dnf/cli/output.py:1257 - msgctxt "long" - msgid "Repository" - msgstr "" - - #. Translators: This message should be no longer than 12 chars. --#: dnf/cli/output.py:533 -+#: dnf/cli/output.py:487 - msgid "From repo" - msgstr "" - -@@ -2696,324 +2687,320 @@ msgstr "" - #. print(_("Committer : %s") % ucd(pkg.committer)) - #. print(_("Committime : %s") % time.ctime(pkg.committime)) - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:539 -+#: dnf/cli/output.py:493 - msgid "Packager" - msgstr "" - - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:541 -+#: dnf/cli/output.py:495 - msgid "Buildtime" - msgstr "" - - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:545 -+#: dnf/cli/output.py:499 - msgid "Install time" - msgstr "" - - #. Translators: This message should be no longer than 12 chars. --#: dnf/cli/output.py:554 -+#: dnf/cli/output.py:508 - msgid "Installed by" - msgstr "" - - #. Translators: This is abbreviated 'Summary'. Should be no longer - #. than 12 characters. You can use the full version if it is short - #. enough in your language. --#: dnf/cli/output.py:558 -+#: dnf/cli/output.py:512 - msgctxt "short" - msgid "Summary" - msgstr "" - - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:564 -+#: dnf/cli/output.py:518 - msgid "License" - msgstr "" - - #. Translators: This is abbreviated 'Description'. Should be no longer - #. than 12 characters. You can use the full version if it is short - #. enough in your language. --#: dnf/cli/output.py:568 -+#: dnf/cli/output.py:522 - msgctxt "short" - msgid "Description" - msgstr "" - --#: dnf/cli/output.py:695 --msgid "No packages to list" --msgstr "" -- --#: dnf/cli/output.py:706 -+#: dnf/cli/output.py:650 - msgid "y" - msgstr "" - --#: dnf/cli/output.py:706 -+#: dnf/cli/output.py:650 - msgid "yes" - msgstr "" - --#: dnf/cli/output.py:707 -+#: dnf/cli/output.py:651 - msgid "n" - msgstr "" - --#: dnf/cli/output.py:707 -+#: dnf/cli/output.py:651 - msgid "no" - msgstr "" - --#: dnf/cli/output.py:711 -+#: dnf/cli/output.py:655 - msgid "Is this ok [y/N]: " - msgstr "" - --#: dnf/cli/output.py:715 -+#: dnf/cli/output.py:659 - msgid "Is this ok [Y/n]: " - msgstr "" - --#: dnf/cli/output.py:795 -+#: dnf/cli/output.py:739 - #, python-format - msgid "Group: %s" - msgstr "" - --#: dnf/cli/output.py:799 -+#: dnf/cli/output.py:743 - #, python-format - msgid " Group-Id: %s" - msgstr "" - --#: dnf/cli/output.py:801 dnf/cli/output.py:840 -+#: dnf/cli/output.py:745 dnf/cli/output.py:784 - #, python-format - msgid " Description: %s" - msgstr "" - --#: dnf/cli/output.py:803 -+#: dnf/cli/output.py:747 - #, python-format - msgid " Language: %s" - msgstr "" - --#: dnf/cli/output.py:806 -+#: dnf/cli/output.py:750 - msgid " Mandatory Packages:" - msgstr "" - --#: dnf/cli/output.py:807 -+#: dnf/cli/output.py:751 - msgid " Default Packages:" - msgstr "" - --#: dnf/cli/output.py:808 -+#: dnf/cli/output.py:752 - msgid " Optional Packages:" - msgstr "" - --#: dnf/cli/output.py:809 -+#: dnf/cli/output.py:753 - msgid " Conditional Packages:" - msgstr "" - --#: dnf/cli/output.py:834 -+#: dnf/cli/output.py:778 - #, python-format - msgid "Environment Group: %s" - msgstr "" - --#: dnf/cli/output.py:837 -+#: dnf/cli/output.py:781 - #, python-format - msgid " Environment-Id: %s" - msgstr "" - --#: dnf/cli/output.py:843 -+#: dnf/cli/output.py:787 - msgid " Mandatory Groups:" - msgstr "" - --#: dnf/cli/output.py:844 -+#: dnf/cli/output.py:788 - msgid " Optional Groups:" - msgstr "" - --#: dnf/cli/output.py:865 -+#: dnf/cli/output.py:809 - msgid "Matched from:" - msgstr "" - --#: dnf/cli/output.py:879 -+#: dnf/cli/output.py:823 - #, python-format - msgid "Filename : %s" - msgstr "" - --#: dnf/cli/output.py:904 -+#: dnf/cli/output.py:848 - #, python-format - msgid "Repo : %s" - msgstr "" - --#: dnf/cli/output.py:913 -+#: dnf/cli/output.py:857 - msgid "Description : " - msgstr "" - --#: dnf/cli/output.py:917 -+#: dnf/cli/output.py:861 - #, python-format - msgid "URL : %s" - msgstr "" - --#: dnf/cli/output.py:921 -+#: dnf/cli/output.py:865 - #, python-format - msgid "License : %s" - msgstr "" - --#: dnf/cli/output.py:927 -+#: dnf/cli/output.py:871 - #, python-format - msgid "Provide : %s" - msgstr "" - --#: dnf/cli/output.py:947 -+#: dnf/cli/output.py:891 - #, python-format - msgid "Other : %s" - msgstr "" - --#: dnf/cli/output.py:996 -+#: dnf/cli/output.py:940 - msgid "There was an error calculating total download size" - msgstr "" - --#: dnf/cli/output.py:1002 -+#: dnf/cli/output.py:946 - #, python-format - msgid "Total size: %s" - msgstr "" - --#: dnf/cli/output.py:1005 -+#: dnf/cli/output.py:949 - #, python-format - msgid "Total download size: %s" - msgstr "" - --#: dnf/cli/output.py:1008 -+#: dnf/cli/output.py:952 - #, python-format - msgid "Installed size: %s" - msgstr "" - --#: dnf/cli/output.py:1026 -+#: dnf/cli/output.py:970 - msgid "There was an error calculating installed size" - msgstr "" - --#: dnf/cli/output.py:1030 -+#: dnf/cli/output.py:974 - #, python-format - msgid "Freed space: %s" - msgstr "" - --#: dnf/cli/output.py:1039 -+#: dnf/cli/output.py:983 - msgid "Marking packages as installed by the group:" - msgstr "" - --#: dnf/cli/output.py:1046 -+#: dnf/cli/output.py:990 - msgid "Marking packages as removed by the group:" - msgstr "" - --#: dnf/cli/output.py:1056 -+#: dnf/cli/output.py:1000 - msgid "Group" - msgstr "" - --#: dnf/cli/output.py:1056 -+#: dnf/cli/output.py:1000 - msgid "Packages" - msgstr "" - --#: dnf/cli/output.py:1133 -+#: dnf/cli/output.py:1046 - msgid "Installing group/module packages" - msgstr "" - --#: dnf/cli/output.py:1134 -+#: dnf/cli/output.py:1047 - msgid "Installing group packages" - msgstr "" - - #. TRANSLATORS: This is for a list of packages to be installed. --#: dnf/cli/output.py:1138 -+#: dnf/cli/output.py:1051 - msgctxt "summary" - msgid "Installing" - msgstr "" - - #. TRANSLATORS: This is for a list of packages to be upgraded. --#: dnf/cli/output.py:1140 -+#: dnf/cli/output.py:1053 - msgctxt "summary" - msgid "Upgrading" - msgstr "" - - #. TRANSLATORS: This is for a list of packages to be reinstalled. --#: dnf/cli/output.py:1142 -+#: dnf/cli/output.py:1055 - msgctxt "summary" - msgid "Reinstalling" - msgstr "" - --#: dnf/cli/output.py:1144 -+#: dnf/cli/output.py:1057 - msgid "Installing dependencies" - msgstr "" - --#: dnf/cli/output.py:1145 -+#: dnf/cli/output.py:1058 - msgid "Installing weak dependencies" - msgstr "" - - #. TRANSLATORS: This is for a list of packages to be removed. --#: dnf/cli/output.py:1147 -+#: dnf/cli/output.py:1060 - msgid "Removing" - msgstr "" - --#: dnf/cli/output.py:1148 -+#: dnf/cli/output.py:1061 - msgid "Removing dependent packages" - msgstr "" - --#: dnf/cli/output.py:1149 -+#: dnf/cli/output.py:1062 - msgid "Removing unused dependencies" - msgstr "" - - #. TRANSLATORS: This is for a list of packages to be downgraded. --#: dnf/cli/output.py:1151 -+#: dnf/cli/output.py:1064 - msgctxt "summary" - msgid "Downgrading" - msgstr "" - --#: dnf/cli/output.py:1176 -+#: dnf/cli/output.py:1089 - msgid "Installing module profiles" - msgstr "" - --#: dnf/cli/output.py:1185 -+#: dnf/cli/output.py:1098 - msgid "Disabling module profiles" - msgstr "" - --#: dnf/cli/output.py:1194 -+#: dnf/cli/output.py:1107 - msgid "Enabling module streams" - msgstr "" - --#: dnf/cli/output.py:1202 -+#: dnf/cli/output.py:1115 - msgid "Switching module streams" - msgstr "" - --#: dnf/cli/output.py:1210 -+#: dnf/cli/output.py:1123 - msgid "Disabling modules" - msgstr "" - --#: dnf/cli/output.py:1218 -+#: dnf/cli/output.py:1131 - msgid "Resetting modules" - msgstr "" - --#: dnf/cli/output.py:1230 -+#: dnf/cli/output.py:1143 - msgid "Installing Environment Groups" - msgstr "" - --#: dnf/cli/output.py:1237 -+#: dnf/cli/output.py:1150 - msgid "Upgrading Environment Groups" - msgstr "" - --#: dnf/cli/output.py:1244 -+#: dnf/cli/output.py:1157 - msgid "Removing Environment Groups" - msgstr "" - --#: dnf/cli/output.py:1251 -+#: dnf/cli/output.py:1164 - msgid "Installing Groups" - msgstr "" - --#: dnf/cli/output.py:1258 -+#: dnf/cli/output.py:1171 - msgid "Upgrading Groups" - msgstr "" - --#: dnf/cli/output.py:1265 -+#: dnf/cli/output.py:1178 - msgid "Removing Groups" - msgstr "" - --#: dnf/cli/output.py:1281 -+#: dnf/cli/output.py:1194 - #, python-format - msgid "" - "Skipping packages with conflicts:\n" - "(add '%s' to command line to force their upgrade)" - msgstr "" - --#: dnf/cli/output.py:1291 -+#: dnf/cli/output.py:1204 - #, python-format - msgid "Skipping packages with broken dependencies%s" - msgstr "" - --#: dnf/cli/output.py:1295 -+#: dnf/cli/output.py:1208 - msgid " or part of a group" - msgstr "" - -@@ -3021,22 +3008,22 @@ msgstr "" - #. use the full (unabbreviated) term 'Package' if you think that - #. the translation to your language is not too long and will - #. always fit to limited space. --#: dnf/cli/output.py:1320 -+#: dnf/cli/output.py:1233 - msgctxt "short" - msgid "Package" - msgstr "" - - #. Translators: This is the full (unabbreviated) term 'Package'. --#: dnf/cli/output.py:1322 -+#: dnf/cli/output.py:1235 - msgctxt "long" - msgid "Package" - msgstr "" - --#: dnf/cli/output.py:1371 -+#: dnf/cli/output.py:1284 - msgid "replacing" - msgstr "" - --#: dnf/cli/output.py:1378 -+#: dnf/cli/output.py:1291 - #, python-format - msgid "" - "\n" -@@ -3045,289 +3032,273 @@ msgid "" - msgstr "" - - #. TODO: remove --#: dnf/cli/output.py:1383 dnf/cli/output.py:1932 dnf/cli/output.py:1933 -+#: dnf/cli/output.py:1296 dnf/cli/output.py:1812 dnf/cli/output.py:1813 - msgid "Install" - msgstr "" - --#: dnf/cli/output.py:1387 dnf/cli/output.py:1941 -+#: dnf/cli/output.py:1300 dnf/cli/output.py:1821 - msgid "Upgrade" - msgstr "" - --#: dnf/cli/output.py:1388 -+#: dnf/cli/output.py:1301 - msgid "Remove" - msgstr "" - --#: dnf/cli/output.py:1390 dnf/cli/output.py:1939 -+#: dnf/cli/output.py:1303 dnf/cli/output.py:1819 - msgid "Downgrade" - msgstr "" - --#: dnf/cli/output.py:1391 -+#: dnf/cli/output.py:1304 - msgid "Skip" - msgstr "" - --#: dnf/cli/output.py:1400 dnf/cli/output.py:1416 -+#: dnf/cli/output.py:1313 dnf/cli/output.py:1329 - msgid "Package" - msgid_plural "Packages" - msgstr[0] "" - msgstr[1] "" - --#: dnf/cli/output.py:1418 -+#: dnf/cli/output.py:1331 - msgid "Dependent package" - msgid_plural "Dependent packages" - msgstr[0] "" - msgstr[1] "" - --#: dnf/cli/output.py:1497 dnf/cli/output.py:1773 dnf/cli/output.py:1942 --msgid "Upgraded" --msgstr "" -- --#: dnf/cli/output.py:1498 dnf/cli/output.py:1773 dnf/cli/output.py:1940 --msgid "Downgraded" --msgstr "" -- --#: dnf/cli/output.py:1503 --msgid "Reinstalled" --msgstr "" -- --#: dnf/cli/output.py:1504 --msgid "Skipped" --msgstr "" -- --#: dnf/cli/output.py:1505 --msgid "Removed" --msgstr "" -- --#: dnf/cli/output.py:1508 --msgid "Failed" --msgstr "" -- --#: dnf/cli/output.py:1559 -+#: dnf/cli/output.py:1439 - msgid "Total" - msgstr "" - --#: dnf/cli/output.py:1587 -+#: dnf/cli/output.py:1467 - msgid "" - msgstr "" - --#: dnf/cli/output.py:1588 -+#: dnf/cli/output.py:1468 - msgid "System" - msgstr "" - --#: dnf/cli/output.py:1638 -+#: dnf/cli/output.py:1518 - msgid "Command line" - msgstr "" - - #. TRANSLATORS: user names who executed transaction in history command output --#: dnf/cli/output.py:1649 -+#: dnf/cli/output.py:1529 - msgid "User name" - msgstr "" - --#: dnf/cli/output.py:1651 -+#: dnf/cli/output.py:1531 - msgid "ID" - msgstr "" - --#: dnf/cli/output.py:1653 -+#: dnf/cli/output.py:1533 - msgid "Date and time" - msgstr "" - --#: dnf/cli/output.py:1654 -+#: dnf/cli/output.py:1534 - msgid "Action(s)" - msgstr "" - --#: dnf/cli/output.py:1655 -+#: dnf/cli/output.py:1535 - msgid "Altered" - msgstr "" - --#: dnf/cli/output.py:1698 -+#: dnf/cli/output.py:1578 - msgid "No transactions" - msgstr "" - --#: dnf/cli/output.py:1699 dnf/cli/output.py:1715 -+#: dnf/cli/output.py:1579 dnf/cli/output.py:1595 - msgid "Failed history info" - msgstr "" - --#: dnf/cli/output.py:1714 -+#: dnf/cli/output.py:1594 - msgid "No transaction ID, or package, given" - msgstr "" - --#: dnf/cli/output.py:1772 -+#: dnf/cli/output.py:1652 - msgid "Erased" - msgstr "" - --#: dnf/cli/output.py:1774 -+#: dnf/cli/output.py:1653 dnf/cli/output.py:1820 dnf/util.py:590 -+msgid "Downgraded" -+msgstr "" -+ -+#: dnf/cli/output.py:1653 dnf/cli/output.py:1822 dnf/util.py:589 -+msgid "Upgraded" -+msgstr "" -+ -+#: dnf/cli/output.py:1654 - msgid "Not installed" - msgstr "" - --#: dnf/cli/output.py:1775 -+#: dnf/cli/output.py:1655 - msgid "Newer" - msgstr "" - --#: dnf/cli/output.py:1775 -+#: dnf/cli/output.py:1655 - msgid "Older" - msgstr "" - --#: dnf/cli/output.py:1823 dnf/cli/output.py:1825 -+#: dnf/cli/output.py:1703 dnf/cli/output.py:1705 - msgid "Transaction ID :" - msgstr "" - --#: dnf/cli/output.py:1828 -+#: dnf/cli/output.py:1708 - msgid "Begin time :" - msgstr "" - --#: dnf/cli/output.py:1831 dnf/cli/output.py:1833 -+#: dnf/cli/output.py:1711 dnf/cli/output.py:1713 - msgid "Begin rpmdb :" - msgstr "" - --#: dnf/cli/output.py:1839 -+#: dnf/cli/output.py:1719 - #, python-format - msgid "(%u seconds)" - msgstr "" - --#: dnf/cli/output.py:1841 -+#: dnf/cli/output.py:1721 - #, python-format - msgid "(%u minutes)" - msgstr "" - --#: dnf/cli/output.py:1843 -+#: dnf/cli/output.py:1723 - #, python-format - msgid "(%u hours)" - msgstr "" - --#: dnf/cli/output.py:1845 -+#: dnf/cli/output.py:1725 - #, python-format - msgid "(%u days)" - msgstr "" - --#: dnf/cli/output.py:1846 -+#: dnf/cli/output.py:1726 - msgid "End time :" - msgstr "" - --#: dnf/cli/output.py:1849 dnf/cli/output.py:1851 -+#: dnf/cli/output.py:1729 dnf/cli/output.py:1731 - msgid "End rpmdb :" - msgstr "" - --#: dnf/cli/output.py:1858 dnf/cli/output.py:1860 -+#: dnf/cli/output.py:1738 dnf/cli/output.py:1740 - msgid "User :" - msgstr "" - --#: dnf/cli/output.py:1864 dnf/cli/output.py:1871 -+#: dnf/cli/output.py:1744 dnf/cli/output.py:1751 - msgid "Aborted" - msgstr "" - --#: dnf/cli/output.py:1864 dnf/cli/output.py:1867 dnf/cli/output.py:1869 --#: dnf/cli/output.py:1871 dnf/cli/output.py:1873 dnf/cli/output.py:1875 -+#: dnf/cli/output.py:1744 dnf/cli/output.py:1747 dnf/cli/output.py:1749 -+#: dnf/cli/output.py:1751 dnf/cli/output.py:1753 dnf/cli/output.py:1755 - msgid "Return-Code :" - msgstr "" - --#: dnf/cli/output.py:1867 dnf/cli/output.py:1875 -+#: dnf/cli/output.py:1747 dnf/cli/output.py:1755 - msgid "Success" - msgstr "" - --#: dnf/cli/output.py:1869 -+#: dnf/cli/output.py:1749 - msgid "Failures:" - msgstr "" - --#: dnf/cli/output.py:1873 -+#: dnf/cli/output.py:1753 - msgid "Failure:" - msgstr "" - --#: dnf/cli/output.py:1883 dnf/cli/output.py:1885 -+#: dnf/cli/output.py:1763 dnf/cli/output.py:1765 - msgid "Releasever :" - msgstr "" - --#: dnf/cli/output.py:1890 dnf/cli/output.py:1892 -+#: dnf/cli/output.py:1770 dnf/cli/output.py:1772 - msgid "Command Line :" - msgstr "" - --#: dnf/cli/output.py:1897 dnf/cli/output.py:1899 -+#: dnf/cli/output.py:1777 dnf/cli/output.py:1779 - msgid "Comment :" - msgstr "" - --#: dnf/cli/output.py:1903 -+#: dnf/cli/output.py:1783 - msgid "Transaction performed with:" - msgstr "" - --#: dnf/cli/output.py:1912 -+#: dnf/cli/output.py:1792 - msgid "Packages Altered:" - msgstr "" - --#: dnf/cli/output.py:1918 -+#: dnf/cli/output.py:1798 - msgid "Scriptlet output:" - msgstr "" - --#: dnf/cli/output.py:1925 -+#: dnf/cli/output.py:1805 - msgid "Errors:" - msgstr "" - --#: dnf/cli/output.py:1934 -+#: dnf/cli/output.py:1814 - msgid "Dep-Install" - msgstr "" - --#: dnf/cli/output.py:1935 -+#: dnf/cli/output.py:1815 - msgid "Obsoleted" - msgstr "" - --#: dnf/cli/output.py:1936 dnf/transaction.py:84 dnf/transaction.py:85 -+#: dnf/cli/output.py:1816 dnf/transaction.py:84 dnf/transaction.py:85 - msgid "Obsoleting" - msgstr "" - --#: dnf/cli/output.py:1937 -+#: dnf/cli/output.py:1817 - msgid "Erase" - msgstr "" - --#: dnf/cli/output.py:1938 -+#: dnf/cli/output.py:1818 - msgid "Reinstall" - msgstr "" - --#: dnf/cli/output.py:2016 -+#: dnf/cli/output.py:1892 - #, python-format - msgid "---> Package %s.%s %s will be installed" - msgstr "" - --#: dnf/cli/output.py:2018 -+#: dnf/cli/output.py:1894 - #, python-format - msgid "---> Package %s.%s %s will be an upgrade" - msgstr "" - --#: dnf/cli/output.py:2020 -+#: dnf/cli/output.py:1896 - #, python-format - msgid "---> Package %s.%s %s will be erased" - msgstr "" - --#: dnf/cli/output.py:2022 -+#: dnf/cli/output.py:1898 - #, python-format - msgid "---> Package %s.%s %s will be reinstalled" - msgstr "" - --#: dnf/cli/output.py:2024 -+#: dnf/cli/output.py:1900 - #, python-format - msgid "---> Package %s.%s %s will be a downgrade" - msgstr "" - --#: dnf/cli/output.py:2026 -+#: dnf/cli/output.py:1902 - #, python-format - msgid "---> Package %s.%s %s will be obsoleting" - msgstr "" - --#: dnf/cli/output.py:2028 -+#: dnf/cli/output.py:1904 - #, python-format - msgid "---> Package %s.%s %s will be upgraded" - msgstr "" - --#: dnf/cli/output.py:2030 -+#: dnf/cli/output.py:1906 - #, python-format - msgid "---> Package %s.%s %s will be obsoleted" - msgstr "" - --#: dnf/cli/output.py:2039 -+#: dnf/cli/output.py:1915 - msgid "--> Starting dependency resolution" - msgstr "" - --#: dnf/cli/output.py:2044 -+#: dnf/cli/output.py:1919 - msgid "--> Finished dependency resolution" - msgstr "" - --#: dnf/cli/output.py:2058 dnf/crypto.py:132 -+#: dnf/cli/output.py:1933 dnf/crypto.py:132 - #, python-format - msgid "" - "Importing GPG key 0x%s:\n" -@@ -3409,7 +3380,7 @@ msgstr "" - msgid "Environment id '%s' does not exist." - msgstr "" - --#: dnf/comps.py:622 dnf/transaction_sr.py:443 dnf/transaction_sr.py:453 -+#: dnf/comps.py:622 dnf/transaction_sr.py:477 dnf/transaction_sr.py:487 - #, python-format - msgid "Environment id '%s' is not installed." - msgstr "" -@@ -3516,6 +3487,11 @@ msgstr "" - msgid "repo %s: imported key 0x%s." - msgstr "" - -+#: dnf/crypto.py:177 -+#, python-format -+msgid "retrieving repo key for %s unencrypted from %s" -+msgstr "" -+ - #: dnf/db/group.py:293 - msgid "" - "No available modular metadata for modular package '{}', it cannot be " -@@ -3598,7 +3574,7 @@ msgid_plural "Modular dependency problems with Defaults:" - msgstr[0] "" - msgstr[1] "" - --#: dnf/exceptions.py:131 dnf/module/module_base.py:686 -+#: dnf/exceptions.py:131 dnf/module/module_base.py:841 - msgid "Modular dependency problem:" - msgid_plural "Modular dependency problems:" - msgstr[0] "" -@@ -3646,8 +3622,8 @@ msgid "" - "Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled, [a]ctive" - msgstr "" - --#: dnf/module/module_base.py:54 dnf/module/module_base.py:421 --#: dnf/module/module_base.py:477 dnf/module/module_base.py:543 -+#: dnf/module/module_base.py:54 dnf/module/module_base.py:547 -+#: dnf/module/module_base.py:603 dnf/module/module_base.py:669 - msgid "Ignoring unnecessary profile: '{}/{}'" - msgstr "" - -@@ -3656,17 +3632,17 @@ msgstr "" - msgid "All matches for argument '{0}' in module '{1}:{2}' are not active" - msgstr "" - --#: dnf/module/module_base.py:92 -+#: dnf/module/module_base.py:92 dnf/module/module_base.py:202 - #, python-brace-format - msgid "Installing module '{0}' from Fail-Safe repository {1} is not allowed" - msgstr "" - --#: dnf/module/module_base.py:102 -+#: dnf/module/module_base.py:102 dnf/module/module_base.py:212 - msgid "" - "Unable to match profile for argument {}. Available profiles for '{}:{}': {}" - msgstr "" - --#: dnf/module/module_base.py:106 -+#: dnf/module/module_base.py:106 dnf/module/module_base.py:216 - msgid "Unable to match profile for argument {}" - msgstr "" - -@@ -3682,40 +3658,54 @@ msgstr "" - msgid "Default profile {} not available in module {}:{}" - msgstr "" - --#: dnf/module/module_base.py:142 -+#: dnf/module/module_base.py:142 dnf/module/module_base.py:245 - msgid "Installing module from Fail-Safe repository is not allowed" - msgstr "" - --#: dnf/module/module_base.py:159 dnf/module/module_base.py:193 --#: dnf/module/module_base.py:337 dnf/module/module_base.py:355 --#: dnf/module/module_base.py:363 dnf/module/module_base.py:417 --#: dnf/module/module_base.py:473 dnf/module/module_base.py:539 --msgid "Unable to resolve argument {}" -+#: dnf/module/module_base.py:194 -+#, python-brace-format -+msgid "No active matches for argument '{0}' in module '{1}:{2}'" - msgstr "" - --#: dnf/module/module_base.py:160 --msgid "No match for package {}" -+#: dnf/module/module_base.py:226 -+#, python-brace-format -+msgid "Installed profile '{0}' is not available in module '{1}' stream '{2}'" -+msgstr "" -+ -+#: dnf/module/module_base.py:265 -+msgid "No packages available to distrosync for package name '{}'" - msgstr "" - --#: dnf/module/module_base.py:204 -+#: dnf/module/module_base.py:308 dnf/module/module_base.py:452 -+#: dnf/module/module_base.py:477 dnf/module/module_base.py:496 -+#: dnf/module/module_base.py:543 dnf/module/module_base.py:599 -+#: dnf/module/module_base.py:665 dnf/module/module_base.py:827 -+msgid "Unable to resolve argument {}" -+msgstr "" -+ -+#: dnf/module/module_base.py:319 - #, python-brace-format - msgid "Upgrading module '{0}' from Fail-Safe repository {1} is not allowed" - msgstr "" - --#: dnf/module/module_base.py:223 dnf/module/module_base.py:251 -+#: dnf/module/module_base.py:338 dnf/module/module_base.py:366 - msgid "Unable to match profile in argument {}" - msgstr "" - --#: dnf/module/module_base.py:231 -+#: dnf/module/module_base.py:346 - msgid "Upgrading module from Fail-Safe repository is not allowed" - msgstr "" - --#: dnf/module/module_base.py:367 -+#: dnf/module/module_base.py:500 - msgid "" - "Only module name is required. Ignoring unneeded information in argument: '{}'" - msgstr "" - --#: dnf/package.py:298 -+#: dnf/module/module_base.py:828 -+msgid "No match for package {}" -+msgstr "" -+ -+#: dnf/package.py:333 - #, python-format - msgid "%s: %s check failed: %s vs %s" - msgstr "" -@@ -3796,6 +3786,12 @@ msgstr "" - msgid "Errors occurred during test transaction." - msgstr "" - -+#: dnf/sack.py:47 -+msgid "" -+"allow_vendor_change is disabled. This option is currently not supported for " -+"downgrade and distro-sync commands" -+msgstr "" -+ - #. TRANSLATORS: This is for a single package currently being downgraded. - #: dnf/transaction.py:80 - msgctxt "currently" -@@ -3842,160 +3838,183 @@ msgstr "" - msgid "Preparing" - msgstr "" - --#: dnf/transaction_sr.py:60 -+#: dnf/transaction_sr.py:66 - #, python-brace-format --msgid "Errors in \"{filename}\":" -+msgid "" -+"The following problems occurred while replaying the transaction from file " -+"\"{filename}\":" - msgstr "" - --#: dnf/transaction_sr.py:70 --#, python-brace-format --msgid "Error in \"{filename}\": {error}" -+#: dnf/transaction_sr.py:68 -+msgid "The following problems occurred while running a transaction:" - msgstr "" - --#: dnf/transaction_sr.py:87 -+#: dnf/transaction_sr.py:89 - #, python-brace-format - msgid "Invalid major version \"{major}\", number expected." - msgstr "" - --#: dnf/transaction_sr.py:95 -+#: dnf/transaction_sr.py:97 - #, python-brace-format - msgid "Invalid minor version \"{minor}\", number expected." - msgstr "" - --#: dnf/transaction_sr.py:101 -+#: dnf/transaction_sr.py:103 - #, python-brace-format - msgid "" - "Incompatible major version \"{major}\", supported major version is " - "\"{major_supp}\"." - msgstr "" - --#: dnf/transaction_sr.py:244 -+#: dnf/transaction_sr.py:224 -+msgid "" -+"Conflicting TransactionReplay arguments have been specified: filename, data" -+msgstr "" -+ -+#: dnf/transaction_sr.py:265 - #, python-brace-format - msgid "Unexpected type of \"{id}\", {exp} expected." - msgstr "" - --#: dnf/transaction_sr.py:250 -+#: dnf/transaction_sr.py:271 - #, python-brace-format - msgid "Missing key \"{key}\"." - msgstr "" - --#: dnf/transaction_sr.py:263 -+#: dnf/transaction_sr.py:285 - #, python-brace-format - msgid "Missing object key \"{key}\" in an rpm." - msgstr "" - --#: dnf/transaction_sr.py:267 -+#: dnf/transaction_sr.py:289 - #, python-brace-format - msgid "" - "Unexpected value of package reason \"{reason}\" for rpm nevra \"{nevra}\"." - msgstr "" - --#: dnf/transaction_sr.py:275 -+#: dnf/transaction_sr.py:297 - #, python-brace-format - msgid "Cannot parse NEVRA for package \"{nevra}\"." - msgstr "" - --#: dnf/transaction_sr.py:286 -+#: dnf/transaction_sr.py:321 - #, python-brace-format - msgid "Cannot find rpm nevra \"{nevra}\"." - msgstr "" - --#: dnf/transaction_sr.py:301 -+#: dnf/transaction_sr.py:336 - #, python-brace-format - msgid "Package \"{na}\" is already installed for action \"{action}\"." - msgstr "" - --#: dnf/transaction_sr.py:311 -+#: dnf/transaction_sr.py:345 - #, python-brace-format - msgid "" - "Package nevra \"{nevra}\" not available in repositories for action " - "\"{action}\"." - msgstr "" - --#: dnf/transaction_sr.py:322 -+#: dnf/transaction_sr.py:356 - #, python-brace-format - msgid "Package nevra \"{nevra}\" not installed for action \"{action}\"." - msgstr "" - --#: dnf/transaction_sr.py:336 -+#: dnf/transaction_sr.py:370 - #, python-brace-format - msgid "" - "Unexpected value of package action \"{action}\" for rpm nevra \"{nevra}\"." - msgstr "" - --#: dnf/transaction_sr.py:343 -+#: dnf/transaction_sr.py:377 - #, python-format - msgid "Group id '%s' is not available." - msgstr "" - --#: dnf/transaction_sr.py:364 -+#: dnf/transaction_sr.py:398 - #, python-brace-format - msgid "Missing object key \"{key}\" in groups.packages." - msgstr "" - --#: dnf/transaction_sr.py:377 dnf/transaction_sr.py:387 -+#: dnf/transaction_sr.py:411 dnf/transaction_sr.py:421 - #, python-format - msgid "Group id '%s' is not installed." - msgstr "" - --#: dnf/transaction_sr.py:398 -+#: dnf/transaction_sr.py:432 - #, python-format - msgid "Environment id '%s' is not available." - msgstr "" - --#: dnf/transaction_sr.py:422 -+#: dnf/transaction_sr.py:456 - #, python-brace-format - msgid "" - "Invalid value \"{group_type}\" of environments.groups.group_type, only " - "\"mandatory\" or \"optional\" is supported." - msgstr "" - --#: dnf/transaction_sr.py:430 -+#: dnf/transaction_sr.py:464 - #, python-brace-format - msgid "Missing object key \"{key}\" in environments.groups." - msgstr "" - --#: dnf/transaction_sr.py:508 -+#: dnf/transaction_sr.py:542 - #, python-brace-format - msgid "Unexpected value of group action \"{action}\" for group \"{group}\"." - msgstr "" - --#: dnf/transaction_sr.py:513 -+#: dnf/transaction_sr.py:547 - #, python-brace-format - msgid "Missing object key \"{key}\" in a group." - msgstr "" - --#: dnf/transaction_sr.py:537 -+#: dnf/transaction_sr.py:571 - #, python-brace-format - msgid "" - "Unexpected value of environment action \"{action}\" for environment " - "\"{env}\"." - msgstr "" - --#: dnf/transaction_sr.py:542 -+#: dnf/transaction_sr.py:576 - #, python-brace-format - msgid "Missing object key \"{key}\" in an environment." - msgstr "" - --#: dnf/transaction_sr.py:581 -+#: dnf/transaction_sr.py:615 - #, python-brace-format - msgid "" - "Package nevra \"{nevra}\", which is not present in the transaction file, was " - "pulled into the transaction." - msgstr "" - --#: dnf/util.py:391 dnf/util.py:393 -+#: dnf/util.py:393 dnf/util.py:395 - msgid "Problem" - msgstr "" - --#: dnf/util.py:444 -+#: dnf/util.py:446 - msgid "TransactionItem not found for key: {}" - msgstr "" - --#: dnf/util.py:454 -+#: dnf/util.py:456 - msgid "TransactionSWDBItem not found for key: {}" - msgstr "" - --#: dnf/util.py:457 -+#: dnf/util.py:459 - msgid "Errors occurred during transaction." - msgstr "" -+ -+#: dnf/util.py:595 -+msgid "Reinstalled" -+msgstr "" -+ -+#: dnf/util.py:596 -+msgid "Skipped" -+msgstr "" -+ -+#: dnf/util.py:597 -+msgid "Removed" -+msgstr "" -+ -+#: dnf/util.py:600 -+msgid "Failed" -+msgstr "" -+ -diff --git a/po/fr.po b/po/fr.po -index 4e883335..bf1ccb6a 100644 ---- a/po/fr.po -+++ b/po/fr.po -@@ -18,20 +18,21 @@ - # Ludek Janda , 2018. #zanata - # Jean-Baptiste Holcroft , 2019. #zanata, 2020. - # Julien Humbert , 2020. -+# Sundeep Anand , 2021. - msgid "" - msgstr "" - "Project-Id-Version: PACKAGE VERSION\n" - "Report-Msgid-Bugs-To: \n" --"POT-Creation-Date: 2020-10-05 09:18-0400\n" --"PO-Revision-Date: 2020-09-12 11:29+0000\n" --"Last-Translator: Julien Humbert \n" --"Language-Team: French \n" -+"POT-Creation-Date: 2021-02-22 09:22+0100\n" -+"PO-Revision-Date: 2021-03-08 10:29+0000\n" -+"Last-Translator: Sundeep Anand \n" -+"Language-Team: French \n" - "Language: fr\n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" - "Plural-Forms: nplurals=2; plural=n > 1;\n" --"X-Generator: Weblate 4.2.2\n" -+"X-Generator: Weblate 4.5.1\n" - - #: dnf/automatic/emitter.py:32 - #, python-format -@@ -88,7 +89,7 @@ msgstr "Valeur de configuration inconnue : %s=%s dans %s ; %s" - msgid "Unknown configuration option: %s = %s in %s" - msgstr "Option de configuration inconnue : %s=%s dans %s" - --#: dnf/automatic/main.py:237 dnf/cli/cli.py:299 -+#: dnf/automatic/main.py:237 dnf/cli/cli.py:304 - msgid "GPG check FAILED" - msgstr "La vérification GPG a ÉCHOUÉ" - -@@ -101,9 +102,10 @@ msgid "Started dnf-automatic." - msgstr "dnf-automatic démarré." - - #: dnf/automatic/main.py:308 --#, python-format --msgid "Sleep for %s seconds" --msgstr "Mise en sommeil pendant %s secondes" -+msgid "Sleep for {} second" -+msgid_plural "Sleep for {} seconds" -+msgstr[0] "Mise en sommeil pendant {} seconde" -+msgstr[1] "Mise en sommeil pendant {} secondes" - - #: dnf/automatic/main.py:315 - msgid "System is off-line." -@@ -115,7 +117,7 @@ msgstr "Le système est hors-ligne." - msgid "Error: %s" - msgstr "Erreur : %s" - --#: dnf/base.py:146 -+#: dnf/base.py:146 dnf/base.py:472 dnf/base.py:474 - msgid "loading repo '{}' failure: {}" - msgstr "Erreur lors du chargement du dépôt « {} » : {}" - -@@ -123,76 +125,76 @@ msgstr "Erreur lors du chargement du dépôt « {} » : {}" - msgid "Loading repository '{}' has failed" - msgstr "Échec du chargement du dépôt « {} »" - --#: dnf/base.py:320 -+#: dnf/base.py:322 - msgid "Metadata timer caching disabled when running on metered connection." - msgstr "" - "Mise en cache temporisée des métadonnées désactivée lors du fonctionnement " - "sur connexion limitée." - --#: dnf/base.py:325 -+#: dnf/base.py:327 - msgid "Metadata timer caching disabled when running on a battery." - msgstr "" - "Mise en cache temporisée des métadonnées désactivée lors du fonctionnement " - "sur batterie." - --#: dnf/base.py:330 -+#: dnf/base.py:332 - msgid "Metadata timer caching disabled." - msgstr "Mise en cache temporisée des métadonnées désactivée." - --#: dnf/base.py:335 -+#: dnf/base.py:337 - msgid "Metadata cache refreshed recently." - msgstr "Cache des métadonnées mis à jour récemment." - --#: dnf/base.py:341 dnf/cli/commands/__init__.py:91 -+#: dnf/base.py:343 dnf/cli/commands/__init__.py:91 - msgid "There are no enabled repositories in \"{}\"." - msgstr "Il n’y a pas de dépôts activés dans « {} »." - --#: dnf/base.py:348 -+#: dnf/base.py:350 - #, python-format - msgid "%s: will never be expired and will not be refreshed." - msgstr "%s : n’expirera jamais et ne sera pas réinitialisé." - --#: dnf/base.py:350 -+#: dnf/base.py:352 - #, python-format - msgid "%s: has expired and will be refreshed." - msgstr "%s : a expiré et sera réinitialisé." - - #. expires within the checking period: --#: dnf/base.py:354 -+#: dnf/base.py:356 - #, python-format - msgid "%s: metadata will expire after %d seconds and will be refreshed now" - msgstr "" - "%s : métadonnées expireront après %d secondes et seront réinitialisées " - "maintenant" - --#: dnf/base.py:358 -+#: dnf/base.py:360 - #, python-format - msgid "%s: will expire after %d seconds." - msgstr "%s : expireront après %d secondes." - - #. performs the md sync --#: dnf/base.py:364 -+#: dnf/base.py:366 - msgid "Metadata cache created." - msgstr "Cache des métadonnées créé." - --#: dnf/base.py:397 -+#: dnf/base.py:399 dnf/base.py:466 - #, python-format - msgid "%s: using metadata from %s." - msgstr "%s : utilisation des métadonnées depuis le %s." - --#: dnf/base.py:409 -+#: dnf/base.py:411 dnf/base.py:479 - #, python-format - msgid "Ignoring repositories: %s" - msgstr "Dépôts ignorés : %s" - --#: dnf/base.py:412 -+#: dnf/base.py:414 - #, python-format - msgid "Last metadata expiration check: %s ago on %s." - msgstr "" - "Dernière vérification de l’expiration des métadonnées effectuée il y a %s le" - " %s." - --#: dnf/base.py:443 -+#: dnf/base.py:507 - msgid "" - "The downloaded packages were saved in cache until the next successful " - "transaction." -@@ -200,59 +202,59 @@ msgstr "" - "Les paquets téléchargés ont été mis en cache jusqu’à la prochaine " - "transaction réussie." - --#: dnf/base.py:445 -+#: dnf/base.py:509 - #, python-format - msgid "You can remove cached packages by executing '%s'." - msgstr "Vous pouvez supprimer les paquets en cache en exécutant « %s »." - --#: dnf/base.py:535 -+#: dnf/base.py:599 - #, python-format - msgid "Invalid tsflag in config file: %s" - msgstr "tsflag invalide dans le fichier de configuration : %s" - --#: dnf/base.py:591 -+#: dnf/base.py:655 - #, python-format - msgid "Failed to add groups file for repository: %s - %s" - msgstr "Échec d’ajout du fichier de groupes pour le dépôt : %s - %s" - --#: dnf/base.py:823 -+#: dnf/base.py:887 - msgid "Running transaction check" - msgstr "Test de la transaction" - --#: dnf/base.py:831 -+#: dnf/base.py:895 - msgid "Error: transaction check vs depsolve:" - msgstr "" - "Erreur : vérification de transaction contre résolution des dépendances :" - --#: dnf/base.py:837 -+#: dnf/base.py:901 - msgid "Transaction check succeeded." - msgstr "La vérification de la transaction a réussi." - --#: dnf/base.py:840 -+#: dnf/base.py:904 - msgid "Running transaction test" - msgstr "Lancement de la transaction de test" - --#: dnf/base.py:850 dnf/base.py:992 -+#: dnf/base.py:914 dnf/base.py:1065 - msgid "RPM: {}" - msgstr "RPM : {}" - --#: dnf/base.py:851 -+#: dnf/base.py:915 - msgid "Transaction test error:" - msgstr "Erreur de la transaction de test :" - --#: dnf/base.py:862 -+#: dnf/base.py:926 - msgid "Transaction test succeeded." - msgstr "Transaction de test réussie." - --#: dnf/base.py:883 -+#: dnf/base.py:947 - msgid "Running transaction" - msgstr "Exécution de la transaction" - --#: dnf/base.py:911 -+#: dnf/base.py:984 - msgid "Disk Requirements:" - msgstr "Besoins en espace disque :" - --#: dnf/base.py:914 -+#: dnf/base.py:987 - #, python-brace-format - msgid "At least {0}MB more space needed on the {1} filesystem." - msgid_plural "At least {0}MB more space needed on the {1} filesystem." -@@ -263,40 +265,40 @@ msgstr[1] "" - "Au moins {0} Mio supplémentaires sont nécessaires sur le système de fichiers" - " {1}." - --#: dnf/base.py:921 -+#: dnf/base.py:994 - msgid "Error Summary" - msgstr "Résumé des erreurs" - --#: dnf/base.py:947 -+#: dnf/base.py:1020 - #, python-brace-format - msgid "RPMDB altered outside of {prog}." - msgstr "RPMDB modifié en dehors de {prog}." - --#: dnf/base.py:993 dnf/base.py:1001 -+#: dnf/base.py:1066 dnf/base.py:1074 - msgid "Could not run transaction." - msgstr "Impossible d’exécuter la transaction." - --#: dnf/base.py:996 -+#: dnf/base.py:1069 - msgid "Transaction couldn't start:" - msgstr "La transaction n’a pas pu démarrer :" - --#: dnf/base.py:1010 -+#: dnf/base.py:1083 - #, python-format - msgid "Failed to remove transaction file %s" - msgstr "Échec de la suppression du fichier de transaction %s" - --#: dnf/base.py:1092 -+#: dnf/base.py:1165 - msgid "Some packages were not downloaded. Retrying." - msgstr "Certains paquets n’ont pas été téléchargés. Nouvel essai." - --#: dnf/base.py:1122 -+#: dnf/base.py:1195 - #, python-format - msgid "Delta RPMs reduced %.1f MB of updates to %.1f MB (%d.1%% saved)" - msgstr "" - "Les Delta RPM ont réduit la taille des mises à jour de %.1f Mio à %.1f Mio " - "(%d.1%% économisés)" - --#: dnf/base.py:1125 -+#: dnf/base.py:1198 - #, python-format - msgid "" - "Failed Delta RPMs increased %.1f MB of updates to %.1f MB (%d.1%% wasted)" -@@ -304,77 +306,77 @@ msgstr "" - "L’échec des Delta RPMs ont fait augmenter les %.1f MO de mises à jour de " - "%.1f MB (%d.1%% gaspillés)" - --#: dnf/base.py:1167 -+#: dnf/base.py:1240 - msgid "Cannot add local packages, because transaction job already exists" - msgstr "" - "Impossible d’ajouter des paquets locaux, car un travail de transaction " - "existe déjà" - --#: dnf/base.py:1181 -+#: dnf/base.py:1254 - msgid "Could not open: {}" - msgstr "Impossible d’ouvrir : {}" - --#: dnf/base.py:1219 -+#: dnf/base.py:1292 - #, python-format - msgid "Public key for %s is not installed" - msgstr "La clé publique pour %s n’est pas installée" - --#: dnf/base.py:1223 -+#: dnf/base.py:1296 - #, python-format - msgid "Problem opening package %s" - msgstr "Problème à l’ouverture du paquet %s" - --#: dnf/base.py:1231 -+#: dnf/base.py:1304 - #, python-format - msgid "Public key for %s is not trusted" - msgstr "La clé publique pour %s n’est pas de confiance" - --#: dnf/base.py:1235 -+#: dnf/base.py:1308 - #, python-format - msgid "Package %s is not signed" - msgstr "Le paquet %s n’est pas signé" - --#: dnf/base.py:1265 -+#: dnf/base.py:1338 - #, python-format - msgid "Cannot remove %s" - msgstr "Impossible de supprimer %s" - --#: dnf/base.py:1269 -+#: dnf/base.py:1342 - #, python-format - msgid "%s removed" - msgstr "%s supprimé" - --#: dnf/base.py:1549 -+#: dnf/base.py:1622 - msgid "No match for group package \"{}\"" - msgstr "Aucune correspondance pour le paquet du groupe « {} »" - --#: dnf/base.py:1635 -+#: dnf/base.py:1708 - #, python-format - msgid "Adding packages from group '%s': %s" - msgstr "Ajout de paquets en provenance du groupe « %s » : %s" - --#: dnf/base.py:1658 dnf/cli/cli.py:219 dnf/cli/commands/__init__.py:442 -+#: dnf/base.py:1731 dnf/cli/cli.py:220 dnf/cli/commands/__init__.py:442 - #: dnf/cli/commands/__init__.py:499 dnf/cli/commands/__init__.py:592 - #: dnf/cli/commands/__init__.py:641 dnf/cli/commands/install.py:80 - #: dnf/cli/commands/install.py:103 dnf/cli/commands/install.py:110 - msgid "Nothing to do." - msgstr "Rien à faire." - --#: dnf/base.py:1676 -+#: dnf/base.py:1749 - msgid "No groups marked for removal." - msgstr "Aucun groupe marqué pour suppression." - --#: dnf/base.py:1710 -+#: dnf/base.py:1783 - msgid "No group marked for upgrade." - msgstr "Aucun groupe marqué pour mise à jour." - --#: dnf/base.py:1925 -+#: dnf/base.py:1997 - #, python-format - msgid "Package %s not installed, cannot downgrade it." - msgstr "Le paquet %s n’est pas installé, impossible de le rétrograder." - --#: dnf/base.py:1927 dnf/base.py:1946 dnf/base.py:1959 dnf/base.py:1980 --#: dnf/base.py:2029 dnf/base.py:2037 dnf/base.py:2172 dnf/cli/cli.py:411 -+#: dnf/base.py:1999 dnf/base.py:2018 dnf/base.py:2031 dnf/base.py:2052 -+#: dnf/base.py:2101 dnf/base.py:2109 dnf/base.py:2243 dnf/cli/cli.py:416 - #: dnf/cli/commands/__init__.py:425 dnf/cli/commands/__init__.py:482 - #: dnf/cli/commands/__init__.py:586 dnf/cli/commands/__init__.py:633 - #: dnf/cli/commands/__init__.py:711 dnf/cli/commands/install.py:147 -@@ -384,30 +386,30 @@ msgstr "Le paquet %s n’est pas installé, impossible de le rétrograder." - msgid "No match for argument: %s" - msgstr "Aucune correspondance pour l’argument : %s" - --#: dnf/base.py:1934 -+#: dnf/base.py:2006 - #, python-format - msgid "Package %s of lower version already installed, cannot downgrade it." - msgstr "" - "Le paquet %s est déjà installé dans une version inférieure, impossible de le" - " rétrograder." - --#: dnf/base.py:1957 -+#: dnf/base.py:2029 - #, python-format - msgid "Package %s not installed, cannot reinstall it." - msgstr "Le paquet %s n’est pas installé, impossible de le réinstaller." - --#: dnf/base.py:1972 -+#: dnf/base.py:2044 - #, python-format - msgid "File %s is a source package and cannot be updated, ignoring." - msgstr "" - "Le fichier %s est un paquet source et ne peut pas être mis à jour, ignoré." - --#: dnf/base.py:1978 -+#: dnf/base.py:2050 - #, python-format - msgid "Package %s not installed, cannot update it." - msgstr "Le paquet %s n’est pas installé, impossible de le mettre à jour." - --#: dnf/base.py:1987 -+#: dnf/base.py:2059 - #, python-format - msgid "" - "The same or higher version of %s is already installed, cannot update it." -@@ -415,127 +417,113 @@ msgstr "" - "La même une ou version supérieure de %s est déjà installée, mise à jour " - "impossible." - --#: dnf/base.py:2026 dnf/cli/commands/reinstall.py:81 -+#: dnf/base.py:2098 dnf/cli/commands/reinstall.py:81 - #, python-format - msgid "Package %s available, but not installed." - msgstr "Le paquet %s est disponible mais n’est pas installé." - --#: dnf/base.py:2032 -+#: dnf/base.py:2104 - #, python-format - msgid "Package %s available, but installed for different architecture." - msgstr "" - "Le paquet %s est disponible mais est installé pour une autre architecture." - --#: dnf/base.py:2057 dnf/base.py:2250 dnf/cli/cli.py:668 dnf/cli/cli.py:699 -+#: dnf/base.py:2129 - #, python-format - msgid "No package %s installed." - msgstr "Aucun paquet %s installé." - --#: dnf/base.py:2075 dnf/cli/commands/install.py:136 -+#: dnf/base.py:2147 dnf/cli/commands/install.py:136 - #: dnf/cli/commands/remove.py:133 - #, python-format - msgid "Not a valid form: %s" - msgstr "Format invalide : %s" - --#: dnf/base.py:2091 dnf/cli/commands/__init__.py:681 --#: dnf/cli/commands/remove.py:163 -+#: dnf/base.py:2162 dnf/cli/commands/__init__.py:681 -+#: dnf/cli/commands/remove.py:162 - msgid "No packages marked for removal." - msgstr "Aucun paquet marqué pour suppression." - --#: dnf/base.py:2179 dnf/cli/cli.py:422 -+#: dnf/base.py:2250 dnf/cli/cli.py:427 - #, python-format - msgid "Packages for argument %s available, but not installed." - msgstr "Les paquets pour le paramètre %s sont disponibles mais pas installés." - --#: dnf/base.py:2184 -+#: dnf/base.py:2255 - #, python-format - msgid "Package %s of lowest version already installed, cannot downgrade it." - msgstr "" - "La version la plus ancienne du paquet %s est déjà installée, impossible de " - "le rétrograder." - --#: dnf/base.py:2242 --msgid "Action not handled: {}" --msgstr "Action non gérée : {}" -- --#: dnf/base.py:2256 dnf/cli/cli.py:419 dnf/cli/cli.py:673 dnf/cli/cli.py:703 --#: dnf/cli/commands/group.py:400 dnf/cli/commands/history.py:169 --#, python-format --msgid "No package %s available." --msgstr "Aucun paquet %s n’est disponible." -- --#: dnf/base.py:2269 --msgid "no package matched" --msgstr "aucun paquet correspondant" -- --#: dnf/base.py:2290 -+#: dnf/base.py:2302 - msgid "No security updates needed, but {} update available" - msgstr "" - "Aucune mise à jour de sécurité n’est nécessaire, mais la mise à jour {} est " - "disponible" - --#: dnf/base.py:2292 -+#: dnf/base.py:2304 - msgid "No security updates needed, but {} updates available" - msgstr "" - "Aucune mise à jour de sécurité n’est nécessaire, mais les mises à jour {} " - "sont disponibles" - --#: dnf/base.py:2296 -+#: dnf/base.py:2308 - msgid "No security updates needed for \"{}\", but {} update available" - msgstr "" - "Aucune mise à jour de sécurité n’est nécessaire pour « {} », mais la mise à " - "jour {} est disponible" - --#: dnf/base.py:2298 -+#: dnf/base.py:2310 - msgid "No security updates needed for \"{}\", but {} updates available" - msgstr "" - "Aucune mise à jour de sécurité n’est nécessaire pour « {} », mais les mises " - "à jour {} sont disponibles" - - #. raise an exception, because po.repoid is not in self.repos --#: dnf/base.py:2319 -+#: dnf/base.py:2331 - #, python-format - msgid "Unable to retrieve a key for a commandline package: %s" - msgstr "" - "Impossible de récupérer une clé pour un paquet en ligne de commande : %s" - --#: dnf/base.py:2327 -+#: dnf/base.py:2339 - #, python-format - msgid ". Failing package is: %s" - msgstr ". Le paquet en erreur est : %s" - --#: dnf/base.py:2328 -+#: dnf/base.py:2340 - #, python-format - msgid "GPG Keys are configured as: %s" - msgstr "Les clés GPG sont configurées comme : %s" - --#: dnf/base.py:2340 -+#: dnf/base.py:2352 - #, python-format - msgid "GPG key at %s (0x%s) is already installed" - msgstr "La clé GPG %s (0x%s) est déjà installée" - --#: dnf/base.py:2373 -+#: dnf/base.py:2385 - msgid "The key has been approved." - msgstr "La clef a été approuvée." - --#: dnf/base.py:2376 -+#: dnf/base.py:2388 - msgid "The key has been rejected." - msgstr "La clef a été rejetée." - --#: dnf/base.py:2409 -+#: dnf/base.py:2421 - #, python-format - msgid "Key import failed (code %d)" - msgstr "L’import de la clé a échoué (code %d)" - --#: dnf/base.py:2411 -+#: dnf/base.py:2423 - msgid "Key imported successfully" - msgstr "La clé a bien été importée" - --#: dnf/base.py:2415 -+#: dnf/base.py:2427 - msgid "Didn't install any keys" - msgstr "Toutes les clés n’ont pas été installées" - --#: dnf/base.py:2418 -+#: dnf/base.py:2430 - #, python-format - msgid "" - "The GPG keys listed for the \"%s\" repository are already installed but they are not correct for this package.\n" -@@ -544,28 +532,28 @@ msgstr "" - "Les clés GPG listées pour le dépôt « %s » sont déjà installées mais sont incorrectes pour ce paquet.\n" - "Vérifiez que les URL des clés pour ce dépôt soient correctes." - --#: dnf/base.py:2429 -+#: dnf/base.py:2441 - msgid "Import of key(s) didn't help, wrong key(s)?" - msgstr "" - "L’import de la ou des clés n’a pas résolu le problème, clés incorrectes ?" - --#: dnf/base.py:2482 -+#: dnf/base.py:2494 - msgid " * Maybe you meant: {}" - msgstr " * Peut-être vouliez-vous dire : {}" - --#: dnf/base.py:2514 -+#: dnf/base.py:2526 - msgid "Package \"{}\" from local repository \"{}\" has incorrect checksum" - msgstr "Le paquet \"{}\" du dépôt local \"{}\" a une somme de contrôle incorrecte" - --#: dnf/base.py:2517 -+#: dnf/base.py:2529 - msgid "Some packages from local repository have incorrect checksum" - msgstr "Certains paquets du dépôt local ont une somme de contrôle incorrecte" - --#: dnf/base.py:2520 -+#: dnf/base.py:2532 - msgid "Package \"{}\" from repository \"{}\" has incorrect checksum" - msgstr "Le paquet \"{}\" du dépôt \"{}\" a une somme de contrôle incorrecte" - --#: dnf/base.py:2523 -+#: dnf/base.py:2535 - msgid "" - "Some packages have invalid cache, but cannot be downloaded due to \"--" - "cacheonly\" option" -@@ -573,29 +561,29 @@ msgstr "" - "Certains paquets ont un cache invalide, mais ne peuvent pas être téléchargés" - " à cause de l’option « --cacheonly »" - --#: dnf/base.py:2541 dnf/base.py:2561 -+#: dnf/base.py:2553 dnf/base.py:2573 - msgid "No match for argument" - msgstr "Aucune correspondance pour le paramètre" - --#: dnf/base.py:2549 dnf/base.py:2569 -+#: dnf/base.py:2561 dnf/base.py:2581 - msgid "All matches were filtered out by exclude filtering for argument" - msgstr "" - "Toutes les correspondances ont été filtrées en excluant le filtrage pour " - "l’argument" - --#: dnf/base.py:2551 -+#: dnf/base.py:2563 - msgid "All matches were filtered out by modular filtering for argument" - msgstr "" - "Toutes les correspondances ont été filtrées par filtrage modulaire pour les " - "arguments" - --#: dnf/base.py:2567 -+#: dnf/base.py:2579 - msgid "All matches were installed from a different repository for argument" - msgstr "" - "Toutes les correspondances ont été installées à partir d’un dépôt différent " - "pour le paramètre" - --#: dnf/base.py:2583 -+#: dnf/base.py:2626 - #, python-format - msgid "Package %s is already installed." - msgstr "Le paquet %s est déjà installé." -@@ -616,8 +604,8 @@ msgstr "La lecture du fichier « %s » a échoué : %s" - msgid "Cannot read file \"%s\": %s" - msgstr "Impossible de lire le fichier « %s » : %s" - --#: dnf/cli/aliases.py:115 dnf/cli/aliases.py:129 dnf/cli/cli.py:902 --#: dnf/cli/cli.py:906 dnf/cli/commands/alias.py:108 -+#: dnf/cli/aliases.py:115 dnf/cli/aliases.py:129 dnf/cli/cli.py:803 -+#: dnf/cli/cli.py:807 dnf/cli/commands/alias.py:108 - #, python-format - msgid "Config error: %s" - msgstr "Erreur de configuration : %s" -@@ -650,7 +638,7 @@ msgstr "" - "Le résulta de l’opération sera le basculement du flux« {1} » du module « {0}" - " » vers le flux« {2} »" - --#: dnf/cli/cli.py:172 -+#: dnf/cli/cli.py:173 - #, python-brace-format - msgid "" - "It is not possible to switch enabled streams of a module.\n" -@@ -659,12 +647,12 @@ msgstr "" - "Il n’est pas possible de basculer les flux actifs d’un module.\n" - "Il et recommandé de retirer tout contenu installé par le module, et de réinitialiser le mode en utilisant la commande « {prog} module reset ». Après la réinitialisation, vous pouvez installer les autres flux." - --#: dnf/cli/cli.py:210 -+#: dnf/cli/cli.py:211 - #, python-brace-format - msgid "{prog} will only download packages for the transaction." - msgstr "{prog} ne téléchargera que les paquets pour la transaction." - --#: dnf/cli/cli.py:213 -+#: dnf/cli/cli.py:214 - #, python-brace-format - msgid "" - "{prog} will only download packages, install gpg keys, and check the " -@@ -673,23 +661,23 @@ msgstr "" - "{prog} ne téléchargera que les paquets, installera les clefs GPG et " - "vérifiera la transaction." - --#: dnf/cli/cli.py:217 -+#: dnf/cli/cli.py:218 - msgid "Operation aborted." - msgstr "Opération avortée." - --#: dnf/cli/cli.py:224 -+#: dnf/cli/cli.py:225 - msgid "Downloading Packages:" - msgstr "Téléchargement des paquets :" - --#: dnf/cli/cli.py:230 -+#: dnf/cli/cli.py:231 - msgid "Error downloading packages:" - msgstr "Erreur de téléchargement des paquets :" - --#: dnf/cli/cli.py:258 -+#: dnf/cli/cli.py:263 - msgid "Transaction failed" - msgstr "La transaction a échoué" - --#: dnf/cli/cli.py:281 -+#: dnf/cli/cli.py:286 - msgid "" - "Refusing to automatically import keys when running unattended.\n" - "Use \"-y\" to override." -@@ -697,91 +685,70 @@ msgstr "" - "Refus de l’importation automatique des clés lors d’une exécution sans surveillance.\n" - "Utilisez l’option « -y » pour passer outre." - --#: dnf/cli/cli.py:331 -+#: dnf/cli/cli.py:336 - msgid "Changelogs for {}" - msgstr "Changements pour {}" - --#: dnf/cli/cli.py:364 dnf/cli/cli.py:505 dnf/cli/cli.py:511 -+#: dnf/cli/cli.py:369 dnf/cli/cli.py:510 dnf/cli/cli.py:516 - msgid "Obsoleting Packages" - msgstr "Passage de paquets en obsolètes" - --#: dnf/cli/cli.py:393 -+#: dnf/cli/cli.py:398 - msgid "No packages marked for distribution synchronization." - msgstr "Aucun paquet marqué pour la synchronisation de la distribution." - --#: dnf/cli/cli.py:428 -+#: dnf/cli/cli.py:424 dnf/cli/commands/group.py:395 -+#, python-format -+msgid "No package %s available." -+msgstr "Aucun paquet %s n’est disponible." -+ -+#: dnf/cli/cli.py:433 - msgid "No packages marked for downgrade." - msgstr "Aucun paquet n’a été marqué pour passer à une version antérieure." - --#: dnf/cli/cli.py:479 -+#: dnf/cli/cli.py:484 - msgid "Installed Packages" - msgstr "Paquets installés" - --#: dnf/cli/cli.py:487 -+#: dnf/cli/cli.py:492 - msgid "Available Packages" - msgstr "Paquets disponibles" - --#: dnf/cli/cli.py:491 -+#: dnf/cli/cli.py:496 - msgid "Autoremove Packages" - msgstr "Supprime des paquets automatiquement" - --#: dnf/cli/cli.py:493 -+#: dnf/cli/cli.py:498 - msgid "Extra Packages" - msgstr "Paquets supplémentaires" - --#: dnf/cli/cli.py:497 -+#: dnf/cli/cli.py:502 - msgid "Available Upgrades" - msgstr "Mises à jour disponibles" - --#: dnf/cli/cli.py:513 -+#: dnf/cli/cli.py:518 - msgid "Recently Added Packages" - msgstr "Paquets récemment ajoutés" - --#: dnf/cli/cli.py:518 -+#: dnf/cli/cli.py:522 - msgid "No matching Packages to list" - msgstr "Aucun paquet correspondant à lister" - --#: dnf/cli/cli.py:599 -+#: dnf/cli/cli.py:603 - msgid "No Matches found" - msgstr "Aucune correspondance trouvée" - --#: dnf/cli/cli.py:609 --msgid "No transaction ID given" --msgstr "Aucun identifiant de transaction n’a été fourni" -- --#: dnf/cli/cli.py:614 --msgid "Not found given transaction ID" --msgstr "L’identifiant de transaction fourni est introuvable" -- --#: dnf/cli/cli.py:623 --msgid "Found more than one transaction ID!" --msgstr "Plus d’un identifiant de transaction ont été trouvés !" -- --#: dnf/cli/cli.py:640 --#, python-format --msgid "Transaction history is incomplete, before %u." --msgstr "L’historique des transactions est incomplet, avant %u." -- --#: dnf/cli/cli.py:642 --#, python-format --msgid "Transaction history is incomplete, after %u." --msgstr "L’historique des transactions est incomplet, après %u." -- --#: dnf/cli/cli.py:689 --msgid "Undoing transaction {}, from {}" --msgstr "Révocation de lla transaction {}, de {}" -- --#: dnf/cli/cli.py:769 dnf/cli/commands/shell.py:237 -+#: dnf/cli/cli.py:670 dnf/cli/commands/shell.py:237 - #, python-format - msgid "Unknown repo: '%s'" - msgstr "Dépôt inconnu : « %s »" - --#: dnf/cli/cli.py:783 -+#: dnf/cli/cli.py:684 - #, python-format - msgid "No repository match: %s" - msgstr "Aucun dépôt ne correspond à %s" - --#: dnf/cli/cli.py:817 -+#: dnf/cli/cli.py:718 - msgid "" - "This command has to be run with superuser privileges (under the root user on" - " most systems)." -@@ -789,12 +756,12 @@ msgstr "" - "Cette commande doit être exécutée avec les privilèges super-utilisateur " - "(sous l’utilisateur root sur la plupart des systèmes)." - --#: dnf/cli/cli.py:847 -+#: dnf/cli/cli.py:748 - #, python-format - msgid "No such command: %s. Please use %s --help" - msgstr "Aucune commande telle que : %s. Veuillez utiliser %s --help" - --#: dnf/cli/cli.py:850 -+#: dnf/cli/cli.py:751 - #, python-format, python-brace-format - msgid "" - "It could be a {PROG} plugin command, try: \"{prog} install 'dnf-" -@@ -803,7 +770,7 @@ msgstr "" - "Cela est peut-être une commande d’un module supplémentaire de {PROG}, " - "essayez : « {prog} install 'dnf-command(%s)' »" - --#: dnf/cli/cli.py:854 -+#: dnf/cli/cli.py:755 - #, python-brace-format - msgid "" - "It could be a {prog} plugin command, but loading of plugins is currently " -@@ -812,7 +779,7 @@ msgstr "" - "Cela est peut-être une commande d’un module supplémentaire de {prog}, mais " - "le chargement de modules supplémentaires est actuellement désactivé." - --#: dnf/cli/cli.py:912 -+#: dnf/cli/cli.py:813 - msgid "" - "--destdir or --downloaddir must be used with --downloadonly or download or " - "system-upgrade command." -@@ -820,7 +787,7 @@ msgstr "" - "--destdir ou --downloaddir doit être utilisé avec la commande --downloadonly" - " ou download ou system-upgrade command." - --#: dnf/cli/cli.py:918 -+#: dnf/cli/cli.py:819 - msgid "" - "--enable, --set-enabled and --disable, --set-disabled must be used with " - "config-manager command." -@@ -828,7 +795,7 @@ msgstr "" - "--enable, --set-enabled et --disable, --set-disabled doit être utilisé avec " - "la commande config-manager." - --#: dnf/cli/cli.py:1000 -+#: dnf/cli/cli.py:901 - msgid "" - "Warning: Enforcing GPG signature check globally as per active RPM security " - "policy (see 'gpgcheck' in dnf.conf(5) for how to squelch this message)" -@@ -837,11 +804,11 @@ msgstr "" - "politique de sécurité RPM active (voir « gpgcheck » dans dnf.conf(5) pour " - "savoir comment interpréter ce message)" - --#: dnf/cli/cli.py:1020 -+#: dnf/cli/cli.py:921 - msgid "Config file \"{}\" does not exist" - msgstr "Le fichier de configuration \"{}\" n’existe pas" - --#: dnf/cli/cli.py:1040 -+#: dnf/cli/cli.py:941 - msgid "" - "Unable to detect release version (use '--releasever' to specify release " - "version)" -@@ -849,28 +816,28 @@ msgstr "" - "Impossible de détecter le numéro de version (utilisez « --releasever » pour " - "spécifier une version)" - --#: dnf/cli/cli.py:1127 dnf/cli/commands/repoquery.py:471 -+#: dnf/cli/cli.py:1028 dnf/cli/commands/repoquery.py:471 - msgid "argument {}: not allowed with argument {}" - msgstr "paramètre {} : non autorisé avec le paramètre {}" - --#: dnf/cli/cli.py:1134 -+#: dnf/cli/cli.py:1035 - #, python-format - msgid "Command \"%s\" already defined" - msgstr "Commande « %s » déjà définie" - --#: dnf/cli/cli.py:1154 -+#: dnf/cli/cli.py:1055 - msgid "Excludes in dnf.conf: " - msgstr "Exclut dans dnf.conf : " - --#: dnf/cli/cli.py:1157 -+#: dnf/cli/cli.py:1058 - msgid "Includes in dnf.conf: " - msgstr "Inclut dans dnf.conf : " - --#: dnf/cli/cli.py:1160 -+#: dnf/cli/cli.py:1061 - msgid "Excludes in repo " - msgstr "Exclut dans dépôt " - --#: dnf/cli/cli.py:1163 -+#: dnf/cli/cli.py:1064 - msgid "Includes in repo " - msgstr "Inclut dans dépôt " - -@@ -929,7 +896,7 @@ msgid "show all packages (default)" - msgstr "affiche tous les paquets (par défaut)" - - #: dnf/cli/commands/__init__.py:171 dnf/cli/commands/__init__.py:743 --#: dnf/cli/commands/module.py:351 -+#: dnf/cli/commands/module.py:373 - msgid "show only available packages" - msgstr "affiche uniquement les paquets disponibles" - -@@ -1260,78 +1227,78 @@ msgstr "affiche ou utilise les informations des groupes" - msgid "No group data available for configured repositories." - msgstr "Aucune donnée sur les groupes disponibles pour les dépôts configurés." - --#: dnf/cli/commands/group.py:129 -+#: dnf/cli/commands/group.py:126 - #, python-format - msgid "Warning: Group %s does not exist." - msgstr "Attention : le groupe %s n’existe pas." - --#: dnf/cli/commands/group.py:170 -+#: dnf/cli/commands/group.py:167 - msgid "Warning: No groups match:" - msgstr "Attention : aucun groupe ne correspond à :" - --#: dnf/cli/commands/group.py:182 dnf/cli/commands/group.py:193 --#: dnf/cli/output.py:1226 -+#: dnf/cli/commands/group.py:179 dnf/cli/commands/group.py:190 -+#: dnf/cli/output.py:1139 - msgid "" - msgstr "" - --#: dnf/cli/commands/group.py:199 -+#: dnf/cli/commands/group.py:196 - msgid "Available Environment Groups:" - msgstr "Groupes d’environnements disponibles :" - --#: dnf/cli/commands/group.py:201 -+#: dnf/cli/commands/group.py:198 - msgid "Installed Environment Groups:" - msgstr "Groupes d’environnements installés :" - --#: dnf/cli/commands/group.py:208 dnf/cli/commands/group.py:294 -+#: dnf/cli/commands/group.py:205 dnf/cli/commands/group.py:291 - msgid "Installed Groups:" - msgstr "Groupes installés :" - --#: dnf/cli/commands/group.py:215 dnf/cli/commands/group.py:301 -+#: dnf/cli/commands/group.py:212 dnf/cli/commands/group.py:298 - msgid "Installed Language Groups:" - msgstr "Groupes de langues installés :" - --#: dnf/cli/commands/group.py:225 dnf/cli/commands/group.py:308 -+#: dnf/cli/commands/group.py:222 dnf/cli/commands/group.py:305 - msgid "Available Groups:" - msgstr "Groupes disponibles :" - --#: dnf/cli/commands/group.py:232 dnf/cli/commands/group.py:315 -+#: dnf/cli/commands/group.py:229 dnf/cli/commands/group.py:312 - msgid "Available Language Groups:" - msgstr "Groupes de langues disponibles :" - --#: dnf/cli/commands/group.py:322 -+#: dnf/cli/commands/group.py:319 - msgid "include optional packages from group" - msgstr "inclure les paquets optionnels du groupe" - --#: dnf/cli/commands/group.py:325 -+#: dnf/cli/commands/group.py:322 - msgid "show also hidden groups" - msgstr "affiche également les groupes cachés" - --#: dnf/cli/commands/group.py:327 -+#: dnf/cli/commands/group.py:324 - msgid "show only installed groups" - msgstr "affiche seulement les groupes installés" - --#: dnf/cli/commands/group.py:329 -+#: dnf/cli/commands/group.py:326 - msgid "show only available groups" - msgstr "affiche uniquement les groupes disponibles" - --#: dnf/cli/commands/group.py:331 -+#: dnf/cli/commands/group.py:328 - msgid "show also ID of groups" - msgstr "affiche également les ID des groupes" - --#: dnf/cli/commands/group.py:333 -+#: dnf/cli/commands/group.py:330 - msgid "available subcommands: {} (default), {}" - msgstr "sous-commandes disponibles : {} (par défaut), {}" - --#: dnf/cli/commands/group.py:337 -+#: dnf/cli/commands/group.py:334 - msgid "argument for group subcommand" - msgstr "paramètre pour la sous-commande group" - --#: dnf/cli/commands/group.py:346 -+#: dnf/cli/commands/group.py:343 - #, python-format - msgid "Invalid groups sub-command, use: %s." - msgstr "Sous-commande de groupes invalide, utilisez : %s." - --#: dnf/cli/commands/group.py:403 -+#: dnf/cli/commands/group.py:398 - msgid "Unable to find a mandatory group package." - msgstr "Impossible de trouver un paquet obligatoire du groupe." - -@@ -1385,16 +1352,16 @@ msgstr "Pas de transaction ou de nom de fichier fourni." - msgid "More than one argument given as transaction file name." - msgstr "Plus d’un argument donné comme nom de fichier de transaction." - --#: dnf/cli/commands/history.py:122 dnf/cli/commands/history.py:126 -+#: dnf/cli/commands/history.py:122 dnf/cli/commands/history.py:130 - msgid "No transaction ID or package name given." - msgstr "Pas d’identifiant de transaction ou de nom de paquet fourni." - --#: dnf/cli/commands/history.py:138 -+#: dnf/cli/commands/history.py:142 - #, python-format - msgid "You don't have access to the history DB: %s" - msgstr "Vous n’avez pas accès à la base de données de l’historique : %s" - --#: dnf/cli/commands/history.py:147 -+#: dnf/cli/commands/history.py:151 - #, python-format - msgid "" - "Cannot undo transaction %s, doing so would result in an inconsistent package" -@@ -1403,7 +1370,7 @@ msgstr "" - "Impossible de défaire la transaction %s ; cela aboutirait à une base de " - "données des paquets incohérente." - --#: dnf/cli/commands/history.py:152 -+#: dnf/cli/commands/history.py:156 - #, python-format - msgid "" - "Cannot rollback transaction %s, doing so would result in an inconsistent " -@@ -1412,7 +1379,34 @@ msgstr "" - "Impossible de défaire la transaction %s ; cela aboutirait à une base de " - "données des paquets incohérente." - --#: dnf/cli/commands/history.py:222 -+#: dnf/cli/commands/history.py:175 -+msgid "No transaction ID given" -+msgstr "Aucun identifiant de transaction n’a été fourni" -+ -+#: dnf/cli/commands/history.py:179 -+#, python-brace-format -+msgid "Transaction ID \"{0}\" not found." -+msgstr "ID de transaction \"{0}\" introuvable." -+ -+#: dnf/cli/commands/history.py:185 -+msgid "Found more than one transaction ID!" -+msgstr "Plus d’un identifiant de transaction ont été trouvés !" -+ -+#: dnf/cli/commands/history.py:203 -+#, python-format -+msgid "Transaction history is incomplete, before %u." -+msgstr "L’historique des transactions est incomplet, avant %u." -+ -+#: dnf/cli/commands/history.py:205 -+#, python-format -+msgid "Transaction history is incomplete, after %u." -+msgstr "L’historique des transactions est incomplet, après %u." -+ -+#: dnf/cli/commands/history.py:256 -+msgid "No packages to list" -+msgstr "Aucun paquet à lister" -+ -+#: dnf/cli/commands/history.py:279 - msgid "" - "Invalid transaction ID range definition '{}'.\n" - "Use '..'." -@@ -1420,7 +1414,7 @@ msgstr "" - "La définition de la plage d’identifiants de transaction est invalide « {} ».\n" - "Utilisez « .. »." - --#: dnf/cli/commands/history.py:226 -+#: dnf/cli/commands/history.py:283 - msgid "" - "Can't convert '{}' to transaction ID.\n" - "Use '', 'last', 'last-'." -@@ -1428,37 +1422,31 @@ msgstr "" - "Impossible de convertir « {} » à ID transaction.\n" - "Utiliser « », « last », « last- »." - --#: dnf/cli/commands/history.py:255 -+#: dnf/cli/commands/history.py:312 - msgid "No transaction which manipulates package '{}' was found." - msgstr "Aucune transaction manipulant le paquet « {} » n’a été trouvée." - --#: dnf/cli/commands/history.py:305 --#, python-brace-format --msgid "Transaction ID \"{id}\" not found." --msgstr "ID de Transaction « {id} » non trouvé." -- --#: dnf/cli/commands/history.py:313 -+#: dnf/cli/commands/history.py:357 - msgid "{} exists, overwrite?" - msgstr "{} existe, l’écraser ?" - --#: dnf/cli/commands/history.py:316 -+#: dnf/cli/commands/history.py:360 - msgid "Not overwriting {}, exiting." - msgstr "{} non écrasé, sortie." - --#: dnf/cli/commands/history.py:323 -+#: dnf/cli/commands/history.py:367 - msgid "Transaction saved to {}." - msgstr "Transaction enregistrée vers {}." - --#: dnf/cli/commands/history.py:326 -+#: dnf/cli/commands/history.py:370 - msgid "Error storing transaction: {}" - msgstr "Erreur lors du stockage de la transaction : {}" - --#: dnf/cli/commands/history.py:350 --msgid "" --"Warning, the following problems occurred while replaying the transaction:" -+#: dnf/cli/commands/history.py:386 -+msgid "Warning, the following problems occurred while running a transaction:" - msgstr "" --"Attention, les problèmes suivants sont survenus lors de la relecture de la " --"transaction :" -+"Attention, les problèmes suivants sont survenus lors de l'exécution d'une " -+"transaction :" - - #: dnf/cli/commands/install.py:47 - msgid "install a package or packages on your system" -@@ -1477,7 +1465,7 @@ msgstr "Impossible de trouver une correspondance" - msgid "Not a valid rpm file path: %s" - msgstr "Chemin du fichier RPM invalide : %s" - --#: dnf/cli/commands/install.py:167 -+#: dnf/cli/commands/install.py:166 - #, python-brace-format - msgid "There are following alternatives for \"{0}\": {1}" - msgstr "Il existe les alternatives suivantes pour \"{0}\" : {1}" -@@ -1522,7 +1510,7 @@ msgid "%s marked as group installed." - msgstr "%s marqué comme étant installé par un groupe." - - #: dnf/cli/commands/mark.py:85 dnf/cli/commands/shell.py:129 --#: dnf/cli/commands/shell.py:237 dnf/cli/commands/shell.py:279 -+#: dnf/cli/commands/shell.py:237 dnf/cli/commands/shell.py:282 - msgid "Error:" - msgstr "Erreur :" - -@@ -1580,42 +1568,46 @@ msgid "Package {} belongs to multiple modules, skipping" - msgstr "Le paquet {} appartient à de multiples modules, ignorer" - - #: dnf/cli/commands/module.py:277 -+msgid "switch a module to a stream and distrosync rpm packages" -+msgstr "passer un module à un flux et à des paquets de rpm de distrosync" -+ -+#: dnf/cli/commands/module.py:299 - msgid "list modular packages" - msgstr "dresser une liste des paquets modulaires" - --#: dnf/cli/commands/module.py:292 -+#: dnf/cli/commands/module.py:314 - msgid "list packages belonging to a module" - msgstr "dresser une liste des paquets appartenant à un module" - --#: dnf/cli/commands/module.py:327 -+#: dnf/cli/commands/module.py:349 - msgid "Interact with Modules." - msgstr "Interagit avec les modules." - --#: dnf/cli/commands/module.py:340 -+#: dnf/cli/commands/module.py:362 - msgid "show only enabled modules" - msgstr "n’affiche que les modules activés" - --#: dnf/cli/commands/module.py:343 -+#: dnf/cli/commands/module.py:365 - msgid "show only disabled modules" - msgstr "n’affiche que les modules désactivés" - --#: dnf/cli/commands/module.py:346 -+#: dnf/cli/commands/module.py:368 - msgid "show only installed modules or packages" - msgstr "affiche uniquement les paquets ou modules installés" - --#: dnf/cli/commands/module.py:349 -+#: dnf/cli/commands/module.py:371 - msgid "show profile content" - msgstr "affiche le contenu du profil" - --#: dnf/cli/commands/module.py:354 -+#: dnf/cli/commands/module.py:376 - msgid "remove all modular packages" - msgstr "Supprimer les paquets modulaires" - --#: dnf/cli/commands/module.py:364 -+#: dnf/cli/commands/module.py:386 - msgid "Module specification" - msgstr "Caractéristique de module" - --#: dnf/cli/commands/module.py:386 -+#: dnf/cli/commands/module.py:408 - msgid "{} {} {}: too few arguments" - msgstr "{} {} {} : trop peu de paramètres" - -@@ -2133,22 +2125,22 @@ msgstr "MOTCLEF" - msgid "Keyword to search for" - msgstr "Mot-clef à chercher" - --#: dnf/cli/commands/search.py:61 dnf/cli/output.py:506 -+#: dnf/cli/commands/search.py:61 dnf/cli/output.py:460 - msgctxt "long" - msgid "Name" - msgstr "Nom" - --#: dnf/cli/commands/search.py:62 dnf/cli/output.py:559 -+#: dnf/cli/commands/search.py:62 dnf/cli/output.py:513 - msgctxt "long" - msgid "Summary" - msgstr "Résumé" - --#: dnf/cli/commands/search.py:63 dnf/cli/output.py:569 -+#: dnf/cli/commands/search.py:63 dnf/cli/output.py:523 - msgctxt "long" - msgid "Description" - msgstr "Description" - --#: dnf/cli/commands/search.py:64 dnf/cli/output.py:562 -+#: dnf/cli/commands/search.py:64 dnf/cli/output.py:516 - msgid "URL" - msgstr "URL" - -@@ -2291,16 +2283,16 @@ msgstr "" - "run résoud et exécute l’ensemble de transactions\n" - "exit (ou quit) quitte l’interpréteur de commandes" - --#: dnf/cli/commands/shell.py:259 -+#: dnf/cli/commands/shell.py:262 - #, python-format - msgid "Error: Cannot open %s for reading" - msgstr "Erreur : %s n’a pu être ouvert pour lecture" - --#: dnf/cli/commands/shell.py:281 dnf/cli/main.py:187 -+#: dnf/cli/commands/shell.py:284 dnf/cli/main.py:187 - msgid "Complete!" - msgstr "Terminé !" - --#: dnf/cli/commands/shell.py:291 -+#: dnf/cli/commands/shell.py:294 - msgid "Leaving Shell" - msgstr "Abandon de l’interpréteur de commandes" - -@@ -2497,8 +2489,8 @@ msgstr "Criticité" - msgid "Files" - msgstr "Fichiers" - --#: dnf/cli/commands/updateinfo.py:359 dnf/cli/output.py:1499 --#: dnf/cli/output.py:1772 dnf/cli/output.py:1774 -+#: dnf/cli/commands/updateinfo.py:359 dnf/cli/output.py:1652 -+#: dnf/cli/output.py:1654 dnf/util.py:591 - msgid "Installed" - msgstr "Installé" - -@@ -2862,13 +2854,13 @@ msgstr "Impossible d’encoder l’argument « %s » : %s" - #. Translators: This is abbreviated 'Name'. Should be no longer - #. than 12 characters. You can use the full version if it is short - #. enough in your language. --#: dnf/cli/output.py:505 -+#: dnf/cli/output.py:459 - msgctxt "short" - msgid "Name" - msgstr "Nom" - - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:511 -+#: dnf/cli/output.py:465 - msgid "Epoch" - msgstr "Époque" - -@@ -2876,38 +2868,38 @@ msgstr "Époque" - #. use the full (unabbreviated) term 'Version' if you think that - #. the translation to your language is not too long and will - #. always fit to limited space. --#: dnf/cli/output.py:512 dnf/cli/output.py:1335 -+#: dnf/cli/output.py:466 dnf/cli/output.py:1248 - msgctxt "short" - msgid "Version" - msgstr "Version" - - #. Translators: This is the full (unabbreviated) term 'Version'. --#: dnf/cli/output.py:513 dnf/cli/output.py:1337 -+#: dnf/cli/output.py:467 dnf/cli/output.py:1250 - msgctxt "long" - msgid "Version" - msgstr "Version" - - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:516 -+#: dnf/cli/output.py:470 - msgid "Release" - msgstr "Publication" - - #. Translators: This is abbreviated 'Architecture', used when - #. we have not enough space to display the full word. --#: dnf/cli/output.py:517 dnf/cli/output.py:1326 -+#: dnf/cli/output.py:471 dnf/cli/output.py:1239 - msgctxt "short" - msgid "Arch" - msgstr "Architecture" - - #. Translators: This is the full word 'Architecture', used when - #. we have enough space. --#: dnf/cli/output.py:518 dnf/cli/output.py:1329 -+#: dnf/cli/output.py:472 dnf/cli/output.py:1242 - msgctxt "long" - msgid "Architecture" - msgstr "Architecture" - - #. Translators: This is the full (unabbreviated) term 'Size'. --#: dnf/cli/output.py:520 dnf/cli/output.py:1352 -+#: dnf/cli/output.py:474 dnf/cli/output.py:1265 - msgctxt "long" - msgid "Size" - msgstr "Taille" -@@ -2916,32 +2908,32 @@ msgstr "Taille" - #. not be longer than 5 characters. If the term 'Size' in your - #. language is not longer than 5 characters then you can use it - #. unabbreviated. --#: dnf/cli/output.py:520 dnf/cli/output.py:1350 -+#: dnf/cli/output.py:474 dnf/cli/output.py:1263 - msgctxt "short" - msgid "Size" - msgstr "Taille" - - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:524 -+#: dnf/cli/output.py:478 - msgid "Source" - msgstr "Source" - - #. Translators: This is abbreviated 'Repository', used when - #. we have not enough space to display the full word. --#: dnf/cli/output.py:525 dnf/cli/output.py:1341 -+#: dnf/cli/output.py:479 dnf/cli/output.py:1254 - msgctxt "short" - msgid "Repo" - msgstr "Dépôt" - - #. Translators: This is the full word 'Repository', used when - #. we have enough space. --#: dnf/cli/output.py:526 dnf/cli/output.py:1344 -+#: dnf/cli/output.py:480 dnf/cli/output.py:1257 - msgctxt "long" - msgid "Repository" - msgstr "Dépôt" - - #. Translators: This message should be no longer than 12 chars. --#: dnf/cli/output.py:533 -+#: dnf/cli/output.py:487 - msgid "From repo" - msgstr "Depuis le dépôt" - -@@ -2949,316 +2941,312 @@ msgstr "Depuis le dépôt" - #. print(_("Committer : %s") % ucd(pkg.committer)) - #. print(_("Committime : %s") % time.ctime(pkg.committime)) - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:539 -+#: dnf/cli/output.py:493 - msgid "Packager" - msgstr "Empaqueteur" - - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:541 -+#: dnf/cli/output.py:495 - msgid "Buildtime" - msgstr "Date de compilation" - - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:545 -+#: dnf/cli/output.py:499 - msgid "Install time" - msgstr "Date d’installation" - - #. Translators: This message should be no longer than 12 chars. --#: dnf/cli/output.py:554 -+#: dnf/cli/output.py:508 - msgid "Installed by" - msgstr "Installé par" - - #. Translators: This is abbreviated 'Summary'. Should be no longer - #. than 12 characters. You can use the full version if it is short - #. enough in your language. --#: dnf/cli/output.py:558 -+#: dnf/cli/output.py:512 - msgctxt "short" - msgid "Summary" - msgstr "Résumé" - - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:564 -+#: dnf/cli/output.py:518 - msgid "License" - msgstr "Licence" - - #. Translators: This is abbreviated 'Description'. Should be no longer - #. than 12 characters. You can use the full version if it is short - #. enough in your language. --#: dnf/cli/output.py:568 -+#: dnf/cli/output.py:522 - msgctxt "short" - msgid "Description" - msgstr "Description" - --#: dnf/cli/output.py:695 --msgid "No packages to list" --msgstr "Aucun paquet à lister" -- --#: dnf/cli/output.py:706 -+#: dnf/cli/output.py:650 - msgid "y" - msgstr "o" - --#: dnf/cli/output.py:706 -+#: dnf/cli/output.py:650 - msgid "yes" - msgstr "oui" - --#: dnf/cli/output.py:707 -+#: dnf/cli/output.py:651 - msgid "n" - msgstr "n" - --#: dnf/cli/output.py:707 -+#: dnf/cli/output.py:651 - msgid "no" - msgstr "non" - --#: dnf/cli/output.py:711 -+#: dnf/cli/output.py:655 - msgid "Is this ok [y/N]: " - msgstr "Voulez-vous continuer ? [o/N] : " - --#: dnf/cli/output.py:715 -+#: dnf/cli/output.py:659 - msgid "Is this ok [Y/n]: " - msgstr "Voulez-vous continuer ? [O/n] : " - --#: dnf/cli/output.py:795 -+#: dnf/cli/output.py:739 - #, python-format - msgid "Group: %s" - msgstr "Groupe : %s" - --#: dnf/cli/output.py:799 -+#: dnf/cli/output.py:743 - #, python-format - msgid " Group-Id: %s" - msgstr " Identifiant du groupe : %s" - --#: dnf/cli/output.py:801 dnf/cli/output.py:840 -+#: dnf/cli/output.py:745 dnf/cli/output.py:784 - #, python-format - msgid " Description: %s" - msgstr " Description : %s" - --#: dnf/cli/output.py:803 -+#: dnf/cli/output.py:747 - #, python-format - msgid " Language: %s" - msgstr " Langue : %s" - --#: dnf/cli/output.py:806 -+#: dnf/cli/output.py:750 - msgid " Mandatory Packages:" - msgstr " Paquets obligatoires :" - --#: dnf/cli/output.py:807 -+#: dnf/cli/output.py:751 - msgid " Default Packages:" - msgstr " Paquets par défaut :" - --#: dnf/cli/output.py:808 -+#: dnf/cli/output.py:752 - msgid " Optional Packages:" - msgstr " Paquets optionnels :" - --#: dnf/cli/output.py:809 -+#: dnf/cli/output.py:753 - msgid " Conditional Packages:" - msgstr " Paquets conditionnels :" - --#: dnf/cli/output.py:834 -+#: dnf/cli/output.py:778 - #, python-format - msgid "Environment Group: %s" - msgstr "Groupe d’environnement : %s" - --#: dnf/cli/output.py:837 -+#: dnf/cli/output.py:781 - #, python-format - msgid " Environment-Id: %s" - msgstr " Identifiant d’environnement : %s" - --#: dnf/cli/output.py:843 -+#: dnf/cli/output.py:787 - msgid " Mandatory Groups:" - msgstr " Groupes obligatoires :" - --#: dnf/cli/output.py:844 -+#: dnf/cli/output.py:788 - msgid " Optional Groups:" - msgstr " Groupes optionnels :" - --#: dnf/cli/output.py:865 -+#: dnf/cli/output.py:809 - msgid "Matched from:" - msgstr "Correspondances trouvées dans  :" - --#: dnf/cli/output.py:879 -+#: dnf/cli/output.py:823 - #, python-format - msgid "Filename : %s" - msgstr "Nom de fichier : %s" - --#: dnf/cli/output.py:904 -+#: dnf/cli/output.py:848 - #, python-format - msgid "Repo : %s" - msgstr "Dépôt   : %s" - --#: dnf/cli/output.py:913 -+#: dnf/cli/output.py:857 - msgid "Description : " - msgstr "Description  : " - --#: dnf/cli/output.py:917 -+#: dnf/cli/output.py:861 - #, python-format - msgid "URL : %s" - msgstr "URL : %s" - --#: dnf/cli/output.py:921 -+#: dnf/cli/output.py:865 - #, python-format - msgid "License : %s" - msgstr "Licence  : %s" - --#: dnf/cli/output.py:927 -+#: dnf/cli/output.py:871 - #, python-format - msgid "Provide : %s" - msgstr "Provide : %s" - --#: dnf/cli/output.py:947 -+#: dnf/cli/output.py:891 - #, python-format - msgid "Other : %s" - msgstr "Autre : %s" - --#: dnf/cli/output.py:996 -+#: dnf/cli/output.py:940 - msgid "There was an error calculating total download size" - msgstr "" - "Une erreur est survenue pendant le calcul de la taille totale des " - "téléchargements" - --#: dnf/cli/output.py:1002 -+#: dnf/cli/output.py:946 - #, python-format - msgid "Total size: %s" - msgstr "Taille totale  : %s" - --#: dnf/cli/output.py:1005 -+#: dnf/cli/output.py:949 - #, python-format - msgid "Total download size: %s" - msgstr "Taille totale des téléchargements : %s" - --#: dnf/cli/output.py:1008 -+#: dnf/cli/output.py:952 - #, python-format - msgid "Installed size: %s" - msgstr "Taille des paquets installés : %s" - --#: dnf/cli/output.py:1026 -+#: dnf/cli/output.py:970 - msgid "There was an error calculating installed size" - msgstr "" - "Une erreur est survenue pendant le calcul de la taille des paquets " - "installées" - --#: dnf/cli/output.py:1030 -+#: dnf/cli/output.py:974 - #, python-format - msgid "Freed space: %s" - msgstr "Espace libéré : %s" - --#: dnf/cli/output.py:1039 -+#: dnf/cli/output.py:983 - msgid "Marking packages as installed by the group:" - msgstr "Marquage des paquets installés par le groupe :" - --#: dnf/cli/output.py:1046 -+#: dnf/cli/output.py:990 - msgid "Marking packages as removed by the group:" - msgstr "Marquage des paquets supprimés par le groupe :" - --#: dnf/cli/output.py:1056 -+#: dnf/cli/output.py:1000 - msgid "Group" - msgstr "Groupe" - --#: dnf/cli/output.py:1056 -+#: dnf/cli/output.py:1000 - msgid "Packages" - msgstr "Paquets" - --#: dnf/cli/output.py:1133 -+#: dnf/cli/output.py:1046 - msgid "Installing group/module packages" - msgstr "Installation des paquets du groupe/module" - --#: dnf/cli/output.py:1134 -+#: dnf/cli/output.py:1047 - msgid "Installing group packages" - msgstr "Installation du groupe de paquets" - - #. TRANSLATORS: This is for a list of packages to be installed. --#: dnf/cli/output.py:1138 -+#: dnf/cli/output.py:1051 - msgctxt "summary" - msgid "Installing" - msgstr "Installation" - - #. TRANSLATORS: This is for a list of packages to be upgraded. --#: dnf/cli/output.py:1140 -+#: dnf/cli/output.py:1053 - msgctxt "summary" - msgid "Upgrading" - msgstr "Mise à jour" - - #. TRANSLATORS: This is for a list of packages to be reinstalled. --#: dnf/cli/output.py:1142 -+#: dnf/cli/output.py:1055 - msgctxt "summary" - msgid "Reinstalling" - msgstr "Réinstallation" - --#: dnf/cli/output.py:1144 -+#: dnf/cli/output.py:1057 - msgid "Installing dependencies" - msgstr "Installation des dépendances" - --#: dnf/cli/output.py:1145 -+#: dnf/cli/output.py:1058 - msgid "Installing weak dependencies" - msgstr "Installation des dépendances faibles" - - #. TRANSLATORS: This is for a list of packages to be removed. --#: dnf/cli/output.py:1147 -+#: dnf/cli/output.py:1060 - msgid "Removing" - msgstr "Suppression" - --#: dnf/cli/output.py:1148 -+#: dnf/cli/output.py:1061 - msgid "Removing dependent packages" - msgstr "Supprimer des paquets dépendants" - --#: dnf/cli/output.py:1149 -+#: dnf/cli/output.py:1062 - msgid "Removing unused dependencies" - msgstr "Suppression des dépendances inutilisées" - - #. TRANSLATORS: This is for a list of packages to be downgraded. --#: dnf/cli/output.py:1151 -+#: dnf/cli/output.py:1064 - msgctxt "summary" - msgid "Downgrading" - msgstr "Rétrogradation" - --#: dnf/cli/output.py:1176 -+#: dnf/cli/output.py:1089 - msgid "Installing module profiles" - msgstr "Installation des profils de module" - --#: dnf/cli/output.py:1185 -+#: dnf/cli/output.py:1098 - msgid "Disabling module profiles" - msgstr "Désactivation des profils de module" - --#: dnf/cli/output.py:1194 -+#: dnf/cli/output.py:1107 - msgid "Enabling module streams" - msgstr "Activation des flux de modules" - --#: dnf/cli/output.py:1202 -+#: dnf/cli/output.py:1115 - msgid "Switching module streams" - msgstr "Basculement des flux de modules" - --#: dnf/cli/output.py:1210 -+#: dnf/cli/output.py:1123 - msgid "Disabling modules" - msgstr "Désactivation des modules" - --#: dnf/cli/output.py:1218 -+#: dnf/cli/output.py:1131 - msgid "Resetting modules" - msgstr "Réinitialisation des modules" - --#: dnf/cli/output.py:1230 -+#: dnf/cli/output.py:1143 - msgid "Installing Environment Groups" - msgstr "Installation des groupes d’environnement" - --#: dnf/cli/output.py:1237 -+#: dnf/cli/output.py:1150 - msgid "Upgrading Environment Groups" - msgstr "Mise à niveau des groupes d’environnement" - --#: dnf/cli/output.py:1244 -+#: dnf/cli/output.py:1157 - msgid "Removing Environment Groups" - msgstr "Suppression des groupes d’environnement" - --#: dnf/cli/output.py:1251 -+#: dnf/cli/output.py:1164 - msgid "Installing Groups" - msgstr "Installation des groupes" - --#: dnf/cli/output.py:1258 -+#: dnf/cli/output.py:1171 - msgid "Upgrading Groups" - msgstr "Mise à niveau des groupes" - --#: dnf/cli/output.py:1265 -+#: dnf/cli/output.py:1178 - msgid "Removing Groups" - msgstr "Suppression des groupes" - --#: dnf/cli/output.py:1281 -+#: dnf/cli/output.py:1194 - #, python-format - msgid "" - "Skipping packages with conflicts:\n" -@@ -3267,12 +3255,12 @@ msgstr "" - "Ignorer les paquets en conflit :\n" - "(ajouter « %s » à la ligne de commande pour forcer leur mise à niveau)" - --#: dnf/cli/output.py:1291 -+#: dnf/cli/output.py:1204 - #, python-format - msgid "Skipping packages with broken dependencies%s" - msgstr "Ignorer les paquets ayant des dépendances cassées %s" - --#: dnf/cli/output.py:1295 -+#: dnf/cli/output.py:1208 - msgid " or part of a group" - msgstr " ou qui fait parti d’un groupe" - -@@ -3280,22 +3268,22 @@ msgstr " ou qui fait parti d’un groupe" - #. use the full (unabbreviated) term 'Package' if you think that - #. the translation to your language is not too long and will - #. always fit to limited space. --#: dnf/cli/output.py:1320 -+#: dnf/cli/output.py:1233 - msgctxt "short" - msgid "Package" - msgstr "Paquet" - - #. Translators: This is the full (unabbreviated) term 'Package'. --#: dnf/cli/output.py:1322 -+#: dnf/cli/output.py:1235 - msgctxt "long" - msgid "Package" - msgstr "Paquet" - --#: dnf/cli/output.py:1371 -+#: dnf/cli/output.py:1284 - msgid "replacing" - msgstr "remplacement" - --#: dnf/cli/output.py:1378 -+#: dnf/cli/output.py:1291 - #, python-format - msgid "" - "\n" -@@ -3307,289 +3295,273 @@ msgstr "" - "%s\n" - - #. TODO: remove --#: dnf/cli/output.py:1383 dnf/cli/output.py:1932 dnf/cli/output.py:1933 -+#: dnf/cli/output.py:1296 dnf/cli/output.py:1812 dnf/cli/output.py:1813 - msgid "Install" - msgstr "Installer" - --#: dnf/cli/output.py:1387 dnf/cli/output.py:1941 -+#: dnf/cli/output.py:1300 dnf/cli/output.py:1821 - msgid "Upgrade" - msgstr "Mettre à niveau" - --#: dnf/cli/output.py:1388 -+#: dnf/cli/output.py:1301 - msgid "Remove" - msgstr "Supprimer" - --#: dnf/cli/output.py:1390 dnf/cli/output.py:1939 -+#: dnf/cli/output.py:1303 dnf/cli/output.py:1819 - msgid "Downgrade" - msgstr "Retrograder" - --#: dnf/cli/output.py:1391 -+#: dnf/cli/output.py:1304 - msgid "Skip" - msgstr "Ignorer" - --#: dnf/cli/output.py:1400 dnf/cli/output.py:1416 -+#: dnf/cli/output.py:1313 dnf/cli/output.py:1329 - msgid "Package" - msgid_plural "Packages" - msgstr[0] "Paquet" - msgstr[1] "Paquets" - --#: dnf/cli/output.py:1418 -+#: dnf/cli/output.py:1331 - msgid "Dependent package" - msgid_plural "Dependent packages" - msgstr[0] "Paquet dépendant" - msgstr[1] "Paquets dépendants" - --#: dnf/cli/output.py:1497 dnf/cli/output.py:1773 dnf/cli/output.py:1942 --msgid "Upgraded" --msgstr "Mis à niveau" -- --#: dnf/cli/output.py:1498 dnf/cli/output.py:1773 dnf/cli/output.py:1940 --msgid "Downgraded" --msgstr "Rétrogradé" -- --#: dnf/cli/output.py:1503 --msgid "Reinstalled" --msgstr "Réinstallé" -- --#: dnf/cli/output.py:1504 --msgid "Skipped" --msgstr "Ignoré" -- --#: dnf/cli/output.py:1505 --msgid "Removed" --msgstr "Supprimé" -- --#: dnf/cli/output.py:1508 --msgid "Failed" --msgstr "Échec" -- --#: dnf/cli/output.py:1559 -+#: dnf/cli/output.py:1439 - msgid "Total" - msgstr "Total" - --#: dnf/cli/output.py:1587 -+#: dnf/cli/output.py:1467 - msgid "" - msgstr "" - --#: dnf/cli/output.py:1588 -+#: dnf/cli/output.py:1468 - msgid "System" - msgstr "Système" - --#: dnf/cli/output.py:1638 -+#: dnf/cli/output.py:1518 - msgid "Command line" - msgstr "Ligne de commande" - - #. TRANSLATORS: user names who executed transaction in history command output --#: dnf/cli/output.py:1649 -+#: dnf/cli/output.py:1529 - msgid "User name" - msgstr "Nom d’utilisateur" - --#: dnf/cli/output.py:1651 -+#: dnf/cli/output.py:1531 - msgid "ID" - msgstr "ID" - --#: dnf/cli/output.py:1653 -+#: dnf/cli/output.py:1533 - msgid "Date and time" - msgstr "Date et heure" - --#: dnf/cli/output.py:1654 -+#: dnf/cli/output.py:1534 - msgid "Action(s)" - msgstr "Action(s)" - --#: dnf/cli/output.py:1655 -+#: dnf/cli/output.py:1535 - msgid "Altered" - msgstr "Modifié" - --#: dnf/cli/output.py:1698 -+#: dnf/cli/output.py:1578 - msgid "No transactions" - msgstr "Pas de transaction" - --#: dnf/cli/output.py:1699 dnf/cli/output.py:1715 -+#: dnf/cli/output.py:1579 dnf/cli/output.py:1595 - msgid "Failed history info" - msgstr "Infos sur l’historique des échecs" - --#: dnf/cli/output.py:1714 -+#: dnf/cli/output.py:1594 - msgid "No transaction ID, or package, given" - msgstr "Pas de paquet ou d’identifiant de transaction fourni" - --#: dnf/cli/output.py:1772 -+#: dnf/cli/output.py:1652 - msgid "Erased" - msgstr "Effacé" - --#: dnf/cli/output.py:1774 -+#: dnf/cli/output.py:1653 dnf/cli/output.py:1820 dnf/util.py:590 -+msgid "Downgraded" -+msgstr "Rétrogradé" -+ -+#: dnf/cli/output.py:1653 dnf/cli/output.py:1822 dnf/util.py:589 -+msgid "Upgraded" -+msgstr "Mis à niveau" -+ -+#: dnf/cli/output.py:1654 - msgid "Not installed" - msgstr "Non installé" - --#: dnf/cli/output.py:1775 -+#: dnf/cli/output.py:1655 - msgid "Newer" - msgstr "Plus récent" - --#: dnf/cli/output.py:1775 -+#: dnf/cli/output.py:1655 - msgid "Older" - msgstr "Plus ancien" - --#: dnf/cli/output.py:1823 dnf/cli/output.py:1825 -+#: dnf/cli/output.py:1703 dnf/cli/output.py:1705 - msgid "Transaction ID :" - msgstr "Identifiant de transaction :" - --#: dnf/cli/output.py:1828 -+#: dnf/cli/output.py:1708 - msgid "Begin time :" - msgstr "Temps de début :" - --#: dnf/cli/output.py:1831 dnf/cli/output.py:1833 -+#: dnf/cli/output.py:1711 dnf/cli/output.py:1713 - msgid "Begin rpmdb :" - msgstr "Début de RPMDB :" - --#: dnf/cli/output.py:1839 -+#: dnf/cli/output.py:1719 - #, python-format - msgid "(%u seconds)" - msgstr "(%u secondes)" - --#: dnf/cli/output.py:1841 -+#: dnf/cli/output.py:1721 - #, python-format - msgid "(%u minutes)" - msgstr "(%u minutes)" - --#: dnf/cli/output.py:1843 -+#: dnf/cli/output.py:1723 - #, python-format - msgid "(%u hours)" - msgstr "(%u heures)" - --#: dnf/cli/output.py:1845 -+#: dnf/cli/output.py:1725 - #, python-format - msgid "(%u days)" - msgstr "(%u jours)" - --#: dnf/cli/output.py:1846 -+#: dnf/cli/output.py:1726 - msgid "End time :" - msgstr "Temps de fin :" - --#: dnf/cli/output.py:1849 dnf/cli/output.py:1851 -+#: dnf/cli/output.py:1729 dnf/cli/output.py:1731 - msgid "End rpmdb :" - msgstr "Fin de RPMDB :" - --#: dnf/cli/output.py:1858 dnf/cli/output.py:1860 -+#: dnf/cli/output.py:1738 dnf/cli/output.py:1740 - msgid "User :" - msgstr "Utilisateur :" - --#: dnf/cli/output.py:1864 dnf/cli/output.py:1871 -+#: dnf/cli/output.py:1744 dnf/cli/output.py:1751 - msgid "Aborted" - msgstr "Avorté" - --#: dnf/cli/output.py:1864 dnf/cli/output.py:1867 dnf/cli/output.py:1869 --#: dnf/cli/output.py:1871 dnf/cli/output.py:1873 dnf/cli/output.py:1875 -+#: dnf/cli/output.py:1744 dnf/cli/output.py:1747 dnf/cli/output.py:1749 -+#: dnf/cli/output.py:1751 dnf/cli/output.py:1753 dnf/cli/output.py:1755 - msgid "Return-Code :" - msgstr "Code de retour :" - --#: dnf/cli/output.py:1867 dnf/cli/output.py:1875 -+#: dnf/cli/output.py:1747 dnf/cli/output.py:1755 - msgid "Success" - msgstr "Réussi" - --#: dnf/cli/output.py:1869 -+#: dnf/cli/output.py:1749 - msgid "Failures:" - msgstr "Échecs :" - --#: dnf/cli/output.py:1873 -+#: dnf/cli/output.py:1753 - msgid "Failure:" - msgstr "Échec :" - --#: dnf/cli/output.py:1883 dnf/cli/output.py:1885 -+#: dnf/cli/output.py:1763 dnf/cli/output.py:1765 - msgid "Releasever :" - msgstr "Releasever :" - --#: dnf/cli/output.py:1890 dnf/cli/output.py:1892 -+#: dnf/cli/output.py:1770 dnf/cli/output.py:1772 - msgid "Command Line :" - msgstr "Ligne de commande :" - --#: dnf/cli/output.py:1897 dnf/cli/output.py:1899 -+#: dnf/cli/output.py:1777 dnf/cli/output.py:1779 - msgid "Comment :" - msgstr "Commentaire :" - --#: dnf/cli/output.py:1903 -+#: dnf/cli/output.py:1783 - msgid "Transaction performed with:" - msgstr "Transaction effectuée avec :" - --#: dnf/cli/output.py:1912 -+#: dnf/cli/output.py:1792 - msgid "Packages Altered:" - msgstr "Paquets modifiés :" - --#: dnf/cli/output.py:1918 -+#: dnf/cli/output.py:1798 - msgid "Scriptlet output:" - msgstr "Sortie du mini script :" - --#: dnf/cli/output.py:1925 -+#: dnf/cli/output.py:1805 - msgid "Errors:" - msgstr "Erreurs :" - --#: dnf/cli/output.py:1934 -+#: dnf/cli/output.py:1814 - msgid "Dep-Install" - msgstr "Installation des dépendances" - --#: dnf/cli/output.py:1935 -+#: dnf/cli/output.py:1815 - msgid "Obsoleted" - msgstr "Rendu obsolète" - --#: dnf/cli/output.py:1936 dnf/transaction.py:84 dnf/transaction.py:85 -+#: dnf/cli/output.py:1816 dnf/transaction.py:84 dnf/transaction.py:85 - msgid "Obsoleting" - msgstr "Rend obsolète" - --#: dnf/cli/output.py:1937 -+#: dnf/cli/output.py:1817 - msgid "Erase" - msgstr "Effacement" - --#: dnf/cli/output.py:1938 -+#: dnf/cli/output.py:1818 - msgid "Reinstall" - msgstr "Réinstallation" - --#: dnf/cli/output.py:2016 -+#: dnf/cli/output.py:1892 - #, python-format - msgid "---> Package %s.%s %s will be installed" - msgstr "---> Le paquet %s.%s %s sera installé" - --#: dnf/cli/output.py:2018 -+#: dnf/cli/output.py:1894 - #, python-format - msgid "---> Package %s.%s %s will be an upgrade" - msgstr "---> Le paquet %s.%s %s sera une mise à jour" - --#: dnf/cli/output.py:2020 -+#: dnf/cli/output.py:1896 - #, python-format - msgid "---> Package %s.%s %s will be erased" - msgstr "---> Le paquet %s.%s %s sera supprimé" - --#: dnf/cli/output.py:2022 -+#: dnf/cli/output.py:1898 - #, python-format - msgid "---> Package %s.%s %s will be reinstalled" - msgstr "---> Le paquet %s.%s %s sera réinstallé" - --#: dnf/cli/output.py:2024 -+#: dnf/cli/output.py:1900 - #, python-format - msgid "---> Package %s.%s %s will be a downgrade" - msgstr "---> Le paquet %s.%s %s sera une rétrogradation" - --#: dnf/cli/output.py:2026 -+#: dnf/cli/output.py:1902 - #, python-format - msgid "---> Package %s.%s %s will be obsoleting" - msgstr "---> Le paquet %s.%s %s sera rendu obsolète" - --#: dnf/cli/output.py:2028 -+#: dnf/cli/output.py:1904 - #, python-format - msgid "---> Package %s.%s %s will be upgraded" - msgstr "---> Le paquet %s.%s %s sera mis à jour" - --#: dnf/cli/output.py:2030 -+#: dnf/cli/output.py:1906 - #, python-format - msgid "---> Package %s.%s %s will be obsoleted" - msgstr "---> Le paquet %s.%s %s sera rendu obsolète" - --#: dnf/cli/output.py:2039 -+#: dnf/cli/output.py:1915 - msgid "--> Starting dependency resolution" - msgstr "--> Début de la résolution des dépendances" - --#: dnf/cli/output.py:2044 -+#: dnf/cli/output.py:1919 - msgid "--> Finished dependency resolution" - msgstr "--> Résolution des dépendances terminée" - --#: dnf/cli/output.py:2058 dnf/crypto.py:132 -+#: dnf/cli/output.py:1933 dnf/crypto.py:132 - #, python-format - msgid "" - "Importing GPG key 0x%s:\n" -@@ -3677,7 +3649,7 @@ msgstr "Module ou Groupe « %s » n’existe pas." - msgid "Environment id '%s' does not exist." - msgstr "L’id d’environnement « %s » n’existe pas." - --#: dnf/comps.py:622 dnf/transaction_sr.py:443 dnf/transaction_sr.py:453 -+#: dnf/comps.py:622 dnf/transaction_sr.py:477 dnf/transaction_sr.py:487 - #, python-format - msgid "Environment id '%s' is not installed." - msgstr "L’id d’environnement « %s » n’est pas installé." -@@ -3791,6 +3763,11 @@ msgstr "dépôt %s : 0x%s déjà importé" - msgid "repo %s: imported key 0x%s." - msgstr "dépôt %s : clé importée 0x%s." - -+#: dnf/crypto.py:177 -+#, python-format -+msgid "retrieving repo key for %s unencrypted from %s" -+msgstr "récupération de la clé de repo de %s non cryptée à partir %s" -+ - #: dnf/db/group.py:293 - msgid "" - "No available modular metadata for modular package '{}', it cannot be " -@@ -3878,7 +3855,7 @@ msgid_plural "Modular dependency problems with Defaults:" - msgstr[0] "Problème de dépendance modulaire avec les valeurs par défaut :" - msgstr[1] "Problèmes de dépendance modulaire avec les valeurs par défaut :" - --#: dnf/exceptions.py:131 dnf/module/module_base.py:686 -+#: dnf/exceptions.py:131 dnf/module/module_base.py:841 - msgid "Modular dependency problem:" - msgid_plural "Modular dependency problems:" - msgstr[0] "Problème de dépendance modulaire :" -@@ -3935,8 +3912,8 @@ msgstr "" - "\n" - "Aide : [d]éfaut, [e]activé, [x]désactivé, [i]nstallé, [a]ctivé" - --#: dnf/module/module_base.py:54 dnf/module/module_base.py:421 --#: dnf/module/module_base.py:477 dnf/module/module_base.py:543 -+#: dnf/module/module_base.py:54 dnf/module/module_base.py:547 -+#: dnf/module/module_base.py:603 dnf/module/module_base.py:669 - msgid "Ignoring unnecessary profile: '{}/{}'" - msgstr "Profil inutile ignoré : {}/{}" - -@@ -3947,21 +3924,21 @@ msgstr "" - "Toutes les correspondance pour le paramètre « {0} » dans le mode module « " - "{1}:{2} » ne sont pas actives" - --#: dnf/module/module_base.py:92 -+#: dnf/module/module_base.py:92 dnf/module/module_base.py:202 - #, python-brace-format - msgid "Installing module '{0}' from Fail-Safe repository {1} is not allowed" - msgstr "" - "L’installation du module « {0} » à partir du dépôt Fail-Safe {1} n’est pas " - "permise" - --#: dnf/module/module_base.py:102 -+#: dnf/module/module_base.py:102 dnf/module/module_base.py:212 - msgid "" - "Unable to match profile for argument {}. Available profiles for '{}:{}': {}" - msgstr "" - "Impossible de faire correspondre le profil pour l’argument {}. Profils " - "disponibles pour « {}:{} » : {}" - --#: dnf/module/module_base.py:106 -+#: dnf/module/module_base.py:106 dnf/module/module_base.py:216 - msgid "Unable to match profile for argument {}" - msgstr "Impossible de faire correspondre le profil pour l’argument {}" - -@@ -3978,39 +3955,53 @@ msgstr "Aucun profil pour le module {} : {}" - msgid "Default profile {} not available in module {}:{}" - msgstr "Le profil par défaut {} n’est pas disponible dans le module {} : {}" - --#: dnf/module/module_base.py:142 -+#: dnf/module/module_base.py:142 dnf/module/module_base.py:245 - msgid "Installing module from Fail-Safe repository is not allowed" - msgstr "" - "L’installation du module à partir du dépôt Fail-Safe n’est pas permise" - --#: dnf/module/module_base.py:159 dnf/module/module_base.py:193 --#: dnf/module/module_base.py:337 dnf/module/module_base.py:355 --#: dnf/module/module_base.py:363 dnf/module/module_base.py:417 --#: dnf/module/module_base.py:473 dnf/module/module_base.py:539 -+#: dnf/module/module_base.py:194 -+#, python-brace-format -+msgid "No active matches for argument '{0}' in module '{1}:{2}'" -+msgstr "" -+"Aucune correspondance active pour l'argument '{0}' dans le module '{1}:{2}'" -+ -+#: dnf/module/module_base.py:226 -+#, python-brace-format -+msgid "Installed profile '{0}' is not available in module '{1}' stream '{2}'" -+msgstr "" -+"Le profil installé '{0}' n'est pas disponible dans le module '{1}' stream " -+"'{2}'" -+ -+#: dnf/module/module_base.py:265 -+msgid "No packages available to distrosync for package name '{}'" -+msgstr "" -+"Aucun paquet disponible pour la distribution pour le nom de paquet '{}'" -+ -+#: dnf/module/module_base.py:308 dnf/module/module_base.py:452 -+#: dnf/module/module_base.py:477 dnf/module/module_base.py:496 -+#: dnf/module/module_base.py:543 dnf/module/module_base.py:599 -+#: dnf/module/module_base.py:665 dnf/module/module_base.py:827 - msgid "Unable to resolve argument {}" - msgstr "Impossible de résoudre le paramètre {}" - --#: dnf/module/module_base.py:160 --msgid "No match for package {}" --msgstr "Aucune correspondance pour le paquet {}" -- --#: dnf/module/module_base.py:204 -+#: dnf/module/module_base.py:319 - #, python-brace-format - msgid "Upgrading module '{0}' from Fail-Safe repository {1} is not allowed" - msgstr "" - "La mise à niveau du module « {0} » à partir du dépôt Fail-Safe {1} n’est pas" - " permise" - --#: dnf/module/module_base.py:223 dnf/module/module_base.py:251 -+#: dnf/module/module_base.py:338 dnf/module/module_base.py:366 - msgid "Unable to match profile in argument {}" - msgstr "Impossible de faire correspondre le profil dans l’argument {}" - --#: dnf/module/module_base.py:231 -+#: dnf/module/module_base.py:346 - msgid "Upgrading module from Fail-Safe repository is not allowed" - msgstr "" - "La mise à niveau du module à partir du dépôt Fail-Safe n’est pas permise" - --#: dnf/module/module_base.py:367 -+#: dnf/module/module_base.py:500 - msgid "" - "Only module name is required. Ignoring unneeded information in argument: " - "'{}'" -@@ -4018,7 +4009,11 @@ msgstr "" - "Seul le nom du module est nécessaire. Les paramètres inutiles ont été " - "ignorés : « {} »" - --#: dnf/package.py:298 -+#: dnf/module/module_base.py:828 -+msgid "No match for package {}" -+msgstr "Aucune correspondance pour le paquet {}" -+ -+#: dnf/package.py:333 - #, python-format - msgid "%s: %s check failed: %s vs %s" - msgstr "%s : %s vérification a échoué : %s vs %s" -@@ -4032,12 +4027,12 @@ msgstr "%s est un fichier vide" - #: dnf/persistor.py:91 - #, python-format - msgid "Failed to load expired repos cache: %s" --msgstr "" -+msgstr "Echec du chargement du cache des repos expirés : %s" - - #: dnf/persistor.py:99 - #, python-format - msgid "Failed to store expired repos cache: %s" --msgstr "" -+msgstr "N'a pas réussi à stocker le cache des repos expirés : %s" - - #: dnf/persistor.py:106 - msgid "Failed storing last makecache time." -@@ -4102,6 +4097,14 @@ msgstr "Ajout du dépôt %s depuis le %s" - msgid "Errors occurred during test transaction." - msgstr "Des erreurs sont survenues lors de la transaction de test." - -+#: dnf/sack.py:47 -+msgid "" -+"allow_vendor_change is disabled. This option is currently not supported for " -+"downgrade and distro-sync commands" -+msgstr "" -+"allow_vendor_change est désactivé. Cette option n'est actuellement pas prise" -+" en charge pour les commandes de downgrade et de distro-sync" -+ - #. TRANSLATORS: This is for a single package currently being downgraded. - #: dnf/transaction.py:80 - msgctxt "currently" -@@ -4148,27 +4151,31 @@ msgstr "Exécution du scriptlet" - msgid "Preparing" - msgstr "Préparation" - --#: dnf/transaction_sr.py:60 -+#: dnf/transaction_sr.py:66 - #, python-brace-format --msgid "Errors in \"{filename}\":" --msgstr "Erreurs dans « {filename} » :" -+msgid "" -+"The following problems occurred while replaying the transaction from file " -+"\"{filename}\":" -+msgstr "" -+"Les problèmes suivants sont survenus lors de la relecture de la transaction " -+"à partir du fichier \"{filename}\" :" - --#: dnf/transaction_sr.py:70 --#, python-brace-format --msgid "Error in \"{filename}\": {error}" --msgstr "Erreur dans « {filename} » : {error}" -+#: dnf/transaction_sr.py:68 -+msgid "The following problems occurred while running a transaction:" -+msgstr "" -+"Les problèmes suivants sont survenus lors de l'exécution d'une transaction :" - --#: dnf/transaction_sr.py:87 -+#: dnf/transaction_sr.py:89 - #, python-brace-format - msgid "Invalid major version \"{major}\", number expected." - msgstr "Version majeur invalide « {major} », numéro attendu." - --#: dnf/transaction_sr.py:95 -+#: dnf/transaction_sr.py:97 - #, python-brace-format - msgid "Invalid minor version \"{minor}\", number expected." - msgstr "Version mineure invalide « {minor} », numéro attendu." - --#: dnf/transaction_sr.py:101 -+#: dnf/transaction_sr.py:103 - #, python-brace-format - msgid "" - "Incompatible major version \"{major}\", supported major version is " -@@ -4177,137 +4184,186 @@ msgstr "" - "Version majeure incompatible « {major} », la version majeure prise en charge" - " est « {major_supp} »." - --#: dnf/transaction_sr.py:244 -+#: dnf/transaction_sr.py:224 -+msgid "" -+"Conflicting TransactionReplay arguments have been specified: filename, data" -+msgstr "" -+"Des arguments contradictoires de TransactionReplay ont été spécifiés : nom " -+"de fichier, données" -+ -+#: dnf/transaction_sr.py:265 - #, python-brace-format - msgid "Unexpected type of \"{id}\", {exp} expected." - msgstr "Type de « {id} » inattendu, {exp} attendu." - --#: dnf/transaction_sr.py:250 -+#: dnf/transaction_sr.py:271 - #, python-brace-format - msgid "Missing key \"{key}\"." - msgstr "Clé « {key} » manquante." - --#: dnf/transaction_sr.py:263 -+#: dnf/transaction_sr.py:285 - #, python-brace-format - msgid "Missing object key \"{key}\" in an rpm." - msgstr "Clé objet « {key} » manquante dans un rpm." - --#: dnf/transaction_sr.py:267 -+#: dnf/transaction_sr.py:289 - #, python-brace-format - msgid "Unexpected value of package reason \"{reason}\" for rpm nevra \"{nevra}\"." - msgstr "" -+"Valeur inattendue de la raison du paquet \"{reason}\" pour rpm nevra " -+"\"{nevra}\"." - --#: dnf/transaction_sr.py:275 -+#: dnf/transaction_sr.py:297 - #, python-brace-format - msgid "Cannot parse NEVRA for package \"{nevra}\"." --msgstr "" -+msgstr "Impossible d'analyser NEVRA pour le paquet \"{nevra}\"." - --#: dnf/transaction_sr.py:286 -+#: dnf/transaction_sr.py:321 - #, python-brace-format - msgid "Cannot find rpm nevra \"{nevra}\"." --msgstr "" -+msgstr "Impossible de trouver rpm nevra \"{nevra}\"." - --#: dnf/transaction_sr.py:301 --#, fuzzy, python-brace-format --#| msgid "Package %s is already installed." -+#: dnf/transaction_sr.py:336 -+#, python-brace-format - msgid "Package \"{na}\" is already installed for action \"{action}\"." --msgstr "Le paquet %s est déjà installé." -+msgstr "Le paquet \"%s\" est déjà installé pour l'action \"{action}\"." - --#: dnf/transaction_sr.py:311 -+#: dnf/transaction_sr.py:345 - #, python-brace-format - msgid "" - "Package nevra \"{nevra}\" not available in repositories for action " - "\"{action}\"." - msgstr "" -+"Le paquet nevra \"{nevra}\" n'est pas disponible dans les dépôts pour action" -+" \"{action}\"." - --#: dnf/transaction_sr.py:322 -+#: dnf/transaction_sr.py:356 - #, python-brace-format - msgid "Package nevra \"{nevra}\" not installed for action \"{action}\"." --msgstr "" -+msgstr "Le paquet nevra \"{nevra}\" n'est pas installé pour l'action \"{action}\"." - --#: dnf/transaction_sr.py:336 -+#: dnf/transaction_sr.py:370 - #, python-brace-format - msgid "Unexpected value of package action \"{action}\" for rpm nevra \"{nevra}\"." --msgstr "" -+msgstr "Valeur inattendue de l'action paquet \"{action}\" pour rpm nevra \"{nevra}\"." - --#: dnf/transaction_sr.py:343 --#, fuzzy, python-format --#| msgid "Module or Group '%s' is not available." -+#: dnf/transaction_sr.py:377 -+#, python-format - msgid "Group id '%s' is not available." --msgstr "Module ou Groupe « %s » non disponible." -+msgstr "L'id du groupe '%s' n'est pas disponible." - --#: dnf/transaction_sr.py:364 -+#: dnf/transaction_sr.py:398 - #, python-brace-format - msgid "Missing object key \"{key}\" in groups.packages." --msgstr "" -+msgstr "Clé d'objet manquante \"{key}\" dans groups.packages." - --#: dnf/transaction_sr.py:377 dnf/transaction_sr.py:387 --#, fuzzy, python-format --#| msgid "Module or Group '%s' is not installed." -+#: dnf/transaction_sr.py:411 dnf/transaction_sr.py:421 -+#, python-format - msgid "Group id '%s' is not installed." --msgstr "Module ou Groupe « %s » non installé." -+msgstr "L'id de groupe '%s' non installé." - --#: dnf/transaction_sr.py:398 --#, fuzzy, python-format --#| msgid "Environment '%s' is not available." -+#: dnf/transaction_sr.py:432 -+#, python-format - msgid "Environment id '%s' is not available." --msgstr "L’environnement « %s » n’est pas disponible." -+msgstr "L’id e l’environnement « %s » n’est pas disponible." - --#: dnf/transaction_sr.py:422 -+#: dnf/transaction_sr.py:456 - #, python-brace-format - msgid "" - "Invalid value \"{group_type}\" of environments.groups.group_type, only " - "\"mandatory\" or \"optional\" is supported." - msgstr "" -+"Valeur invalide \"{group_type}\" de environments.groups.group_type, seul \" " -+"obligatoire \" ou \" optionnel \" est supporté." - --#: dnf/transaction_sr.py:430 -+#: dnf/transaction_sr.py:464 - #, python-brace-format - msgid "Missing object key \"{key}\" in environments.groups." --msgstr "" -+msgstr "Clé d'objet manquante \"{key}\" dans environments.groups." - --#: dnf/transaction_sr.py:508 -+#: dnf/transaction_sr.py:542 - #, python-brace-format - msgid "Unexpected value of group action \"{action}\" for group \"{group}\"." - msgstr "" -+"Valeur inattendue de l'action de groupe \"{action}\" pour le groupe " -+"\"{group}\"." - --#: dnf/transaction_sr.py:513 -+#: dnf/transaction_sr.py:547 - #, python-brace-format - msgid "Missing object key \"{key}\" in a group." --msgstr "" -+msgstr "Clé d'objet manquant \"{key}\" dans un groupe." - --#: dnf/transaction_sr.py:537 -+#: dnf/transaction_sr.py:571 - #, python-brace-format - msgid "Unexpected value of environment action \"{action}\" for environment \"{env}\"." - msgstr "" -+"Valeur inattendue de l'action environnementale \"{action}\" pour " -+"l'environnement \"{env}\"." - --#: dnf/transaction_sr.py:542 -+#: dnf/transaction_sr.py:576 - #, python-brace-format - msgid "Missing object key \"{key}\" in an environment." --msgstr "" -+msgstr "Clé d'objet manquant \"{key}\" dans un environnement." - --#: dnf/transaction_sr.py:581 -+#: dnf/transaction_sr.py:615 - #, python-brace-format - msgid "" - "Package nevra \"{nevra}\", which is not present in the transaction file, was" - " pulled into the transaction." - msgstr "" -+"Le paquet nevra \"{nevra}\", qui n'est pas présent dans le fichier de " -+"transaction, a été introduit dans la transaction." - --#: dnf/util.py:391 dnf/util.py:393 -+#: dnf/util.py:393 dnf/util.py:395 - msgid "Problem" - msgstr "Problème" - --#: dnf/util.py:444 -+#: dnf/util.py:446 - msgid "TransactionItem not found for key: {}" - msgstr "TransactionItem n’a pas été trouvé pour la clef : {}" - --#: dnf/util.py:454 -+#: dnf/util.py:456 - msgid "TransactionSWDBItem not found for key: {}" - msgstr "TransactionSWDBItem n’a pas été trouvé pour la clef : {}" - --#: dnf/util.py:457 -+#: dnf/util.py:459 - msgid "Errors occurred during transaction." - msgstr "Des erreurs sont survenues lors de la transaction." - -+#: dnf/util.py:595 -+msgid "Reinstalled" -+msgstr "Réinstallé" -+ -+#: dnf/util.py:596 -+msgid "Skipped" -+msgstr "Ignoré" -+ -+#: dnf/util.py:597 -+msgid "Removed" -+msgstr "Supprimé" -+ -+#: dnf/util.py:600 -+msgid "Failed" -+msgstr "Échec" -+ -+#~ msgid "Action not handled: {}" -+#~ msgstr "Action non gérée : {}" -+ -+#~ msgid "no package matched" -+#~ msgstr "aucun paquet correspondant" -+ -+#~ msgid "Not found given transaction ID" -+#~ msgstr "L’identifiant de transaction fourni est introuvable" -+ -+#~ msgid "Undoing transaction {}, from {}" -+#~ msgstr "Révocation de lla transaction {}, de {}" -+ -+#~ msgid "Errors in \"{filename}\":" -+#~ msgstr "Erreurs dans « {filename} » :" -+ -+#~ msgid "Error in \"{filename}\": {error}" -+#~ msgstr "Erreur dans « {filename} » : {error}" -+ - #~ msgid "format for displaying found packages" - #~ msgstr "format d’affichage des paquets trouvés" - -diff --git a/po/ja.po b/po/ja.po -index 6435271c..00529771 100644 ---- a/po/ja.po -+++ b/po/ja.po -@@ -22,20 +22,21 @@ - # Julien Humbert , 2020. - # Casey Jones , 2020. - # Hajime Taira , 2020. -+# Sundeep Anand , 2021. - msgid "" - msgstr "" - "Project-Id-Version: PACKAGE VERSION\n" - "Report-Msgid-Bugs-To: \n" --"POT-Creation-Date: 2020-10-05 09:18-0400\n" --"PO-Revision-Date: 2020-07-27 05:29+0000\n" --"Last-Translator: Hajime Taira \n" --"Language-Team: Japanese \n" -+"POT-Creation-Date: 2021-02-22 09:22+0100\n" -+"PO-Revision-Date: 2021-03-08 10:29+0000\n" -+"Last-Translator: Sundeep Anand \n" -+"Language-Team: Japanese \n" - "Language: ja\n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" - "Plural-Forms: nplurals=1; plural=0;\n" --"X-Generator: Weblate 4.1.1\n" -+"X-Generator: Weblate 4.5.1\n" - - #: dnf/automatic/emitter.py:32 - #, python-format -@@ -45,7 +46,7 @@ msgstr "'%s' に以下の更新が適用されました:" - #: dnf/automatic/emitter.py:33 - #, python-format - msgid "Updates completed at %s" --msgstr "'%s' に更新が適用されました。" -+msgstr "'%s' に更新が適用されました" - - #: dnf/automatic/emitter.py:34 - #, python-format -@@ -92,7 +93,7 @@ msgstr "不明な設定値: %s=%s in %s; %s" - msgid "Unknown configuration option: %s = %s in %s" - msgstr "不明な設定オプション: %s = %s in %s" - --#: dnf/automatic/main.py:237 dnf/cli/cli.py:299 -+#: dnf/automatic/main.py:237 dnf/cli/cli.py:304 - msgid "GPG check FAILED" - msgstr "GPG の確認に失敗しました" - -@@ -105,9 +106,9 @@ msgid "Started dnf-automatic." - msgstr "dnf-automatic を開始しました。" - - #: dnf/automatic/main.py:308 --#, python-format --msgid "Sleep for %s seconds" --msgstr "%s 秒スリープします" -+msgid "Sleep for {} second" -+msgid_plural "Sleep for {} seconds" -+msgstr[0] "{} 秒スリープします" - - #: dnf/automatic/main.py:315 - msgid "System is off-line." -@@ -119,7 +120,7 @@ msgstr "システムはオフラインです。" - msgid "Error: %s" - msgstr "エラー: %s" - --#: dnf/base.py:146 -+#: dnf/base.py:146 dnf/base.py:472 dnf/base.py:474 - msgid "loading repo '{}' failure: {}" - msgstr "repo '{}' のロードに失敗しました: {}" - -@@ -127,236 +128,236 @@ msgstr "repo '{}' のロードに失敗しました: {}" - msgid "Loading repository '{}' has failed" - msgstr "repository '{}' のロードに失敗しました" - --#: dnf/base.py:320 -+#: dnf/base.py:322 - msgid "Metadata timer caching disabled when running on metered connection." - msgstr "metered 接続で実行する際、メタデータタイマーキャッシュは無効化されました。" - --#: dnf/base.py:325 -+#: dnf/base.py:327 - msgid "Metadata timer caching disabled when running on a battery." - msgstr "バッテリーで実行する際、メタデータタイマーキャッシュは無効化されました。" - --#: dnf/base.py:330 -+#: dnf/base.py:332 - msgid "Metadata timer caching disabled." - msgstr "メタデータタイマーキャッシュは無効化されました。" - --#: dnf/base.py:335 -+#: dnf/base.py:337 - msgid "Metadata cache refreshed recently." - msgstr "メタデータキャッシュは最近、リフレッシュされました。" - --#: dnf/base.py:341 dnf/cli/commands/__init__.py:91 -+#: dnf/base.py:343 dnf/cli/commands/__init__.py:91 - msgid "There are no enabled repositories in \"{}\"." - msgstr "\"{}\" には有効化されたリポジトリーがありません。" - --#: dnf/base.py:348 -+#: dnf/base.py:350 - #, python-format - msgid "%s: will never be expired and will not be refreshed." - msgstr "%s: は期限切れになることはなく、リフレッシュされることもありません。" - --#: dnf/base.py:350 -+#: dnf/base.py:352 - #, python-format - msgid "%s: has expired and will be refreshed." - msgstr "%s: は期限切れとなったのでリフレッシュされます。" - - #. expires within the checking period: --#: dnf/base.py:354 -+#: dnf/base.py:356 - #, python-format - msgid "%s: metadata will expire after %d seconds and will be refreshed now" - msgstr "%s: メタデータは %d 秒後に期限切れとなり、すぐにリフレッシュされます" - --#: dnf/base.py:358 -+#: dnf/base.py:360 - #, python-format - msgid "%s: will expire after %d seconds." - msgstr "%s: は %d 秒後に期限切れとなります。" - - #. performs the md sync --#: dnf/base.py:364 -+#: dnf/base.py:366 - msgid "Metadata cache created." - msgstr "メタデータキャッシュを作成しました。" - --#: dnf/base.py:397 -+#: dnf/base.py:399 dnf/base.py:466 - #, python-format - msgid "%s: using metadata from %s." --msgstr "%s: は %s から取得したメタデータを使用中" -+msgstr "%s: は %s から取得したメタデータを使用中。" - --#: dnf/base.py:409 -+#: dnf/base.py:411 dnf/base.py:479 - #, python-format - msgid "Ignoring repositories: %s" - msgstr "リポジトリーを無視します: %s" - --#: dnf/base.py:412 -+#: dnf/base.py:414 - #, python-format - msgid "Last metadata expiration check: %s ago on %s." - msgstr "メタデータの期限切れの最終確認: %s 時間前の %s に実施しました。" - --#: dnf/base.py:443 -+#: dnf/base.py:507 - msgid "" - "The downloaded packages were saved in cache until the next successful " - "transaction." - msgstr "ダウンロード済みのパッケージは、次の正常なトランザクションまでキャッシュに保存されました。" - --#: dnf/base.py:445 -+#: dnf/base.py:509 - #, python-format - msgid "You can remove cached packages by executing '%s'." - msgstr "'%s' を実行することでキャッシュパッケージを削除できます。" - --#: dnf/base.py:535 -+#: dnf/base.py:599 - #, python-format - msgid "Invalid tsflag in config file: %s" - msgstr "設定ファイルの tsflag が無効です: %s" - --#: dnf/base.py:591 -+#: dnf/base.py:655 - #, python-format - msgid "Failed to add groups file for repository: %s - %s" - msgstr "リポジトリーのグループファイルを追加できませんでした: %s - %s" - --#: dnf/base.py:823 -+#: dnf/base.py:887 - msgid "Running transaction check" - msgstr "トランザクションの確認を実行中" - --#: dnf/base.py:831 -+#: dnf/base.py:895 - msgid "Error: transaction check vs depsolve:" - msgstr "エラー: トランザクションの確認 vs depsolve:" - --#: dnf/base.py:837 -+#: dnf/base.py:901 - msgid "Transaction check succeeded." - msgstr "トランザクションの確認に成功しました。" - --#: dnf/base.py:840 -+#: dnf/base.py:904 - msgid "Running transaction test" - msgstr "トランザクションのテストを実行中" - --#: dnf/base.py:850 dnf/base.py:992 -+#: dnf/base.py:914 dnf/base.py:1065 - msgid "RPM: {}" - msgstr "RPM: {}" - --#: dnf/base.py:851 -+#: dnf/base.py:915 - msgid "Transaction test error:" - msgstr "トランザクションテストエラー:" - --#: dnf/base.py:862 -+#: dnf/base.py:926 - msgid "Transaction test succeeded." - msgstr "トランザクションのテストに成功しました。" - --#: dnf/base.py:883 -+#: dnf/base.py:947 - msgid "Running transaction" - msgstr "トランザクションを実行中" - --#: dnf/base.py:911 -+#: dnf/base.py:984 - msgid "Disk Requirements:" --msgstr "ディスク要件" -+msgstr "ディスク要件:" - --#: dnf/base.py:914 -+#: dnf/base.py:987 - #, python-brace-format - msgid "At least {0}MB more space needed on the {1} filesystem." - msgid_plural "At least {0}MB more space needed on the {1} filesystem." - msgstr[0] "{1} ファイルシステムに最低 {0}MB の追加スペースが必要です。" - --#: dnf/base.py:921 -+#: dnf/base.py:994 - msgid "Error Summary" - msgstr "エラーの概要" - --#: dnf/base.py:947 -+#: dnf/base.py:1020 - #, python-brace-format - msgid "RPMDB altered outside of {prog}." - msgstr "RPMDBは {prog} のサポート外に変更されました。" - --#: dnf/base.py:993 dnf/base.py:1001 -+#: dnf/base.py:1066 dnf/base.py:1074 - msgid "Could not run transaction." - msgstr "トランザクションを実行できませんでした。" - --#: dnf/base.py:996 -+#: dnf/base.py:1069 - msgid "Transaction couldn't start:" - msgstr "トランザクションを開始できませんでした:" - --#: dnf/base.py:1010 -+#: dnf/base.py:1083 - #, python-format - msgid "Failed to remove transaction file %s" - msgstr "トランザクションファイル %s の削除に失敗しました" - --#: dnf/base.py:1092 -+#: dnf/base.py:1165 - msgid "Some packages were not downloaded. Retrying." - msgstr "一部のパッケージはダウンロードされませんでした。再試行中です。" - --#: dnf/base.py:1122 -+#: dnf/base.py:1195 - #, python-format - msgid "Delta RPMs reduced %.1f MB of updates to %.1f MB (%d.1%% saved)" - msgstr "Delta RPM により %.1f MB の更新を %.1f MB に削減できました。(%d.1%% がキャッシュされていました)" - --#: dnf/base.py:1125 -+#: dnf/base.py:1198 - #, python-format - msgid "" - "Failed Delta RPMs increased %.1f MB of updates to %.1f MB (%d.1%% wasted)" - msgstr "非効率な Delta RPM により %.1f MB の更新が増加し、%.1f MB となりました。(%d.1%% が無駄になりました)" - --#: dnf/base.py:1167 -+#: dnf/base.py:1240 - msgid "Cannot add local packages, because transaction job already exists" - msgstr "ローカルパッケージを追加できません、トランザクションジョブがすでに存在するためです" - --#: dnf/base.py:1181 -+#: dnf/base.py:1254 - msgid "Could not open: {}" - msgstr "開くことができませんでした: {}" - --#: dnf/base.py:1219 -+#: dnf/base.py:1292 - #, python-format - msgid "Public key for %s is not installed" - msgstr "%s の公開鍵がインストールされていません" - --#: dnf/base.py:1223 -+#: dnf/base.py:1296 - #, python-format - msgid "Problem opening package %s" - msgstr "パッケージ %s を開くことができません" - --#: dnf/base.py:1231 -+#: dnf/base.py:1304 - #, python-format - msgid "Public key for %s is not trusted" - msgstr "%s の公開鍵は信頼されていません" - --#: dnf/base.py:1235 -+#: dnf/base.py:1308 - #, python-format - msgid "Package %s is not signed" - msgstr "パッケージ %s は署名されていません" - --#: dnf/base.py:1265 -+#: dnf/base.py:1338 - #, python-format - msgid "Cannot remove %s" - msgstr "%s を削除できません" - --#: dnf/base.py:1269 -+#: dnf/base.py:1342 - #, python-format - msgid "%s removed" - msgstr "%s を削除しました" - --#: dnf/base.py:1549 -+#: dnf/base.py:1622 - msgid "No match for group package \"{}\"" --msgstr "グループパッケージ \"{}\" に一致するものはありません" -+msgstr "グループパッケージ \"{}\" に一致するものはありません" - --#: dnf/base.py:1635 -+#: dnf/base.py:1708 - #, python-format - msgid "Adding packages from group '%s': %s" - msgstr "グループ '%s' からのパッケージを追加します: %s" - --#: dnf/base.py:1658 dnf/cli/cli.py:219 dnf/cli/commands/__init__.py:442 -+#: dnf/base.py:1731 dnf/cli/cli.py:220 dnf/cli/commands/__init__.py:442 - #: dnf/cli/commands/__init__.py:499 dnf/cli/commands/__init__.py:592 - #: dnf/cli/commands/__init__.py:641 dnf/cli/commands/install.py:80 - #: dnf/cli/commands/install.py:103 dnf/cli/commands/install.py:110 - msgid "Nothing to do." - msgstr "行うべきことはありません。" - --#: dnf/base.py:1676 -+#: dnf/base.py:1749 - msgid "No groups marked for removal." - msgstr "削除対象のパッケージはありません。" - --#: dnf/base.py:1710 -+#: dnf/base.py:1783 - msgid "No group marked for upgrade." - msgstr "アップグレード対象のグループはありません。" - --#: dnf/base.py:1925 -+#: dnf/base.py:1997 - #, python-format - msgid "Package %s not installed, cannot downgrade it." - msgstr "パッケージ %s はインストールされていないので、ダウングレードできません。" - --#: dnf/base.py:1927 dnf/base.py:1946 dnf/base.py:1959 dnf/base.py:1980 --#: dnf/base.py:2029 dnf/base.py:2037 dnf/base.py:2172 dnf/cli/cli.py:411 -+#: dnf/base.py:1999 dnf/base.py:2018 dnf/base.py:2031 dnf/base.py:2052 -+#: dnf/base.py:2101 dnf/base.py:2109 dnf/base.py:2243 dnf/cli/cli.py:416 - #: dnf/cli/commands/__init__.py:425 dnf/cli/commands/__init__.py:482 - #: dnf/cli/commands/__init__.py:586 dnf/cli/commands/__init__.py:633 - #: dnf/cli/commands/__init__.py:711 dnf/cli/commands/install.py:147 -@@ -366,141 +367,127 @@ msgstr "パッケージ %s はインストールされていないので、ダ - msgid "No match for argument: %s" - msgstr "一致した引数がありません: %s" - --#: dnf/base.py:1934 -+#: dnf/base.py:2006 - #, python-format - msgid "Package %s of lower version already installed, cannot downgrade it." - msgstr "下位バージョンのパッケージ %s はインストール済みなので、ダウングレードできません。" - --#: dnf/base.py:1957 -+#: dnf/base.py:2029 - #, python-format - msgid "Package %s not installed, cannot reinstall it." - msgstr "パッケージ %s はインストールされていないのでの、再インストールできません。" - --#: dnf/base.py:1972 -+#: dnf/base.py:2044 - #, python-format - msgid "File %s is a source package and cannot be updated, ignoring." - msgstr "ファイル %s はソースパッケージで更新できません。無視します。" - --#: dnf/base.py:1978 -+#: dnf/base.py:2050 - #, python-format - msgid "Package %s not installed, cannot update it." - msgstr "パッケージ %s はインストールされていないので、更新できません。" - --#: dnf/base.py:1987 -+#: dnf/base.py:2059 - #, python-format - msgid "" - "The same or higher version of %s is already installed, cannot update it." - msgstr "同じまたはさらに新しいバージョンの %s が既にインストールされています、アップデートできません。" - --#: dnf/base.py:2026 dnf/cli/commands/reinstall.py:81 -+#: dnf/base.py:2098 dnf/cli/commands/reinstall.py:81 - #, python-format - msgid "Package %s available, but not installed." - msgstr "パッケージ %s は利用可能ですが、インストールされていません。" - --#: dnf/base.py:2032 -+#: dnf/base.py:2104 - #, python-format - msgid "Package %s available, but installed for different architecture." - msgstr "パッケージ %s は利用可能ですが、他のアーキテクチャー用にインストールされています。" - --#: dnf/base.py:2057 dnf/base.py:2250 dnf/cli/cli.py:668 dnf/cli/cli.py:699 -+#: dnf/base.py:2129 - #, python-format - msgid "No package %s installed." - msgstr "パッケージ %s はインストールされていません。" - --#: dnf/base.py:2075 dnf/cli/commands/install.py:136 -+#: dnf/base.py:2147 dnf/cli/commands/install.py:136 - #: dnf/cli/commands/remove.py:133 - #, python-format - msgid "Not a valid form: %s" - msgstr "有効な形式ではありません: %s" - --#: dnf/base.py:2091 dnf/cli/commands/__init__.py:681 --#: dnf/cli/commands/remove.py:163 -+#: dnf/base.py:2162 dnf/cli/commands/__init__.py:681 -+#: dnf/cli/commands/remove.py:162 - msgid "No packages marked for removal." - msgstr "削除対象のパッケージはありません。" - --#: dnf/base.py:2179 dnf/cli/cli.py:422 -+#: dnf/base.py:2250 dnf/cli/cli.py:427 - #, python-format - msgid "Packages for argument %s available, but not installed." --msgstr "引数 %s のパッケージは利用可能ですが、インストールされていません。" -+msgstr "引数 %s のパッケージは利用可能ですが、インストールされていません。" - --#: dnf/base.py:2184 -+#: dnf/base.py:2255 - #, python-format - msgid "Package %s of lowest version already installed, cannot downgrade it." - msgstr "最下位バージョンのパッケージ %s はインストール済みなので、ダウングレードできません。" - --#: dnf/base.py:2242 --msgid "Action not handled: {}" --msgstr "動作は対処されていません: {}" -- --#: dnf/base.py:2256 dnf/cli/cli.py:419 dnf/cli/cli.py:673 dnf/cli/cli.py:703 --#: dnf/cli/commands/group.py:400 dnf/cli/commands/history.py:169 --#, python-format --msgid "No package %s available." --msgstr "利用可能なパッケージ %s がありません。" -- --#: dnf/base.py:2269 --msgid "no package matched" --msgstr "一致したパッケージはありません。" -- --#: dnf/base.py:2290 -+#: dnf/base.py:2302 - msgid "No security updates needed, but {} update available" - msgstr "セキュリティー更新は必要ありませんが、{} 更新が利用可能です" - --#: dnf/base.py:2292 -+#: dnf/base.py:2304 - msgid "No security updates needed, but {} updates available" - msgstr "セキュリティー更新は必要ありませんが、{} 更新が利用可能です" - --#: dnf/base.py:2296 -+#: dnf/base.py:2308 - msgid "No security updates needed for \"{}\", but {} update available" - msgstr "\"{}\" のセキュリティー更新は必要ありませんが、{} 更新が利用可能です" - --#: dnf/base.py:2298 -+#: dnf/base.py:2310 - msgid "No security updates needed for \"{}\", but {} updates available" - msgstr "\"{}\" のセキュリティー更新は必要ありませんが、{} 更新が利用可能です" - - #. raise an exception, because po.repoid is not in self.repos --#: dnf/base.py:2319 -+#: dnf/base.py:2331 - #, python-format - msgid "Unable to retrieve a key for a commandline package: %s" --msgstr "" -+msgstr "コマンドラインパッケージのキーを取得できません: %s" - --#: dnf/base.py:2327 -+#: dnf/base.py:2339 - #, python-format - msgid ". Failing package is: %s" - msgstr ". 失敗したパッケージは: %s" - --#: dnf/base.py:2328 -+#: dnf/base.py:2340 - #, python-format - msgid "GPG Keys are configured as: %s" - msgstr "GPG 鍵が設定されています: %s" - --#: dnf/base.py:2340 -+#: dnf/base.py:2352 - #, python-format - msgid "GPG key at %s (0x%s) is already installed" - msgstr "%s (0x%s) の GPG 鍵はインストール済みです" - --#: dnf/base.py:2373 -+#: dnf/base.py:2385 - msgid "The key has been approved." - msgstr "鍵が承認されました。" - --#: dnf/base.py:2376 -+#: dnf/base.py:2388 - msgid "The key has been rejected." - msgstr "鍵が拒否されました。" - --#: dnf/base.py:2409 -+#: dnf/base.py:2421 - #, python-format - msgid "Key import failed (code %d)" - msgstr "鍵のインポートに失敗しました (コード: %d)" - --#: dnf/base.py:2411 -+#: dnf/base.py:2423 - msgid "Key imported successfully" - msgstr "鍵のインポートに成功しました" - --#: dnf/base.py:2415 -+#: dnf/base.py:2427 - msgid "Didn't install any keys" - msgstr "鍵を 1 つもインストールしませんでした" - --#: dnf/base.py:2418 -+#: dnf/base.py:2430 - #, python-format - msgid "" - "The GPG keys listed for the \"%s\" repository are already installed but they are not correct for this package.\n" -@@ -509,49 +496,49 @@ msgstr "" - "\"%s\" リポジトリーに一覧表示されている GPG 鍵はインストール済みですが、このパッケージには適切ではありません。\n" - "正しい鍵 URL がこのリポジトリー用に設定されているか確認してください。" - --#: dnf/base.py:2429 -+#: dnf/base.py:2441 - msgid "Import of key(s) didn't help, wrong key(s)?" - msgstr "鍵をインポートしても役に立ちませんでした。鍵が間違っていませんか?" - --#: dnf/base.py:2482 -+#: dnf/base.py:2494 - msgid " * Maybe you meant: {}" - msgstr " * おそらく: {}" - --#: dnf/base.py:2514 -+#: dnf/base.py:2526 - msgid "Package \"{}\" from local repository \"{}\" has incorrect checksum" - msgstr "ローカルリポジトリー \"{}\" のパッケージ \"{}\" のチェックサムは正しくありません" - --#: dnf/base.py:2517 -+#: dnf/base.py:2529 - msgid "Some packages from local repository have incorrect checksum" - msgstr "ローカルリポジトリーのいくつかのパッケージのチェックサムは正しくありません" - --#: dnf/base.py:2520 -+#: dnf/base.py:2532 - msgid "Package \"{}\" from repository \"{}\" has incorrect checksum" - msgstr "リポジトリー \"{}\" のパッケージ \"{}\" のチェックサムは正しくありません" - --#: dnf/base.py:2523 -+#: dnf/base.py:2535 - msgid "" - "Some packages have invalid cache, but cannot be downloaded due to \"--" - "cacheonly\" option" - msgstr "いくつかのパッケージには無効なキャッシュがありますが、\"--cacheonly\" オプションによりダウンロードできません" - --#: dnf/base.py:2541 dnf/base.py:2561 -+#: dnf/base.py:2553 dnf/base.py:2573 - msgid "No match for argument" - msgstr "一致した引数がありません" - --#: dnf/base.py:2549 dnf/base.py:2569 -+#: dnf/base.py:2561 dnf/base.py:2581 - msgid "All matches were filtered out by exclude filtering for argument" --msgstr "すべての検索結果は引数の除外フィルタリングに一致しません(filter out)" -+msgstr "すべての検索結果は引数の除外フィルタリングに一致しません (filter out)" - --#: dnf/base.py:2551 -+#: dnf/base.py:2563 - msgid "All matches were filtered out by modular filtering for argument" --msgstr "すべての検出結果は引数のモジュラーフィルタリングに一致しません(filter out)" -+msgstr "すべての検出結果は引数のモジュラーフィルタリングに一致しません (filter out)" - --#: dnf/base.py:2567 -+#: dnf/base.py:2579 - msgid "All matches were installed from a different repository for argument" - msgstr "すべての検索結果は引数に対し異なるレポジトリからインストールされたものです" - --#: dnf/base.py:2583 -+#: dnf/base.py:2626 - #, python-format - msgid "Package %s is already installed." - msgstr "パッケージ %s は既にインストールされています。" -@@ -571,8 +558,8 @@ msgstr "ファイル \"%s\" の解析に失敗しました: %s" - msgid "Cannot read file \"%s\": %s" - msgstr "ファイル \"%s\" を読み込めません: %s" - --#: dnf/cli/aliases.py:115 dnf/cli/aliases.py:129 dnf/cli/cli.py:902 --#: dnf/cli/cli.py:906 dnf/cli/commands/alias.py:108 -+#: dnf/cli/aliases.py:115 dnf/cli/aliases.py:129 dnf/cli/cli.py:803 -+#: dnf/cli/cli.py:807 dnf/cli/commands/alias.py:108 - #, python-format - msgid "Config error: %s" - msgstr "設定エラー: %s" -@@ -603,7 +590,7 @@ msgid "" - "stream '{2}'" - msgstr "オペレーションは、モジュール '{0}' ストリーム '{1}' を ストリーム '{2}' へと切り替える結果となります" - --#: dnf/cli/cli.py:172 -+#: dnf/cli/cli.py:173 - #, python-brace-format - msgid "" - "It is not possible to switch enabled streams of a module.\n" -@@ -612,35 +599,35 @@ msgstr "" - "モジュールの有効なストリームを切り替えることはできません。\n" - "モジュールからインストールされた全てのコンテンツを削除し、 '{prog} module reset ' コマンドを使用してリセットすることが推奨されます。モジュールのリセット後、他のストリームをインストール可能です。" - --#: dnf/cli/cli.py:210 -+#: dnf/cli/cli.py:211 - #, python-brace-format - msgid "{prog} will only download packages for the transaction." - msgstr "{prog} はトランザクションでパッケージのダウンロードのみ行います。" - --#: dnf/cli/cli.py:213 -+#: dnf/cli/cli.py:214 - #, python-brace-format - msgid "" - "{prog} will only download packages, install gpg keys, and check the " - "transaction." - msgstr "{prog} はパッケージのダウンロード、gpgキーのインストール、トランザクションのチェックのみ行います。" - --#: dnf/cli/cli.py:217 -+#: dnf/cli/cli.py:218 - msgid "Operation aborted." - msgstr "操作が中断されました。" - --#: dnf/cli/cli.py:224 -+#: dnf/cli/cli.py:225 - msgid "Downloading Packages:" - msgstr "パッケージのダウンロード:" - --#: dnf/cli/cli.py:230 -+#: dnf/cli/cli.py:231 - msgid "Error downloading packages:" - msgstr "パッケージのダウンロード中にエラーが発生しました:" - --#: dnf/cli/cli.py:258 -+#: dnf/cli/cli.py:263 - msgid "Transaction failed" - msgstr "トランザクションが失敗しました" - --#: dnf/cli/cli.py:281 -+#: dnf/cli/cli.py:286 - msgid "" - "Refusing to automatically import keys when running unattended.\n" - "Use \"-y\" to override." -@@ -648,116 +635,95 @@ msgstr "" - "無人での実行中に鍵の自動インポートを拒否します。\n" - "オーバーライドするには \"-y\" を使用してください。" - --#: dnf/cli/cli.py:331 -+#: dnf/cli/cli.py:336 - msgid "Changelogs for {}" - msgstr "{} の Changelogs" - --#: dnf/cli/cli.py:364 dnf/cli/cli.py:505 dnf/cli/cli.py:511 -+#: dnf/cli/cli.py:369 dnf/cli/cli.py:510 dnf/cli/cli.py:516 - msgid "Obsoleting Packages" - msgstr "パッケージの廃止" - --#: dnf/cli/cli.py:393 -+#: dnf/cli/cli.py:398 - msgid "No packages marked for distribution synchronization." --msgstr "ディストリビューション同期対象のパッケージがありません" -+msgstr "ディストリビューション同期対象のパッケージがありません。" -+ -+#: dnf/cli/cli.py:424 dnf/cli/commands/group.py:395 -+#, python-format -+msgid "No package %s available." -+msgstr "利用可能なパッケージ %s がありません。" - --#: dnf/cli/cli.py:428 -+#: dnf/cli/cli.py:433 - msgid "No packages marked for downgrade." - msgstr "ダウングレード対象のパッケージはありません。" - --#: dnf/cli/cli.py:479 -+#: dnf/cli/cli.py:484 - msgid "Installed Packages" - msgstr "インストール済みパッケージ" - --#: dnf/cli/cli.py:487 -+#: dnf/cli/cli.py:492 - msgid "Available Packages" - msgstr "利用可能なパッケージ" - --#: dnf/cli/cli.py:491 -+#: dnf/cli/cli.py:496 - msgid "Autoremove Packages" - msgstr "パッケージを自動削除します" - --#: dnf/cli/cli.py:493 -+#: dnf/cli/cli.py:498 - msgid "Extra Packages" - msgstr "エクストラパッケージ" - --#: dnf/cli/cli.py:497 -+#: dnf/cli/cli.py:502 - msgid "Available Upgrades" - msgstr "利用可能なアップグレード" - --#: dnf/cli/cli.py:513 -+#: dnf/cli/cli.py:518 - msgid "Recently Added Packages" - msgstr "最近追加したパッケージ" - --#: dnf/cli/cli.py:518 -+#: dnf/cli/cli.py:522 - msgid "No matching Packages to list" - msgstr "表示するための一致したパッケージはありません" - --#: dnf/cli/cli.py:599 -+#: dnf/cli/cli.py:603 - msgid "No Matches found" - msgstr "一致したものは見つかりませんでした" - --#: dnf/cli/cli.py:609 --msgid "No transaction ID given" --msgstr "トランザクション ID は指定されていません" -- --#: dnf/cli/cli.py:614 --msgid "Not found given transaction ID" --msgstr "指定されたトランザクション ID は見つかりません" -- --#: dnf/cli/cli.py:623 --msgid "Found more than one transaction ID!" --msgstr "1 つ以上のトランザクション ID が見つかりました!" -- --#: dnf/cli/cli.py:640 --#, python-format --msgid "Transaction history is incomplete, before %u." --msgstr "%u の前のトランザクション履歴が不完全です。" -- --#: dnf/cli/cli.py:642 --#, python-format --msgid "Transaction history is incomplete, after %u." --msgstr "%u の後のトランザクション履歴が不完全です。" -- --#: dnf/cli/cli.py:689 --msgid "Undoing transaction {}, from {}" --msgstr "トランザクション {} を {} から取り消しています" -- --#: dnf/cli/cli.py:769 dnf/cli/commands/shell.py:237 -+#: dnf/cli/cli.py:670 dnf/cli/commands/shell.py:237 - #, python-format - msgid "Unknown repo: '%s'" - msgstr "不明な repo : '%s'" - --#: dnf/cli/cli.py:783 -+#: dnf/cli/cli.py:684 - #, python-format - msgid "No repository match: %s" - msgstr "一致するリポジトリーがありません: %s" - --#: dnf/cli/cli.py:817 -+#: dnf/cli/cli.py:718 - msgid "" - "This command has to be run with superuser privileges (under the root user on" - " most systems)." - msgstr "このコマンドはスーパーユーザー特権(大概のシステムではrootユーザー)で実行しなければいけません。" - --#: dnf/cli/cli.py:847 -+#: dnf/cli/cli.py:748 - #, python-format - msgid "No such command: %s. Please use %s --help" --msgstr "そのようなコマンドはありません: %s. %s --help を使用してください。" -+msgstr "そのようなコマンドはありません: %s. %s --help を使用してください" - --#: dnf/cli/cli.py:850 -+#: dnf/cli/cli.py:751 - #, python-format, python-brace-format - msgid "" - "It could be a {PROG} plugin command, try: \"{prog} install 'dnf-" - "command(%s)'\"" - msgstr "{PROG} プラグインコマンドを実行できません、試してください: \"{prog} install 'dnf-command(%s)'\"" - --#: dnf/cli/cli.py:854 -+#: dnf/cli/cli.py:755 - #, python-brace-format - msgid "" - "It could be a {prog} plugin command, but loading of plugins is currently " - "disabled." - msgstr "{prog} プラグインコマンドを実行できません、プラグインのロードが現在無効になっているようです。" - --#: dnf/cli/cli.py:912 -+#: dnf/cli/cli.py:813 - msgid "" - "--destdir or --downloaddir must be used with --downloadonly or download or " - "system-upgrade command." -@@ -765,7 +731,7 @@ msgstr "" - "--destdir または --downloaddir は、--downloadonly、download あるいは system-upgrade " - "コマンドと共に使用する必要があります。" - --#: dnf/cli/cli.py:918 -+#: dnf/cli/cli.py:819 - msgid "" - "--enable, --set-enabled and --disable, --set-disabled must be used with " - "config-manager command." -@@ -773,7 +739,7 @@ msgstr "" - "--enable と --set-enabled および --disable と --set-disabled は、config-manager " - "コマンドと共に使用しなければなりません。" - --#: dnf/cli/cli.py:1000 -+#: dnf/cli/cli.py:901 - msgid "" - "Warning: Enforcing GPG signature check globally as per active RPM security " - "policy (see 'gpgcheck' in dnf.conf(5) for how to squelch this message)" -@@ -781,38 +747,38 @@ msgstr "" - "警告: アクティブな RPM セキュリティーポリシーにより、GPG 署名の確認をグローバルに強制します " - "(このメッセージをスケルチするには、dnf.conf(5) の 'gpgcheck' を参照してください)" - --#: dnf/cli/cli.py:1020 -+#: dnf/cli/cli.py:921 - msgid "Config file \"{}\" does not exist" - msgstr "設定ファイル \"{}\" は存在しません" - --#: dnf/cli/cli.py:1040 -+#: dnf/cli/cli.py:941 - msgid "" - "Unable to detect release version (use '--releasever' to specify release " - "version)" - msgstr "リリースバージョンを検出できません (リリースバージョンを指定するには '--releasever' を使用してください)" - --#: dnf/cli/cli.py:1127 dnf/cli/commands/repoquery.py:471 -+#: dnf/cli/cli.py:1028 dnf/cli/commands/repoquery.py:471 - msgid "argument {}: not allowed with argument {}" - msgstr "引数 {}: 引数 {} と許可されていません" - --#: dnf/cli/cli.py:1134 -+#: dnf/cli/cli.py:1035 - #, python-format - msgid "Command \"%s\" already defined" - msgstr "コマンド \"%s\" はすでに定義済みです" - --#: dnf/cli/cli.py:1154 -+#: dnf/cli/cli.py:1055 - msgid "Excludes in dnf.conf: " - msgstr "dnf.conf で除外します: " - --#: dnf/cli/cli.py:1157 -+#: dnf/cli/cli.py:1058 - msgid "Includes in dnf.conf: " - msgstr "dnf.conf で含めます: " - --#: dnf/cli/cli.py:1160 -+#: dnf/cli/cli.py:1061 - msgid "Excludes in repo " - msgstr "repo で除外します " - --#: dnf/cli/cli.py:1163 -+#: dnf/cli/cli.py:1064 - msgid "Includes in repo " - msgstr "repo に含めます " - -@@ -869,7 +835,7 @@ msgid "show all packages (default)" - msgstr "すべてのパッケージを表示します (デフォルト)" - - #: dnf/cli/commands/__init__.py:171 dnf/cli/commands/__init__.py:743 --#: dnf/cli/commands/module.py:351 -+#: dnf/cli/commands/module.py:373 - msgid "show only available packages" - msgstr "利用可能なパッケージのみを表示します" - -@@ -1194,78 +1160,78 @@ msgstr "グループ情報を表示または使用します" - msgid "No group data available for configured repositories." - msgstr "設定されたリポジトリーが利用可能なグループデータはありません。" - --#: dnf/cli/commands/group.py:129 -+#: dnf/cli/commands/group.py:126 - #, python-format - msgid "Warning: Group %s does not exist." - msgstr "警告: グループ %s は存在しません。" - --#: dnf/cli/commands/group.py:170 -+#: dnf/cli/commands/group.py:167 - msgid "Warning: No groups match:" - msgstr "警告: 一致するグループはありません:" - --#: dnf/cli/commands/group.py:182 dnf/cli/commands/group.py:193 --#: dnf/cli/output.py:1226 -+#: dnf/cli/commands/group.py:179 dnf/cli/commands/group.py:190 -+#: dnf/cli/output.py:1139 - msgid "" - msgstr "" - --#: dnf/cli/commands/group.py:199 -+#: dnf/cli/commands/group.py:196 - msgid "Available Environment Groups:" - msgstr "利用可能な環境グループ:" - --#: dnf/cli/commands/group.py:201 -+#: dnf/cli/commands/group.py:198 - msgid "Installed Environment Groups:" - msgstr "インストール済みの環境グループ:" - --#: dnf/cli/commands/group.py:208 dnf/cli/commands/group.py:294 -+#: dnf/cli/commands/group.py:205 dnf/cli/commands/group.py:291 - msgid "Installed Groups:" - msgstr "インストール済みのグループ:" - --#: dnf/cli/commands/group.py:215 dnf/cli/commands/group.py:301 -+#: dnf/cli/commands/group.py:212 dnf/cli/commands/group.py:298 - msgid "Installed Language Groups:" - msgstr "インストール済みの言語グループ:" - --#: dnf/cli/commands/group.py:225 dnf/cli/commands/group.py:308 -+#: dnf/cli/commands/group.py:222 dnf/cli/commands/group.py:305 - msgid "Available Groups:" - msgstr "利用可能なグループ:" - --#: dnf/cli/commands/group.py:232 dnf/cli/commands/group.py:315 -+#: dnf/cli/commands/group.py:229 dnf/cli/commands/group.py:312 - msgid "Available Language Groups:" - msgstr "利用可能な言語グループ:" - --#: dnf/cli/commands/group.py:322 -+#: dnf/cli/commands/group.py:319 - msgid "include optional packages from group" - msgstr "グループのオプションパッケージを含めます" - --#: dnf/cli/commands/group.py:325 -+#: dnf/cli/commands/group.py:322 - msgid "show also hidden groups" - msgstr "非表示のグループも表示します" - --#: dnf/cli/commands/group.py:327 -+#: dnf/cli/commands/group.py:324 - msgid "show only installed groups" - msgstr "インストール済みのグループのみを表示します" - --#: dnf/cli/commands/group.py:329 -+#: dnf/cli/commands/group.py:326 - msgid "show only available groups" - msgstr "利用可能なグループのみを表示します" - --#: dnf/cli/commands/group.py:331 -+#: dnf/cli/commands/group.py:328 - msgid "show also ID of groups" - msgstr "グループIDも表示" - --#: dnf/cli/commands/group.py:333 -+#: dnf/cli/commands/group.py:330 - msgid "available subcommands: {} (default), {}" - msgstr "利用可能なサブコマンド: {} (default), {}" - --#: dnf/cli/commands/group.py:337 -+#: dnf/cli/commands/group.py:334 - msgid "argument for group subcommand" - msgstr "グループサブコマンドの引数" - --#: dnf/cli/commands/group.py:346 -+#: dnf/cli/commands/group.py:343 - #, python-format - msgid "Invalid groups sub-command, use: %s." --msgstr "groups のサブコマンドが無効です: %s. を使用します" -+msgstr "groups のサブコマンドが無効です: %s を使用します。" - --#: dnf/cli/commands/group.py:403 -+#: dnf/cli/commands/group.py:398 - msgid "Unable to find a mandatory group package." - msgstr "必須のグループパッケージを見つけることができません。" - -@@ -1275,25 +1241,25 @@ msgstr "トランザクション履歴を表示、または使用します" - - #: dnf/cli/commands/history.py:66 - msgid "For the store command, file path to store the transaction to" --msgstr "" -+msgstr "store コマンドの場合は、トランザクションを保存するファイルパス" - - #: dnf/cli/commands/history.py:68 - msgid "" - "For the replay command, don't check for installed packages matching those in" - " transaction" --msgstr "" -+msgstr "replay コマンドの場合は、トランザクション内のパッケージに一致するインストール済みパッケージを確認しない" - - #: dnf/cli/commands/history.py:71 - msgid "" - "For the replay command, don't check for extra packages pulled into the " - "transaction" --msgstr "" -+msgstr "replay コマンドの場合は、トランザクションにプルされた追加パッケージを確認しない" - - #: dnf/cli/commands/history.py:74 - msgid "" - "For the replay command, skip packages that are not available or have missing" - " dependencies" --msgstr "" -+msgstr "replay コマンドの場合は、利用できないパッケージや、依存関係が不足しているパッケージをスキップ" - - #: dnf/cli/commands/history.py:94 - msgid "" -@@ -1304,41 +1270,64 @@ msgstr "" - "'{}' は 1 つのトランザクション ID またはパッケージ名が必要です。" - - #: dnf/cli/commands/history.py:101 --#, fuzzy --#| msgid "No transaction ID or package name given." - msgid "No transaction file name given." --msgstr "トランザクション ID、またはパッケージ名が指定されていません。" -+msgstr "トランザクションファイル名が指定されていません。" - - #: dnf/cli/commands/history.py:103 --#, fuzzy --#| msgid "Failed to remove transaction file %s" - msgid "More than one argument given as transaction file name." --msgstr "トランザクションファイル %s の削除に失敗しました" -+msgstr "トランザクションファイル名として指定された複数の引数。" - --#: dnf/cli/commands/history.py:122 dnf/cli/commands/history.py:126 -+#: dnf/cli/commands/history.py:122 dnf/cli/commands/history.py:130 - msgid "No transaction ID or package name given." - msgstr "トランザクション ID、またはパッケージ名が指定されていません。" - --#: dnf/cli/commands/history.py:138 -+#: dnf/cli/commands/history.py:142 - #, python-format - msgid "You don't have access to the history DB: %s" - msgstr "履歴 DB にアクセスできません: %s" - --#: dnf/cli/commands/history.py:147 -+#: dnf/cli/commands/history.py:151 - #, python-format - msgid "" - "Cannot undo transaction %s, doing so would result in an inconsistent package" - " database." - msgstr "トランザクション %s を取り消すことはできません。取り消すことで、パッケージデータベースに矛盾が生じます。" - --#: dnf/cli/commands/history.py:152 -+#: dnf/cli/commands/history.py:156 - #, python-format - msgid "" - "Cannot rollback transaction %s, doing so would result in an inconsistent " - "package database." - msgstr "トランザクション %s をロールバックすることはできません。ロールバックすることで、パッケージデータベースに矛盾が生じます。" - --#: dnf/cli/commands/history.py:222 -+#: dnf/cli/commands/history.py:175 -+msgid "No transaction ID given" -+msgstr "トランザクション ID は指定されていません" -+ -+#: dnf/cli/commands/history.py:179 -+#, python-brace-format -+msgid "Transaction ID \"{0}\" not found." -+msgstr "トランザクション ID \"{0}\" が見つかりません。" -+ -+#: dnf/cli/commands/history.py:185 -+msgid "Found more than one transaction ID!" -+msgstr "1 つ以上のトランザクション ID が見つかりました!" -+ -+#: dnf/cli/commands/history.py:203 -+#, python-format -+msgid "Transaction history is incomplete, before %u." -+msgstr "%u の前のトランザクション履歴が不完全です。" -+ -+#: dnf/cli/commands/history.py:205 -+#, python-format -+msgid "Transaction history is incomplete, after %u." -+msgstr "%u の後のトランザクション履歴が不完全です。" -+ -+#: dnf/cli/commands/history.py:256 -+msgid "No packages to list" -+msgstr "一覧表示するパッケージはありません" -+ -+#: dnf/cli/commands/history.py:279 - msgid "" - "Invalid transaction ID range definition '{}'.\n" - "Use '..'." -@@ -1346,7 +1335,7 @@ msgstr "" - "無効なトランザクション ID の範囲の定義 '{}'。\n" - "'..' を使用してください。" - --#: dnf/cli/commands/history.py:226 -+#: dnf/cli/commands/history.py:283 - msgid "" - "Can't convert '{}' to transaction ID.\n" - "Use '', 'last', 'last-'." -@@ -1354,40 +1343,29 @@ msgstr "" - "'{}' をトランザクション IDに変換できません。\n" - "'', 'last', 'last-' を使用してください。" - --#: dnf/cli/commands/history.py:255 -+#: dnf/cli/commands/history.py:312 - msgid "No transaction which manipulates package '{}' was found." - msgstr "パッケージ '{}' を操作するトランザクションが見つかりません。" - --#: dnf/cli/commands/history.py:305 --#, fuzzy, python-brace-format --#| msgid "TransactionItem not found for key: {}" --msgid "Transaction ID \"{id}\" not found." --msgstr "TransactionItemが見つかりません鍵: {}" -- --#: dnf/cli/commands/history.py:313 -+#: dnf/cli/commands/history.py:357 - msgid "{} exists, overwrite?" --msgstr "" -+msgstr "{} は存在します。上書きしますか?" - --#: dnf/cli/commands/history.py:316 -+#: dnf/cli/commands/history.py:360 - msgid "Not overwriting {}, exiting." --msgstr "" -+msgstr "{} は存在するため上書きしません。" - --#: dnf/cli/commands/history.py:323 --#, fuzzy --#| msgid "Transaction failed" -+#: dnf/cli/commands/history.py:367 - msgid "Transaction saved to {}." --msgstr "トランザクションが失敗しました" -+msgstr "{} に保存されているトランザクション。" - --#: dnf/cli/commands/history.py:326 --#, fuzzy --#| msgid "Errors occurred during transaction." -+#: dnf/cli/commands/history.py:370 - msgid "Error storing transaction: {}" --msgstr "トランザクション中にエラーが発生しました。" -+msgstr "トランザクションの保存エラー: {}" - --#: dnf/cli/commands/history.py:350 --msgid "" --"Warning, the following problems occurred while replaying the transaction:" --msgstr "" -+#: dnf/cli/commands/history.py:386 -+msgid "Warning, the following problems occurred while running a transaction:" -+msgstr "警告: トランザクションの実行中に以下の問題が発生しました。" - - #: dnf/cli/commands/install.py:47 - msgid "install a package or packages on your system" -@@ -1406,7 +1384,7 @@ msgstr "一致するものが見つかりません" - msgid "Not a valid rpm file path: %s" - msgstr "有効な rpm ファイルパスではありません: %s" - --#: dnf/cli/commands/install.py:167 -+#: dnf/cli/commands/install.py:166 - #, python-brace-format - msgid "There are following alternatives for \"{0}\": {1}" - msgstr "\"{0}\"には次の選択肢があります: {1}" -@@ -1449,7 +1427,7 @@ msgid "%s marked as group installed." - msgstr "グループインストールには %s のマークがついています。" - - #: dnf/cli/commands/mark.py:85 dnf/cli/commands/shell.py:129 --#: dnf/cli/commands/shell.py:237 dnf/cli/commands/shell.py:279 -+#: dnf/cli/commands/shell.py:237 dnf/cli/commands/shell.py:282 - msgid "Error:" - msgstr "エラー:" - -@@ -1505,42 +1483,46 @@ msgid "Package {} belongs to multiple modules, skipping" - msgstr "パッケージ {} は複数のモジュールに属しています、スキップします" - - #: dnf/cli/commands/module.py:277 -+msgid "switch a module to a stream and distrosync rpm packages" -+msgstr "モジュールをストリームに切り替え、rpm パッケージを distrosync します" -+ -+#: dnf/cli/commands/module.py:299 - msgid "list modular packages" - msgstr "モジュラーパッケージをリスト" - --#: dnf/cli/commands/module.py:292 -+#: dnf/cli/commands/module.py:314 - msgid "list packages belonging to a module" - msgstr "モジュールに属するパッケージをリスト" - --#: dnf/cli/commands/module.py:327 -+#: dnf/cli/commands/module.py:349 - msgid "Interact with Modules." - msgstr "モジュールと対話します。" - --#: dnf/cli/commands/module.py:340 -+#: dnf/cli/commands/module.py:362 - msgid "show only enabled modules" - msgstr "有効なモジュールのみを表示します" - --#: dnf/cli/commands/module.py:343 -+#: dnf/cli/commands/module.py:365 - msgid "show only disabled modules" - msgstr "無効なモジュールのみを表示します" - --#: dnf/cli/commands/module.py:346 -+#: dnf/cli/commands/module.py:368 - msgid "show only installed modules or packages" - msgstr "インストールされたモジュールまたはパッケージのみ表示" - --#: dnf/cli/commands/module.py:349 -+#: dnf/cli/commands/module.py:371 - msgid "show profile content" - msgstr "プロファイルコンテンツを表示します" - --#: dnf/cli/commands/module.py:354 -+#: dnf/cli/commands/module.py:376 - msgid "remove all modular packages" - msgstr "すべてのモジュラーパッケージを削除" - --#: dnf/cli/commands/module.py:364 -+#: dnf/cli/commands/module.py:386 - msgid "Module specification" - msgstr "モジュールspec" - --#: dnf/cli/commands/module.py:386 -+#: dnf/cli/commands/module.py:408 - msgid "{} {} {}: too few arguments" - msgstr "{} {} {}: 引数が足りません" - -@@ -1843,6 +1825,8 @@ msgid "" - "display format for listing packages: \"%%{name} %%{version} ...\", use " - "--querytags to view full tag list" - msgstr "" -+"パッケージを一覧表示するための形式の表示: \"%%{name} %%{version} ...\"。--querytags " -+"を指定して完全なタグリストを表示" - - #: dnf/cli/commands/repoquery.py:198 - msgid "show available tags to use with --queryformat" -@@ -1977,7 +1961,7 @@ msgid "" - msgstr "" - "オプションの '--resolve' は、'--conflicts'、'--depends'、'--enhances'、'--provides'、'--" - "recommends'、'--requires'、'--requires-pre'、'--suggests' または '--supplements' " --"オプションのいずれか 1 つと使用する必要があります。" -+"オプションのいずれか 1 つと使用する必要があります" - - #: dnf/cli/commands/repoquery.py:305 - msgid "" -@@ -1986,7 +1970,7 @@ msgid "" - "--resolve'" - msgstr "" - "オプションの '--recursive' は、'--whatrequires ' (オプションでは '--exactdeps' ではなく、'" --"--alldeps' と共に使用) または '--requires --resolve' と共に使用する必要があります。" -+"--alldeps' と共に使用) または '--requires --resolve' と共に使用する必要があります" - - #: dnf/cli/commands/repoquery.py:312 - msgid "argument {} requires --whatrequires or --whatdepends option" -@@ -2027,22 +2011,22 @@ msgstr "KEYWORD" - msgid "Keyword to search for" - msgstr "検索のキーワード" - --#: dnf/cli/commands/search.py:61 dnf/cli/output.py:506 -+#: dnf/cli/commands/search.py:61 dnf/cli/output.py:460 - msgctxt "long" - msgid "Name" - msgstr "名前" - --#: dnf/cli/commands/search.py:62 dnf/cli/output.py:559 -+#: dnf/cli/commands/search.py:62 dnf/cli/output.py:513 - msgctxt "long" - msgid "Summary" - msgstr "概要" - --#: dnf/cli/commands/search.py:63 dnf/cli/output.py:569 -+#: dnf/cli/commands/search.py:63 dnf/cli/output.py:523 - msgctxt "long" - msgid "Description" - msgstr "説明" - --#: dnf/cli/commands/search.py:64 dnf/cli/output.py:562 -+#: dnf/cli/commands/search.py:64 dnf/cli/output.py:516 - msgid "URL" - msgstr "URL" - -@@ -2185,16 +2169,16 @@ msgstr "" - "実行 トランザクションセットの解決および実行\n" - "終了 (または 中止) シェルの終了" - --#: dnf/cli/commands/shell.py:259 -+#: dnf/cli/commands/shell.py:262 - #, python-format - msgid "Error: Cannot open %s for reading" - msgstr "エラー: 読み込み用に %s を開くことができません" - --#: dnf/cli/commands/shell.py:281 dnf/cli/main.py:187 -+#: dnf/cli/commands/shell.py:284 dnf/cli/main.py:187 - msgid "Complete!" - msgstr "完了しました!" - --#: dnf/cli/commands/shell.py:291 -+#: dnf/cli/commands/shell.py:294 - msgid "Leaving Shell" - msgstr "シェルを終了します" - -@@ -2385,8 +2369,8 @@ msgstr "重大度" - msgid "Files" - msgstr "ファイル" - --#: dnf/cli/commands/updateinfo.py:359 dnf/cli/output.py:1499 --#: dnf/cli/output.py:1772 dnf/cli/output.py:1774 -+#: dnf/cli/commands/updateinfo.py:359 dnf/cli/output.py:1652 -+#: dnf/cli/output.py:1654 dnf/util.py:591 - msgid "Installed" - msgstr "インストール済み" - -@@ -2709,13 +2693,13 @@ msgstr "引数をエンコードできません '%s': %s" - #. Translators: This is abbreviated 'Name'. Should be no longer - #. than 12 characters. You can use the full version if it is short - #. enough in your language. --#: dnf/cli/output.py:505 -+#: dnf/cli/output.py:459 - msgctxt "short" - msgid "Name" - msgstr "名前" - - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:511 -+#: dnf/cli/output.py:465 - msgid "Epoch" - msgstr "エポック" - -@@ -2723,38 +2707,38 @@ msgstr "エポック" - #. use the full (unabbreviated) term 'Version' if you think that - #. the translation to your language is not too long and will - #. always fit to limited space. --#: dnf/cli/output.py:512 dnf/cli/output.py:1335 -+#: dnf/cli/output.py:466 dnf/cli/output.py:1248 - msgctxt "short" - msgid "Version" - msgstr "バージョン" - - #. Translators: This is the full (unabbreviated) term 'Version'. --#: dnf/cli/output.py:513 dnf/cli/output.py:1337 -+#: dnf/cli/output.py:467 dnf/cli/output.py:1250 - msgctxt "long" - msgid "Version" - msgstr "バージョン" - - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:516 -+#: dnf/cli/output.py:470 - msgid "Release" - msgstr "リリース" - - #. Translators: This is abbreviated 'Architecture', used when - #. we have not enough space to display the full word. --#: dnf/cli/output.py:517 dnf/cli/output.py:1326 -+#: dnf/cli/output.py:471 dnf/cli/output.py:1239 - msgctxt "short" - msgid "Arch" - msgstr "Arch" - - #. Translators: This is the full word 'Architecture', used when - #. we have enough space. --#: dnf/cli/output.py:518 dnf/cli/output.py:1329 -+#: dnf/cli/output.py:472 dnf/cli/output.py:1242 - msgctxt "long" - msgid "Architecture" - msgstr "アーキテクチャー" - - #. Translators: This is the full (unabbreviated) term 'Size'. --#: dnf/cli/output.py:520 dnf/cli/output.py:1352 -+#: dnf/cli/output.py:474 dnf/cli/output.py:1265 - msgctxt "long" - msgid "Size" - msgstr "サイズ" -@@ -2763,32 +2747,32 @@ msgstr "サイズ" - #. not be longer than 5 characters. If the term 'Size' in your - #. language is not longer than 5 characters then you can use it - #. unabbreviated. --#: dnf/cli/output.py:520 dnf/cli/output.py:1350 -+#: dnf/cli/output.py:474 dnf/cli/output.py:1263 - msgctxt "short" - msgid "Size" - msgstr "サイズ" - - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:524 -+#: dnf/cli/output.py:478 - msgid "Source" - msgstr "ソース" - - #. Translators: This is abbreviated 'Repository', used when - #. we have not enough space to display the full word. --#: dnf/cli/output.py:525 dnf/cli/output.py:1341 -+#: dnf/cli/output.py:479 dnf/cli/output.py:1254 - msgctxt "short" - msgid "Repo" - msgstr "Repo" - - #. Translators: This is the full word 'Repository', used when - #. we have enough space. --#: dnf/cli/output.py:526 dnf/cli/output.py:1344 -+#: dnf/cli/output.py:480 dnf/cli/output.py:1257 - msgctxt "long" - msgid "Repository" - msgstr "リポジトリー" - - #. Translators: This message should be no longer than 12 chars. --#: dnf/cli/output.py:533 -+#: dnf/cli/output.py:487 - msgid "From repo" - msgstr "repo から" - -@@ -2796,312 +2780,308 @@ msgstr "repo から" - #. print(_("Committer : %s") % ucd(pkg.committer)) - #. print(_("Committime : %s") % time.ctime(pkg.committime)) - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:539 -+#: dnf/cli/output.py:493 - msgid "Packager" - msgstr "パッケージャー" - - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:541 -+#: dnf/cli/output.py:495 - msgid "Buildtime" - msgstr "ビルド時間" - - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:545 -+#: dnf/cli/output.py:499 - msgid "Install time" - msgstr "インストール時間" - - #. Translators: This message should be no longer than 12 chars. --#: dnf/cli/output.py:554 -+#: dnf/cli/output.py:508 - msgid "Installed by" - msgstr "インストール済み" - - #. Translators: This is abbreviated 'Summary'. Should be no longer - #. than 12 characters. You can use the full version if it is short - #. enough in your language. --#: dnf/cli/output.py:558 -+#: dnf/cli/output.py:512 - msgctxt "short" - msgid "Summary" - msgstr "概要" - - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:564 -+#: dnf/cli/output.py:518 - msgid "License" - msgstr "ライセンス" - - #. Translators: This is abbreviated 'Description'. Should be no longer - #. than 12 characters. You can use the full version if it is short - #. enough in your language. --#: dnf/cli/output.py:568 -+#: dnf/cli/output.py:522 - msgctxt "short" - msgid "Description" - msgstr "説明" - --#: dnf/cli/output.py:695 --msgid "No packages to list" --msgstr "一覧表示するパッケージはありません" -- --#: dnf/cli/output.py:706 -+#: dnf/cli/output.py:650 - msgid "y" - msgstr "y" - --#: dnf/cli/output.py:706 -+#: dnf/cli/output.py:650 - msgid "yes" - msgstr "はい" - --#: dnf/cli/output.py:707 -+#: dnf/cli/output.py:651 - msgid "n" - msgstr "n" - --#: dnf/cli/output.py:707 -+#: dnf/cli/output.py:651 - msgid "no" - msgstr "いいえ" - --#: dnf/cli/output.py:711 -+#: dnf/cli/output.py:655 - msgid "Is this ok [y/N]: " - msgstr "これでよろしいですか? [y/N]: " - --#: dnf/cli/output.py:715 -+#: dnf/cli/output.py:659 - msgid "Is this ok [Y/n]: " - msgstr "これでよろしいですか? [Y/n]: " - --#: dnf/cli/output.py:795 -+#: dnf/cli/output.py:739 - #, python-format - msgid "Group: %s" - msgstr "グループ: %s" - --#: dnf/cli/output.py:799 -+#: dnf/cli/output.py:743 - #, python-format - msgid " Group-Id: %s" - msgstr " グループ ID: %s" - --#: dnf/cli/output.py:801 dnf/cli/output.py:840 -+#: dnf/cli/output.py:745 dnf/cli/output.py:784 - #, python-format - msgid " Description: %s" - msgstr " 説明: %s" - --#: dnf/cli/output.py:803 -+#: dnf/cli/output.py:747 - #, python-format - msgid " Language: %s" - msgstr " 言語: %s" - --#: dnf/cli/output.py:806 -+#: dnf/cli/output.py:750 - msgid " Mandatory Packages:" - msgstr " 必須なパッケージ:" - --#: dnf/cli/output.py:807 -+#: dnf/cli/output.py:751 - msgid " Default Packages:" - msgstr " 標準パッケージ:" - --#: dnf/cli/output.py:808 -+#: dnf/cli/output.py:752 - msgid " Optional Packages:" - msgstr " オプション パッケージ:" - --#: dnf/cli/output.py:809 -+#: dnf/cli/output.py:753 - msgid " Conditional Packages:" - msgstr " 条件付きパッケージ:" - --#: dnf/cli/output.py:834 -+#: dnf/cli/output.py:778 - #, python-format - msgid "Environment Group: %s" - msgstr "環境グループ: %s" - --#: dnf/cli/output.py:837 -+#: dnf/cli/output.py:781 - #, python-format - msgid " Environment-Id: %s" - msgstr " 環境 Id: %s" - --#: dnf/cli/output.py:843 -+#: dnf/cli/output.py:787 - msgid " Mandatory Groups:" - msgstr " 必須なグループ:" - --#: dnf/cli/output.py:844 -+#: dnf/cli/output.py:788 - msgid " Optional Groups:" - msgstr " 任意なグループ:" - --#: dnf/cli/output.py:865 -+#: dnf/cli/output.py:809 - msgid "Matched from:" - msgstr "一致:" - --#: dnf/cli/output.py:879 -+#: dnf/cli/output.py:823 - #, python-format - msgid "Filename : %s" - msgstr "ファイル名 : %s" - --#: dnf/cli/output.py:904 -+#: dnf/cli/output.py:848 - #, python-format - msgid "Repo : %s" - msgstr "Repo : %s" - --#: dnf/cli/output.py:913 -+#: dnf/cli/output.py:857 - msgid "Description : " --msgstr "説明 : " -+msgstr "説明: " - --#: dnf/cli/output.py:917 -+#: dnf/cli/output.py:861 - #, python-format - msgid "URL : %s" - msgstr "URL : %s" - --#: dnf/cli/output.py:921 -+#: dnf/cli/output.py:865 - #, python-format - msgid "License : %s" - msgstr "ライセンス : %s" - --#: dnf/cli/output.py:927 -+#: dnf/cli/output.py:871 - #, python-format - msgid "Provide : %s" - msgstr "提供する : %s" - --#: dnf/cli/output.py:947 -+#: dnf/cli/output.py:891 - #, python-format - msgid "Other : %s" - msgstr "その他 : %s" - --#: dnf/cli/output.py:996 -+#: dnf/cli/output.py:940 - msgid "There was an error calculating total download size" - msgstr "ダウンロードサイズの合計を計算中にエラーが発生しました" - --#: dnf/cli/output.py:1002 -+#: dnf/cli/output.py:946 - #, python-format - msgid "Total size: %s" - msgstr "合計サイズ: %s" - --#: dnf/cli/output.py:1005 -+#: dnf/cli/output.py:949 - #, python-format - msgid "Total download size: %s" - msgstr "ダウンロードサイズの合計: %s" - --#: dnf/cli/output.py:1008 -+#: dnf/cli/output.py:952 - #, python-format - msgid "Installed size: %s" - msgstr "インストール後のサイズ: %s" - --#: dnf/cli/output.py:1026 -+#: dnf/cli/output.py:970 - msgid "There was an error calculating installed size" - msgstr "インストール後のサイズを計算中にエラーが発生しました" - --#: dnf/cli/output.py:1030 -+#: dnf/cli/output.py:974 - #, python-format - msgid "Freed space: %s" - msgstr "解放された容量: %s" - --#: dnf/cli/output.py:1039 -+#: dnf/cli/output.py:983 - msgid "Marking packages as installed by the group:" - msgstr "パッケージをグループごとにインストール済みとマークします:" - --#: dnf/cli/output.py:1046 -+#: dnf/cli/output.py:990 - msgid "Marking packages as removed by the group:" - msgstr "パッケージをグループごとに削除済みとマークします:" - --#: dnf/cli/output.py:1056 -+#: dnf/cli/output.py:1000 - msgid "Group" - msgstr "グループ" - --#: dnf/cli/output.py:1056 -+#: dnf/cli/output.py:1000 - msgid "Packages" - msgstr "パッケージ" - --#: dnf/cli/output.py:1133 -+#: dnf/cli/output.py:1046 - msgid "Installing group/module packages" - msgstr "group/moduleパッケージをインストール" - --#: dnf/cli/output.py:1134 -+#: dnf/cli/output.py:1047 - msgid "Installing group packages" - msgstr "グループパッケージのインストール" - - #. TRANSLATORS: This is for a list of packages to be installed. --#: dnf/cli/output.py:1138 -+#: dnf/cli/output.py:1051 - msgctxt "summary" - msgid "Installing" - msgstr "インストール" - - #. TRANSLATORS: This is for a list of packages to be upgraded. --#: dnf/cli/output.py:1140 -+#: dnf/cli/output.py:1053 - msgctxt "summary" - msgid "Upgrading" - msgstr "アップグレード" - - #. TRANSLATORS: This is for a list of packages to be reinstalled. --#: dnf/cli/output.py:1142 -+#: dnf/cli/output.py:1055 - msgctxt "summary" - msgid "Reinstalling" - msgstr "再インストール" - --#: dnf/cli/output.py:1144 -+#: dnf/cli/output.py:1057 - msgid "Installing dependencies" - msgstr "依存関係のインストール" - --#: dnf/cli/output.py:1145 -+#: dnf/cli/output.py:1058 - msgid "Installing weak dependencies" - msgstr "弱い依存関係のインストール" - - #. TRANSLATORS: This is for a list of packages to be removed. --#: dnf/cli/output.py:1147 -+#: dnf/cli/output.py:1060 - msgid "Removing" - msgstr "削除中" - --#: dnf/cli/output.py:1148 -+#: dnf/cli/output.py:1061 - msgid "Removing dependent packages" - msgstr "依存関係パッケージの削除" - --#: dnf/cli/output.py:1149 -+#: dnf/cli/output.py:1062 - msgid "Removing unused dependencies" - msgstr "未使用の依存関係の削除" - - #. TRANSLATORS: This is for a list of packages to be downgraded. --#: dnf/cli/output.py:1151 -+#: dnf/cli/output.py:1064 - msgctxt "summary" - msgid "Downgrading" - msgstr "ダウングレード" - --#: dnf/cli/output.py:1176 -+#: dnf/cli/output.py:1089 - msgid "Installing module profiles" - msgstr "モジュールプロファイルのインストール中" - --#: dnf/cli/output.py:1185 -+#: dnf/cli/output.py:1098 - msgid "Disabling module profiles" - msgstr "モジュールプロファイルの無効化中" - --#: dnf/cli/output.py:1194 -+#: dnf/cli/output.py:1107 - msgid "Enabling module streams" - msgstr "モジュールストリームの有効化中" - --#: dnf/cli/output.py:1202 -+#: dnf/cli/output.py:1115 - msgid "Switching module streams" - msgstr "モジュールストリームの切り替え中" - --#: dnf/cli/output.py:1210 -+#: dnf/cli/output.py:1123 - msgid "Disabling modules" - msgstr "モジュールの無効化" - --#: dnf/cli/output.py:1218 -+#: dnf/cli/output.py:1131 - msgid "Resetting modules" - msgstr "モジュールの再設定中" - --#: dnf/cli/output.py:1230 -+#: dnf/cli/output.py:1143 - msgid "Installing Environment Groups" - msgstr "環境グループのインストール中" - --#: dnf/cli/output.py:1237 -+#: dnf/cli/output.py:1150 - msgid "Upgrading Environment Groups" - msgstr "環境グループのアップグレード中" - --#: dnf/cli/output.py:1244 -+#: dnf/cli/output.py:1157 - msgid "Removing Environment Groups" - msgstr "環境グループの削除中" - --#: dnf/cli/output.py:1251 -+#: dnf/cli/output.py:1164 - msgid "Installing Groups" - msgstr "グループのインストール中" - --#: dnf/cli/output.py:1258 -+#: dnf/cli/output.py:1171 - msgid "Upgrading Groups" - msgstr "グループのアップグレード中" - --#: dnf/cli/output.py:1265 -+#: dnf/cli/output.py:1178 - msgid "Removing Groups" - msgstr "グループの削除中" - --#: dnf/cli/output.py:1281 -+#: dnf/cli/output.py:1194 - #, python-format - msgid "" - "Skipping packages with conflicts:\n" -@@ -3110,12 +3090,12 @@ msgstr "" - "競合するパッケージをスキップします:\n" - "(アップグレードを強制するにはコマンドラインに '%s' を追加します)" - --#: dnf/cli/output.py:1291 -+#: dnf/cli/output.py:1204 - #, python-format - msgid "Skipping packages with broken dependencies%s" - msgstr "壊れた dependencies%s のパッケージをスキップします" - --#: dnf/cli/output.py:1295 -+#: dnf/cli/output.py:1208 - msgid " or part of a group" - msgstr " またはグループの一部" - -@@ -3123,22 +3103,22 @@ msgstr " またはグループの一部" - #. use the full (unabbreviated) term 'Package' if you think that - #. the translation to your language is not too long and will - #. always fit to limited space. --#: dnf/cli/output.py:1320 -+#: dnf/cli/output.py:1233 - msgctxt "short" - msgid "Package" - msgstr "パッケージ" - - #. Translators: This is the full (unabbreviated) term 'Package'. --#: dnf/cli/output.py:1322 -+#: dnf/cli/output.py:1235 - msgctxt "long" - msgid "Package" - msgstr "パッケージ" - --#: dnf/cli/output.py:1371 -+#: dnf/cli/output.py:1284 - msgid "replacing" - msgstr "置き換え" - --#: dnf/cli/output.py:1378 -+#: dnf/cli/output.py:1291 - #, python-format - msgid "" - "\n" -@@ -3150,287 +3130,271 @@ msgstr "" - "%s\n" - - #. TODO: remove --#: dnf/cli/output.py:1383 dnf/cli/output.py:1932 dnf/cli/output.py:1933 -+#: dnf/cli/output.py:1296 dnf/cli/output.py:1812 dnf/cli/output.py:1813 - msgid "Install" - msgstr "インストール" - --#: dnf/cli/output.py:1387 dnf/cli/output.py:1941 -+#: dnf/cli/output.py:1300 dnf/cli/output.py:1821 - msgid "Upgrade" - msgstr "アップグレード" - --#: dnf/cli/output.py:1388 -+#: dnf/cli/output.py:1301 - msgid "Remove" - msgstr "削除" - --#: dnf/cli/output.py:1390 dnf/cli/output.py:1939 -+#: dnf/cli/output.py:1303 dnf/cli/output.py:1819 - msgid "Downgrade" - msgstr "ダウングレード" - --#: dnf/cli/output.py:1391 -+#: dnf/cli/output.py:1304 - msgid "Skip" - msgstr "スキップ" - --#: dnf/cli/output.py:1400 dnf/cli/output.py:1416 -+#: dnf/cli/output.py:1313 dnf/cli/output.py:1329 - msgid "Package" - msgid_plural "Packages" - msgstr[0] "パッケージ" - --#: dnf/cli/output.py:1418 -+#: dnf/cli/output.py:1331 - msgid "Dependent package" - msgid_plural "Dependent packages" - msgstr[0] "依存パッケージ" - --#: dnf/cli/output.py:1497 dnf/cli/output.py:1773 dnf/cli/output.py:1942 --msgid "Upgraded" --msgstr "アップグレード済み" -- --#: dnf/cli/output.py:1498 dnf/cli/output.py:1773 dnf/cli/output.py:1940 --msgid "Downgraded" --msgstr "ダウングレード済み" -- --#: dnf/cli/output.py:1503 --msgid "Reinstalled" --msgstr "再インストール済み" -- --#: dnf/cli/output.py:1504 --msgid "Skipped" --msgstr "スキップ済み" -- --#: dnf/cli/output.py:1505 --msgid "Removed" --msgstr "削除しました" -- --#: dnf/cli/output.py:1508 --msgid "Failed" --msgstr "失敗しました" -- --#: dnf/cli/output.py:1559 -+#: dnf/cli/output.py:1439 - msgid "Total" - msgstr "合計" - --#: dnf/cli/output.py:1587 -+#: dnf/cli/output.py:1467 - msgid "" - msgstr "<未設定>" - --#: dnf/cli/output.py:1588 -+#: dnf/cli/output.py:1468 - msgid "System" - msgstr "システム" - --#: dnf/cli/output.py:1638 -+#: dnf/cli/output.py:1518 - msgid "Command line" - msgstr "コマンドライン" - - #. TRANSLATORS: user names who executed transaction in history command output --#: dnf/cli/output.py:1649 -+#: dnf/cli/output.py:1529 - msgid "User name" - msgstr "ユーザー名" - --#: dnf/cli/output.py:1651 -+#: dnf/cli/output.py:1531 - msgid "ID" - msgstr "ID" - --#: dnf/cli/output.py:1653 -+#: dnf/cli/output.py:1533 - msgid "Date and time" - msgstr "日時" - --#: dnf/cli/output.py:1654 -+#: dnf/cli/output.py:1534 - msgid "Action(s)" - msgstr "動作" - --#: dnf/cli/output.py:1655 -+#: dnf/cli/output.py:1535 - msgid "Altered" - msgstr "変更されました" - --#: dnf/cli/output.py:1698 -+#: dnf/cli/output.py:1578 - msgid "No transactions" - msgstr "トランザクションがありません" - --#: dnf/cli/output.py:1699 dnf/cli/output.py:1715 -+#: dnf/cli/output.py:1579 dnf/cli/output.py:1595 - msgid "Failed history info" - msgstr "失敗した履歴情報" - --#: dnf/cli/output.py:1714 -+#: dnf/cli/output.py:1594 - msgid "No transaction ID, or package, given" - msgstr "トランザクション ID、またはパッケージが指定されていません" - --#: dnf/cli/output.py:1772 -+#: dnf/cli/output.py:1652 - msgid "Erased" - msgstr "削除されました" - --#: dnf/cli/output.py:1774 -+#: dnf/cli/output.py:1653 dnf/cli/output.py:1820 dnf/util.py:590 -+msgid "Downgraded" -+msgstr "ダウングレード済み" -+ -+#: dnf/cli/output.py:1653 dnf/cli/output.py:1822 dnf/util.py:589 -+msgid "Upgraded" -+msgstr "アップグレード済み" -+ -+#: dnf/cli/output.py:1654 - msgid "Not installed" - msgstr "インストールされていません" - --#: dnf/cli/output.py:1775 -+#: dnf/cli/output.py:1655 - msgid "Newer" - msgstr "新しい" - --#: dnf/cli/output.py:1775 -+#: dnf/cli/output.py:1655 - msgid "Older" - msgstr "古い" - --#: dnf/cli/output.py:1823 dnf/cli/output.py:1825 -+#: dnf/cli/output.py:1703 dnf/cli/output.py:1705 - msgid "Transaction ID :" - msgstr "トランザクション ID :" - --#: dnf/cli/output.py:1828 -+#: dnf/cli/output.py:1708 - msgid "Begin time :" - msgstr "開始時間 :" - --#: dnf/cli/output.py:1831 dnf/cli/output.py:1833 -+#: dnf/cli/output.py:1711 dnf/cli/output.py:1713 - msgid "Begin rpmdb :" - msgstr "開始 rpmdb :" - --#: dnf/cli/output.py:1839 -+#: dnf/cli/output.py:1719 - #, python-format - msgid "(%u seconds)" - msgstr "(%u 秒)" - --#: dnf/cli/output.py:1841 -+#: dnf/cli/output.py:1721 - #, python-format - msgid "(%u minutes)" - msgstr "(%u 分)" - --#: dnf/cli/output.py:1843 -+#: dnf/cli/output.py:1723 - #, python-format - msgid "(%u hours)" - msgstr "(%u 時間)" - --#: dnf/cli/output.py:1845 -+#: dnf/cli/output.py:1725 - #, python-format - msgid "(%u days)" - msgstr "(%u 日)" - --#: dnf/cli/output.py:1846 -+#: dnf/cli/output.py:1726 - msgid "End time :" - msgstr "終了時間 :" - --#: dnf/cli/output.py:1849 dnf/cli/output.py:1851 -+#: dnf/cli/output.py:1729 dnf/cli/output.py:1731 - msgid "End rpmdb :" - msgstr "終了 rpmdb :" - --#: dnf/cli/output.py:1858 dnf/cli/output.py:1860 -+#: dnf/cli/output.py:1738 dnf/cli/output.py:1740 - msgid "User :" - msgstr "ユーザー :" - --#: dnf/cli/output.py:1864 dnf/cli/output.py:1871 -+#: dnf/cli/output.py:1744 dnf/cli/output.py:1751 - msgid "Aborted" - msgstr "中断しました" - --#: dnf/cli/output.py:1864 dnf/cli/output.py:1867 dnf/cli/output.py:1869 --#: dnf/cli/output.py:1871 dnf/cli/output.py:1873 dnf/cli/output.py:1875 -+#: dnf/cli/output.py:1744 dnf/cli/output.py:1747 dnf/cli/output.py:1749 -+#: dnf/cli/output.py:1751 dnf/cli/output.py:1753 dnf/cli/output.py:1755 - msgid "Return-Code :" - msgstr "終了コード :" - --#: dnf/cli/output.py:1867 dnf/cli/output.py:1875 -+#: dnf/cli/output.py:1747 dnf/cli/output.py:1755 - msgid "Success" - msgstr "成功" - --#: dnf/cli/output.py:1869 -+#: dnf/cli/output.py:1749 - msgid "Failures:" - msgstr "失敗:" - --#: dnf/cli/output.py:1873 -+#: dnf/cli/output.py:1753 - msgid "Failure:" - msgstr "失敗しました:" - --#: dnf/cli/output.py:1883 dnf/cli/output.py:1885 -+#: dnf/cli/output.py:1763 dnf/cli/output.py:1765 - msgid "Releasever :" - msgstr "Releasever :" - --#: dnf/cli/output.py:1890 dnf/cli/output.py:1892 -+#: dnf/cli/output.py:1770 dnf/cli/output.py:1772 - msgid "Command Line :" - msgstr "コマンドライン :" - --#: dnf/cli/output.py:1897 dnf/cli/output.py:1899 -+#: dnf/cli/output.py:1777 dnf/cli/output.py:1779 - msgid "Comment :" - msgstr "コメント :" - --#: dnf/cli/output.py:1903 -+#: dnf/cli/output.py:1783 - msgid "Transaction performed with:" - msgstr "実行されたトランザクション:" - --#: dnf/cli/output.py:1912 -+#: dnf/cli/output.py:1792 - msgid "Packages Altered:" - msgstr "変更されたパッケージ:" - --#: dnf/cli/output.py:1918 -+#: dnf/cli/output.py:1798 - msgid "Scriptlet output:" - msgstr "Scriptlet の出力:" - --#: dnf/cli/output.py:1925 -+#: dnf/cli/output.py:1805 - msgid "Errors:" - msgstr "エラー:" - --#: dnf/cli/output.py:1934 -+#: dnf/cli/output.py:1814 - msgid "Dep-Install" - msgstr "Dep-Install" - --#: dnf/cli/output.py:1935 -+#: dnf/cli/output.py:1815 - msgid "Obsoleted" - msgstr "廃止された" - --#: dnf/cli/output.py:1936 dnf/transaction.py:84 dnf/transaction.py:85 -+#: dnf/cli/output.py:1816 dnf/transaction.py:84 dnf/transaction.py:85 - msgid "Obsoleting" - msgstr "廃止" - --#: dnf/cli/output.py:1937 -+#: dnf/cli/output.py:1817 - msgid "Erase" - msgstr "削除" - --#: dnf/cli/output.py:1938 -+#: dnf/cli/output.py:1818 - msgid "Reinstall" - msgstr "再インストール" - --#: dnf/cli/output.py:2016 -+#: dnf/cli/output.py:1892 - #, python-format - msgid "---> Package %s.%s %s will be installed" - msgstr "---> パッケージ %s.%s %s はインストールされます" - --#: dnf/cli/output.py:2018 -+#: dnf/cli/output.py:1894 - #, python-format - msgid "---> Package %s.%s %s will be an upgrade" - msgstr "---> パッケージ %s.%s %s はアップグレードされます" - --#: dnf/cli/output.py:2020 -+#: dnf/cli/output.py:1896 - #, python-format - msgid "---> Package %s.%s %s will be erased" - msgstr "---> パッケージ %s.%s %s は消去されます" - --#: dnf/cli/output.py:2022 -+#: dnf/cli/output.py:1898 - #, python-format - msgid "---> Package %s.%s %s will be reinstalled" - msgstr "---> パッケージ %s.%s %s は再インストールされます" - --#: dnf/cli/output.py:2024 -+#: dnf/cli/output.py:1900 - #, python-format - msgid "---> Package %s.%s %s will be a downgrade" - msgstr "---> パッケージ %s.%s %s はダウングレードされます" - --#: dnf/cli/output.py:2026 -+#: dnf/cli/output.py:1902 - #, python-format - msgid "---> Package %s.%s %s will be obsoleting" - msgstr "---> パッケージ %s.%s %s は廃止となります" - --#: dnf/cli/output.py:2028 -+#: dnf/cli/output.py:1904 - #, python-format - msgid "---> Package %s.%s %s will be upgraded" - msgstr "---> パッケージ %s.%s %s はアップグレードされます" - --#: dnf/cli/output.py:2030 -+#: dnf/cli/output.py:1906 - #, python-format - msgid "---> Package %s.%s %s will be obsoleted" - msgstr "---> パッケージ %s.%s %s は廃止されます" - --#: dnf/cli/output.py:2039 -+#: dnf/cli/output.py:1915 - msgid "--> Starting dependency resolution" - msgstr "--> 依存関係の解決を開始しました" - --#: dnf/cli/output.py:2044 -+#: dnf/cli/output.py:1919 - msgid "--> Finished dependency resolution" - msgstr "--> 依存関係の解決が完了しました" - --#: dnf/cli/output.py:2058 dnf/crypto.py:132 -+#: dnf/cli/output.py:1933 dnf/crypto.py:132 - #, python-format - msgid "" - "Importing GPG key 0x%s:\n" -@@ -3512,16 +3476,14 @@ msgid "Module or Group '%s' does not exist." - msgstr "モジュールまたはグループ '%s' は存在しません。" - - #: dnf/comps.py:599 --#, fuzzy, python-format --#| msgid "Environment '%s' is not installed." -+#, python-format - msgid "Environment id '%s' does not exist." --msgstr "環境 '%s' はインストールされていません。" -+msgstr "環境 id '%s' は存在しません。" - --#: dnf/comps.py:622 dnf/transaction_sr.py:443 dnf/transaction_sr.py:453 --#, fuzzy, python-format --#| msgid "Environment '%s' is not installed." -+#: dnf/comps.py:622 dnf/transaction_sr.py:477 dnf/transaction_sr.py:487 -+#, python-format - msgid "Environment id '%s' is not installed." --msgstr "環境 '%s' はインストールされていません。" -+msgstr "環境 id '%s' はインストールされていません。" - - #: dnf/comps.py:639 - #, python-format -@@ -3534,10 +3496,9 @@ msgid "Environment '%s' is not available." - msgstr "環境 '%s' は利用不可です。" - - #: dnf/comps.py:673 --#, fuzzy, python-format --#| msgid "Group_id '%s' does not exist." -+#, python-format - msgid "Group id '%s' does not exist." --msgstr "Group_id '%s' は存在しません。" -+msgstr "グループ id '%s' は存在しません。" - - #: dnf/conf/config.py:136 - #, python-format -@@ -3588,7 +3549,7 @@ msgstr "repo %s には setopt の前に %s attr. がありませんでした" - #: dnf/conf/read.py:51 - #, python-format - msgid "Warning: failed loading '%s', skipping." --msgstr "警告: '%s' のロードに失敗、スキップします。" -+msgstr "警告: '%s' のロードに失敗、スキップします。" - - #: dnf/conf/read.py:63 - msgid "Bad id for repo: {} ({}), byte = {} {}" -@@ -3628,6 +3589,11 @@ msgstr "repo %s: 0x%s はインポート済みです" - msgid "repo %s: imported key 0x%s." - msgstr "repo %s: インポート済みの鍵 0x%s。" - -+#: dnf/crypto.py:177 -+#, python-format -+msgid "retrieving repo key for %s unencrypted from %s" -+msgstr "%s から暗号化されていない %s の repo キーを取得しています" -+ - #: dnf/db/group.py:293 - msgid "" - "No available modular metadata for modular package '{}', it cannot be " -@@ -3710,7 +3676,7 @@ msgid "Modular dependency problem with Defaults:" - msgid_plural "Modular dependency problems with Defaults:" - msgstr[0] "デフォルトのモジュラー依存問題:" - --#: dnf/exceptions.py:131 dnf/module/module_base.py:686 -+#: dnf/exceptions.py:131 dnf/module/module_base.py:841 - msgid "Modular dependency problem:" - msgid_plural "Modular dependency problems:" - msgstr[0] "モジュラーの依存に関する問題:" -@@ -3764,8 +3730,8 @@ msgstr "" - "\n" - "ヒント: [d]efault, [e]nabled, [x]disabled, [i]nstalled, [a]ctive" - --#: dnf/module/module_base.py:54 dnf/module/module_base.py:421 --#: dnf/module/module_base.py:477 dnf/module/module_base.py:543 -+#: dnf/module/module_base.py:54 dnf/module/module_base.py:547 -+#: dnf/module/module_base.py:603 dnf/module/module_base.py:669 - msgid "Ignoring unnecessary profile: '{}/{}'" - msgstr "不要なプロファイルを無視します: '{}/{}'" - -@@ -3774,17 +3740,17 @@ msgstr "不要なプロファイルを無視します: '{}/{}'" - msgid "All matches for argument '{0}' in module '{1}:{2}' are not active" - msgstr "モジュール '{1}:{2}' の引数 '{0}' に一致するものはすべて非アクティブです" - --#: dnf/module/module_base.py:92 -+#: dnf/module/module_base.py:92 dnf/module/module_base.py:202 - #, python-brace-format - msgid "Installing module '{0}' from Fail-Safe repository {1} is not allowed" - msgstr "フェイルセーフレポジトリー {1} からのモジュール '{0}' インストールは許可されていません" - --#: dnf/module/module_base.py:102 -+#: dnf/module/module_base.py:102 dnf/module/module_base.py:212 - msgid "" - "Unable to match profile for argument {}. Available profiles for '{}:{}': {}" - msgstr "引数 {} でプロファイルが見つかりません。利用可能プロファイル '{}:{}': {}" - --#: dnf/module/module_base.py:106 -+#: dnf/module/module_base.py:106 dnf/module/module_base.py:216 - msgid "Unable to match profile for argument {}" - msgstr "引数 {} でプロファイルが見つかりません" - -@@ -3800,41 +3766,55 @@ msgstr "モジュール {}:{} にプロファイルがありません" - msgid "Default profile {} not available in module {}:{}" - msgstr "デフォルトのプロファイル {} はモジュール {}:{} で利用不可です" - --#: dnf/module/module_base.py:142 -+#: dnf/module/module_base.py:142 dnf/module/module_base.py:245 - msgid "Installing module from Fail-Safe repository is not allowed" - msgstr "フェイルセーフレポジトリーからのモジュールインストールは許可されていません" - --#: dnf/module/module_base.py:159 dnf/module/module_base.py:193 --#: dnf/module/module_base.py:337 dnf/module/module_base.py:355 --#: dnf/module/module_base.py:363 dnf/module/module_base.py:417 --#: dnf/module/module_base.py:473 dnf/module/module_base.py:539 -+#: dnf/module/module_base.py:194 -+#, python-brace-format -+msgid "No active matches for argument '{0}' in module '{1}:{2}'" -+msgstr "モジュール '{1}:{2}' の引数 '{0}' には、アクティブな一致がありません" -+ -+#: dnf/module/module_base.py:226 -+#, python-brace-format -+msgid "Installed profile '{0}' is not available in module '{1}' stream '{2}'" -+msgstr "インストールされたプロファイル '{0}' は、モジュール '{1}' ストリーム '{2}' では利用できません" -+ -+#: dnf/module/module_base.py:265 -+msgid "No packages available to distrosync for package name '{}'" -+msgstr "パッケージ名 '{}' 向けに distrosync するパッケージはありません" -+ -+#: dnf/module/module_base.py:308 dnf/module/module_base.py:452 -+#: dnf/module/module_base.py:477 dnf/module/module_base.py:496 -+#: dnf/module/module_base.py:543 dnf/module/module_base.py:599 -+#: dnf/module/module_base.py:665 dnf/module/module_base.py:827 - msgid "Unable to resolve argument {}" - msgstr "引数 {} を解決できません" - --#: dnf/module/module_base.py:160 --msgid "No match for package {}" --msgstr "パッケージ {} に一致するものはありません" -- --#: dnf/module/module_base.py:204 -+#: dnf/module/module_base.py:319 - #, python-brace-format - msgid "Upgrading module '{0}' from Fail-Safe repository {1} is not allowed" - msgstr "フェイルセーフレポジトリー {1} からのモジュール '{0}' アップグレードは許可されていません" - --#: dnf/module/module_base.py:223 dnf/module/module_base.py:251 -+#: dnf/module/module_base.py:338 dnf/module/module_base.py:366 - msgid "Unable to match profile in argument {}" - msgstr "引数 {} でプロファイルを一致できません" - --#: dnf/module/module_base.py:231 -+#: dnf/module/module_base.py:346 - msgid "Upgrading module from Fail-Safe repository is not allowed" - msgstr "フェイルセーフレポジトリーからのモジュールアップグレードは許可されていません" - --#: dnf/module/module_base.py:367 -+#: dnf/module/module_base.py:500 - msgid "" - "Only module name is required. Ignoring unneeded information in argument: " - "'{}'" - msgstr "モジュール名のみが必要です。引数で不必要な情報を無視します: '{}'" - --#: dnf/package.py:298 -+#: dnf/module/module_base.py:828 -+msgid "No match for package {}" -+msgstr "パッケージ {} に一致するものはありません" -+ -+#: dnf/package.py:333 - #, python-format - msgid "%s: %s check failed: %s vs %s" - msgstr "%s: %s の確認に失敗しました: %s vs %s" -@@ -3848,12 +3828,12 @@ msgstr "%s は空のファイルです" - #: dnf/persistor.py:91 - #, python-format - msgid "Failed to load expired repos cache: %s" --msgstr "" -+msgstr "期限切れのリポジトリーキャッシュのロードに失敗しました: %s" - - #: dnf/persistor.py:99 - #, python-format - msgid "Failed to store expired repos cache: %s" --msgstr "" -+msgstr "期限切れのリポジトリーキャッシュの保存に失敗しました: %s" - - #: dnf/persistor.py:106 - msgid "Failed storing last makecache time." -@@ -3915,6 +3895,14 @@ msgstr "%s から %s repo を追加しました" - msgid "Errors occurred during test transaction." - msgstr "テストトランザクション中にエラーが発生しました。" - -+#: dnf/sack.py:47 -+msgid "" -+"allow_vendor_change is disabled. This option is currently not supported for " -+"downgrade and distro-sync commands" -+msgstr "" -+"allow_vendor_change は無効になっています。このオプションは、downgrade コマンドおよび distro-sync " -+"コマンドではサポートされていません" -+ - #. TRANSLATORS: This is for a single package currently being downgraded. - #: dnf/transaction.py:80 - msgctxt "currently" -@@ -3961,168 +3949,200 @@ msgstr "scriptletの実行中" - msgid "Preparing" - msgstr "準備" - --#: dnf/transaction_sr.py:60 -+#: dnf/transaction_sr.py:66 - #, python-brace-format --msgid "Errors in \"{filename}\":" --msgstr "" -+msgid "" -+"The following problems occurred while replaying the transaction from file " -+"\"{filename}\":" -+msgstr "ファイル \"{filename}\" からのトランザクションの再生中に以下の問題が発生しました。" - --#: dnf/transaction_sr.py:70 --#, python-brace-format --msgid "Error in \"{filename}\": {error}" --msgstr "" -+#: dnf/transaction_sr.py:68 -+msgid "The following problems occurred while running a transaction:" -+msgstr "トランザクションの実行中に以下の問題が発生しました。" - --#: dnf/transaction_sr.py:87 -+#: dnf/transaction_sr.py:89 - #, python-brace-format - msgid "Invalid major version \"{major}\", number expected." --msgstr "" -+msgstr "無効なメジャーバージョン \"{major}\"。数字が必要です。" - --#: dnf/transaction_sr.py:95 -+#: dnf/transaction_sr.py:97 - #, python-brace-format - msgid "Invalid minor version \"{minor}\", number expected." --msgstr "" -+msgstr "無効なマイナーバージョン \"{minor}\"。数字が必要です。" - --#: dnf/transaction_sr.py:101 -+#: dnf/transaction_sr.py:103 - #, python-brace-format - msgid "" - "Incompatible major version \"{major}\", supported major version is " - "\"{major_supp}\"." --msgstr "" -+msgstr "互換性のないメジャーバージョン \"{major}\"。サポートされているメジャーバージョンは \"{major_supp}\" です。" -+ -+#: dnf/transaction_sr.py:224 -+msgid "" -+"Conflicting TransactionReplay arguments have been specified: filename, data" -+msgstr "競合する TransactionReplay 引数が指定されています。filename, data" - --#: dnf/transaction_sr.py:244 -+#: dnf/transaction_sr.py:265 - #, python-brace-format - msgid "Unexpected type of \"{id}\", {exp} expected." --msgstr "" -+msgstr "予期しない {id}\" のタイプ。{exp} が必要です。" - --#: dnf/transaction_sr.py:250 -+#: dnf/transaction_sr.py:271 - #, python-brace-format - msgid "Missing key \"{key}\"." --msgstr "" -+msgstr "\"{key}\" キーがありません。" - --#: dnf/transaction_sr.py:263 -+#: dnf/transaction_sr.py:285 - #, python-brace-format - msgid "Missing object key \"{key}\" in an rpm." --msgstr "" -+msgstr "オブジェクトキー \"{key}\" が rpm にありません。" - --#: dnf/transaction_sr.py:267 -+#: dnf/transaction_sr.py:289 - #, python-brace-format - msgid "Unexpected value of package reason \"{reason}\" for rpm nevra \"{nevra}\"." --msgstr "" -+msgstr "rpm nevra \"{nevra}\" の予期しないパッケージ理由 \"{reason}\" の値。" - --#: dnf/transaction_sr.py:275 -+#: dnf/transaction_sr.py:297 - #, python-brace-format - msgid "Cannot parse NEVRA for package \"{nevra}\"." --msgstr "" -+msgstr "パッケージ \"{nevra}\" の NEVRA を解析できません。" - --#: dnf/transaction_sr.py:286 -+#: dnf/transaction_sr.py:321 - #, python-brace-format - msgid "Cannot find rpm nevra \"{nevra}\"." --msgstr "" -+msgstr "rpm nevra \"{nevra}\" を見つけることはできません。" - --#: dnf/transaction_sr.py:301 --#, fuzzy, python-brace-format --#| msgid "Package %s is already installed." -+#: dnf/transaction_sr.py:336 -+#, python-brace-format - msgid "Package \"{na}\" is already installed for action \"{action}\"." --msgstr "パッケージ %s は既にインストールされています。" -+msgstr "パッケージ \"{na}\" は、アクション \"{action}\" 用に既にインストールされています。" - --#: dnf/transaction_sr.py:311 -+#: dnf/transaction_sr.py:345 - #, python-brace-format - msgid "" - "Package nevra \"{nevra}\" not available in repositories for action " - "\"{action}\"." --msgstr "" -+msgstr "アクション \"{action}\" に利用できる パッケージ nevra \"{nevra}\" はレポジトリーにありません。" - --#: dnf/transaction_sr.py:322 -+#: dnf/transaction_sr.py:356 - #, python-brace-format - msgid "Package nevra \"{nevra}\" not installed for action \"{action}\"." --msgstr "" -+msgstr "アクション \"{action}\" には、パッケージ nevra \"{nevra}\" インストールされていません。" - --#: dnf/transaction_sr.py:336 -+#: dnf/transaction_sr.py:370 - #, python-brace-format - msgid "Unexpected value of package action \"{action}\" for rpm nevra \"{nevra}\"." --msgstr "" -+msgstr "rpm nevra \"{nevra}\" の、パッケージアクション \"{action}\" の予期しない値。" - --#: dnf/transaction_sr.py:343 --#, fuzzy, python-format --#| msgid "Module or Group '%s' is not available." -+#: dnf/transaction_sr.py:377 -+#, python-format - msgid "Group id '%s' is not available." --msgstr "モジュールまたはグループ '%s' は利用不可です。" -+msgstr "グループ id '%s' は利用できません。" - --#: dnf/transaction_sr.py:364 -+#: dnf/transaction_sr.py:398 - #, python-brace-format - msgid "Missing object key \"{key}\" in groups.packages." --msgstr "" -+msgstr "オブジェクトキー \"{key}\" が groups.packages に含まれません。" - --#: dnf/transaction_sr.py:377 dnf/transaction_sr.py:387 --#, fuzzy, python-format --#| msgid "Module or Group '%s' is not installed." -+#: dnf/transaction_sr.py:411 dnf/transaction_sr.py:421 -+#, python-format - msgid "Group id '%s' is not installed." --msgstr "モジュールまたはグループ '%s' がインストールされていません。" -+msgstr "グループ id '%s' がインストールされていません。" - --#: dnf/transaction_sr.py:398 --#, fuzzy, python-format --#| msgid "Environment '%s' is not available." -+#: dnf/transaction_sr.py:432 -+#, python-format - msgid "Environment id '%s' is not available." --msgstr "環境 '%s' は利用不可です。" -+msgstr "環境 id '%s' は利用できません。" - --#: dnf/transaction_sr.py:422 -+#: dnf/transaction_sr.py:456 - #, python-brace-format - msgid "" - "Invalid value \"{group_type}\" of environments.groups.group_type, only " - "\"mandatory\" or \"optional\" is supported." - msgstr "" -+"environments.groups.group_type の無効な値 \"{group_type}\"。\"mandatory\" または " -+"\"optional\" のみに対応しています。" - --#: dnf/transaction_sr.py:430 -+#: dnf/transaction_sr.py:464 - #, python-brace-format - msgid "Missing object key \"{key}\" in environments.groups." --msgstr "" -+msgstr "オブジェクトキー \"{key}\" が environments.groups に含まれません。" - --#: dnf/transaction_sr.py:508 -+#: dnf/transaction_sr.py:542 - #, python-brace-format - msgid "Unexpected value of group action \"{action}\" for group \"{group}\"." --msgstr "" -+msgstr "グループ \"{group}\" の グループアクション \"{action}\" の予期しない値。" - --#: dnf/transaction_sr.py:513 -+#: dnf/transaction_sr.py:547 - #, python-brace-format - msgid "Missing object key \"{key}\" in a group." --msgstr "" -+msgstr "オブジェクトキー \"{key}\" がグループ内にありません。" - --#: dnf/transaction_sr.py:537 -+#: dnf/transaction_sr.py:571 - #, python-brace-format - msgid "Unexpected value of environment action \"{action}\" for environment \"{env}\"." --msgstr "" -+msgstr "環境 \"{env}\" の環境アクション \"{action}\" の予期しない値。" - --#: dnf/transaction_sr.py:542 -+#: dnf/transaction_sr.py:576 - #, python-brace-format - msgid "Missing object key \"{key}\" in an environment." --msgstr "" -+msgstr "オブジェクトキー \"{key}\" が環境にありません。" - --#: dnf/transaction_sr.py:581 -+#: dnf/transaction_sr.py:615 - #, python-brace-format - msgid "" - "Package nevra \"{nevra}\", which is not present in the transaction file, was" - " pulled into the transaction." --msgstr "" -+msgstr "トランザクションファイルに存在しないパッケージ nevra \"{nevra}\" がトランザクションにプルされていました。" - - # translation auto-copied from project jbpm-designer, version 6.0.1, document - # org.jbpm/jbpm-designer- - # api/resources/org/jbpm/designer/resources/i18n/DesignerConstants, author - # nmirasch --#: dnf/util.py:391 dnf/util.py:393 -+#: dnf/util.py:393 dnf/util.py:395 - msgid "Problem" - msgstr "問題" - --#: dnf/util.py:444 -+#: dnf/util.py:446 - msgid "TransactionItem not found for key: {}" - msgstr "TransactionItemが見つかりません鍵: {}" - --#: dnf/util.py:454 -+#: dnf/util.py:456 - msgid "TransactionSWDBItem not found for key: {}" - msgstr "TransactionSWDBItemが見つかりません鍵: {}" - --#: dnf/util.py:457 -+#: dnf/util.py:459 - msgid "Errors occurred during transaction." - msgstr "トランザクション中にエラーが発生しました。" - -+#: dnf/util.py:595 -+msgid "Reinstalled" -+msgstr "再インストール済み" -+ -+#: dnf/util.py:596 -+msgid "Skipped" -+msgstr "スキップ済み" -+ -+#: dnf/util.py:597 -+msgid "Removed" -+msgstr "削除しました" -+ -+#: dnf/util.py:600 -+msgid "Failed" -+msgstr "失敗しました" -+ -+#~ msgid "Action not handled: {}" -+#~ msgstr "動作は対処されていません: {}" -+ -+#~ msgid "no package matched" -+#~ msgstr "一致したパッケージはありません。" -+ -+#~ msgid "Not found given transaction ID" -+#~ msgstr "指定されたトランザクション ID は見つかりません" -+ -+#~ msgid "Undoing transaction {}, from {}" -+#~ msgstr "トランザクション {} を {} から取り消しています" -+ - #~ msgid "format for displaying found packages" - #~ msgstr "見つかったパッケージを表示する形式" - -diff --git a/po/ko.po b/po/ko.po -index 449f6130..9f37ae13 100644 ---- a/po/ko.po -+++ b/po/ko.po -@@ -5,7 +5,7 @@ msgid "" - msgstr "" - "Project-Id-Version: PACKAGE VERSION\n" - "Report-Msgid-Bugs-To: \n" --"POT-Creation-Date: 2020-10-05 09:18-0400\n" -+"POT-Creation-Date: 2021-02-22 09:22+0100\n" - "PO-Revision-Date: 2020-09-12 11:29+0000\n" - "Last-Translator: Ludek Janda \n" - "Language-Team: Korean \n" -@@ -72,7 +72,7 @@ msgstr "알 수없는 설정: %s=%s in %s; %s" - msgid "Unknown configuration option: %s = %s in %s" - msgstr "알 수없는 옵션 : %s = %s in %s" - --#: dnf/automatic/main.py:237 dnf/cli/cli.py:299 -+#: dnf/automatic/main.py:237 dnf/cli/cli.py:304 - msgid "GPG check FAILED" - msgstr "GPG 확인 실패" - -@@ -85,9 +85,11 @@ msgid "Started dnf-automatic." - msgstr "dnf-automatic을 시작했습니다." - - #: dnf/automatic/main.py:308 --#, python-format --msgid "Sleep for %s seconds" --msgstr "%s 초 동안 절전합니다" -+#, fuzzy -+#| msgid "Sleep for %s seconds" -+msgid "Sleep for {} second" -+msgid_plural "Sleep for {} seconds" -+msgstr[0] "%s 초 동안 절전합니다" - - #: dnf/automatic/main.py:315 - msgid "System is off-line." -@@ -99,7 +101,7 @@ msgstr "" - msgid "Error: %s" - msgstr "오류: %s" - --#: dnf/base.py:146 -+#: dnf/base.py:146 dnf/base.py:472 dnf/base.py:474 - msgid "loading repo '{}' failure: {}" - msgstr "repo '{}'의 로드에 실패했습니다 : {}" - -@@ -107,236 +109,236 @@ msgstr "repo '{}'의 로드에 실패했습니다 : {}" - msgid "Loading repository '{}' has failed" - msgstr "리포지토리 '{}'의 로드에 실패했습니다" - --#: dnf/base.py:320 -+#: dnf/base.py:322 - msgid "Metadata timer caching disabled when running on metered connection." - msgstr "데이터 통신 연결을 사용할 때 메타 데이터 타이머 캐싱을 비활성화합니다." - --#: dnf/base.py:325 -+#: dnf/base.py:327 - msgid "Metadata timer caching disabled when running on a battery." - msgstr "배터리를 사용할할 때 메타 데이터 타이머 캐싱을 비활성화합니다." - --#: dnf/base.py:330 -+#: dnf/base.py:332 - msgid "Metadata timer caching disabled." - msgstr "메타 데이터 타이머 캐싱이 비활성화되었습니다." - --#: dnf/base.py:335 -+#: dnf/base.py:337 - msgid "Metadata cache refreshed recently." - msgstr "최근에 메타 데이터 캐시가 새로 고쳐졌습니다." - --#: dnf/base.py:341 dnf/cli/commands/__init__.py:91 -+#: dnf/base.py:343 dnf/cli/commands/__init__.py:91 - msgid "There are no enabled repositories in \"{}\"." - msgstr "\"{}\"에 사용 가능한 저장소가 없습니다." - --#: dnf/base.py:348 -+#: dnf/base.py:350 - #, python-format - msgid "%s: will never be expired and will not be refreshed." - msgstr "%s: 만료되지 않고 새로 고침되지 않습니다." - --#: dnf/base.py:350 -+#: dnf/base.py:352 - #, python-format - msgid "%s: has expired and will be refreshed." - msgstr "%s: 만료되어 새로 고침됩니다." - - #. expires within the checking period: --#: dnf/base.py:354 -+#: dnf/base.py:356 - #, python-format - msgid "%s: metadata will expire after %d seconds and will be refreshed now" - msgstr "%s: 메타 데이터는 %d 초 이후에 만료되며 이제 새로 고침됩니다." - --#: dnf/base.py:358 -+#: dnf/base.py:360 - #, python-format - msgid "%s: will expire after %d seconds." - msgstr "%s: %d 초 후에 만료됩니다." - - #. performs the md sync --#: dnf/base.py:364 -+#: dnf/base.py:366 - msgid "Metadata cache created." - msgstr "메타 데이터 캐시가 생성되었습니다." - --#: dnf/base.py:397 -+#: dnf/base.py:399 dnf/base.py:466 - #, python-format - msgid "%s: using metadata from %s." - msgstr "%s: %s에서 메타 데이터 사용 중" - --#: dnf/base.py:409 -+#: dnf/base.py:411 dnf/base.py:479 - #, python-format - msgid "Ignoring repositories: %s" - msgstr "리포지토리를 무시합니다: %s" - --#: dnf/base.py:412 -+#: dnf/base.py:414 - #, python-format - msgid "Last metadata expiration check: %s ago on %s." - msgstr "마지막 메타 데이터 만료 확인 :%s. %s 이전에 확인" - --#: dnf/base.py:443 -+#: dnf/base.py:507 - msgid "" - "The downloaded packages were saved in cache until the next successful " - "transaction." - msgstr "다운로드된 패키지는 다음 번 성공적인 트랜잭션까지 캐시에 저장됩니다." - --#: dnf/base.py:445 -+#: dnf/base.py:509 - #, python-format - msgid "You can remove cached packages by executing '%s'." - msgstr "'%s'을/를 실행하여 캐시 패키지를 삭제할 수 있습니다." - --#: dnf/base.py:535 -+#: dnf/base.py:599 - #, python-format - msgid "Invalid tsflag in config file: %s" - msgstr "설정 파일에서 tsflag 사용이 잘못되었습니다: %s" - --#: dnf/base.py:591 -+#: dnf/base.py:655 - #, python-format - msgid "Failed to add groups file for repository: %s - %s" - msgstr "리포지토리의 그룹 파일을 추가하지 못했습니다. %s - %s" - --#: dnf/base.py:823 -+#: dnf/base.py:887 - msgid "Running transaction check" - msgstr "트랜잭션 확인 실행 중" - --#: dnf/base.py:831 -+#: dnf/base.py:895 - msgid "Error: transaction check vs depsolve:" - msgstr "오류 : 트랜잭션 확인 및 종속성 해결 오류" - --#: dnf/base.py:837 -+#: dnf/base.py:901 - msgid "Transaction check succeeded." - msgstr "트랜잭션 확인에 성공했습니다." - --#: dnf/base.py:840 -+#: dnf/base.py:904 - msgid "Running transaction test" - msgstr "트랜잭션 테스트 실행 중" - --#: dnf/base.py:850 dnf/base.py:992 -+#: dnf/base.py:914 dnf/base.py:1065 - msgid "RPM: {}" - msgstr "RPM: {}" - --#: dnf/base.py:851 -+#: dnf/base.py:915 - msgid "Transaction test error:" - msgstr "트랜잭션 테스트 오류:" - --#: dnf/base.py:862 -+#: dnf/base.py:926 - msgid "Transaction test succeeded." - msgstr "트랜잭션 테스트에 성공했습니다." - --#: dnf/base.py:883 -+#: dnf/base.py:947 - msgid "Running transaction" - msgstr "트랜잭션 실행 중" - --#: dnf/base.py:911 -+#: dnf/base.py:984 - msgid "Disk Requirements:" - msgstr "디스크 요구 사항 :" - --#: dnf/base.py:914 -+#: dnf/base.py:987 - #, python-brace-format - msgid "At least {0}MB more space needed on the {1} filesystem." - msgid_plural "At least {0}MB more space needed on the {1} filesystem." - msgstr[0] "{1} 파일 시스템에 최소 {0}MB의 공간이 더 필요합니다." - --#: dnf/base.py:921 -+#: dnf/base.py:994 - msgid "Error Summary" - msgstr "오류 요약" - --#: dnf/base.py:947 -+#: dnf/base.py:1020 - #, python-brace-format - msgid "RPMDB altered outside of {prog}." - msgstr "RPMDB는 {prog} 외부에서 변경되었습니다." - --#: dnf/base.py:993 dnf/base.py:1001 -+#: dnf/base.py:1066 dnf/base.py:1074 - msgid "Could not run transaction." - msgstr "트랜잭션을 실행할 수 없습니다." - --#: dnf/base.py:996 -+#: dnf/base.py:1069 - msgid "Transaction couldn't start:" - msgstr "트랜잭션을 시작할 수 없습니다 :" - --#: dnf/base.py:1010 -+#: dnf/base.py:1083 - #, python-format - msgid "Failed to remove transaction file %s" - msgstr "%s 트랜잭션 파일을 삭제하지 못했습니다" - --#: dnf/base.py:1092 -+#: dnf/base.py:1165 - msgid "Some packages were not downloaded. Retrying." - msgstr "일부 패키지가 다운로드되지 않았습니다. 다시 시도 중입니다." - --#: dnf/base.py:1122 -+#: dnf/base.py:1195 - #, python-format - msgid "Delta RPMs reduced %.1f MB of updates to %.1f MB (%d.1%% saved)" - msgstr "Delta RPM이 %.1f MB의 업데이트를 %.1f MB로 줄였습니다. (%d.1 %% 절약됨)" - --#: dnf/base.py:1125 -+#: dnf/base.py:1198 - #, python-format - msgid "" - "Failed Delta RPMs increased %.1f MB of updates to %.1f MB (%d.1%% wasted)" - msgstr "Delta RPM은 %.1f MB의 업데이트를 %.1f MB로 줄이는데 실패했습니다. (%d.1 %% 손실됨)" - --#: dnf/base.py:1167 -+#: dnf/base.py:1240 - msgid "Cannot add local packages, because transaction job already exists" - msgstr "트랜잭션 작업이 이미 존재하므로 로컬 패키지를 추가할 수 없습니다" - --#: dnf/base.py:1181 -+#: dnf/base.py:1254 - msgid "Could not open: {}" - msgstr "열 수 없음 : {}" - --#: dnf/base.py:1219 -+#: dnf/base.py:1292 - #, python-format - msgid "Public key for %s is not installed" - msgstr "%s의 공개 키는 설치되어 있지 않습니다." - --#: dnf/base.py:1223 -+#: dnf/base.py:1296 - #, python-format - msgid "Problem opening package %s" - msgstr "%s 패키지를 여는 중에 문제가 발생했습니다" - --#: dnf/base.py:1231 -+#: dnf/base.py:1304 - #, python-format - msgid "Public key for %s is not trusted" - msgstr "%s의 공개 키는 신뢰할 수 없습니다" - --#: dnf/base.py:1235 -+#: dnf/base.py:1308 - #, python-format - msgid "Package %s is not signed" - msgstr "%s 패키지가 서명되지 않았습니다" - --#: dnf/base.py:1265 -+#: dnf/base.py:1338 - #, python-format - msgid "Cannot remove %s" - msgstr "%s을/를 삭제할 수 없습니다." - --#: dnf/base.py:1269 -+#: dnf/base.py:1342 - #, python-format - msgid "%s removed" - msgstr "%s가 삭제되었습니다" - --#: dnf/base.py:1549 -+#: dnf/base.py:1622 - msgid "No match for group package \"{}\"" - msgstr "그룹 패키지 \"{}\"에 일치하는 항목이 없습니다" - --#: dnf/base.py:1635 -+#: dnf/base.py:1708 - #, python-format - msgid "Adding packages from group '%s': %s" - msgstr "'%s' 그룹에서 패키지 추가: %s" - --#: dnf/base.py:1658 dnf/cli/cli.py:219 dnf/cli/commands/__init__.py:442 -+#: dnf/base.py:1731 dnf/cli/cli.py:220 dnf/cli/commands/__init__.py:442 - #: dnf/cli/commands/__init__.py:499 dnf/cli/commands/__init__.py:592 - #: dnf/cli/commands/__init__.py:641 dnf/cli/commands/install.py:80 - #: dnf/cli/commands/install.py:103 dnf/cli/commands/install.py:110 - msgid "Nothing to do." - msgstr "처리가 필요하지 않습니다" - --#: dnf/base.py:1676 -+#: dnf/base.py:1749 - msgid "No groups marked for removal." - msgstr "제거할 패키지 그룹이 없습니다" - --#: dnf/base.py:1710 -+#: dnf/base.py:1783 - msgid "No group marked for upgrade." - msgstr "업그레이드용으로 표시된 그룹이 없습니다." - --#: dnf/base.py:1925 -+#: dnf/base.py:1997 - #, python-format - msgid "Package %s not installed, cannot downgrade it." - msgstr "%s 패키지가 설치되어 있지 않기 때문에 다운 그레이드할 수 없습니다." - --#: dnf/base.py:1927 dnf/base.py:1946 dnf/base.py:1959 dnf/base.py:1980 --#: dnf/base.py:2029 dnf/base.py:2037 dnf/base.py:2172 dnf/cli/cli.py:411 -+#: dnf/base.py:1999 dnf/base.py:2018 dnf/base.py:2031 dnf/base.py:2052 -+#: dnf/base.py:2101 dnf/base.py:2109 dnf/base.py:2243 dnf/cli/cli.py:416 - #: dnf/cli/commands/__init__.py:425 dnf/cli/commands/__init__.py:482 - #: dnf/cli/commands/__init__.py:586 dnf/cli/commands/__init__.py:633 - #: dnf/cli/commands/__init__.py:711 dnf/cli/commands/install.py:147 -@@ -346,141 +348,127 @@ msgstr "%s 패키지가 설치되어 있지 않기 때문에 다운 그레이드 - msgid "No match for argument: %s" - msgstr "일치하는 인수가 없습니다 : %s" - --#: dnf/base.py:1934 -+#: dnf/base.py:2006 - #, python-format - msgid "Package %s of lower version already installed, cannot downgrade it." - msgstr "%s 패키지의 하위 버전이 이미 설치되어 있으므로 다운 그레이드할 수 없습니다." - --#: dnf/base.py:1957 -+#: dnf/base.py:2029 - #, python-format - msgid "Package %s not installed, cannot reinstall it." - msgstr "%s 패키지가 설치되어 있지 않기 때문에 다시 설치할 수 없습니다." - --#: dnf/base.py:1972 -+#: dnf/base.py:2044 - #, python-format - msgid "File %s is a source package and cannot be updated, ignoring." - msgstr "%s 파일은 소스 패키지이며 업데이트할 수 없습니다. 무시합니다." - --#: dnf/base.py:1978 -+#: dnf/base.py:2050 - #, python-format - msgid "Package %s not installed, cannot update it." - msgstr "%s 패키지가 설치되어 있지 않기 때문에 업데이트할 수 없습니다." - --#: dnf/base.py:1987 -+#: dnf/base.py:2059 - #, python-format - msgid "" - "The same or higher version of %s is already installed, cannot update it." - msgstr "%s 이상의 버전이 이미 설치되어 있으므로 업데이트할 수 없습니다." - --#: dnf/base.py:2026 dnf/cli/commands/reinstall.py:81 -+#: dnf/base.py:2098 dnf/cli/commands/reinstall.py:81 - #, python-format - msgid "Package %s available, but not installed." - msgstr "%s 패키지는 사용할 수는 있지만 설치되어 있지 않습니다." - --#: dnf/base.py:2032 -+#: dnf/base.py:2104 - #, python-format - msgid "Package %s available, but installed for different architecture." - msgstr "%s 패키지는 사용 가능하지만 다른 아키텍처 용으로 설치되어 있습니다." - --#: dnf/base.py:2057 dnf/base.py:2250 dnf/cli/cli.py:668 dnf/cli/cli.py:699 -+#: dnf/base.py:2129 - #, python-format - msgid "No package %s installed." - msgstr "%s 패키지는 설치되어 있지 않습니다" - --#: dnf/base.py:2075 dnf/cli/commands/install.py:136 -+#: dnf/base.py:2147 dnf/cli/commands/install.py:136 - #: dnf/cli/commands/remove.py:133 - #, python-format - msgid "Not a valid form: %s" - msgstr "잘못된 형식: %s" - --#: dnf/base.py:2091 dnf/cli/commands/__init__.py:681 --#: dnf/cli/commands/remove.py:163 -+#: dnf/base.py:2162 dnf/cli/commands/__init__.py:681 -+#: dnf/cli/commands/remove.py:162 - msgid "No packages marked for removal." - msgstr "제거 대상 패키지가 없습니다." - --#: dnf/base.py:2179 dnf/cli/cli.py:422 -+#: dnf/base.py:2250 dnf/cli/cli.py:427 - #, python-format - msgid "Packages for argument %s available, but not installed." - msgstr "%s 인수에 대한 패키지를 사용할 수 있지만 설치되어 있지 않습니다." - --#: dnf/base.py:2184 -+#: dnf/base.py:2255 - #, python-format - msgid "Package %s of lowest version already installed, cannot downgrade it." - msgstr "%s 패키지의 최하위 버전이 이미 설치되어 있으므로 다운 그레이드할 수 없습니다." - --#: dnf/base.py:2242 --msgid "Action not handled: {}" --msgstr "작업이 처리되지 않았습니다: {}" -- --#: dnf/base.py:2256 dnf/cli/cli.py:419 dnf/cli/cli.py:673 dnf/cli/cli.py:703 --#: dnf/cli/commands/group.py:400 dnf/cli/commands/history.py:169 --#, python-format --msgid "No package %s available." --msgstr "사용 가능한 패키지 %s가 없습니다." -- --#: dnf/base.py:2269 --msgid "no package matched" --msgstr "일치하는 패키지가 없습니다." -- --#: dnf/base.py:2290 -+#: dnf/base.py:2302 - msgid "No security updates needed, but {} update available" - msgstr "보안 업데이트가 필요하지 않지만 {} 업데이트가 가능합니다" - --#: dnf/base.py:2292 -+#: dnf/base.py:2304 - msgid "No security updates needed, but {} updates available" - msgstr "보안 업데이트는 필요하지 않지만 {} 업데이트가 가능합니다" - --#: dnf/base.py:2296 -+#: dnf/base.py:2308 - msgid "No security updates needed for \"{}\", but {} update available" - msgstr "\"{}\"에는 보안 업데이트가 필요하지 않지만 {} 업데이트가 가능합니다" - --#: dnf/base.py:2298 -+#: dnf/base.py:2310 - msgid "No security updates needed for \"{}\", but {} updates available" - msgstr "\"{}\"에는 보안 업데이트가 필요하지 않지만 {} 업데이트가 가능합니다" - - #. raise an exception, because po.repoid is not in self.repos --#: dnf/base.py:2319 -+#: dnf/base.py:2331 - #, python-format - msgid "Unable to retrieve a key for a commandline package: %s" - msgstr "" - --#: dnf/base.py:2327 -+#: dnf/base.py:2339 - #, python-format - msgid ". Failing package is: %s" - msgstr "실패한 패키지는 다음과 같습니다. %s" - --#: dnf/base.py:2328 -+#: dnf/base.py:2340 - #, python-format - msgid "GPG Keys are configured as: %s" - msgstr "GPG 키는 다음과 같이 설정되어 있습니다. %s" - --#: dnf/base.py:2340 -+#: dnf/base.py:2352 - #, python-format - msgid "GPG key at %s (0x%s) is already installed" - msgstr "%s (0x%s)의 GPG 키가 이미 설치되어 있습니다" - --#: dnf/base.py:2373 -+#: dnf/base.py:2385 - msgid "The key has been approved." - msgstr "키가 승인되었습니다." - --#: dnf/base.py:2376 -+#: dnf/base.py:2388 - msgid "The key has been rejected." - msgstr "키가 거부되었습니다." - --#: dnf/base.py:2409 -+#: dnf/base.py:2421 - #, python-format - msgid "Key import failed (code %d)" - msgstr "키 가져 오기에 실패했습니다 (코드 %d)" - --#: dnf/base.py:2411 -+#: dnf/base.py:2423 - msgid "Key imported successfully" - msgstr "키 가져오기에 성공했습니다" - --#: dnf/base.py:2415 -+#: dnf/base.py:2427 - msgid "Didn't install any keys" - msgstr "키를 하나도 설치하지 못했습니다" - --#: dnf/base.py:2418 -+#: dnf/base.py:2430 - #, python-format - msgid "" - "The GPG keys listed for the \"%s\" repository are already installed but they are not correct for this package.\n" -@@ -489,49 +477,49 @@ msgstr "" - "해당 GPG 키는 \"%s\"저장소가 이미 설치되어 있지만이 패키지에 맞지 않습니다.\n" - "이 저장소에 대해 올바른 키 URL이 구성되었는지 확인하십시오." - --#: dnf/base.py:2429 -+#: dnf/base.py:2441 - msgid "Import of key(s) didn't help, wrong key(s)?" - msgstr "가져온 키에 문제가 있습니다. 잘못된 키입니까?" - --#: dnf/base.py:2482 -+#: dnf/base.py:2494 - msgid " * Maybe you meant: {}" - msgstr " * 다음을 의미할 수도 있습니다: {}" - --#: dnf/base.py:2514 -+#: dnf/base.py:2526 - msgid "Package \"{}\" from local repository \"{}\" has incorrect checksum" - msgstr "로컬 저장소 \"{}\"의 \"{}\"패키지에 잘못된 체크섬이 있습니다" - --#: dnf/base.py:2517 -+#: dnf/base.py:2529 - msgid "Some packages from local repository have incorrect checksum" - msgstr "로컬 저장소의 일부 패키지에 잘못된 체크섬이 있습니다" - --#: dnf/base.py:2520 -+#: dnf/base.py:2532 - msgid "Package \"{}\" from repository \"{}\" has incorrect checksum" - msgstr "저장소 \"{}\"의 패키지 \"{}\"에 잘못된 체크섬이 있습니다" - --#: dnf/base.py:2523 -+#: dnf/base.py:2535 - msgid "" - "Some packages have invalid cache, but cannot be downloaded due to \"--" - "cacheonly\" option" - msgstr "일부 패키지에는 유효하지 않은 캐시가 있지만 \"--cacheonly\"옵션으로 인해 다운로드할 수 없습니다" - --#: dnf/base.py:2541 dnf/base.py:2561 -+#: dnf/base.py:2553 dnf/base.py:2573 - msgid "No match for argument" - msgstr "일치하는 인수가 없습니다" - --#: dnf/base.py:2549 dnf/base.py:2569 -+#: dnf/base.py:2561 dnf/base.py:2581 - msgid "All matches were filtered out by exclude filtering for argument" - msgstr "모든 일치 항목이 인수의 제외 필터로 필터링되었습니다" - --#: dnf/base.py:2551 -+#: dnf/base.py:2563 - msgid "All matches were filtered out by modular filtering for argument" - msgstr "모든 일치 항목이 인수의 모듈식 필터로 필터링되었습니다" - --#: dnf/base.py:2567 -+#: dnf/base.py:2579 - msgid "All matches were installed from a different repository for argument" - msgstr "모든 일치 항목이 인수의 다른 리포지토리에서 설치되었습니다" - --#: dnf/base.py:2583 -+#: dnf/base.py:2626 - #, python-format - msgid "Package %s is already installed." - msgstr "패키지 %s이/가 이미 설치되어 있습니다." -@@ -551,8 +539,8 @@ msgstr "\"%s\" 파일의 구문 분석에 실패했습니다 : %s" - msgid "Cannot read file \"%s\": %s" - msgstr "\"%s\" 파일을 읽을 수 없습니다: %s" - --#: dnf/cli/aliases.py:115 dnf/cli/aliases.py:129 dnf/cli/cli.py:902 --#: dnf/cli/cli.py:906 dnf/cli/commands/alias.py:108 -+#: dnf/cli/aliases.py:115 dnf/cli/aliases.py:129 dnf/cli/cli.py:803 -+#: dnf/cli/cli.py:807 dnf/cli/commands/alias.py:108 - #, python-format - msgid "Config error: %s" - msgstr "설정 오류: %s" -@@ -583,7 +571,7 @@ msgid "" - "stream '{2}'" - msgstr "이 작업은 '{0}' 모듈을 '{1}' 스트림에서 ‘{2}' 스트림으로 전환합니다" - --#: dnf/cli/cli.py:172 -+#: dnf/cli/cli.py:173 - #, python-brace-format - msgid "" - "It is not possible to switch enabled streams of a module.\n" -@@ -592,35 +580,35 @@ msgstr "" - "활성화된 모듈 스트림을 전환 할 수 없습니다.\n" - "설치된 모든 내용을 모듈에서 제거하고 ‘{prog} module reset ' 명령을 사용하여 모듈을 재설정하는 것이 좋습니다. 모듈을 재설정한 후 다른 스트림을 설치할 수 있습니다." - --#: dnf/cli/cli.py:210 -+#: dnf/cli/cli.py:211 - #, python-brace-format - msgid "{prog} will only download packages for the transaction." - msgstr "{prog}은/는 트랜잭션용 패키지 만 다운로드합니다." - --#: dnf/cli/cli.py:213 -+#: dnf/cli/cli.py:214 - #, python-brace-format - msgid "" - "{prog} will only download packages, install gpg keys, and check the " - "transaction." - msgstr "{prog}은/는 패키지 만 다운로드하고 gpg 키를 설치하며 트랜잭션을 확인합니다." - --#: dnf/cli/cli.py:217 -+#: dnf/cli/cli.py:218 - msgid "Operation aborted." - msgstr "작업이 중지됨." - --#: dnf/cli/cli.py:224 -+#: dnf/cli/cli.py:225 - msgid "Downloading Packages:" - msgstr "패키지 다운로드중:" - --#: dnf/cli/cli.py:230 -+#: dnf/cli/cli.py:231 - msgid "Error downloading packages:" - msgstr "패키지 다운로드중 오류 발생:" - --#: dnf/cli/cli.py:258 -+#: dnf/cli/cli.py:263 - msgid "Transaction failed" - msgstr "트랜잭션 실패" - --#: dnf/cli/cli.py:281 -+#: dnf/cli/cli.py:286 - msgid "" - "Refusing to automatically import keys when running unattended.\n" - "Use \"-y\" to override." -@@ -628,117 +616,96 @@ msgstr "" - "키를 자동으로 가져 오는 것을 거부합니다.\n" - "동작을 무시하려면 \"-y\"를 사용하십시오." - --#: dnf/cli/cli.py:331 -+#: dnf/cli/cli.py:336 - msgid "Changelogs for {}" - msgstr "{}의 변경 사항" - --#: dnf/cli/cli.py:364 dnf/cli/cli.py:505 dnf/cli/cli.py:511 -+#: dnf/cli/cli.py:369 dnf/cli/cli.py:510 dnf/cli/cli.py:516 - msgid "Obsoleting Packages" - msgstr "더 이상 사용되지 않는 패키지" - --#: dnf/cli/cli.py:393 -+#: dnf/cli/cli.py:398 - msgid "No packages marked for distribution synchronization." - msgstr "배포 동기화가 필요한 패키지가 없습니다." - --#: dnf/cli/cli.py:428 -+#: dnf/cli/cli.py:424 dnf/cli/commands/group.py:395 -+#, python-format -+msgid "No package %s available." -+msgstr "사용 가능한 패키지 %s가 없습니다." -+ -+#: dnf/cli/cli.py:433 - msgid "No packages marked for downgrade." - msgstr "다운 그레이드 대상으로 표시된 패키지가 없습니다." - --#: dnf/cli/cli.py:479 -+#: dnf/cli/cli.py:484 - msgid "Installed Packages" - msgstr "설치된 패키지" - --#: dnf/cli/cli.py:487 -+#: dnf/cli/cli.py:492 - msgid "Available Packages" - msgstr "사용 가능한 패키지" - --#: dnf/cli/cli.py:491 -+#: dnf/cli/cli.py:496 - msgid "Autoremove Packages" - msgstr "패키지 자동 삭제" - - # ctx::sourcefile::Systems Navigation Menu --#: dnf/cli/cli.py:493 -+#: dnf/cli/cli.py:498 - msgid "Extra Packages" - msgstr "추가 패키지" - --#: dnf/cli/cli.py:497 -+#: dnf/cli/cli.py:502 - msgid "Available Upgrades" - msgstr "사용 가능한 업그레이드" - --#: dnf/cli/cli.py:513 -+#: dnf/cli/cli.py:518 - msgid "Recently Added Packages" - msgstr "최근에 추가 된 패키지" - --#: dnf/cli/cli.py:518 -+#: dnf/cli/cli.py:522 - msgid "No matching Packages to list" - msgstr "목록과 일치하는 패키지가 없습니다" - --#: dnf/cli/cli.py:599 -+#: dnf/cli/cli.py:603 - msgid "No Matches found" - msgstr "검색 결과가 없습니다" - --#: dnf/cli/cli.py:609 --msgid "No transaction ID given" --msgstr "지정된 트랜잭션 ID가 없습니다" -- --#: dnf/cli/cli.py:614 --msgid "Not found given transaction ID" --msgstr "주어진 트랜잭션 ID를 찾을 수 없습니다" -- --#: dnf/cli/cli.py:623 --msgid "Found more than one transaction ID!" --msgstr "두 개 이상의 트랜잭션 ID를 찾았습니다!" -- --#: dnf/cli/cli.py:640 --#, python-format --msgid "Transaction history is incomplete, before %u." --msgstr "%u이전 트랜잭션 내역이 불완전합니다." -- --#: dnf/cli/cli.py:642 --#, python-format --msgid "Transaction history is incomplete, after %u." --msgstr "%u이후 트랜잭션 내역이 불완전합니다." -- --#: dnf/cli/cli.py:689 --msgid "Undoing transaction {}, from {}" --msgstr "{}에서 {} 트랜잭션 실행을 취소하고 있습니다" -- --#: dnf/cli/cli.py:769 dnf/cli/commands/shell.py:237 -+#: dnf/cli/cli.py:670 dnf/cli/commands/shell.py:237 - #, python-format - msgid "Unknown repo: '%s'" - msgstr "알 수 없는 저장소: '%s'" - --#: dnf/cli/cli.py:783 -+#: dnf/cli/cli.py:684 - #, python-format - msgid "No repository match: %s" - msgstr "일치하는 저장소가 없습니다 : %s" - --#: dnf/cli/cli.py:817 -+#: dnf/cli/cli.py:718 - msgid "" - "This command has to be run with superuser privileges (under the root user on" - " most systems)." - msgstr "이 명령은 수퍼 유저 권한으로 실행해야합니다 (대부분의 시스템에서 root 사용자로 실행)." - --#: dnf/cli/cli.py:847 -+#: dnf/cli/cli.py:748 - #, python-format - msgid "No such command: %s. Please use %s --help" - msgstr "명령을 찾을 수 없습니다: %s . %s --help를 사용하십시오" - --#: dnf/cli/cli.py:850 -+#: dnf/cli/cli.py:751 - #, python-format, python-brace-format - msgid "" - "It could be a {PROG} plugin command, try: \"{prog} install 'dnf-" - "command(%s)'\"" - msgstr "{PROG} 플러그인 명령일 수 있습니다: \"{prog} 'dnf-command(%s)'\"" - --#: dnf/cli/cli.py:854 -+#: dnf/cli/cli.py:755 - #, python-brace-format - msgid "" - "It could be a {prog} plugin command, but loading of plugins is currently " - "disabled." - msgstr "{prog} 플러그인 명령일 수 있지만 플러그인 로딩은 현재 비활성화되어 있습니다." - --#: dnf/cli/cli.py:912 -+#: dnf/cli/cli.py:813 - msgid "" - "--destdir or --downloaddir must be used with --downloadonly or download or " - "system-upgrade command." -@@ -746,7 +713,7 @@ msgstr "" - "--destdir 또는 --downloaddir은 --downloadonly 또는 download 또는 system-upgrade 명령과" - " 함께 사용해야합니다." - --#: dnf/cli/cli.py:918 -+#: dnf/cli/cli.py:819 - msgid "" - "--enable, --set-enabled and --disable, --set-disabled must be used with " - "config-manager command." -@@ -754,7 +721,7 @@ msgstr "" - "--enable, --set-enabled 및 --disable, --set-disabled는 config-manager 명령과 함께 " - "사용해야합니다." - --#: dnf/cli/cli.py:1000 -+#: dnf/cli/cli.py:901 - msgid "" - "Warning: Enforcing GPG signature check globally as per active RPM security " - "policy (see 'gpgcheck' in dnf.conf(5) for how to squelch this message)" -@@ -762,38 +729,38 @@ msgstr "" - "경고: 활성화된 RPM 보안 정책에 따라 GPG 서명 검사를 전체적으로 시행합니다 (이 메시지를 제거하는 방법은 dnf.conf (5)의" - " 'gpgcheck' 참조)" - --#: dnf/cli/cli.py:1020 -+#: dnf/cli/cli.py:921 - msgid "Config file \"{}\" does not exist" - msgstr "\"{}\" 설정 파일이 존재하지 않습니다" - --#: dnf/cli/cli.py:1040 -+#: dnf/cli/cli.py:941 - msgid "" - "Unable to detect release version (use '--releasever' to specify release " - "version)" - msgstr "릴리스 버전을 찾을 수 없습니다 ('--releasever'를 사용하여 릴리스 버전을 지정하십시오)" - --#: dnf/cli/cli.py:1127 dnf/cli/commands/repoquery.py:471 -+#: dnf/cli/cli.py:1028 dnf/cli/commands/repoquery.py:471 - msgid "argument {}: not allowed with argument {}" - msgstr "인수 {}: 인수 {}과 함께 사용할 수 없습니다" - --#: dnf/cli/cli.py:1134 -+#: dnf/cli/cli.py:1035 - #, python-format - msgid "Command \"%s\" already defined" - msgstr "\"%s\" 명령이 이미 정의되어 있습니다" - --#: dnf/cli/cli.py:1154 -+#: dnf/cli/cli.py:1055 - msgid "Excludes in dnf.conf: " - msgstr "dnf.conf에서 제외: " - --#: dnf/cli/cli.py:1157 -+#: dnf/cli/cli.py:1058 - msgid "Includes in dnf.conf: " - msgstr "dnf.conf에 포함:. " - --#: dnf/cli/cli.py:1160 -+#: dnf/cli/cli.py:1061 - msgid "Excludes in repo " - msgstr "리포지토리에서 제외 " - --#: dnf/cli/cli.py:1163 -+#: dnf/cli/cli.py:1064 - msgid "Includes in repo " - msgstr "리포지토리에 포함 " - -@@ -849,7 +816,7 @@ msgid "show all packages (default)" - msgstr "모든 패키지 표시 (기본값)" - - #: dnf/cli/commands/__init__.py:171 dnf/cli/commands/__init__.py:743 --#: dnf/cli/commands/module.py:351 -+#: dnf/cli/commands/module.py:373 - msgid "show only available packages" - msgstr "사용 가능한 패키지 만 표시" - -@@ -1174,78 +1141,78 @@ msgstr "그룹 정보를 표시하거나 사용합니다" - msgid "No group data available for configured repositories." - msgstr "설정된 리포지토리에 사용할 수있는 그룹 데이터가 없습니다." - --#: dnf/cli/commands/group.py:129 -+#: dnf/cli/commands/group.py:126 - #, python-format - msgid "Warning: Group %s does not exist." - msgstr "경고: %s 그룹이 존재하지 않습니다." - --#: dnf/cli/commands/group.py:170 -+#: dnf/cli/commands/group.py:167 - msgid "Warning: No groups match:" - msgstr "경고: 일치하는 그룹이 없습니다" - --#: dnf/cli/commands/group.py:182 dnf/cli/commands/group.py:193 --#: dnf/cli/output.py:1226 -+#: dnf/cli/commands/group.py:179 dnf/cli/commands/group.py:190 -+#: dnf/cli/output.py:1139 - msgid "" - msgstr "" - --#: dnf/cli/commands/group.py:199 -+#: dnf/cli/commands/group.py:196 - msgid "Available Environment Groups:" - msgstr "사용 가능한 환경 그룹 :" - --#: dnf/cli/commands/group.py:201 -+#: dnf/cli/commands/group.py:198 - msgid "Installed Environment Groups:" - msgstr "설치된 환경 그룹 :" - --#: dnf/cli/commands/group.py:208 dnf/cli/commands/group.py:294 -+#: dnf/cli/commands/group.py:205 dnf/cli/commands/group.py:291 - msgid "Installed Groups:" - msgstr "설치된 그룹 :" - --#: dnf/cli/commands/group.py:215 dnf/cli/commands/group.py:301 -+#: dnf/cli/commands/group.py:212 dnf/cli/commands/group.py:298 - msgid "Installed Language Groups:" - msgstr "설치된 언어 그룹 :" - --#: dnf/cli/commands/group.py:225 dnf/cli/commands/group.py:308 -+#: dnf/cli/commands/group.py:222 dnf/cli/commands/group.py:305 - msgid "Available Groups:" - msgstr "사용 가능한 그룹 :" - --#: dnf/cli/commands/group.py:232 dnf/cli/commands/group.py:315 -+#: dnf/cli/commands/group.py:229 dnf/cli/commands/group.py:312 - msgid "Available Language Groups:" - msgstr "사용 가능한 언어 그룹 :" - --#: dnf/cli/commands/group.py:322 -+#: dnf/cli/commands/group.py:319 - msgid "include optional packages from group" - msgstr "그룹의 선택 패키지를 포함합니다" - --#: dnf/cli/commands/group.py:325 -+#: dnf/cli/commands/group.py:322 - msgid "show also hidden groups" - msgstr "숨겨진 그룹도 표시합니다" - --#: dnf/cli/commands/group.py:327 -+#: dnf/cli/commands/group.py:324 - msgid "show only installed groups" - msgstr "설치된 그룹 만 표시합니다" - --#: dnf/cli/commands/group.py:329 -+#: dnf/cli/commands/group.py:326 - msgid "show only available groups" - msgstr "사용 가능한 그룹 만 표시합니다" - --#: dnf/cli/commands/group.py:331 -+#: dnf/cli/commands/group.py:328 - msgid "show also ID of groups" - msgstr "그룹 ID 표시" - --#: dnf/cli/commands/group.py:333 -+#: dnf/cli/commands/group.py:330 - msgid "available subcommands: {} (default), {}" - msgstr "사용 가능한 하위 명령: {} (기본값), {}" - --#: dnf/cli/commands/group.py:337 -+#: dnf/cli/commands/group.py:334 - msgid "argument for group subcommand" - msgstr "그룹 하위 명령의 인수" - --#: dnf/cli/commands/group.py:346 -+#: dnf/cli/commands/group.py:343 - #, python-format - msgid "Invalid groups sub-command, use: %s." - msgstr "그룹 하위 명령이 잘못되었습니다. %s을/를 사용합니다." - --#: dnf/cli/commands/group.py:403 -+#: dnf/cli/commands/group.py:398 - msgid "Unable to find a mandatory group package." - msgstr "필수 그룹 패키지를 찾을 수 없습니다." - -@@ -1295,30 +1262,58 @@ msgstr "주어진 거래 ID가 없습니다." - msgid "More than one argument given as transaction file name." - msgstr "트랜잭션 파일을 제거하지 못했습니다. %s" - --#: dnf/cli/commands/history.py:122 dnf/cli/commands/history.py:126 -+#: dnf/cli/commands/history.py:122 dnf/cli/commands/history.py:130 - msgid "No transaction ID or package name given." - msgstr "트랜잭션 ID 또는 패키지 이름이 없습니다." - --#: dnf/cli/commands/history.py:138 -+#: dnf/cli/commands/history.py:142 - #, python-format - msgid "You don't have access to the history DB: %s" - msgstr "기록 DB에 액세스할 수 없습니다: %s" - --#: dnf/cli/commands/history.py:147 -+#: dnf/cli/commands/history.py:151 - #, python-format - msgid "" - "Cannot undo transaction %s, doing so would result in an inconsistent package" - " database." - msgstr "%s 트랜잭션을 취소할 수 없습니다. 취소하면 패키지 데이터베이스가 일치하지 않게 됩니다." - --#: dnf/cli/commands/history.py:152 -+#: dnf/cli/commands/history.py:156 - #, python-format - msgid "" - "Cannot rollback transaction %s, doing so would result in an inconsistent " - "package database." - msgstr "%s 트랜잭션을 롤백할 수 없습니다. 이렇게하면 패키지 데이터베이스가 일치하지 않게 됩니다." - --#: dnf/cli/commands/history.py:222 -+#: dnf/cli/commands/history.py:175 -+msgid "No transaction ID given" -+msgstr "지정된 트랜잭션 ID가 없습니다" -+ -+#: dnf/cli/commands/history.py:179 -+#, fuzzy, python-brace-format -+#| msgid "TransactionItem not found for key: {}" -+msgid "Transaction ID \"{0}\" not found." -+msgstr "{} 키에 대한 TransactionItem을 찾을 수 없습니다" -+ -+#: dnf/cli/commands/history.py:185 -+msgid "Found more than one transaction ID!" -+msgstr "두 개 이상의 트랜잭션 ID를 찾았습니다!" -+ -+#: dnf/cli/commands/history.py:203 -+#, python-format -+msgid "Transaction history is incomplete, before %u." -+msgstr "%u이전 트랜잭션 내역이 불완전합니다." -+ -+#: dnf/cli/commands/history.py:205 -+#, python-format -+msgid "Transaction history is incomplete, after %u." -+msgstr "%u이후 트랜잭션 내역이 불완전합니다." -+ -+#: dnf/cli/commands/history.py:256 -+msgid "No packages to list" -+msgstr "목록에 패키지가 없습니다" -+ -+#: dnf/cli/commands/history.py:279 - msgid "" - "Invalid transaction ID range definition '{}'.\n" - "Use '..'." -@@ -1326,7 +1321,7 @@ msgstr "" - "잘못된 트랜잭션 ID 범위 정의 '{}'. \n" - "'..' 사용." - --#: dnf/cli/commands/history.py:226 -+#: dnf/cli/commands/history.py:283 - msgid "" - "Can't convert '{}' to transaction ID.\n" - "Use '', 'last', 'last-'." -@@ -1334,38 +1329,32 @@ msgstr "" - "'{}'을 (를) 트랜잭션 ID로 변환할 수 없습니다. \n" - "'', 'last', 'last-' 사용." - --#: dnf/cli/commands/history.py:255 -+#: dnf/cli/commands/history.py:312 - msgid "No transaction which manipulates package '{}' was found." - msgstr "패키지 '{}'을 (를) 사용하는 트랜잭션이 없습니다." - --#: dnf/cli/commands/history.py:305 --#, python-brace-format --msgid "Transaction ID \"{id}\" not found." --msgstr "" -- --#: dnf/cli/commands/history.py:313 -+#: dnf/cli/commands/history.py:357 - msgid "{} exists, overwrite?" - msgstr "" - --#: dnf/cli/commands/history.py:316 -+#: dnf/cli/commands/history.py:360 - msgid "Not overwriting {}, exiting." - msgstr "" - --#: dnf/cli/commands/history.py:323 -+#: dnf/cli/commands/history.py:367 - #, fuzzy - #| msgid "Transaction test succeeded." - msgid "Transaction saved to {}." - msgstr "트랜잭션 테스트가 완료되었습니다." - --#: dnf/cli/commands/history.py:326 -+#: dnf/cli/commands/history.py:370 - #, fuzzy - #| msgid "Errors occurred during transaction." - msgid "Error storing transaction: {}" - msgstr "거래 중에 오류가 발생했습니다." - --#: dnf/cli/commands/history.py:350 --msgid "" --"Warning, the following problems occurred while replaying the transaction:" -+#: dnf/cli/commands/history.py:386 -+msgid "Warning, the following problems occurred while running a transaction:" - msgstr "" - - #: dnf/cli/commands/install.py:47 -@@ -1385,7 +1374,7 @@ msgstr "일치하는 항목을 찾을 수 없습니다" - msgid "Not a valid rpm file path: %s" - msgstr "올바른 rpm 파일 경로가 아닙니다. %s" - --#: dnf/cli/commands/install.py:167 -+#: dnf/cli/commands/install.py:166 - #, python-brace-format - msgid "There are following alternatives for \"{0}\": {1}" - msgstr "다음은 “{0}\"의 대안입니다. {1}" -@@ -1428,7 +1417,7 @@ msgid "%s marked as group installed." - msgstr "%s은/는 그룹이 설치한 것으로 표시되었습니다" - - #: dnf/cli/commands/mark.py:85 dnf/cli/commands/shell.py:129 --#: dnf/cli/commands/shell.py:237 dnf/cli/commands/shell.py:279 -+#: dnf/cli/commands/shell.py:237 dnf/cli/commands/shell.py:282 - msgid "Error:" - msgstr "오류:" - -@@ -1484,42 +1473,46 @@ msgid "Package {} belongs to multiple modules, skipping" - msgstr "{} 패키지는 여러 모듈에 속합니다. 건너 뛰기" - - #: dnf/cli/commands/module.py:277 -+msgid "switch a module to a stream and distrosync rpm packages" -+msgstr "" -+ -+#: dnf/cli/commands/module.py:299 - msgid "list modular packages" - msgstr "모듈 패키지 목록" - --#: dnf/cli/commands/module.py:292 -+#: dnf/cli/commands/module.py:314 - msgid "list packages belonging to a module" - msgstr "모듈에 속하는 패키지를 나열하십시오" - --#: dnf/cli/commands/module.py:327 -+#: dnf/cli/commands/module.py:349 - msgid "Interact with Modules." - msgstr "모듈과 상호 작용합니다." - --#: dnf/cli/commands/module.py:340 -+#: dnf/cli/commands/module.py:362 - msgid "show only enabled modules" - msgstr "활성화된 모듈 만 표시" - --#: dnf/cli/commands/module.py:343 -+#: dnf/cli/commands/module.py:365 - msgid "show only disabled modules" - msgstr "비활성화된 모듈 만 표시" - --#: dnf/cli/commands/module.py:346 -+#: dnf/cli/commands/module.py:368 - msgid "show only installed modules or packages" - msgstr "설치된 모듈 또는 패키지 만 표시" - --#: dnf/cli/commands/module.py:349 -+#: dnf/cli/commands/module.py:371 - msgid "show profile content" - msgstr "프로파일 내용 표시" - --#: dnf/cli/commands/module.py:354 -+#: dnf/cli/commands/module.py:376 - msgid "remove all modular packages" - msgstr "모든 모듈 패키지 삭제" - --#: dnf/cli/commands/module.py:364 -+#: dnf/cli/commands/module.py:386 - msgid "Module specification" - msgstr "모듈 사양" - --#: dnf/cli/commands/module.py:386 -+#: dnf/cli/commands/module.py:408 - msgid "{} {} {}: too few arguments" - msgstr "{} {} {}: 인수가 부족합니다" - -@@ -2004,22 +1997,22 @@ msgstr "KEYWORD" - msgid "Keyword to search for" - msgstr "검색 키워드" - --#: dnf/cli/commands/search.py:61 dnf/cli/output.py:506 -+#: dnf/cli/commands/search.py:61 dnf/cli/output.py:460 - msgctxt "long" - msgid "Name" - msgstr "이름" - --#: dnf/cli/commands/search.py:62 dnf/cli/output.py:559 -+#: dnf/cli/commands/search.py:62 dnf/cli/output.py:513 - msgctxt "long" - msgid "Summary" - msgstr "요약" - --#: dnf/cli/commands/search.py:63 dnf/cli/output.py:569 -+#: dnf/cli/commands/search.py:63 dnf/cli/output.py:523 - msgctxt "long" - msgid "Description" - msgstr "설명" - --#: dnf/cli/commands/search.py:64 dnf/cli/output.py:562 -+#: dnf/cli/commands/search.py:64 dnf/cli/output.py:516 - msgid "URL" - msgstr "URL" - -@@ -2162,16 +2155,16 @@ msgstr "" - "run 트랜잭션 세트 분석 및 실행\n" - "exit (or quit) 쉘 종료" - --#: dnf/cli/commands/shell.py:259 -+#: dnf/cli/commands/shell.py:262 - #, python-format - msgid "Error: Cannot open %s for reading" - msgstr "오류: 읽기 전용 %s를 열 수 없습니다" - --#: dnf/cli/commands/shell.py:281 dnf/cli/main.py:187 -+#: dnf/cli/commands/shell.py:284 dnf/cli/main.py:187 - msgid "Complete!" - msgstr "완료되었습니다!" - --#: dnf/cli/commands/shell.py:291 -+#: dnf/cli/commands/shell.py:294 - msgid "Leaving Shell" - msgstr "쉘 나가기" - -@@ -2364,8 +2357,8 @@ msgstr "파일" - - # translation auto-copied from project subscription-manager, version 1.11.X, - # document keys --#: dnf/cli/commands/updateinfo.py:359 dnf/cli/output.py:1499 --#: dnf/cli/output.py:1772 dnf/cli/output.py:1774 -+#: dnf/cli/commands/updateinfo.py:359 dnf/cli/output.py:1652 -+#: dnf/cli/output.py:1654 dnf/util.py:591 - msgid "Installed" - msgstr "설치됨" - -@@ -2688,13 +2681,13 @@ msgstr "‘%s' 인수를 인코딩할 수 없습니다: %s" - #. Translators: This is abbreviated 'Name'. Should be no longer - #. than 12 characters. You can use the full version if it is short - #. enough in your language. --#: dnf/cli/output.py:505 -+#: dnf/cli/output.py:459 - msgctxt "short" - msgid "Name" - msgstr "이름" - - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:511 -+#: dnf/cli/output.py:465 - msgid "Epoch" - msgstr "기간" - -@@ -2702,38 +2695,38 @@ msgstr "기간" - #. use the full (unabbreviated) term 'Version' if you think that - #. the translation to your language is not too long and will - #. always fit to limited space. --#: dnf/cli/output.py:512 dnf/cli/output.py:1335 -+#: dnf/cli/output.py:466 dnf/cli/output.py:1248 - msgctxt "short" - msgid "Version" - msgstr "버전" - - #. Translators: This is the full (unabbreviated) term 'Version'. --#: dnf/cli/output.py:513 dnf/cli/output.py:1337 -+#: dnf/cli/output.py:467 dnf/cli/output.py:1250 - msgctxt "long" - msgid "Version" - msgstr "버전" - - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:516 -+#: dnf/cli/output.py:470 - msgid "Release" - msgstr "릴리즈" - - #. Translators: This is abbreviated 'Architecture', used when - #. we have not enough space to display the full word. --#: dnf/cli/output.py:517 dnf/cli/output.py:1326 -+#: dnf/cli/output.py:471 dnf/cli/output.py:1239 - msgctxt "short" - msgid "Arch" - msgstr "아키텍처" - - #. Translators: This is the full word 'Architecture', used when - #. we have enough space. --#: dnf/cli/output.py:518 dnf/cli/output.py:1329 -+#: dnf/cli/output.py:472 dnf/cli/output.py:1242 - msgctxt "long" - msgid "Architecture" - msgstr "아키텍처" - - #. Translators: This is the full (unabbreviated) term 'Size'. --#: dnf/cli/output.py:520 dnf/cli/output.py:1352 -+#: dnf/cli/output.py:474 dnf/cli/output.py:1265 - msgctxt "long" - msgid "Size" - msgstr "크기" -@@ -2742,32 +2735,32 @@ msgstr "크기" - #. not be longer than 5 characters. If the term 'Size' in your - #. language is not longer than 5 characters then you can use it - #. unabbreviated. --#: dnf/cli/output.py:520 dnf/cli/output.py:1350 -+#: dnf/cli/output.py:474 dnf/cli/output.py:1263 - msgctxt "short" - msgid "Size" - msgstr "크기" - - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:524 -+#: dnf/cli/output.py:478 - msgid "Source" - msgstr "소스" - - #. Translators: This is abbreviated 'Repository', used when - #. we have not enough space to display the full word. --#: dnf/cli/output.py:525 dnf/cli/output.py:1341 -+#: dnf/cli/output.py:479 dnf/cli/output.py:1254 - msgctxt "short" - msgid "Repo" - msgstr "리포지터리" - - #. Translators: This is the full word 'Repository', used when - #. we have enough space. --#: dnf/cli/output.py:526 dnf/cli/output.py:1344 -+#: dnf/cli/output.py:480 dnf/cli/output.py:1257 - msgctxt "long" - msgid "Repository" - msgstr "리포지터리" - - #. Translators: This message should be no longer than 12 chars. --#: dnf/cli/output.py:533 -+#: dnf/cli/output.py:487 - msgid "From repo" - msgstr "리포지터리에서" - -@@ -2775,314 +2768,310 @@ msgstr "리포지터리에서" - #. print(_("Committer : %s") % ucd(pkg.committer)) - #. print(_("Committime : %s") % time.ctime(pkg.committime)) - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:539 -+#: dnf/cli/output.py:493 - msgid "Packager" - msgstr "패키지 프로그램" - - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:541 -+#: dnf/cli/output.py:495 - msgid "Buildtime" - msgstr "빌드 시간" - - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:545 -+#: dnf/cli/output.py:499 - msgid "Install time" - msgstr "설치 시간" - - #. Translators: This message should be no longer than 12 chars. --#: dnf/cli/output.py:554 -+#: dnf/cli/output.py:508 - msgid "Installed by" - msgstr "설치자" - - #. Translators: This is abbreviated 'Summary'. Should be no longer - #. than 12 characters. You can use the full version if it is short - #. enough in your language. --#: dnf/cli/output.py:558 -+#: dnf/cli/output.py:512 - msgctxt "short" - msgid "Summary" - msgstr "요약" - - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:564 -+#: dnf/cli/output.py:518 - msgid "License" - msgstr "라이센스" - - #. Translators: This is abbreviated 'Description'. Should be no longer - #. than 12 characters. You can use the full version if it is short - #. enough in your language. --#: dnf/cli/output.py:568 -+#: dnf/cli/output.py:522 - msgctxt "short" - msgid "Description" - msgstr "설명" - --#: dnf/cli/output.py:695 --msgid "No packages to list" --msgstr "목록에 패키지가 없습니다" -- --#: dnf/cli/output.py:706 -+#: dnf/cli/output.py:650 - msgid "y" - msgstr "y" - --#: dnf/cli/output.py:706 -+#: dnf/cli/output.py:650 - msgid "yes" - msgstr "예" - --#: dnf/cli/output.py:707 -+#: dnf/cli/output.py:651 - msgid "n" - msgstr "n" - --#: dnf/cli/output.py:707 -+#: dnf/cli/output.py:651 - msgid "no" - msgstr "아니요" - --#: dnf/cli/output.py:711 -+#: dnf/cli/output.py:655 - msgid "Is this ok [y/N]: " - msgstr "정말입니까 [y/N]: " - --#: dnf/cli/output.py:715 -+#: dnf/cli/output.py:659 - msgid "Is this ok [Y/n]: " - msgstr "정말입니까 [Y/n]: " - --#: dnf/cli/output.py:795 -+#: dnf/cli/output.py:739 - #, python-format - msgid "Group: %s" - msgstr "그룹 %s" - --#: dnf/cli/output.py:799 -+#: dnf/cli/output.py:743 - #, python-format - msgid " Group-Id: %s" - msgstr " 그룹 ID: %s" - --#: dnf/cli/output.py:801 dnf/cli/output.py:840 -+#: dnf/cli/output.py:745 dnf/cli/output.py:784 - #, python-format - msgid " Description: %s" - msgstr " 설명: %s" - --#: dnf/cli/output.py:803 -+#: dnf/cli/output.py:747 - #, python-format - msgid " Language: %s" - msgstr " 언어: %s" - --#: dnf/cli/output.py:806 -+#: dnf/cli/output.py:750 - msgid " Mandatory Packages:" - msgstr " 필수 패키지 :" - --#: dnf/cli/output.py:807 -+#: dnf/cli/output.py:751 - msgid " Default Packages:" - msgstr " 기본 패키지 :" - --#: dnf/cli/output.py:808 -+#: dnf/cli/output.py:752 - msgid " Optional Packages:" - msgstr " 선택적인 패키지 :" - --#: dnf/cli/output.py:809 -+#: dnf/cli/output.py:753 - msgid " Conditional Packages:" - msgstr " 추가 가능 패키지 :" - --#: dnf/cli/output.py:834 -+#: dnf/cli/output.py:778 - #, python-format - msgid "Environment Group: %s" - msgstr "환경 그룹 : %s" - --#: dnf/cli/output.py:837 -+#: dnf/cli/output.py:781 - #, python-format - msgid " Environment-Id: %s" - msgstr " 환경 -ID : %s" - --#: dnf/cli/output.py:843 -+#: dnf/cli/output.py:787 - msgid " Mandatory Groups:" - msgstr " 필수 그룹 :" - --#: dnf/cli/output.py:844 -+#: dnf/cli/output.py:788 - msgid " Optional Groups:" - msgstr " 선택적인 그룹 :" - --#: dnf/cli/output.py:865 -+#: dnf/cli/output.py:809 - msgid "Matched from:" - msgstr "일치하는 항목 :" - --#: dnf/cli/output.py:879 -+#: dnf/cli/output.py:823 - #, python-format - msgid "Filename : %s" - msgstr "파일 이름 : %s" - --#: dnf/cli/output.py:904 -+#: dnf/cli/output.py:848 - #, python-format - msgid "Repo : %s" - msgstr "리포지토리 : %s" - --#: dnf/cli/output.py:913 -+#: dnf/cli/output.py:857 - msgid "Description : " - msgstr "설명 : " - --#: dnf/cli/output.py:917 -+#: dnf/cli/output.py:861 - #, python-format - msgid "URL : %s" - msgstr "URL : %s" - --#: dnf/cli/output.py:921 -+#: dnf/cli/output.py:865 - #, python-format - msgid "License : %s" - msgstr "라이센스 : %s" - --#: dnf/cli/output.py:927 -+#: dnf/cli/output.py:871 - #, python-format - msgid "Provide : %s" - msgstr "제공 : %s" - --#: dnf/cli/output.py:947 -+#: dnf/cli/output.py:891 - #, python-format - msgid "Other : %s" - msgstr "기타 : %s" - --#: dnf/cli/output.py:996 -+#: dnf/cli/output.py:940 - msgid "There was an error calculating total download size" - msgstr "총 다운로드 크기를 계산하는 중에 오류가 발생했습니다" - --#: dnf/cli/output.py:1002 -+#: dnf/cli/output.py:946 - #, python-format - msgid "Total size: %s" - msgstr "전체 크기: %s" - --#: dnf/cli/output.py:1005 -+#: dnf/cli/output.py:949 - #, python-format - msgid "Total download size: %s" - msgstr "총 다운로드 크기 : %s" - --#: dnf/cli/output.py:1008 -+#: dnf/cli/output.py:952 - #, python-format - msgid "Installed size: %s" - msgstr "설치된 크기 : %s" - --#: dnf/cli/output.py:1026 -+#: dnf/cli/output.py:970 - msgid "There was an error calculating installed size" - msgstr "설치된 크기를 계산하는 동안 오류가 발생했습니다" - --#: dnf/cli/output.py:1030 -+#: dnf/cli/output.py:974 - #, python-format - msgid "Freed space: %s" - msgstr "사용 가능한 공간 : %s" - --#: dnf/cli/output.py:1039 -+#: dnf/cli/output.py:983 - msgid "Marking packages as installed by the group:" - msgstr "그룹에 설치된 패키지 표시:" - --#: dnf/cli/output.py:1046 -+#: dnf/cli/output.py:990 - msgid "Marking packages as removed by the group:" - msgstr "그룹에 의해 제거된 패키지 표시:" - --#: dnf/cli/output.py:1056 -+#: dnf/cli/output.py:1000 - msgid "Group" - msgstr "그룹" - --#: dnf/cli/output.py:1056 -+#: dnf/cli/output.py:1000 - msgid "Packages" - msgstr "패키지" - --#: dnf/cli/output.py:1133 -+#: dnf/cli/output.py:1046 - msgid "Installing group/module packages" - msgstr "그룹 / 모듈 패키지 설치" - --#: dnf/cli/output.py:1134 -+#: dnf/cli/output.py:1047 - msgid "Installing group packages" - msgstr "그룹 패키지 설치" - - #. TRANSLATORS: This is for a list of packages to be installed. --#: dnf/cli/output.py:1138 -+#: dnf/cli/output.py:1051 - msgctxt "summary" - msgid "Installing" - msgstr "설치 중" - - #. TRANSLATORS: This is for a list of packages to be upgraded. --#: dnf/cli/output.py:1140 -+#: dnf/cli/output.py:1053 - msgctxt "summary" - msgid "Upgrading" - msgstr "업그레이드 중" - - #. TRANSLATORS: This is for a list of packages to be reinstalled. --#: dnf/cli/output.py:1142 -+#: dnf/cli/output.py:1055 - msgctxt "summary" - msgid "Reinstalling" - msgstr "재설치 중" - --#: dnf/cli/output.py:1144 -+#: dnf/cli/output.py:1057 - msgid "Installing dependencies" - msgstr "종속 패키지 설치 중" - --#: dnf/cli/output.py:1145 -+#: dnf/cli/output.py:1058 - msgid "Installing weak dependencies" - msgstr "취약한 종속 패키지 설치 중" - - #. TRANSLATORS: This is for a list of packages to be removed. - # translation auto-copied from project subscription-manager, version 1.11.X, - # document keys --#: dnf/cli/output.py:1147 -+#: dnf/cli/output.py:1060 - msgid "Removing" - msgstr "삭제 중" - --#: dnf/cli/output.py:1148 -+#: dnf/cli/output.py:1061 - msgid "Removing dependent packages" - msgstr "종속 패키지 제거" - --#: dnf/cli/output.py:1149 -+#: dnf/cli/output.py:1062 - msgid "Removing unused dependencies" - msgstr "사용하지 않는 종속 패키지 제거" - - #. TRANSLATORS: This is for a list of packages to be downgraded. --#: dnf/cli/output.py:1151 -+#: dnf/cli/output.py:1064 - msgctxt "summary" - msgid "Downgrading" - msgstr "다운그레이드 중" - --#: dnf/cli/output.py:1176 -+#: dnf/cli/output.py:1089 - msgid "Installing module profiles" - msgstr "모듈 프로파일 설치" - --#: dnf/cli/output.py:1185 -+#: dnf/cli/output.py:1098 - msgid "Disabling module profiles" - msgstr "모듈 프로파일 비활성화" - --#: dnf/cli/output.py:1194 -+#: dnf/cli/output.py:1107 - msgid "Enabling module streams" - msgstr "모듈 스트림 활성화" - --#: dnf/cli/output.py:1202 -+#: dnf/cli/output.py:1115 - msgid "Switching module streams" - msgstr "모듈 스트림 전환" - --#: dnf/cli/output.py:1210 -+#: dnf/cli/output.py:1123 - msgid "Disabling modules" - msgstr "모듈 비활성화" - --#: dnf/cli/output.py:1218 -+#: dnf/cli/output.py:1131 - msgid "Resetting modules" - msgstr "모듈 재설정" - --#: dnf/cli/output.py:1230 -+#: dnf/cli/output.py:1143 - msgid "Installing Environment Groups" - msgstr "환경 그룹 설치" - --#: dnf/cli/output.py:1237 -+#: dnf/cli/output.py:1150 - msgid "Upgrading Environment Groups" - msgstr "환경 그룹 업그레이드" - --#: dnf/cli/output.py:1244 -+#: dnf/cli/output.py:1157 - msgid "Removing Environment Groups" - msgstr "환경 그룹 제거" - --#: dnf/cli/output.py:1251 -+#: dnf/cli/output.py:1164 - msgid "Installing Groups" - msgstr "그룹 설치" - --#: dnf/cli/output.py:1258 -+#: dnf/cli/output.py:1171 - msgid "Upgrading Groups" - msgstr "그룹 업그레이드" - --#: dnf/cli/output.py:1265 -+#: dnf/cli/output.py:1178 - msgid "Removing Groups" - msgstr "그룹 제거" - --#: dnf/cli/output.py:1281 -+#: dnf/cli/output.py:1194 - #, python-format - msgid "" - "Skipping packages with conflicts:\n" -@@ -3091,12 +3080,12 @@ msgstr "" - "충돌 패키지 건너 뛰기 :\n" - "(업그레이드를 강제하려면 명령행에 '%s' 추가)" - --#: dnf/cli/output.py:1291 -+#: dnf/cli/output.py:1204 - #, python-format - msgid "Skipping packages with broken dependencies%s" - msgstr "손상된 종속성이 있는 %s 패키지 건너 뛰기" - --#: dnf/cli/output.py:1295 -+#: dnf/cli/output.py:1208 - msgid " or part of a group" - msgstr " 또는 그룹의 일부" - -@@ -3104,22 +3093,22 @@ msgstr " 또는 그룹의 일부" - #. use the full (unabbreviated) term 'Package' if you think that - #. the translation to your language is not too long and will - #. always fit to limited space. --#: dnf/cli/output.py:1320 -+#: dnf/cli/output.py:1233 - msgctxt "short" - msgid "Package" - msgstr "패키지" - - #. Translators: This is the full (unabbreviated) term 'Package'. --#: dnf/cli/output.py:1322 -+#: dnf/cli/output.py:1235 - msgctxt "long" - msgid "Package" - msgstr "패키지" - --#: dnf/cli/output.py:1371 -+#: dnf/cli/output.py:1284 - msgid "replacing" - msgstr "교체" - --#: dnf/cli/output.py:1378 -+#: dnf/cli/output.py:1291 - #, python-format - msgid "" - "\n" -@@ -3131,292 +3120,276 @@ msgstr "" - "%s\n" - - #. TODO: remove --#: dnf/cli/output.py:1383 dnf/cli/output.py:1932 dnf/cli/output.py:1933 -+#: dnf/cli/output.py:1296 dnf/cli/output.py:1812 dnf/cli/output.py:1813 - msgid "Install" - msgstr "설치" - - # ctx::sourcefile::Navigation Menu --#: dnf/cli/output.py:1387 dnf/cli/output.py:1941 -+#: dnf/cli/output.py:1300 dnf/cli/output.py:1821 - msgid "Upgrade" - msgstr "업그레이드" - --#: dnf/cli/output.py:1388 -+#: dnf/cli/output.py:1301 - msgid "Remove" - msgstr "삭제" - --#: dnf/cli/output.py:1390 dnf/cli/output.py:1939 -+#: dnf/cli/output.py:1303 dnf/cli/output.py:1819 - msgid "Downgrade" - msgstr "다운 그레이드" - --#: dnf/cli/output.py:1391 -+#: dnf/cli/output.py:1304 - msgid "Skip" - msgstr "건너뛰기" - --#: dnf/cli/output.py:1400 dnf/cli/output.py:1416 -+#: dnf/cli/output.py:1313 dnf/cli/output.py:1329 - msgid "Package" - msgid_plural "Packages" - msgstr[0] "패키지" - --#: dnf/cli/output.py:1418 -+#: dnf/cli/output.py:1331 - msgid "Dependent package" - msgid_plural "Dependent packages" - msgstr[0] "종속 패키지" - --#: dnf/cli/output.py:1497 dnf/cli/output.py:1773 dnf/cli/output.py:1942 --msgid "Upgraded" --msgstr "업그레이드 됨" -- --#: dnf/cli/output.py:1498 dnf/cli/output.py:1773 dnf/cli/output.py:1940 --msgid "Downgraded" --msgstr "다운 그레이드" -- --#: dnf/cli/output.py:1503 --msgid "Reinstalled" --msgstr "다시 설치됨" -- --#: dnf/cli/output.py:1504 --msgid "Skipped" --msgstr "건너 뛰기됨" -- --#: dnf/cli/output.py:1505 --msgid "Removed" --msgstr "제거됨" -- --#: dnf/cli/output.py:1508 --msgid "Failed" --msgstr "실패하였습니다" -- - # auto translated by TM merge from project: RHOSP Director Installation and - # Usage , version: 11-Korean, DocId: master --#: dnf/cli/output.py:1559 -+#: dnf/cli/output.py:1439 - msgid "Total" - msgstr "합계" - --#: dnf/cli/output.py:1587 -+#: dnf/cli/output.py:1467 - msgid "" - msgstr "" - --#: dnf/cli/output.py:1588 -+#: dnf/cli/output.py:1468 - msgid "System" - msgstr "시스템" - --#: dnf/cli/output.py:1638 -+#: dnf/cli/output.py:1518 - msgid "Command line" - msgstr "명령행" - - #. TRANSLATORS: user names who executed transaction in history command output --#: dnf/cli/output.py:1649 -+#: dnf/cli/output.py:1529 - msgid "User name" - msgstr "사용자 이름" - - # translation auto-copied from project subscription-manager, version 1.11.X, - # document keys --#: dnf/cli/output.py:1651 -+#: dnf/cli/output.py:1531 - msgid "ID" - msgstr "ID" - --#: dnf/cli/output.py:1653 -+#: dnf/cli/output.py:1533 - msgid "Date and time" - msgstr "날짜와 시간" - --#: dnf/cli/output.py:1654 -+#: dnf/cli/output.py:1534 - msgid "Action(s)" - msgstr "작업" - --#: dnf/cli/output.py:1655 -+#: dnf/cli/output.py:1535 - msgid "Altered" - msgstr "변경됨" - --#: dnf/cli/output.py:1698 -+#: dnf/cli/output.py:1578 - msgid "No transactions" - msgstr "트랜잭션 없음" - --#: dnf/cli/output.py:1699 dnf/cli/output.py:1715 -+#: dnf/cli/output.py:1579 dnf/cli/output.py:1595 - msgid "Failed history info" - msgstr "실패 기록 정보" - --#: dnf/cli/output.py:1714 -+#: dnf/cli/output.py:1594 - msgid "No transaction ID, or package, given" - msgstr "트랜잭션 ID 또는 패키지가 지정되지 않았습니다" - --#: dnf/cli/output.py:1772 -+#: dnf/cli/output.py:1652 - msgid "Erased" - msgstr "삭제됨" - --#: dnf/cli/output.py:1774 -+#: dnf/cli/output.py:1653 dnf/cli/output.py:1820 dnf/util.py:590 -+msgid "Downgraded" -+msgstr "다운 그레이드" -+ -+#: dnf/cli/output.py:1653 dnf/cli/output.py:1822 dnf/util.py:589 -+msgid "Upgraded" -+msgstr "업그레이드 됨" -+ -+#: dnf/cli/output.py:1654 - msgid "Not installed" - msgstr "설치되지 않음" - --#: dnf/cli/output.py:1775 -+#: dnf/cli/output.py:1655 - msgid "Newer" - msgstr "최신" - --#: dnf/cli/output.py:1775 -+#: dnf/cli/output.py:1655 - msgid "Older" - msgstr "이전" - --#: dnf/cli/output.py:1823 dnf/cli/output.py:1825 -+#: dnf/cli/output.py:1703 dnf/cli/output.py:1705 - msgid "Transaction ID :" - msgstr "트랜잭션 ID :" - --#: dnf/cli/output.py:1828 -+#: dnf/cli/output.py:1708 - msgid "Begin time :" - msgstr "시작 시간 :" - --#: dnf/cli/output.py:1831 dnf/cli/output.py:1833 -+#: dnf/cli/output.py:1711 dnf/cli/output.py:1713 - msgid "Begin rpmdb :" - msgstr "rpmdb 시작 :" - --#: dnf/cli/output.py:1839 -+#: dnf/cli/output.py:1719 - #, python-format - msgid "(%u seconds)" - msgstr "(%u 초)" - --#: dnf/cli/output.py:1841 -+#: dnf/cli/output.py:1721 - #, python-format - msgid "(%u minutes)" - msgstr "(%u 분)" - --#: dnf/cli/output.py:1843 -+#: dnf/cli/output.py:1723 - #, python-format - msgid "(%u hours)" - msgstr "(%u 시간)" - --#: dnf/cli/output.py:1845 -+#: dnf/cli/output.py:1725 - #, python-format - msgid "(%u days)" - msgstr "(%u 일)" - --#: dnf/cli/output.py:1846 -+#: dnf/cli/output.py:1726 - msgid "End time :" - msgstr "종료 시간 :" - --#: dnf/cli/output.py:1849 dnf/cli/output.py:1851 -+#: dnf/cli/output.py:1729 dnf/cli/output.py:1731 - msgid "End rpmdb :" - msgstr "rpmdb 종료:" - --#: dnf/cli/output.py:1858 dnf/cli/output.py:1860 -+#: dnf/cli/output.py:1738 dnf/cli/output.py:1740 - msgid "User :" - msgstr "사용자 :" - --#: dnf/cli/output.py:1864 dnf/cli/output.py:1871 -+#: dnf/cli/output.py:1744 dnf/cli/output.py:1751 - msgid "Aborted" - msgstr "중지됨" - --#: dnf/cli/output.py:1864 dnf/cli/output.py:1867 dnf/cli/output.py:1869 --#: dnf/cli/output.py:1871 dnf/cli/output.py:1873 dnf/cli/output.py:1875 -+#: dnf/cli/output.py:1744 dnf/cli/output.py:1747 dnf/cli/output.py:1749 -+#: dnf/cli/output.py:1751 dnf/cli/output.py:1753 dnf/cli/output.py:1755 - msgid "Return-Code :" - msgstr "반환 코드 :" - --#: dnf/cli/output.py:1867 dnf/cli/output.py:1875 -+#: dnf/cli/output.py:1747 dnf/cli/output.py:1755 - msgid "Success" - msgstr "성공" - --#: dnf/cli/output.py:1869 -+#: dnf/cli/output.py:1749 - msgid "Failures:" - msgstr "실패 :" - --#: dnf/cli/output.py:1873 -+#: dnf/cli/output.py:1753 - msgid "Failure:" - msgstr "실패:" - --#: dnf/cli/output.py:1883 dnf/cli/output.py:1885 -+#: dnf/cli/output.py:1763 dnf/cli/output.py:1765 - msgid "Releasever :" - msgstr "Releasever :" - --#: dnf/cli/output.py:1890 dnf/cli/output.py:1892 -+#: dnf/cli/output.py:1770 dnf/cli/output.py:1772 - msgid "Command Line :" - msgstr "명령 줄 :" - --#: dnf/cli/output.py:1897 dnf/cli/output.py:1899 -+#: dnf/cli/output.py:1777 dnf/cli/output.py:1779 - msgid "Comment :" - msgstr "댓글 :" - --#: dnf/cli/output.py:1903 -+#: dnf/cli/output.py:1783 - msgid "Transaction performed with:" - msgstr "실행된 트랜잭션:" - --#: dnf/cli/output.py:1912 -+#: dnf/cli/output.py:1792 - msgid "Packages Altered:" - msgstr "변경된 패키지 :" - --#: dnf/cli/output.py:1918 -+#: dnf/cli/output.py:1798 - msgid "Scriptlet output:" - msgstr "Scriptlet 출력 :" - --#: dnf/cli/output.py:1925 -+#: dnf/cli/output.py:1805 - msgid "Errors:" - msgstr "오류 :" - --#: dnf/cli/output.py:1934 -+#: dnf/cli/output.py:1814 - msgid "Dep-Install" - msgstr "Dep-Install" - --#: dnf/cli/output.py:1935 -+#: dnf/cli/output.py:1815 - msgid "Obsoleted" - msgstr "사용 중지됨" - --#: dnf/cli/output.py:1936 dnf/transaction.py:84 dnf/transaction.py:85 -+#: dnf/cli/output.py:1816 dnf/transaction.py:84 dnf/transaction.py:85 - msgid "Obsoleting" - msgstr "사용 중지" - --#: dnf/cli/output.py:1937 -+#: dnf/cli/output.py:1817 - msgid "Erase" - msgstr "삭제" - --#: dnf/cli/output.py:1938 -+#: dnf/cli/output.py:1818 - msgid "Reinstall" - msgstr "재설치" - --#: dnf/cli/output.py:2016 -+#: dnf/cli/output.py:1892 - #, python-format - msgid "---> Package %s.%s %s will be installed" - msgstr "---> 패키지 %s.%s %s이/가 설치됩니다" - --#: dnf/cli/output.py:2018 -+#: dnf/cli/output.py:1894 - #, python-format - msgid "---> Package %s.%s %s will be an upgrade" - msgstr "---> 패키지 %s.%s %s이/가 업그레이드됩니다" - --#: dnf/cli/output.py:2020 -+#: dnf/cli/output.py:1896 - #, python-format - msgid "---> Package %s.%s %s will be erased" - msgstr "---> 패키지 %s.%s %s이/가 제거됩니다" - --#: dnf/cli/output.py:2022 -+#: dnf/cli/output.py:1898 - #, python-format - msgid "---> Package %s.%s %s will be reinstalled" - msgstr "---> 패키지 %s.%s %s이/가 다시 설치됩니다" - --#: dnf/cli/output.py:2024 -+#: dnf/cli/output.py:1900 - #, python-format - msgid "---> Package %s.%s %s will be a downgrade" - msgstr "---> 패키지 %s.%s %s이/가 다운그레이드됩니다" - --#: dnf/cli/output.py:2026 -+#: dnf/cli/output.py:1902 - #, python-format - msgid "---> Package %s.%s %s will be obsoleting" - msgstr "---> 패키지 %s.%s %s이/가 더 이상 사용되지 않습니다" - --#: dnf/cli/output.py:2028 -+#: dnf/cli/output.py:1904 - #, python-format - msgid "---> Package %s.%s %s will be upgraded" - msgstr "---> 패키지 %s.%s %s이/가 업그레이드됩니다" - --#: dnf/cli/output.py:2030 -+#: dnf/cli/output.py:1906 - #, python-format - msgid "---> Package %s.%s %s will be obsoleted" - msgstr "---> 패키지 %s.%s %s이/가 더 이상 사용되지 않습니다" - --#: dnf/cli/output.py:2039 -+#: dnf/cli/output.py:1915 - msgid "--> Starting dependency resolution" - msgstr "-> 종석성 해결 시작" - --#: dnf/cli/output.py:2044 -+#: dnf/cli/output.py:1919 - msgid "--> Finished dependency resolution" - msgstr "-> 종속성 해결 완료" - --#: dnf/cli/output.py:2058 dnf/crypto.py:132 -+#: dnf/cli/output.py:1933 dnf/crypto.py:132 - #, python-format - msgid "" - "Importing GPG key 0x%s:\n" -@@ -3503,7 +3476,7 @@ msgstr "모듈 또는 그룹 '%s'이/가 존재하지 않습니다." - msgid "Environment id '%s' does not exist." - msgstr "환경 '%s'이 설치되지 않았습니다." - --#: dnf/comps.py:622 dnf/transaction_sr.py:443 dnf/transaction_sr.py:453 -+#: dnf/comps.py:622 dnf/transaction_sr.py:477 dnf/transaction_sr.py:487 - #, fuzzy, python-format - #| msgid "Environment '%s' is not installed." - msgid "Environment id '%s' is not installed." -@@ -3614,6 +3587,11 @@ msgstr "repo %s: 0x%s을/를 이미 가져왔습니다" - msgid "repo %s: imported key 0x%s." - msgstr "repo %s: 0x%s 키를 가져왔습니다." - -+#: dnf/crypto.py:177 -+#, python-format -+msgid "retrieving repo key for %s unencrypted from %s" -+msgstr "" -+ - #: dnf/db/group.py:293 - msgid "" - "No available modular metadata for modular package '{}', it cannot be " -@@ -3698,7 +3676,7 @@ msgid "Modular dependency problem with Defaults:" - msgid_plural "Modular dependency problems with Defaults:" - msgstr[0] "기본값의 모듈 종속성 문제 :" - --#: dnf/exceptions.py:131 dnf/module/module_base.py:686 -+#: dnf/exceptions.py:131 dnf/module/module_base.py:841 - msgid "Modular dependency problem:" - msgid_plural "Modular dependency problems:" - msgstr[0] "모듈 종속성 문제 :" -@@ -3752,8 +3730,8 @@ msgstr "" - "\n" - "힌트 : [d] efault, [e] nabled, [x] disabled, [i] stalled, [a] ctive" - --#: dnf/module/module_base.py:54 dnf/module/module_base.py:421 --#: dnf/module/module_base.py:477 dnf/module/module_base.py:543 -+#: dnf/module/module_base.py:54 dnf/module/module_base.py:547 -+#: dnf/module/module_base.py:603 dnf/module/module_base.py:669 - msgid "Ignoring unnecessary profile: '{}/{}'" - msgstr "불필요한 프로파일을 무시합니다: '{}/{}'" - -@@ -3762,17 +3740,17 @@ msgstr "불필요한 프로파일을 무시합니다: '{}/{}'" - msgid "All matches for argument '{0}' in module '{1}:{2}' are not active" - msgstr "모듈 '{1}:{2}'의 인수 '{0}'에 대한 모든 일치 항목이 활성화되지 않았습니다" - --#: dnf/module/module_base.py:92 -+#: dnf/module/module_base.py:92 dnf/module/module_base.py:202 - #, python-brace-format - msgid "Installing module '{0}' from Fail-Safe repository {1} is not allowed" - msgstr "Fail-Safe 리포지토리 {1}에서 모듈 '{0}’을/를 설치할 수 없습니다" - --#: dnf/module/module_base.py:102 -+#: dnf/module/module_base.py:102 dnf/module/module_base.py:212 - msgid "" - "Unable to match profile for argument {}. Available profiles for '{}:{}': {}" - msgstr "인수 {}의 프로파일을 찾을 수 없습니다. '{}:{}'에 사용 가능한 프로파일: {}" - --#: dnf/module/module_base.py:106 -+#: dnf/module/module_base.py:106 dnf/module/module_base.py:216 - msgid "Unable to match profile for argument {}" - msgstr "인수 {}의 프로파일을 찾을 수 없습니다" - -@@ -3788,41 +3766,58 @@ msgstr "{} : {} 모듈에 대한 프로파일이 없습니다" - msgid "Default profile {} not available in module {}:{}" - msgstr "{} 모듈에서 기본 프로필 {}을 (를) 사용할 수 없음 : {}" - --#: dnf/module/module_base.py:142 -+#: dnf/module/module_base.py:142 dnf/module/module_base.py:245 - msgid "Installing module from Fail-Safe repository is not allowed" - msgstr "Fail-Safe 리포지토리에서 모듈을 설치할 수 없습니다" - --#: dnf/module/module_base.py:159 dnf/module/module_base.py:193 --#: dnf/module/module_base.py:337 dnf/module/module_base.py:355 --#: dnf/module/module_base.py:363 dnf/module/module_base.py:417 --#: dnf/module/module_base.py:473 dnf/module/module_base.py:539 -+#: dnf/module/module_base.py:194 -+#, fuzzy, python-brace-format -+#| msgid "" -+#| "All matches for argument '{0}' in module '{1}:{2}' are not active" -+msgid "No active matches for argument '{0}' in module '{1}:{2}'" -+msgstr "모듈 '{1}:{2}'의 인수 '{0}'에 대한 모든 일치 항목이 활성화되지 않았습니다" -+ -+#: dnf/module/module_base.py:226 -+#, fuzzy, python-brace-format -+#| msgid "Default profile {} not available in module {}:{}" -+msgid "Installed profile '{0}' is not available in module '{1}' stream '{2}'" -+msgstr "{} 모듈에서 기본 프로필 {}을 (를) 사용할 수 없음 : {}" -+ -+#: dnf/module/module_base.py:265 -+msgid "No packages available to distrosync for package name '{}'" -+msgstr "" -+ -+#: dnf/module/module_base.py:308 dnf/module/module_base.py:452 -+#: dnf/module/module_base.py:477 dnf/module/module_base.py:496 -+#: dnf/module/module_base.py:543 dnf/module/module_base.py:599 -+#: dnf/module/module_base.py:665 dnf/module/module_base.py:827 - msgid "Unable to resolve argument {}" - msgstr "인수 {}을 (를) 구문 분석할 수 없습니다" - --#: dnf/module/module_base.py:160 --msgid "No match for package {}" --msgstr "{} 패키지와 일치하지 않습니다" -- --#: dnf/module/module_base.py:204 -+#: dnf/module/module_base.py:319 - #, python-brace-format - msgid "Upgrading module '{0}' from Fail-Safe repository {1} is not allowed" - msgstr "Fail-Safe 리포지토리 {1}에서 모듈 '{0}’을/를 업그레이드할 수 없습니다" - --#: dnf/module/module_base.py:223 dnf/module/module_base.py:251 -+#: dnf/module/module_base.py:338 dnf/module/module_base.py:366 - msgid "Unable to match profile in argument {}" - msgstr "인수 {}에서 프로파일이 일치하지 않습니다" - --#: dnf/module/module_base.py:231 -+#: dnf/module/module_base.py:346 - msgid "Upgrading module from Fail-Safe repository is not allowed" - msgstr "Fail-Safe 리포지토리에서 모듈을 업그레이드할 수 없습니다" - --#: dnf/module/module_base.py:367 -+#: dnf/module/module_base.py:500 - msgid "" - "Only module name is required. Ignoring unneeded information in argument: " - "'{}'" - msgstr "모듈 이름만 필요합니다. '{}'인수에서 불필요한 정보를 무시합니다" - --#: dnf/package.py:298 -+#: dnf/module/module_base.py:828 -+msgid "No match for package {}" -+msgstr "{} 패키지와 일치하지 않습니다" -+ -+#: dnf/package.py:333 - #, python-format - msgid "%s: %s check failed: %s vs %s" - msgstr "%s: %s 확인 실패 : %s 대 %s" -@@ -3903,6 +3898,12 @@ msgstr "%s 에서 %s repo를 추가했습니다" - msgid "Errors occurred during test transaction." - msgstr "트랜잭션 테스트 중에 오류가 발생했습니다." - -+#: dnf/sack.py:47 -+msgid "" -+"allow_vendor_change is disabled. This option is currently not supported for " -+"downgrade and distro-sync commands" -+msgstr "" -+ - #. TRANSLATORS: This is for a single package currently being downgraded. - #: dnf/transaction.py:80 - msgctxt "currently" -@@ -3949,163 +3950,199 @@ msgstr "scriptlet 실행 중" - msgid "Preparing" - msgstr "준비 중" - --#: dnf/transaction_sr.py:60 -+#: dnf/transaction_sr.py:66 - #, python-brace-format --msgid "Errors in \"{filename}\":" -+msgid "" -+"The following problems occurred while replaying the transaction from file " -+"\"{filename}\":" - msgstr "" - --#: dnf/transaction_sr.py:70 --#, python-brace-format --msgid "Error in \"{filename}\": {error}" --msgstr "" -+#: dnf/transaction_sr.py:68 -+#, fuzzy -+#| msgid "Errors occurred during transaction." -+msgid "The following problems occurred while running a transaction:" -+msgstr "트랜잭션 중에 오류가 발생했습니다." - --#: dnf/transaction_sr.py:87 -+#: dnf/transaction_sr.py:89 - #, python-brace-format - msgid "Invalid major version \"{major}\", number expected." - msgstr "" - --#: dnf/transaction_sr.py:95 -+#: dnf/transaction_sr.py:97 - #, python-brace-format - msgid "Invalid minor version \"{minor}\", number expected." - msgstr "" - --#: dnf/transaction_sr.py:101 -+#: dnf/transaction_sr.py:103 - #, python-brace-format - msgid "" - "Incompatible major version \"{major}\", supported major version is " - "\"{major_supp}\"." - msgstr "" - --#: dnf/transaction_sr.py:244 -+#: dnf/transaction_sr.py:224 -+msgid "" -+"Conflicting TransactionReplay arguments have been specified: filename, data" -+msgstr "" -+ -+#: dnf/transaction_sr.py:265 - #, python-brace-format - msgid "Unexpected type of \"{id}\", {exp} expected." - msgstr "" - --#: dnf/transaction_sr.py:250 -+#: dnf/transaction_sr.py:271 - #, python-brace-format - msgid "Missing key \"{key}\"." - msgstr "" - --#: dnf/transaction_sr.py:263 -+#: dnf/transaction_sr.py:285 - #, python-brace-format - msgid "Missing object key \"{key}\" in an rpm." - msgstr "" - --#: dnf/transaction_sr.py:267 -+#: dnf/transaction_sr.py:289 - #, python-brace-format - msgid "Unexpected value of package reason \"{reason}\" for rpm nevra \"{nevra}\"." - msgstr "" - --#: dnf/transaction_sr.py:275 -+#: dnf/transaction_sr.py:297 - #, python-brace-format - msgid "Cannot parse NEVRA for package \"{nevra}\"." - msgstr "" - --#: dnf/transaction_sr.py:286 -+#: dnf/transaction_sr.py:321 - #, python-brace-format - msgid "Cannot find rpm nevra \"{nevra}\"." - msgstr "" - --#: dnf/transaction_sr.py:301 -+#: dnf/transaction_sr.py:336 - #, python-brace-format - msgid "Package \"{na}\" is already installed for action \"{action}\"." - msgstr "" - --#: dnf/transaction_sr.py:311 -+#: dnf/transaction_sr.py:345 - #, python-brace-format - msgid "" - "Package nevra \"{nevra}\" not available in repositories for action " - "\"{action}\"." - msgstr "" - --#: dnf/transaction_sr.py:322 -+#: dnf/transaction_sr.py:356 - #, python-brace-format - msgid "Package nevra \"{nevra}\" not installed for action \"{action}\"." - msgstr "" - --#: dnf/transaction_sr.py:336 -+#: dnf/transaction_sr.py:370 - #, python-brace-format - msgid "Unexpected value of package action \"{action}\" for rpm nevra \"{nevra}\"." - msgstr "" - --#: dnf/transaction_sr.py:343 -+#: dnf/transaction_sr.py:377 - #, fuzzy, python-format - #| msgid "Group_id '%s' does not exist." - msgid "Group id '%s' is not available." - msgstr "Group_id '%s' 존재하지 않는다." - --#: dnf/transaction_sr.py:364 -+#: dnf/transaction_sr.py:398 - #, python-brace-format - msgid "Missing object key \"{key}\" in groups.packages." - msgstr "" - --#: dnf/transaction_sr.py:377 dnf/transaction_sr.py:387 -+#: dnf/transaction_sr.py:411 dnf/transaction_sr.py:421 - #, fuzzy, python-format - #| msgid "Environment '%s' is not installed." - msgid "Group id '%s' is not installed." - msgstr "환경 '%s'이 설치되지 않았습니다." - --#: dnf/transaction_sr.py:398 -+#: dnf/transaction_sr.py:432 - #, fuzzy, python-format - #| msgid "Environment '%s' is not installed." - msgid "Environment id '%s' is not available." - msgstr "환경 '%s'이 설치되지 않았습니다." - --#: dnf/transaction_sr.py:422 -+#: dnf/transaction_sr.py:456 - #, python-brace-format - msgid "" - "Invalid value \"{group_type}\" of environments.groups.group_type, only " - "\"mandatory\" or \"optional\" is supported." - msgstr "" - --#: dnf/transaction_sr.py:430 -+#: dnf/transaction_sr.py:464 - #, python-brace-format - msgid "Missing object key \"{key}\" in environments.groups." - msgstr "" - --#: dnf/transaction_sr.py:508 -+#: dnf/transaction_sr.py:542 - #, python-brace-format - msgid "Unexpected value of group action \"{action}\" for group \"{group}\"." - msgstr "" - --#: dnf/transaction_sr.py:513 -+#: dnf/transaction_sr.py:547 - #, python-brace-format - msgid "Missing object key \"{key}\" in a group." - msgstr "" - --#: dnf/transaction_sr.py:537 -+#: dnf/transaction_sr.py:571 - #, python-brace-format - msgid "Unexpected value of environment action \"{action}\" for environment \"{env}\"." - msgstr "" - --#: dnf/transaction_sr.py:542 -+#: dnf/transaction_sr.py:576 - #, python-brace-format - msgid "Missing object key \"{key}\" in an environment." - msgstr "" - --#: dnf/transaction_sr.py:581 -+#: dnf/transaction_sr.py:615 - #, python-brace-format - msgid "" - "Package nevra \"{nevra}\", which is not present in the transaction file, was" - " pulled into the transaction." - msgstr "" - --#: dnf/util.py:391 dnf/util.py:393 -+#: dnf/util.py:393 dnf/util.py:395 - msgid "Problem" - msgstr "문제" - --#: dnf/util.py:444 -+#: dnf/util.py:446 - msgid "TransactionItem not found for key: {}" - msgstr "{} 키에 대한 TransactionItem을 찾을 수 없습니다" - --#: dnf/util.py:454 -+#: dnf/util.py:456 - msgid "TransactionSWDBItem not found for key: {}" - msgstr "{} 키에 대한 TransactionSWDBItem을 찾을 수 없습니다" - --#: dnf/util.py:457 -+#: dnf/util.py:459 - msgid "Errors occurred during transaction." - msgstr "트랜잭션 중에 오류가 발생했습니다." - -+#: dnf/util.py:595 -+msgid "Reinstalled" -+msgstr "다시 설치됨" -+ -+#: dnf/util.py:596 -+msgid "Skipped" -+msgstr "건너 뛰기됨" -+ -+#: dnf/util.py:597 -+msgid "Removed" -+msgstr "제거됨" -+ -+#: dnf/util.py:600 -+msgid "Failed" -+msgstr "실패하였습니다" -+ -+#~ msgid "Action not handled: {}" -+#~ msgstr "작업이 처리되지 않았습니다: {}" -+ -+#~ msgid "no package matched" -+#~ msgstr "일치하는 패키지가 없습니다." -+ -+#~ msgid "Not found given transaction ID" -+#~ msgstr "주어진 트랜잭션 ID를 찾을 수 없습니다" -+ -+#~ msgid "Undoing transaction {}, from {}" -+#~ msgstr "{}에서 {} 트랜잭션 실행을 취소하고 있습니다" -+ - #~ msgid "format for displaying found packages" - #~ msgstr "발견 된 패키지를 표시하기위한 형식" - -diff --git a/po/zh_CN.po b/po/zh_CN.po -index 7ede4ed8..d1c433a3 100644 ---- a/po/zh_CN.po -+++ b/po/zh_CN.po -@@ -26,20 +26,21 @@ - # Anonymous , 2020. - # Hongqiao Chen , 2020. - # Harry Chen , 2020. -+# Sundeep Anand , 2021. - msgid "" - msgstr "" - "Project-Id-Version: PACKAGE VERSION\n" - "Report-Msgid-Bugs-To: \n" --"POT-Creation-Date: 2020-10-05 09:18-0400\n" --"PO-Revision-Date: 2020-08-02 08:29+0000\n" --"Last-Translator: Charles Lee \n" --"Language-Team: Chinese (Simplified) \n" -+"POT-Creation-Date: 2021-02-22 09:22+0100\n" -+"PO-Revision-Date: 2021-03-08 10:29+0000\n" -+"Last-Translator: Sundeep Anand \n" -+"Language-Team: Chinese (Simplified) \n" - "Language: zh_CN\n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" - "Plural-Forms: nplurals=1; plural=0;\n" --"X-Generator: Weblate 4.1.1\n" -+"X-Generator: Weblate 4.5.1\n" - - #: dnf/automatic/emitter.py:32 - #, python-format -@@ -96,7 +97,7 @@ msgstr "未知配置值: %s=%s 在 %s 中; %s" - msgid "Unknown configuration option: %s = %s in %s" - msgstr "未知配置选项:%s = %s 在 %s 中" - --#: dnf/automatic/main.py:237 dnf/cli/cli.py:299 -+#: dnf/automatic/main.py:237 dnf/cli/cli.py:304 - msgid "GPG check FAILED" - msgstr "GPG 检查失败" - -@@ -109,9 +110,9 @@ msgid "Started dnf-automatic." - msgstr "启动的 dnf-automatic。" - - #: dnf/automatic/main.py:308 --#, python-format --msgid "Sleep for %s seconds" --msgstr "休眠 %s 秒" -+msgid "Sleep for {} second" -+msgid_plural "Sleep for {} seconds" -+msgstr[0] "休眠 {} 秒" - - #: dnf/automatic/main.py:315 - msgid "System is off-line." -@@ -123,7 +124,7 @@ msgstr "系统离线。" - msgid "Error: %s" - msgstr "错误:%s" - --#: dnf/base.py:146 -+#: dnf/base.py:146 dnf/base.py:472 dnf/base.py:474 - msgid "loading repo '{}' failure: {}" - msgstr "加载仓库 '{}' 失败:{}" - -@@ -131,236 +132,236 @@ msgstr "加载仓库 '{}' 失败:{}" - msgid "Loading repository '{}' has failed" - msgstr "加载仓库 '{}' 失败" - --#: dnf/base.py:320 -+#: dnf/base.py:322 - msgid "Metadata timer caching disabled when running on metered connection." - msgstr "在使用按流量计费的连接时禁用元数据计时缓存。" - --#: dnf/base.py:325 -+#: dnf/base.py:327 - msgid "Metadata timer caching disabled when running on a battery." - msgstr "在使用电池时禁用元数据计时缓存。" - --#: dnf/base.py:330 -+#: dnf/base.py:332 - msgid "Metadata timer caching disabled." - msgstr "元数据计时缓存已禁用。" - --#: dnf/base.py:335 -+#: dnf/base.py:337 - msgid "Metadata cache refreshed recently." - msgstr "元数据缓存近期已刷新。" - --#: dnf/base.py:341 dnf/cli/commands/__init__.py:91 -+#: dnf/base.py:343 dnf/cli/commands/__init__.py:91 - msgid "There are no enabled repositories in \"{}\"." - msgstr "在\"{}\"中没有被启用的仓库。" - --#: dnf/base.py:348 -+#: dnf/base.py:350 - #, python-format - msgid "%s: will never be expired and will not be refreshed." - msgstr "%s: 永远不过期并不会被刷新。" - --#: dnf/base.py:350 -+#: dnf/base.py:352 - #, python-format - msgid "%s: has expired and will be refreshed." - msgstr "%s: 已过期并不会被刷新。" - - #. expires within the checking period: --#: dnf/base.py:354 -+#: dnf/base.py:356 - #, python-format - msgid "%s: metadata will expire after %d seconds and will be refreshed now" - msgstr "%s: 元数据将在 %d 秒后过期,现在将会被刷新" - --#: dnf/base.py:358 -+#: dnf/base.py:360 - #, python-format - msgid "%s: will expire after %d seconds." - msgstr "%s: 将会在 %d 秒后过期。" - - #. performs the md sync --#: dnf/base.py:364 -+#: dnf/base.py:366 - msgid "Metadata cache created." - msgstr "元数据缓存已建立。" - --#: dnf/base.py:397 -+#: dnf/base.py:399 dnf/base.py:466 - #, python-format - msgid "%s: using metadata from %s." - msgstr "%s:正在使用截止于 %s 的元数据。" - --#: dnf/base.py:409 -+#: dnf/base.py:411 dnf/base.py:479 - #, python-format - msgid "Ignoring repositories: %s" - msgstr "正在忽略仓库:%s" - --#: dnf/base.py:412 -+#: dnf/base.py:414 - #, python-format - msgid "Last metadata expiration check: %s ago on %s." - msgstr "上次元数据过期检查:%s 前,执行于 %s。" - --#: dnf/base.py:443 -+#: dnf/base.py:507 - msgid "" - "The downloaded packages were saved in cache until the next successful " - "transaction." - msgstr "下载的软件包保存在缓存中,直到下次成功执行事务。" - --#: dnf/base.py:445 -+#: dnf/base.py:509 - #, python-format - msgid "You can remove cached packages by executing '%s'." - msgstr "您可以通过执行 '%s' 删除软件包缓存。" - --#: dnf/base.py:535 -+#: dnf/base.py:599 - #, python-format - msgid "Invalid tsflag in config file: %s" - msgstr "配置文件 %s 中使用 tsflag 是错误的" - --#: dnf/base.py:591 -+#: dnf/base.py:655 - #, python-format - msgid "Failed to add groups file for repository: %s - %s" - msgstr "为仓库 %s 添加组文件时失败:%s" - --#: dnf/base.py:823 -+#: dnf/base.py:887 - msgid "Running transaction check" - msgstr "运行事务检查" - --#: dnf/base.py:831 -+#: dnf/base.py:895 - msgid "Error: transaction check vs depsolve:" - msgstr "错误:事务检查与依赖解决错误:" - --#: dnf/base.py:837 -+#: dnf/base.py:901 - msgid "Transaction check succeeded." - msgstr "事务检查成功。" - --#: dnf/base.py:840 -+#: dnf/base.py:904 - msgid "Running transaction test" - msgstr "运行事务测试" - --#: dnf/base.py:850 dnf/base.py:992 -+#: dnf/base.py:914 dnf/base.py:1065 - msgid "RPM: {}" - msgstr "RPM软件包: {}" - --#: dnf/base.py:851 -+#: dnf/base.py:915 - msgid "Transaction test error:" - msgstr "事物测试失败:" - --#: dnf/base.py:862 -+#: dnf/base.py:926 - msgid "Transaction test succeeded." - msgstr "事务测试成功。" - --#: dnf/base.py:883 -+#: dnf/base.py:947 - msgid "Running transaction" - msgstr "运行事务" - --#: dnf/base.py:911 -+#: dnf/base.py:984 - msgid "Disk Requirements:" - msgstr "磁盘需求:" - --#: dnf/base.py:914 -+#: dnf/base.py:987 - #, python-brace-format - msgid "At least {0}MB more space needed on the {1} filesystem." - msgid_plural "At least {0}MB more space needed on the {1} filesystem." - msgstr[0] "在文件系统{1}上至少需要{0}MB的可用空间。" - --#: dnf/base.py:921 -+#: dnf/base.py:994 - msgid "Error Summary" - msgstr "错误汇总" - --#: dnf/base.py:947 -+#: dnf/base.py:1020 - #, python-brace-format - msgid "RPMDB altered outside of {prog}." - msgstr "RPMDB 在 {prog} 外被改动了。" - --#: dnf/base.py:993 dnf/base.py:1001 -+#: dnf/base.py:1066 dnf/base.py:1074 - msgid "Could not run transaction." - msgstr "不能执行事务。" - --#: dnf/base.py:996 -+#: dnf/base.py:1069 - msgid "Transaction couldn't start:" - msgstr "事务无法启动:" - --#: dnf/base.py:1010 -+#: dnf/base.py:1083 - #, python-format - msgid "Failed to remove transaction file %s" - msgstr "移除事务文件 %s 失败" - --#: dnf/base.py:1092 -+#: dnf/base.py:1165 - msgid "Some packages were not downloaded. Retrying." - msgstr "某些软件包没有被下载。正在重试。" - --#: dnf/base.py:1122 -+#: dnf/base.py:1195 - #, python-format - msgid "Delta RPMs reduced %.1f MB of updates to %.1f MB (%d.1%% saved)" - msgstr "增量 RPM 将 %.1f MB 的更新减少至 %.1f MB(已节省 %d.1%% )" - --#: dnf/base.py:1125 -+#: dnf/base.py:1198 - #, python-format - msgid "" - "Failed Delta RPMs increased %.1f MB of updates to %.1f MB (%d.1%% wasted)" - msgstr "增量 RPM 未能将 %.1f MB 的更新减少至 %.1f MB(已浪费 %d.1%% )" - --#: dnf/base.py:1167 -+#: dnf/base.py:1240 - msgid "Cannot add local packages, because transaction job already exists" - msgstr "由于事物已经存在,无法添加本地软件包" - --#: dnf/base.py:1181 -+#: dnf/base.py:1254 - msgid "Could not open: {}" - msgstr "无法打开: {}" - --#: dnf/base.py:1219 -+#: dnf/base.py:1292 - #, python-format - msgid "Public key for %s is not installed" - msgstr "%s 的公钥没有安装" - --#: dnf/base.py:1223 -+#: dnf/base.py:1296 - #, python-format - msgid "Problem opening package %s" - msgstr "打开软件包 %s 出现问题" - --#: dnf/base.py:1231 -+#: dnf/base.py:1304 - #, python-format - msgid "Public key for %s is not trusted" - msgstr "%s 的公钥不可信任" - --#: dnf/base.py:1235 -+#: dnf/base.py:1308 - #, python-format - msgid "Package %s is not signed" - msgstr "软件包 %s 没有签名" - --#: dnf/base.py:1265 -+#: dnf/base.py:1338 - #, python-format - msgid "Cannot remove %s" - msgstr "无法删除 %s" - --#: dnf/base.py:1269 -+#: dnf/base.py:1342 - #, python-format - msgid "%s removed" - msgstr "%s 已删除" - --#: dnf/base.py:1549 -+#: dnf/base.py:1622 - msgid "No match for group package \"{}\"" - msgstr "没有和组 \"{}\" 匹配的" - --#: dnf/base.py:1635 -+#: dnf/base.py:1708 - #, python-format - msgid "Adding packages from group '%s': %s" - msgstr "从组 '%s': %s 添加软件包" - --#: dnf/base.py:1658 dnf/cli/cli.py:219 dnf/cli/commands/__init__.py:442 -+#: dnf/base.py:1731 dnf/cli/cli.py:220 dnf/cli/commands/__init__.py:442 - #: dnf/cli/commands/__init__.py:499 dnf/cli/commands/__init__.py:592 - #: dnf/cli/commands/__init__.py:641 dnf/cli/commands/install.py:80 - #: dnf/cli/commands/install.py:103 dnf/cli/commands/install.py:110 - msgid "Nothing to do." - msgstr "无需任何处理。" - --#: dnf/base.py:1676 -+#: dnf/base.py:1749 - msgid "No groups marked for removal." - msgstr "没有软件包组需要移除。" - --#: dnf/base.py:1710 -+#: dnf/base.py:1783 - msgid "No group marked for upgrade." - msgstr "没有标记为要升级的组。" - --#: dnf/base.py:1925 -+#: dnf/base.py:1997 - #, python-format - msgid "Package %s not installed, cannot downgrade it." - msgstr "软件包 %s 并没有能够安装,无法进行降级操作。" - --#: dnf/base.py:1927 dnf/base.py:1946 dnf/base.py:1959 dnf/base.py:1980 --#: dnf/base.py:2029 dnf/base.py:2037 dnf/base.py:2172 dnf/cli/cli.py:411 -+#: dnf/base.py:1999 dnf/base.py:2018 dnf/base.py:2031 dnf/base.py:2052 -+#: dnf/base.py:2101 dnf/base.py:2109 dnf/base.py:2243 dnf/cli/cli.py:416 - #: dnf/cli/commands/__init__.py:425 dnf/cli/commands/__init__.py:482 - #: dnf/cli/commands/__init__.py:586 dnf/cli/commands/__init__.py:633 - #: dnf/cli/commands/__init__.py:711 dnf/cli/commands/install.py:147 -@@ -370,141 +371,127 @@ msgstr "软件包 %s 并没有能够安装,无法进行降级操作。" - msgid "No match for argument: %s" - msgstr "未找到匹配的参数: %s" - --#: dnf/base.py:1934 -+#: dnf/base.py:2006 - #, python-format - msgid "Package %s of lower version already installed, cannot downgrade it." - msgstr "软件包 %s 的低版本已经安装,无法进行降级。" - --#: dnf/base.py:1957 -+#: dnf/base.py:2029 - #, python-format - msgid "Package %s not installed, cannot reinstall it." - msgstr "软件包 %s 未能够安装成功,无法进行重新安装。" - --#: dnf/base.py:1972 -+#: dnf/base.py:2044 - #, python-format - msgid "File %s is a source package and cannot be updated, ignoring." - msgstr "%s 文件无法被升级,已忽略。" - --#: dnf/base.py:1978 -+#: dnf/base.py:2050 - #, python-format - msgid "Package %s not installed, cannot update it." - msgstr "软件包 %s 未安装,无法更新。" - --#: dnf/base.py:1987 -+#: dnf/base.py:2059 - #, python-format - msgid "" - "The same or higher version of %s is already installed, cannot update it." - msgstr "已经安装了软件包%s的相同或更高版本,无法更新。" - --#: dnf/base.py:2026 dnf/cli/commands/reinstall.py:81 -+#: dnf/base.py:2098 dnf/cli/commands/reinstall.py:81 - #, python-format - msgid "Package %s available, but not installed." - msgstr "软件包 %s 可用,但没有被安装。" - --#: dnf/base.py:2032 -+#: dnf/base.py:2104 - #, python-format - msgid "Package %s available, but installed for different architecture." - msgstr "软件包 %s 可用,当是为其它架构安装。" - --#: dnf/base.py:2057 dnf/base.py:2250 dnf/cli/cli.py:668 dnf/cli/cli.py:699 -+#: dnf/base.py:2129 - #, python-format - msgid "No package %s installed." - msgstr "没有软件包 %s 安装。" - --#: dnf/base.py:2075 dnf/cli/commands/install.py:136 -+#: dnf/base.py:2147 dnf/cli/commands/install.py:136 - #: dnf/cli/commands/remove.py:133 - #, python-format - msgid "Not a valid form: %s" - msgstr "无效: %s" - --#: dnf/base.py:2091 dnf/cli/commands/__init__.py:681 --#: dnf/cli/commands/remove.py:163 -+#: dnf/base.py:2162 dnf/cli/commands/__init__.py:681 -+#: dnf/cli/commands/remove.py:162 - msgid "No packages marked for removal." - msgstr "没有软件包需要移除。" - --#: dnf/base.py:2179 dnf/cli/cli.py:422 -+#: dnf/base.py:2250 dnf/cli/cli.py:427 - #, python-format - msgid "Packages for argument %s available, but not installed." - msgstr "针对于参数 %s 的软件包可用, 但是目前没有安装。" - --#: dnf/base.py:2184 -+#: dnf/base.py:2255 - #, python-format - msgid "Package %s of lowest version already installed, cannot downgrade it." - msgstr "软件包 %s 的最低版本已经安装,无法再进行降级。" - --#: dnf/base.py:2242 --msgid "Action not handled: {}" --msgstr "操作没被处理:{}" -- --#: dnf/base.py:2256 dnf/cli/cli.py:419 dnf/cli/cli.py:673 dnf/cli/cli.py:703 --#: dnf/cli/commands/group.py:400 dnf/cli/commands/history.py:169 --#, python-format --msgid "No package %s available." --msgstr "没有可用的软件包 %s。" -- --#: dnf/base.py:2269 --msgid "no package matched" --msgstr "没有能够与之匹配的软件包" -- --#: dnf/base.py:2290 -+#: dnf/base.py:2302 - msgid "No security updates needed, but {} update available" - msgstr "没有必须的安全更新, 但是 {} 的更新可用" - --#: dnf/base.py:2292 -+#: dnf/base.py:2304 - msgid "No security updates needed, but {} updates available" - msgstr "没有必须的安全更新, 但是 {} 的更新可用" - --#: dnf/base.py:2296 -+#: dnf/base.py:2308 - msgid "No security updates needed for \"{}\", but {} update available" - msgstr "没有针对于\"{}\" 所必须的安全更新, 但是 {} 的更新可用" - --#: dnf/base.py:2298 -+#: dnf/base.py:2310 - msgid "No security updates needed for \"{}\", but {} updates available" - msgstr "没有针对于\"{}\" 所必须的安全更新, 但是 {} 的更新可用" - - #. raise an exception, because po.repoid is not in self.repos --#: dnf/base.py:2319 -+#: dnf/base.py:2331 - #, python-format - msgid "Unable to retrieve a key for a commandline package: %s" --msgstr "" -+msgstr "无法获取命令行软件包的密钥: %s" - --#: dnf/base.py:2327 -+#: dnf/base.py:2339 - #, python-format - msgid ". Failing package is: %s" - msgstr ". 失败的软件包是:%s" - --#: dnf/base.py:2328 -+#: dnf/base.py:2340 - #, python-format - msgid "GPG Keys are configured as: %s" - msgstr "GPG密钥配置为:%s" - --#: dnf/base.py:2340 -+#: dnf/base.py:2352 - #, python-format - msgid "GPG key at %s (0x%s) is already installed" - msgstr "%s 的 GPG 公钥(0x%s)已安装" - --#: dnf/base.py:2373 -+#: dnf/base.py:2385 - msgid "The key has been approved." - msgstr "密钥已被确认。" - --#: dnf/base.py:2376 -+#: dnf/base.py:2388 - msgid "The key has been rejected." - msgstr "密钥已被拒绝。" - --#: dnf/base.py:2409 -+#: dnf/base.py:2421 - #, python-format - msgid "Key import failed (code %d)" - msgstr "导入公钥失败(代码 %d)" - --#: dnf/base.py:2411 -+#: dnf/base.py:2423 - msgid "Key imported successfully" - msgstr "导入公钥成功" - --#: dnf/base.py:2415 -+#: dnf/base.py:2427 - msgid "Didn't install any keys" - msgstr "没有安装任何公钥" - --#: dnf/base.py:2418 -+#: dnf/base.py:2430 - #, python-format - msgid "" - "The GPG keys listed for the \"%s\" repository are already installed but they are not correct for this package.\n" -@@ -513,49 +500,49 @@ msgstr "" - "仓库 \"%s\" 的 GPG 公钥已安装,但是不适用于此软件包。\n" - "请检查此仓库的公钥 URL 是否配置正确。" - --#: dnf/base.py:2429 -+#: dnf/base.py:2441 - msgid "Import of key(s) didn't help, wrong key(s)?" - msgstr "导入的密钥没有公钥,错误的公钥?" - --#: dnf/base.py:2482 -+#: dnf/base.py:2494 - msgid " * Maybe you meant: {}" - msgstr " * 可能您的意思是:{}" - --#: dnf/base.py:2514 -+#: dnf/base.py:2526 - msgid "Package \"{}\" from local repository \"{}\" has incorrect checksum" - msgstr "软件包 \"{}\"(来自于本地仓库 \"{}\")的 checksum 不正确" - --#: dnf/base.py:2517 -+#: dnf/base.py:2529 - msgid "Some packages from local repository have incorrect checksum" - msgstr "本地仓库的一些软件包校验值(checksum)不正确,无法确定软件包完整" - --#: dnf/base.py:2520 -+#: dnf/base.py:2532 - msgid "Package \"{}\" from repository \"{}\" has incorrect checksum" - msgstr "软件包 \"{}\"(来自仓库 \"{}\")的 checksum 不正确" - --#: dnf/base.py:2523 -+#: dnf/base.py:2535 - msgid "" - "Some packages have invalid cache, but cannot be downloaded due to \"--" - "cacheonly\" option" - msgstr "以下软件包有无效缓存,因为使用了 \"--cacheonly\" 选项不能下载" - --#: dnf/base.py:2541 dnf/base.py:2561 -+#: dnf/base.py:2553 dnf/base.py:2573 - msgid "No match for argument" - msgstr "未找到匹配的参数" - --#: dnf/base.py:2549 dnf/base.py:2569 -+#: dnf/base.py:2561 dnf/base.py:2581 - msgid "All matches were filtered out by exclude filtering for argument" - msgstr "由于您的搜索参数,所有相关结果都已被滤掉" - --#: dnf/base.py:2551 -+#: dnf/base.py:2563 - msgid "All matches were filtered out by modular filtering for argument" - msgstr "所有的匹配结果均已经被参数的模块化过滤条件筛除" - --#: dnf/base.py:2567 -+#: dnf/base.py:2579 - msgid "All matches were installed from a different repository for argument" - msgstr "已从另一个仓库安装了参数的所有匹配" - --#: dnf/base.py:2583 -+#: dnf/base.py:2626 - #, python-format - msgid "Package %s is already installed." - msgstr "软件包 %s 已安装。" -@@ -575,8 +562,8 @@ msgstr "解析文件 \"%s\" 失败:%s" - msgid "Cannot read file \"%s\": %s" - msgstr "无法读取文件 \"%s\": %s" - --#: dnf/cli/aliases.py:115 dnf/cli/aliases.py:129 dnf/cli/cli.py:902 --#: dnf/cli/cli.py:906 dnf/cli/commands/alias.py:108 -+#: dnf/cli/aliases.py:115 dnf/cli/aliases.py:129 dnf/cli/cli.py:803 -+#: dnf/cli/cli.py:807 dnf/cli/commands/alias.py:108 - #, python-format - msgid "Config error: %s" - msgstr "配置错误:%s" -@@ -607,7 +594,7 @@ msgid "" - "stream '{2}'" - msgstr "这个操作会把模块 '{0}' 从流 '{1}' 切换到流 '{2}'" - --#: dnf/cli/cli.py:172 -+#: dnf/cli/cli.py:173 - #, python-brace-format - msgid "" - "It is not possible to switch enabled streams of a module.\n" -@@ -616,35 +603,35 @@ msgstr "" - "无法切换已启用模块的流。\n" - "推荐移除来自模块的所有已安装内容,然后通过 '{prog} module reset ' 命令重置模块。在您重置模块之后,就可以安装其他的流。" - --#: dnf/cli/cli.py:210 -+#: dnf/cli/cli.py:211 - #, python-brace-format - msgid "{prog} will only download packages for the transaction." - msgstr "{prog}将仅会从事务下载软件包。" - --#: dnf/cli/cli.py:213 -+#: dnf/cli/cli.py:214 - #, python-brace-format - msgid "" - "{prog} will only download packages, install gpg keys, and check the " - "transaction." - msgstr "{prog}将仅会下载软件包,导入gpg密钥并检查事务。" - --#: dnf/cli/cli.py:217 -+#: dnf/cli/cli.py:218 - msgid "Operation aborted." - msgstr "操作中止。" - --#: dnf/cli/cli.py:224 -+#: dnf/cli/cli.py:225 - msgid "Downloading Packages:" - msgstr "下载软件包:" - --#: dnf/cli/cli.py:230 -+#: dnf/cli/cli.py:231 - msgid "Error downloading packages:" - msgstr "下载软件包出错 :" - --#: dnf/cli/cli.py:258 -+#: dnf/cli/cli.py:263 - msgid "Transaction failed" - msgstr "事务失败" - --#: dnf/cli/cli.py:281 -+#: dnf/cli/cli.py:286 - msgid "" - "Refusing to automatically import keys when running unattended.\n" - "Use \"-y\" to override." -@@ -652,116 +639,95 @@ msgstr "" - "如果不加干预,拒绝自动导入公钥。\n" - "指定 \"-y\" 改变这个行为。" - --#: dnf/cli/cli.py:331 -+#: dnf/cli/cli.py:336 - msgid "Changelogs for {}" - msgstr "{}的变更记录" - --#: dnf/cli/cli.py:364 dnf/cli/cli.py:505 dnf/cli/cli.py:511 -+#: dnf/cli/cli.py:369 dnf/cli/cli.py:510 dnf/cli/cli.py:516 - msgid "Obsoleting Packages" - msgstr "取代的软件包" - --#: dnf/cli/cli.py:393 -+#: dnf/cli/cli.py:398 - msgid "No packages marked for distribution synchronization." - msgstr "没有软件包需要发行版同步。" - --#: dnf/cli/cli.py:428 -+#: dnf/cli/cli.py:424 dnf/cli/commands/group.py:395 -+#, python-format -+msgid "No package %s available." -+msgstr "没有可用的软件包 %s。" -+ -+#: dnf/cli/cli.py:433 - msgid "No packages marked for downgrade." - msgstr "没有标记要降级的软件包。" - --#: dnf/cli/cli.py:479 -+#: dnf/cli/cli.py:484 - msgid "Installed Packages" - msgstr "已安装的软件包" - --#: dnf/cli/cli.py:487 -+#: dnf/cli/cli.py:492 - msgid "Available Packages" - msgstr "可安装的软件包" - --#: dnf/cli/cli.py:491 -+#: dnf/cli/cli.py:496 - msgid "Autoremove Packages" - msgstr "自动移除软件包" - --#: dnf/cli/cli.py:493 -+#: dnf/cli/cli.py:498 - msgid "Extra Packages" - msgstr "更多软件包" - --#: dnf/cli/cli.py:497 -+#: dnf/cli/cli.py:502 - msgid "Available Upgrades" - msgstr "可用升级" - --#: dnf/cli/cli.py:513 -+#: dnf/cli/cli.py:518 - msgid "Recently Added Packages" - msgstr "最近添加的软件包" - --#: dnf/cli/cli.py:518 -+#: dnf/cli/cli.py:522 - msgid "No matching Packages to list" - msgstr "没有匹配的软件包可以列出" - --#: dnf/cli/cli.py:599 -+#: dnf/cli/cli.py:603 - msgid "No Matches found" - msgstr "没有找到匹配的软件包" - --#: dnf/cli/cli.py:609 --msgid "No transaction ID given" --msgstr "没有事务 ID" -- --#: dnf/cli/cli.py:614 --msgid "Not found given transaction ID" --msgstr "未找到指定事务 ID" -- --#: dnf/cli/cli.py:623 --msgid "Found more than one transaction ID!" --msgstr "找到多个事务 ID!" -- --#: dnf/cli/cli.py:640 --#, python-format --msgid "Transaction history is incomplete, before %u." --msgstr "在 %u 之前,事务历史不完整。" -- --#: dnf/cli/cli.py:642 --#, python-format --msgid "Transaction history is incomplete, after %u." --msgstr "在 %u 之后,事务历史不完整。" -- --#: dnf/cli/cli.py:689 --msgid "Undoing transaction {}, from {}" --msgstr "撤销事务 {},从 {}" -- --#: dnf/cli/cli.py:769 dnf/cli/commands/shell.py:237 -+#: dnf/cli/cli.py:670 dnf/cli/commands/shell.py:237 - #, python-format - msgid "Unknown repo: '%s'" - msgstr "未知仓库:'%s'" - --#: dnf/cli/cli.py:783 -+#: dnf/cli/cli.py:684 - #, python-format - msgid "No repository match: %s" - msgstr "没有仓库匹配: %s" - --#: dnf/cli/cli.py:817 -+#: dnf/cli/cli.py:718 - msgid "" - "This command has to be run with superuser privileges (under the root user on" - " most systems)." - msgstr "运行此命令需要管理员特权(多数系统下是root用户)。" - --#: dnf/cli/cli.py:847 -+#: dnf/cli/cli.py:748 - #, python-format - msgid "No such command: %s. Please use %s --help" - msgstr "未找到命令: %s。请使用 %s --help" - --#: dnf/cli/cli.py:850 -+#: dnf/cli/cli.py:751 - #, python-format, python-brace-format - msgid "" - "It could be a {PROG} plugin command, try: \"{prog} install 'dnf-" - "command(%s)'\"" - msgstr "它可能是一个{PROG}插件命令,尝试:\"{prog} install 'dnf-command(%s)'\"" - --#: dnf/cli/cli.py:854 -+#: dnf/cli/cli.py:755 - #, python-brace-format - msgid "" - "It could be a {prog} plugin command, but loading of plugins is currently " - "disabled." - msgstr "这可能是一个 {prog} 插件的命令,但是插件的加载当前已经禁用。" - --#: dnf/cli/cli.py:912 -+#: dnf/cli/cli.py:813 - msgid "" - "--destdir or --downloaddir must be used with --downloadonly or download or " - "system-upgrade command." -@@ -769,51 +735,51 @@ msgstr "" - "--destdir 或 --downloaddir 必须和 --downloadonly 或 download 或 system-upgrade " - "命令一起使用。" - --#: dnf/cli/cli.py:918 -+#: dnf/cli/cli.py:819 - msgid "" - "--enable, --set-enabled and --disable, --set-disabled must be used with " - "config-manager command." - msgstr "" - "--enable、--set-enabled 和 --disable、--set-disabled 必须和 config-manager 命令一起使用。" - --#: dnf/cli/cli.py:1000 -+#: dnf/cli/cli.py:901 - msgid "" - "Warning: Enforcing GPG signature check globally as per active RPM security " - "policy (see 'gpgcheck' in dnf.conf(5) for how to squelch this message)" - msgstr "警告:由于活动的RPM安全策略,强制执行全局GPG签名检查 (请参照dnf.conf(5)中的'gpgcheck'以了解如何阻止这条信息)" - --#: dnf/cli/cli.py:1020 -+#: dnf/cli/cli.py:921 - msgid "Config file \"{}\" does not exist" - msgstr "配置文件 \"{}\" 不存在" - --#: dnf/cli/cli.py:1040 -+#: dnf/cli/cli.py:941 - msgid "" - "Unable to detect release version (use '--releasever' to specify release " - "version)" - msgstr "无法找到发布版本(可用 '--releasever' 指定版本)" - --#: dnf/cli/cli.py:1127 dnf/cli/commands/repoquery.py:471 -+#: dnf/cli/cli.py:1028 dnf/cli/commands/repoquery.py:471 - msgid "argument {}: not allowed with argument {}" - msgstr "参数 {}:不允许与参数 {} 一起使用" - --#: dnf/cli/cli.py:1134 -+#: dnf/cli/cli.py:1035 - #, python-format - msgid "Command \"%s\" already defined" - msgstr "命令 \"%s\" 已有定义" - --#: dnf/cli/cli.py:1154 -+#: dnf/cli/cli.py:1055 - msgid "Excludes in dnf.conf: " - msgstr "在 dnf.conf 中排除: " - --#: dnf/cli/cli.py:1157 -+#: dnf/cli/cli.py:1058 - msgid "Includes in dnf.conf: " - msgstr "在 dnf.conf 中包括: " - --#: dnf/cli/cli.py:1160 -+#: dnf/cli/cli.py:1061 - msgid "Excludes in repo " - msgstr "在 repo 中排除 " - --#: dnf/cli/cli.py:1163 -+#: dnf/cli/cli.py:1064 - msgid "Includes in repo " - msgstr "在 repo 中包括 " - -@@ -870,7 +836,7 @@ msgid "show all packages (default)" - msgstr "显示所有的软件包(默认)" - - #: dnf/cli/commands/__init__.py:171 dnf/cli/commands/__init__.py:743 --#: dnf/cli/commands/module.py:351 -+#: dnf/cli/commands/module.py:373 - msgid "show only available packages" - msgstr "只显示可用的软件包" - -@@ -1195,78 +1161,78 @@ msgstr "显示或使用组信息" - msgid "No group data available for configured repositories." - msgstr "配置的软件源不包含组数据。" - --#: dnf/cli/commands/group.py:129 -+#: dnf/cli/commands/group.py:126 - #, python-format - msgid "Warning: Group %s does not exist." - msgstr "警告:组 %s 不存在。" - --#: dnf/cli/commands/group.py:170 -+#: dnf/cli/commands/group.py:167 - msgid "Warning: No groups match:" - msgstr "警告:没有匹配的组:" - --#: dnf/cli/commands/group.py:182 dnf/cli/commands/group.py:193 --#: dnf/cli/output.py:1226 -+#: dnf/cli/commands/group.py:179 dnf/cli/commands/group.py:190 -+#: dnf/cli/output.py:1139 - msgid "" - msgstr "<名称-未设定>" - --#: dnf/cli/commands/group.py:199 -+#: dnf/cli/commands/group.py:196 - msgid "Available Environment Groups:" - msgstr "可用环境组:" - --#: dnf/cli/commands/group.py:201 -+#: dnf/cli/commands/group.py:198 - msgid "Installed Environment Groups:" - msgstr "已安装的环境组:" - --#: dnf/cli/commands/group.py:208 dnf/cli/commands/group.py:294 -+#: dnf/cli/commands/group.py:205 dnf/cli/commands/group.py:291 - msgid "Installed Groups:" - msgstr "已安装组:" - --#: dnf/cli/commands/group.py:215 dnf/cli/commands/group.py:301 -+#: dnf/cli/commands/group.py:212 dnf/cli/commands/group.py:298 - msgid "Installed Language Groups:" - msgstr "已安装语言组:" - --#: dnf/cli/commands/group.py:225 dnf/cli/commands/group.py:308 -+#: dnf/cli/commands/group.py:222 dnf/cli/commands/group.py:305 - msgid "Available Groups:" - msgstr "可用组:" - --#: dnf/cli/commands/group.py:232 dnf/cli/commands/group.py:315 -+#: dnf/cli/commands/group.py:229 dnf/cli/commands/group.py:312 - msgid "Available Language Groups:" - msgstr "可用语言组:" - --#: dnf/cli/commands/group.py:322 -+#: dnf/cli/commands/group.py:319 - msgid "include optional packages from group" - msgstr "包含可选软件包" - --#: dnf/cli/commands/group.py:325 -+#: dnf/cli/commands/group.py:322 - msgid "show also hidden groups" - msgstr "同时显示已隐藏的软件组" - --#: dnf/cli/commands/group.py:327 -+#: dnf/cli/commands/group.py:324 - msgid "show only installed groups" - msgstr "只显示已安装的软件组" - --#: dnf/cli/commands/group.py:329 -+#: dnf/cli/commands/group.py:326 - msgid "show only available groups" - msgstr "只显示可获得的团队" - --#: dnf/cli/commands/group.py:331 -+#: dnf/cli/commands/group.py:328 - msgid "show also ID of groups" - msgstr "同时显示组的 ID" - --#: dnf/cli/commands/group.py:333 -+#: dnf/cli/commands/group.py:330 - msgid "available subcommands: {} (default), {}" - msgstr "可用的子命令:{} (默认), {}" - --#: dnf/cli/commands/group.py:337 -+#: dnf/cli/commands/group.py:334 - msgid "argument for group subcommand" - msgstr "组子命令的参数" - --#: dnf/cli/commands/group.py:346 -+#: dnf/cli/commands/group.py:343 - #, python-format - msgid "Invalid groups sub-command, use: %s." - msgstr "无效的组子命令,请使用:%s 。" - --#: dnf/cli/commands/group.py:403 -+#: dnf/cli/commands/group.py:398 - msgid "Unable to find a mandatory group package." - msgstr "无法找到一个必须的组软件包。" - -@@ -1276,25 +1242,25 @@ msgstr "显示或使用事务历史" - - #: dnf/cli/commands/history.py:66 - msgid "For the store command, file path to store the transaction to" --msgstr "" -+msgstr "对于 store 命令,将事务保存到的文件路径" - - #: dnf/cli/commands/history.py:68 - msgid "" - "For the replay command, don't check for installed packages matching those in" - " transaction" --msgstr "" -+msgstr "对于 replay 命令,不检查与事务中匹配的安装的软件包" - - #: dnf/cli/commands/history.py:71 - msgid "" - "For the replay command, don't check for extra packages pulled into the " - "transaction" --msgstr "" -+msgstr "对于 replay 命令,不检查提取到事务中的额外的软件包" - - #: dnf/cli/commands/history.py:74 - msgid "" - "For the replay command, skip packages that are not available or have missing" - " dependencies" --msgstr "" -+msgstr "对于 replay 命令,跳过不可用或者缺少依赖项的软件包" - - #: dnf/cli/commands/history.py:94 - msgid "" -@@ -1305,41 +1271,64 @@ msgstr "" - "'{}' 需要一个事务 ID 或软件包名。" - - #: dnf/cli/commands/history.py:101 --#, fuzzy --#| msgid "No transaction ID or package name given." - msgid "No transaction file name given." --msgstr "没有提供事务 ID 或软件包名。" -+msgstr "没有给定事务文件名称。" - - #: dnf/cli/commands/history.py:103 --#, fuzzy --#| msgid "Failed to remove transaction file %s" - msgid "More than one argument given as transaction file name." --msgstr "移除事务文件 %s 失败" -+msgstr "提供了多于一个的作为事务文件名的参数。" - --#: dnf/cli/commands/history.py:122 dnf/cli/commands/history.py:126 -+#: dnf/cli/commands/history.py:122 dnf/cli/commands/history.py:130 - msgid "No transaction ID or package name given." - msgstr "没有提供事务 ID 或软件包名。" - --#: dnf/cli/commands/history.py:138 -+#: dnf/cli/commands/history.py:142 - #, python-format - msgid "You don't have access to the history DB: %s" - msgstr "你没有权限访问历史数据库:%s" - --#: dnf/cli/commands/history.py:147 -+#: dnf/cli/commands/history.py:151 - #, python-format - msgid "" - "Cannot undo transaction %s, doing so would result in an inconsistent package" - " database." - msgstr "无法撤销事务 %s,这样做将可能导致不一致的软件包数据库。" - --#: dnf/cli/commands/history.py:152 -+#: dnf/cli/commands/history.py:156 - #, python-format - msgid "" - "Cannot rollback transaction %s, doing so would result in an inconsistent " - "package database." - msgstr "无法回滚事务 %s,这样做将可能导致不一致的软件包数据库。" - --#: dnf/cli/commands/history.py:222 -+#: dnf/cli/commands/history.py:175 -+msgid "No transaction ID given" -+msgstr "没有事务 ID" -+ -+#: dnf/cli/commands/history.py:179 -+#, python-brace-format -+msgid "Transaction ID \"{0}\" not found." -+msgstr "没有找到事务 ID \"{0}\"。" -+ -+#: dnf/cli/commands/history.py:185 -+msgid "Found more than one transaction ID!" -+msgstr "找到多个事务 ID!" -+ -+#: dnf/cli/commands/history.py:203 -+#, python-format -+msgid "Transaction history is incomplete, before %u." -+msgstr "在 %u 之前,事务历史不完整。" -+ -+#: dnf/cli/commands/history.py:205 -+#, python-format -+msgid "Transaction history is incomplete, after %u." -+msgstr "在 %u 之后,事务历史不完整。" -+ -+#: dnf/cli/commands/history.py:256 -+msgid "No packages to list" -+msgstr "没有可以列出的软件包" -+ -+#: dnf/cli/commands/history.py:279 - msgid "" - "Invalid transaction ID range definition '{}'.\n" - "Use '..'." -@@ -1347,7 +1336,7 @@ msgstr "" - "无效的事务 ID 范围定义 '{}'。\n" - "使用 '..'。" - --#: dnf/cli/commands/history.py:226 -+#: dnf/cli/commands/history.py:283 - msgid "" - "Can't convert '{}' to transaction ID.\n" - "Use '', 'last', 'last-'." -@@ -1355,40 +1344,29 @@ msgstr "" - "无法将 '{}' 转换为事务 ID。\n" - "请使用 ''、'last'、'last-'。" - --#: dnf/cli/commands/history.py:255 -+#: dnf/cli/commands/history.py:312 - msgid "No transaction which manipulates package '{}' was found." - msgstr "没有找到操作软件包 '{}' 的事务。" - --#: dnf/cli/commands/history.py:305 --#, fuzzy, python-brace-format --#| msgid "TransactionItem not found for key: {}" --msgid "Transaction ID \"{id}\" not found." --msgstr "找不到键的 TransactionItem: {}" -- --#: dnf/cli/commands/history.py:313 -+#: dnf/cli/commands/history.py:357 - msgid "{} exists, overwrite?" --msgstr "" -+msgstr "{} 已存在,是否覆盖?" - --#: dnf/cli/commands/history.py:316 -+#: dnf/cli/commands/history.py:360 - msgid "Not overwriting {}, exiting." --msgstr "" -+msgstr "不覆盖 {},退出。" - --#: dnf/cli/commands/history.py:323 --#, fuzzy --#| msgid "Transaction failed" -+#: dnf/cli/commands/history.py:367 - msgid "Transaction saved to {}." --msgstr "事务失败" -+msgstr "事务保存到 {}。" - --#: dnf/cli/commands/history.py:326 --#, fuzzy --#| msgid "Errors occurred during transaction." -+#: dnf/cli/commands/history.py:370 - msgid "Error storing transaction: {}" --msgstr "事务过程中出现错误。" -+msgstr "存储事务出错:{}" - --#: dnf/cli/commands/history.py:350 --msgid "" --"Warning, the following problems occurred while replaying the transaction:" --msgstr "" -+#: dnf/cli/commands/history.py:386 -+msgid "Warning, the following problems occurred while running a transaction:" -+msgstr "警告,在运行事务时发生以下问题:" - - #: dnf/cli/commands/install.py:47 - msgid "install a package or packages on your system" -@@ -1407,7 +1385,7 @@ msgstr "没有任何匹配" - msgid "Not a valid rpm file path: %s" - msgstr "RPM文件路径错误:%s" - --#: dnf/cli/commands/install.py:167 -+#: dnf/cli/commands/install.py:166 - #, python-brace-format - msgid "There are following alternatives for \"{0}\": {1}" - msgstr "以下是 \"{0}\" 的替代 : {1}" -@@ -1450,7 +1428,7 @@ msgid "%s marked as group installed." - msgstr "%s 已标记为已安装软件组。" - - #: dnf/cli/commands/mark.py:85 dnf/cli/commands/shell.py:129 --#: dnf/cli/commands/shell.py:237 dnf/cli/commands/shell.py:279 -+#: dnf/cli/commands/shell.py:237 dnf/cli/commands/shell.py:282 - msgid "Error:" - msgstr "错误:" - -@@ -1506,42 +1484,46 @@ msgid "Package {} belongs to multiple modules, skipping" - msgstr "软件包 {} 属于多个模块,正在跳过" - - #: dnf/cli/commands/module.py:277 -+msgid "switch a module to a stream and distrosync rpm packages" -+msgstr "将模块切换到流和 distrosync rpm 软件包" -+ -+#: dnf/cli/commands/module.py:299 - msgid "list modular packages" - msgstr "列出模块包" - --#: dnf/cli/commands/module.py:292 -+#: dnf/cli/commands/module.py:314 - msgid "list packages belonging to a module" - msgstr "列出属于一个模块的软件包" - --#: dnf/cli/commands/module.py:327 -+#: dnf/cli/commands/module.py:349 - msgid "Interact with Modules." - msgstr "与模块交互。" - --#: dnf/cli/commands/module.py:340 -+#: dnf/cli/commands/module.py:362 - msgid "show only enabled modules" - msgstr "只显示启用的模块" - --#: dnf/cli/commands/module.py:343 -+#: dnf/cli/commands/module.py:365 - msgid "show only disabled modules" - msgstr "只显示禁用的模块" - --#: dnf/cli/commands/module.py:346 -+#: dnf/cli/commands/module.py:368 - msgid "show only installed modules or packages" - msgstr "只显示已安装的模块或者软件包" - --#: dnf/cli/commands/module.py:349 -+#: dnf/cli/commands/module.py:371 - msgid "show profile content" - msgstr "显示档案内容" - --#: dnf/cli/commands/module.py:354 -+#: dnf/cli/commands/module.py:376 - msgid "remove all modular packages" - msgstr "移除所有模块包" - --#: dnf/cli/commands/module.py:364 -+#: dnf/cli/commands/module.py:386 - msgid "Module specification" - msgstr "模块规格" - --#: dnf/cli/commands/module.py:386 -+#: dnf/cli/commands/module.py:408 - msgid "{} {} {}: too few arguments" - msgstr "{} {} {}: 参数太少" - -@@ -2026,22 +2008,22 @@ msgstr "KEYWORD" - msgid "Keyword to search for" - msgstr "要搜索的关键字" - --#: dnf/cli/commands/search.py:61 dnf/cli/output.py:506 -+#: dnf/cli/commands/search.py:61 dnf/cli/output.py:460 - msgctxt "long" - msgid "Name" - msgstr "名称" - --#: dnf/cli/commands/search.py:62 dnf/cli/output.py:559 -+#: dnf/cli/commands/search.py:62 dnf/cli/output.py:513 - msgctxt "long" - msgid "Summary" - msgstr "概况" - --#: dnf/cli/commands/search.py:63 dnf/cli/output.py:569 -+#: dnf/cli/commands/search.py:63 dnf/cli/output.py:523 - msgctxt "long" - msgid "Description" - msgstr "描述" - --#: dnf/cli/commands/search.py:64 dnf/cli/output.py:562 -+#: dnf/cli/commands/search.py:64 dnf/cli/output.py:516 - msgid "URL" - msgstr "URL" - -@@ -2184,16 +2166,16 @@ msgstr "" - "run 解析以及运行事务集\n" - "exit (或 quit) 退出 shell" - --#: dnf/cli/commands/shell.py:259 -+#: dnf/cli/commands/shell.py:262 - #, python-format - msgid "Error: Cannot open %s for reading" - msgstr "错误:无法打开%s来读取" - --#: dnf/cli/commands/shell.py:281 dnf/cli/main.py:187 -+#: dnf/cli/commands/shell.py:284 dnf/cli/main.py:187 - msgid "Complete!" - msgstr "完毕!" - --#: dnf/cli/commands/shell.py:291 -+#: dnf/cli/commands/shell.py:294 - msgid "Leaving Shell" - msgstr "离开终端" - -@@ -2384,8 +2366,8 @@ msgstr "严重性" - msgid "Files" - msgstr "文件" - --#: dnf/cli/commands/updateinfo.py:359 dnf/cli/output.py:1499 --#: dnf/cli/output.py:1772 dnf/cli/output.py:1774 -+#: dnf/cli/commands/updateinfo.py:359 dnf/cli/output.py:1652 -+#: dnf/cli/output.py:1654 dnf/util.py:591 - msgid "Installed" - msgstr "已安装" - -@@ -2706,13 +2688,13 @@ msgstr "无法编码参数 '%s': %s" - #. Translators: This is abbreviated 'Name'. Should be no longer - #. than 12 characters. You can use the full version if it is short - #. enough in your language. --#: dnf/cli/output.py:505 -+#: dnf/cli/output.py:459 - msgctxt "short" - msgid "Name" - msgstr "名称" - - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:511 -+#: dnf/cli/output.py:465 - msgid "Epoch" - msgstr "时期" - -@@ -2720,38 +2702,38 @@ msgstr "时期" - #. use the full (unabbreviated) term 'Version' if you think that - #. the translation to your language is not too long and will - #. always fit to limited space. --#: dnf/cli/output.py:512 dnf/cli/output.py:1335 -+#: dnf/cli/output.py:466 dnf/cli/output.py:1248 - msgctxt "short" - msgid "Version" - msgstr "版本" - - #. Translators: This is the full (unabbreviated) term 'Version'. --#: dnf/cli/output.py:513 dnf/cli/output.py:1337 -+#: dnf/cli/output.py:467 dnf/cli/output.py:1250 - msgctxt "long" - msgid "Version" - msgstr "版本" - - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:516 -+#: dnf/cli/output.py:470 - msgid "Release" - msgstr "发布" - - #. Translators: This is abbreviated 'Architecture', used when - #. we have not enough space to display the full word. --#: dnf/cli/output.py:517 dnf/cli/output.py:1326 -+#: dnf/cli/output.py:471 dnf/cli/output.py:1239 - msgctxt "short" - msgid "Arch" - msgstr "架构" - - #. Translators: This is the full word 'Architecture', used when - #. we have enough space. --#: dnf/cli/output.py:518 dnf/cli/output.py:1329 -+#: dnf/cli/output.py:472 dnf/cli/output.py:1242 - msgctxt "long" - msgid "Architecture" - msgstr "架构" - - #. Translators: This is the full (unabbreviated) term 'Size'. --#: dnf/cli/output.py:520 dnf/cli/output.py:1352 -+#: dnf/cli/output.py:474 dnf/cli/output.py:1265 - msgctxt "long" - msgid "Size" - msgstr "大小" -@@ -2760,32 +2742,32 @@ msgstr "大小" - #. not be longer than 5 characters. If the term 'Size' in your - #. language is not longer than 5 characters then you can use it - #. unabbreviated. --#: dnf/cli/output.py:520 dnf/cli/output.py:1350 -+#: dnf/cli/output.py:474 dnf/cli/output.py:1263 - msgctxt "short" - msgid "Size" - msgstr "大小" - - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:524 -+#: dnf/cli/output.py:478 - msgid "Source" - msgstr "源" - - #. Translators: This is abbreviated 'Repository', used when - #. we have not enough space to display the full word. --#: dnf/cli/output.py:525 dnf/cli/output.py:1341 -+#: dnf/cli/output.py:479 dnf/cli/output.py:1254 - msgctxt "short" - msgid "Repo" - msgstr "仓库" - - #. Translators: This is the full word 'Repository', used when - #. we have enough space. --#: dnf/cli/output.py:526 dnf/cli/output.py:1344 -+#: dnf/cli/output.py:480 dnf/cli/output.py:1257 - msgctxt "long" - msgid "Repository" - msgstr "仓库" - - #. Translators: This message should be no longer than 12 chars. --#: dnf/cli/output.py:533 -+#: dnf/cli/output.py:487 - msgid "From repo" - msgstr "来自仓库" - -@@ -2793,312 +2775,308 @@ msgstr "来自仓库" - #. print(_("Committer : %s") % ucd(pkg.committer)) - #. print(_("Committime : %s") % time.ctime(pkg.committime)) - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:539 -+#: dnf/cli/output.py:493 - msgid "Packager" - msgstr "打包者" - - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:541 -+#: dnf/cli/output.py:495 - msgid "Buildtime" - msgstr "构建时间" - - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:545 -+#: dnf/cli/output.py:499 - msgid "Install time" - msgstr "安装时间" - - #. Translators: This message should be no longer than 12 chars. --#: dnf/cli/output.py:554 -+#: dnf/cli/output.py:508 - msgid "Installed by" - msgstr "安装者" - - #. Translators: This is abbreviated 'Summary'. Should be no longer - #. than 12 characters. You can use the full version if it is short - #. enough in your language. --#: dnf/cli/output.py:558 -+#: dnf/cli/output.py:512 - msgctxt "short" - msgid "Summary" - msgstr "概况" - - #. Translators: This message should be no longer than 12 characters. --#: dnf/cli/output.py:564 -+#: dnf/cli/output.py:518 - msgid "License" - msgstr "协议" - - #. Translators: This is abbreviated 'Description'. Should be no longer - #. than 12 characters. You can use the full version if it is short - #. enough in your language. --#: dnf/cli/output.py:568 -+#: dnf/cli/output.py:522 - msgctxt "short" - msgid "Description" - msgstr "描述" - --#: dnf/cli/output.py:695 --msgid "No packages to list" --msgstr "没有可以列出的软件包" -- --#: dnf/cli/output.py:706 -+#: dnf/cli/output.py:650 - msgid "y" - msgstr "y" - --#: dnf/cli/output.py:706 -+#: dnf/cli/output.py:650 - msgid "yes" - msgstr "是" - --#: dnf/cli/output.py:707 -+#: dnf/cli/output.py:651 - msgid "n" - msgstr "n" - --#: dnf/cli/output.py:707 -+#: dnf/cli/output.py:651 - msgid "no" - msgstr "否" - --#: dnf/cli/output.py:711 -+#: dnf/cli/output.py:655 - msgid "Is this ok [y/N]: " - msgstr "确定吗?[y/N]: " - --#: dnf/cli/output.py:715 -+#: dnf/cli/output.py:659 - msgid "Is this ok [Y/n]: " - msgstr "确定吗?[Y/n]: " - --#: dnf/cli/output.py:795 -+#: dnf/cli/output.py:739 - #, python-format - msgid "Group: %s" - msgstr "组:%s" - --#: dnf/cli/output.py:799 -+#: dnf/cli/output.py:743 - #, python-format - msgid " Group-Id: %s" - msgstr " 组编号:%s" - --#: dnf/cli/output.py:801 dnf/cli/output.py:840 -+#: dnf/cli/output.py:745 dnf/cli/output.py:784 - #, python-format - msgid " Description: %s" - msgstr " 描述:%s" - --#: dnf/cli/output.py:803 -+#: dnf/cli/output.py:747 - #, python-format - msgid " Language: %s" - msgstr " 语言:%s" - --#: dnf/cli/output.py:806 -+#: dnf/cli/output.py:750 - msgid " Mandatory Packages:" - msgstr " 必要的软件包:" - --#: dnf/cli/output.py:807 -+#: dnf/cli/output.py:751 - msgid " Default Packages:" - msgstr " 默认的软件包:" - --#: dnf/cli/output.py:808 -+#: dnf/cli/output.py:752 - msgid " Optional Packages:" - msgstr " 可选的软件包:" - --#: dnf/cli/output.py:809 -+#: dnf/cli/output.py:753 - msgid " Conditional Packages:" - msgstr " 可能的软件包:" - --#: dnf/cli/output.py:834 -+#: dnf/cli/output.py:778 - #, python-format - msgid "Environment Group: %s" - msgstr "环境组:%s" - --#: dnf/cli/output.py:837 -+#: dnf/cli/output.py:781 - #, python-format - msgid " Environment-Id: %s" - msgstr " 环境-Id:%s" - --#: dnf/cli/output.py:843 -+#: dnf/cli/output.py:787 - msgid " Mandatory Groups:" - msgstr " 必选软件包组:" - --#: dnf/cli/output.py:844 -+#: dnf/cli/output.py:788 - msgid " Optional Groups:" - msgstr " 可选软件包组:" - --#: dnf/cli/output.py:865 -+#: dnf/cli/output.py:809 - msgid "Matched from:" - msgstr "匹配来源:" - --#: dnf/cli/output.py:879 -+#: dnf/cli/output.py:823 - #, python-format - msgid "Filename : %s" - msgstr "文件名 :%s" - --#: dnf/cli/output.py:904 -+#: dnf/cli/output.py:848 - #, python-format - msgid "Repo : %s" - msgstr "仓库 :%s" - --#: dnf/cli/output.py:913 -+#: dnf/cli/output.py:857 - msgid "Description : " - msgstr "描述: " - --#: dnf/cli/output.py:917 -+#: dnf/cli/output.py:861 - #, python-format - msgid "URL : %s" - msgstr "网址 :%s" - --#: dnf/cli/output.py:921 -+#: dnf/cli/output.py:865 - #, python-format - msgid "License : %s" - msgstr "协议 :%s" - --#: dnf/cli/output.py:927 -+#: dnf/cli/output.py:871 - #, python-format - msgid "Provide : %s" - msgstr "提供 : %s" - --#: dnf/cli/output.py:947 -+#: dnf/cli/output.py:891 - #, python-format - msgid "Other : %s" - msgstr "其它 : %s" - --#: dnf/cli/output.py:996 -+#: dnf/cli/output.py:940 - msgid "There was an error calculating total download size" - msgstr "计算总下载量时出错" - --#: dnf/cli/output.py:1002 -+#: dnf/cli/output.py:946 - #, python-format - msgid "Total size: %s" - msgstr "总计:%s" - --#: dnf/cli/output.py:1005 -+#: dnf/cli/output.py:949 - #, python-format - msgid "Total download size: %s" - msgstr "总下载:%s" - --#: dnf/cli/output.py:1008 -+#: dnf/cli/output.py:952 - #, python-format - msgid "Installed size: %s" - msgstr "安装大小:%s" - --#: dnf/cli/output.py:1026 -+#: dnf/cli/output.py:970 - msgid "There was an error calculating installed size" - msgstr "计算安装大小时出错" - --#: dnf/cli/output.py:1030 -+#: dnf/cli/output.py:974 - #, python-format - msgid "Freed space: %s" - msgstr "将会释放空间:%s" - --#: dnf/cli/output.py:1039 -+#: dnf/cli/output.py:983 - msgid "Marking packages as installed by the group:" - msgstr "标记软件包为遵循软件包组安装的:" - --#: dnf/cli/output.py:1046 -+#: dnf/cli/output.py:990 - msgid "Marking packages as removed by the group:" - msgstr "标记软件包为遵循软件包组移除的:" - --#: dnf/cli/output.py:1056 -+#: dnf/cli/output.py:1000 - msgid "Group" - msgstr "组" - --#: dnf/cli/output.py:1056 -+#: dnf/cli/output.py:1000 - msgid "Packages" - msgstr "软件包" - --#: dnf/cli/output.py:1133 -+#: dnf/cli/output.py:1046 - msgid "Installing group/module packages" - msgstr "安装组/模块包" - --#: dnf/cli/output.py:1134 -+#: dnf/cli/output.py:1047 - msgid "Installing group packages" - msgstr "安装软件包组" - - #. TRANSLATORS: This is for a list of packages to be installed. --#: dnf/cli/output.py:1138 -+#: dnf/cli/output.py:1051 - msgctxt "summary" - msgid "Installing" - msgstr "安装" - - #. TRANSLATORS: This is for a list of packages to be upgraded. --#: dnf/cli/output.py:1140 -+#: dnf/cli/output.py:1053 - msgctxt "summary" - msgid "Upgrading" - msgstr "升级" - - #. TRANSLATORS: This is for a list of packages to be reinstalled. --#: dnf/cli/output.py:1142 -+#: dnf/cli/output.py:1055 - msgctxt "summary" - msgid "Reinstalling" - msgstr "重新安装" - --#: dnf/cli/output.py:1144 -+#: dnf/cli/output.py:1057 - msgid "Installing dependencies" - msgstr "安装依赖关系" - --#: dnf/cli/output.py:1145 -+#: dnf/cli/output.py:1058 - msgid "Installing weak dependencies" - msgstr "安装弱的依赖" - - #. TRANSLATORS: This is for a list of packages to be removed. --#: dnf/cli/output.py:1147 -+#: dnf/cli/output.py:1060 - msgid "Removing" - msgstr "移除" - --#: dnf/cli/output.py:1148 -+#: dnf/cli/output.py:1061 - msgid "Removing dependent packages" - msgstr "移除依赖的软件包" - --#: dnf/cli/output.py:1149 -+#: dnf/cli/output.py:1062 - msgid "Removing unused dependencies" - msgstr "清除未被使用的依赖关系" - - #. TRANSLATORS: This is for a list of packages to be downgraded. --#: dnf/cli/output.py:1151 -+#: dnf/cli/output.py:1064 - msgctxt "summary" - msgid "Downgrading" - msgstr "降级" - --#: dnf/cli/output.py:1176 -+#: dnf/cli/output.py:1089 - msgid "Installing module profiles" - msgstr "安装模块配置档案" - --#: dnf/cli/output.py:1185 -+#: dnf/cli/output.py:1098 - msgid "Disabling module profiles" - msgstr "禁用模块配置档案" - --#: dnf/cli/output.py:1194 -+#: dnf/cli/output.py:1107 - msgid "Enabling module streams" - msgstr "启用模块流" - --#: dnf/cli/output.py:1202 -+#: dnf/cli/output.py:1115 - msgid "Switching module streams" - msgstr "切换模块流" - --#: dnf/cli/output.py:1210 -+#: dnf/cli/output.py:1123 - msgid "Disabling modules" - msgstr "禁用模块" - --#: dnf/cli/output.py:1218 -+#: dnf/cli/output.py:1131 - msgid "Resetting modules" - msgstr "重置模块" - --#: dnf/cli/output.py:1230 -+#: dnf/cli/output.py:1143 - msgid "Installing Environment Groups" - msgstr "安装环境组" - --#: dnf/cli/output.py:1237 -+#: dnf/cli/output.py:1150 - msgid "Upgrading Environment Groups" - msgstr "升级环境组" - --#: dnf/cli/output.py:1244 -+#: dnf/cli/output.py:1157 - msgid "Removing Environment Groups" - msgstr "删除环境组" - --#: dnf/cli/output.py:1251 -+#: dnf/cli/output.py:1164 - msgid "Installing Groups" - msgstr "安装组" - --#: dnf/cli/output.py:1258 -+#: dnf/cli/output.py:1171 - msgid "Upgrading Groups" - msgstr "升级组" - --#: dnf/cli/output.py:1265 -+#: dnf/cli/output.py:1178 - msgid "Removing Groups" - msgstr "删除组" - --#: dnf/cli/output.py:1281 -+#: dnf/cli/output.py:1194 - #, python-format - msgid "" - "Skipping packages with conflicts:\n" -@@ -3107,12 +3085,12 @@ msgstr "" - "跳过有冲突的软件包:\n" - "(添加 '%s' 至命令行来强制升级)" - --#: dnf/cli/output.py:1291 -+#: dnf/cli/output.py:1204 - #, python-format - msgid "Skipping packages with broken dependencies%s" - msgstr "跳过存在损坏依赖关系的软件包 %s" - --#: dnf/cli/output.py:1295 -+#: dnf/cli/output.py:1208 - msgid " or part of a group" - msgstr " 或一个组的一部分" - -@@ -3120,22 +3098,22 @@ msgstr " 或一个组的一部分" - #. use the full (unabbreviated) term 'Package' if you think that - #. the translation to your language is not too long and will - #. always fit to limited space. --#: dnf/cli/output.py:1320 -+#: dnf/cli/output.py:1233 - msgctxt "short" - msgid "Package" - msgstr "软件包" - - #. Translators: This is the full (unabbreviated) term 'Package'. --#: dnf/cli/output.py:1322 -+#: dnf/cli/output.py:1235 - msgctxt "long" - msgid "Package" - msgstr "软件包" - --#: dnf/cli/output.py:1371 -+#: dnf/cli/output.py:1284 - msgid "replacing" - msgstr "替换" - --#: dnf/cli/output.py:1378 -+#: dnf/cli/output.py:1291 - #, python-format - msgid "" - "\n" -@@ -3147,287 +3125,271 @@ msgstr "" - "%s\n" - - #. TODO: remove --#: dnf/cli/output.py:1383 dnf/cli/output.py:1932 dnf/cli/output.py:1933 -+#: dnf/cli/output.py:1296 dnf/cli/output.py:1812 dnf/cli/output.py:1813 - msgid "Install" - msgstr "安装" - --#: dnf/cli/output.py:1387 dnf/cli/output.py:1941 -+#: dnf/cli/output.py:1300 dnf/cli/output.py:1821 - msgid "Upgrade" - msgstr "升级" - --#: dnf/cli/output.py:1388 -+#: dnf/cli/output.py:1301 - msgid "Remove" - msgstr "移除" - --#: dnf/cli/output.py:1390 dnf/cli/output.py:1939 -+#: dnf/cli/output.py:1303 dnf/cli/output.py:1819 - msgid "Downgrade" - msgstr "降级" - --#: dnf/cli/output.py:1391 -+#: dnf/cli/output.py:1304 - msgid "Skip" - msgstr "跳过" - --#: dnf/cli/output.py:1400 dnf/cli/output.py:1416 -+#: dnf/cli/output.py:1313 dnf/cli/output.py:1329 - msgid "Package" - msgid_plural "Packages" - msgstr[0] "软件包" - --#: dnf/cli/output.py:1418 -+#: dnf/cli/output.py:1331 - msgid "Dependent package" - msgid_plural "Dependent packages" - msgstr[0] "依赖软件包" - --#: dnf/cli/output.py:1497 dnf/cli/output.py:1773 dnf/cli/output.py:1942 --msgid "Upgraded" --msgstr "已升级" -- --#: dnf/cli/output.py:1498 dnf/cli/output.py:1773 dnf/cli/output.py:1940 --msgid "Downgraded" --msgstr "已降级" -- --#: dnf/cli/output.py:1503 --msgid "Reinstalled" --msgstr "已重装" -- --#: dnf/cli/output.py:1504 --msgid "Skipped" --msgstr "已跳过" -- --#: dnf/cli/output.py:1505 --msgid "Removed" --msgstr "已移除" -- --#: dnf/cli/output.py:1508 --msgid "Failed" --msgstr "失败" -- --#: dnf/cli/output.py:1559 -+#: dnf/cli/output.py:1439 - msgid "Total" - msgstr "总计" - --#: dnf/cli/output.py:1587 -+#: dnf/cli/output.py:1467 - msgid "" - msgstr "<空>" - --#: dnf/cli/output.py:1588 -+#: dnf/cli/output.py:1468 - msgid "System" - msgstr "系统" - --#: dnf/cli/output.py:1638 -+#: dnf/cli/output.py:1518 - msgid "Command line" - msgstr "命令行" - - #. TRANSLATORS: user names who executed transaction in history command output --#: dnf/cli/output.py:1649 -+#: dnf/cli/output.py:1529 - msgid "User name" - msgstr "用户名" - --#: dnf/cli/output.py:1651 -+#: dnf/cli/output.py:1531 - msgid "ID" - msgstr "ID" - --#: dnf/cli/output.py:1653 -+#: dnf/cli/output.py:1533 - msgid "Date and time" - msgstr "日期和时间" - --#: dnf/cli/output.py:1654 -+#: dnf/cli/output.py:1534 - msgid "Action(s)" - msgstr "操作" - --#: dnf/cli/output.py:1655 -+#: dnf/cli/output.py:1535 - msgid "Altered" - msgstr "更改" - --#: dnf/cli/output.py:1698 -+#: dnf/cli/output.py:1578 - msgid "No transactions" - msgstr "没有事务" - --#: dnf/cli/output.py:1699 dnf/cli/output.py:1715 -+#: dnf/cli/output.py:1579 dnf/cli/output.py:1595 - msgid "Failed history info" - msgstr "失败的历史信息" - --#: dnf/cli/output.py:1714 -+#: dnf/cli/output.py:1594 - msgid "No transaction ID, or package, given" - msgstr "未指定事务 ID、或者软件包" - --#: dnf/cli/output.py:1772 -+#: dnf/cli/output.py:1652 - msgid "Erased" - msgstr "已删除" - --#: dnf/cli/output.py:1774 -+#: dnf/cli/output.py:1653 dnf/cli/output.py:1820 dnf/util.py:590 -+msgid "Downgraded" -+msgstr "已降级" -+ -+#: dnf/cli/output.py:1653 dnf/cli/output.py:1822 dnf/util.py:589 -+msgid "Upgraded" -+msgstr "已升级" -+ -+#: dnf/cli/output.py:1654 - msgid "Not installed" - msgstr "未安装" - --#: dnf/cli/output.py:1775 -+#: dnf/cli/output.py:1655 - msgid "Newer" - msgstr "较早的" - --#: dnf/cli/output.py:1775 -+#: dnf/cli/output.py:1655 - msgid "Older" - msgstr "较老的" - --#: dnf/cli/output.py:1823 dnf/cli/output.py:1825 -+#: dnf/cli/output.py:1703 dnf/cli/output.py:1705 - msgid "Transaction ID :" - msgstr "事务 ID:" - --#: dnf/cli/output.py:1828 -+#: dnf/cli/output.py:1708 - msgid "Begin time :" - msgstr "起始时间 :" - --#: dnf/cli/output.py:1831 dnf/cli/output.py:1833 -+#: dnf/cli/output.py:1711 dnf/cli/output.py:1713 - msgid "Begin rpmdb :" - msgstr "起始 RPM 数据库 :" - --#: dnf/cli/output.py:1839 -+#: dnf/cli/output.py:1719 - #, python-format - msgid "(%u seconds)" - msgstr "(%u 秒)" - --#: dnf/cli/output.py:1841 -+#: dnf/cli/output.py:1721 - #, python-format - msgid "(%u minutes)" - msgstr "(%u 分钟)" - --#: dnf/cli/output.py:1843 -+#: dnf/cli/output.py:1723 - #, python-format - msgid "(%u hours)" - msgstr "(%u 小时)" - --#: dnf/cli/output.py:1845 -+#: dnf/cli/output.py:1725 - #, python-format - msgid "(%u days)" - msgstr "(%u 天)" - --#: dnf/cli/output.py:1846 -+#: dnf/cli/output.py:1726 - msgid "End time :" - msgstr "结束时间 :" - --#: dnf/cli/output.py:1849 dnf/cli/output.py:1851 -+#: dnf/cli/output.py:1729 dnf/cli/output.py:1731 - msgid "End rpmdb :" - msgstr "结束 RPM 数据库 :" - --#: dnf/cli/output.py:1858 dnf/cli/output.py:1860 -+#: dnf/cli/output.py:1738 dnf/cli/output.py:1740 - msgid "User :" - msgstr "用户 :" - --#: dnf/cli/output.py:1864 dnf/cli/output.py:1871 -+#: dnf/cli/output.py:1744 dnf/cli/output.py:1751 - msgid "Aborted" - msgstr "已终止" - --#: dnf/cli/output.py:1864 dnf/cli/output.py:1867 dnf/cli/output.py:1869 --#: dnf/cli/output.py:1871 dnf/cli/output.py:1873 dnf/cli/output.py:1875 -+#: dnf/cli/output.py:1744 dnf/cli/output.py:1747 dnf/cli/output.py:1749 -+#: dnf/cli/output.py:1751 dnf/cli/output.py:1753 dnf/cli/output.py:1755 - msgid "Return-Code :" - msgstr "返回码 :" - --#: dnf/cli/output.py:1867 dnf/cli/output.py:1875 -+#: dnf/cli/output.py:1747 dnf/cli/output.py:1755 - msgid "Success" - msgstr "成功" - --#: dnf/cli/output.py:1869 -+#: dnf/cli/output.py:1749 - msgid "Failures:" - msgstr "失败:" - --#: dnf/cli/output.py:1873 -+#: dnf/cli/output.py:1753 - msgid "Failure:" - msgstr "失败:" - --#: dnf/cli/output.py:1883 dnf/cli/output.py:1885 -+#: dnf/cli/output.py:1763 dnf/cli/output.py:1765 - msgid "Releasever :" - msgstr "Releasever :" - --#: dnf/cli/output.py:1890 dnf/cli/output.py:1892 -+#: dnf/cli/output.py:1770 dnf/cli/output.py:1772 - msgid "Command Line :" - msgstr "命令行 :" - --#: dnf/cli/output.py:1897 dnf/cli/output.py:1899 -+#: dnf/cli/output.py:1777 dnf/cli/output.py:1779 - msgid "Comment :" - msgstr "注释 :" - --#: dnf/cli/output.py:1903 -+#: dnf/cli/output.py:1783 - msgid "Transaction performed with:" - msgstr "事务完成由:" - --#: dnf/cli/output.py:1912 -+#: dnf/cli/output.py:1792 - msgid "Packages Altered:" - msgstr "已改变的包:" - --#: dnf/cli/output.py:1918 -+#: dnf/cli/output.py:1798 - msgid "Scriptlet output:" - msgstr "Scriptlet 输出:" - --#: dnf/cli/output.py:1925 -+#: dnf/cli/output.py:1805 - msgid "Errors:" - msgstr "错误:" - --#: dnf/cli/output.py:1934 -+#: dnf/cli/output.py:1814 - msgid "Dep-Install" - msgstr "依赖安装" - --#: dnf/cli/output.py:1935 -+#: dnf/cli/output.py:1815 - msgid "Obsoleted" - msgstr "已废弃" - --#: dnf/cli/output.py:1936 dnf/transaction.py:84 dnf/transaction.py:85 -+#: dnf/cli/output.py:1816 dnf/transaction.py:84 dnf/transaction.py:85 - msgid "Obsoleting" - msgstr "废弃" - --#: dnf/cli/output.py:1937 -+#: dnf/cli/output.py:1817 - msgid "Erase" - msgstr "删除" - --#: dnf/cli/output.py:1938 -+#: dnf/cli/output.py:1818 - msgid "Reinstall" - msgstr "重装" - --#: dnf/cli/output.py:2016 -+#: dnf/cli/output.py:1892 - #, python-format - msgid "---> Package %s.%s %s will be installed" - msgstr "---> 软件包 %s.%s %s 将会被安装" - --#: dnf/cli/output.py:2018 -+#: dnf/cli/output.py:1894 - #, python-format - msgid "---> Package %s.%s %s will be an upgrade" - msgstr "---> 软件包 %s.%s %s 将作为一个更新" - --#: dnf/cli/output.py:2020 -+#: dnf/cli/output.py:1896 - #, python-format - msgid "---> Package %s.%s %s will be erased" - msgstr "---> 软件包 %s.%s %s 将会被清除" - --#: dnf/cli/output.py:2022 -+#: dnf/cli/output.py:1898 - #, python-format - msgid "---> Package %s.%s %s will be reinstalled" - msgstr "---> 软件包 %s.%s %s 将会被重新安装" - --#: dnf/cli/output.py:2024 -+#: dnf/cli/output.py:1900 - #, python-format - msgid "---> Package %s.%s %s will be a downgrade" - msgstr "---> 软件包 %s.%s %s 将会被降级" - --#: dnf/cli/output.py:2026 -+#: dnf/cli/output.py:1902 - #, python-format - msgid "---> Package %s.%s %s will be obsoleting" - msgstr "---> 软件包 %s.%s %s 将会废弃" - --#: dnf/cli/output.py:2028 -+#: dnf/cli/output.py:1904 - #, python-format - msgid "---> Package %s.%s %s will be upgraded" - msgstr "---> 软件包 %s.%s %s 将会被升级" - --#: dnf/cli/output.py:2030 -+#: dnf/cli/output.py:1906 - #, python-format - msgid "---> Package %s.%s %s will be obsoleted" - msgstr "---> 软件包 %s.%s %s 将会被废弃" - --#: dnf/cli/output.py:2039 -+#: dnf/cli/output.py:1915 - msgid "--> Starting dependency resolution" - msgstr "--> 开始解决依赖关系" - --#: dnf/cli/output.py:2044 -+#: dnf/cli/output.py:1919 - msgid "--> Finished dependency resolution" - msgstr "--> 依赖关系解决完成" - --#: dnf/cli/output.py:2058 dnf/crypto.py:132 -+#: dnf/cli/output.py:1933 dnf/crypto.py:132 - #, python-format - msgid "" - "Importing GPG key 0x%s:\n" -@@ -3509,16 +3471,14 @@ msgid "Module or Group '%s' does not exist." - msgstr "模块或者组 '%s' 不存在。" - - #: dnf/comps.py:599 --#, fuzzy, python-format --#| msgid "Environment '%s' is not installed." -+#, python-format - msgid "Environment id '%s' does not exist." --msgstr "环境组 '%s' 没有安装。" -+msgstr "环境 id '%s' 不存在。" - --#: dnf/comps.py:622 dnf/transaction_sr.py:443 dnf/transaction_sr.py:453 --#, fuzzy, python-format --#| msgid "Environment '%s' is not installed." -+#: dnf/comps.py:622 dnf/transaction_sr.py:477 dnf/transaction_sr.py:487 -+#, python-format - msgid "Environment id '%s' is not installed." --msgstr "环境组 '%s' 没有安装。" -+msgstr "环境 id '%s' 没有安装。" - - #: dnf/comps.py:639 - #, python-format -@@ -3531,10 +3491,9 @@ msgid "Environment '%s' is not available." - msgstr "环境 '%s' 不可用。" - - #: dnf/comps.py:673 --#, fuzzy, python-format --#| msgid "Group_id '%s' does not exist." -+#, python-format - msgid "Group id '%s' does not exist." --msgstr "Group_id '%s' 不存在。" -+msgstr "组 id '%s' 不存在。" - - #: dnf/conf/config.py:136 - #, python-format -@@ -3593,7 +3552,7 @@ msgstr "repo 的 id 无效: {} ({}), byte = {} {}" - - #: dnf/conf/read.py:67 - msgid "Bad id for repo: {}, byte = {} {}" --msgstr "repo 的 id 无效: %s, byte = %s %d" -+msgstr "repo 的 id 无效: {}, byte = {} {}" - - #: dnf/conf/read.py:75 - msgid "Repository '{}' ({}): Error parsing config: {}" -@@ -3625,6 +3584,11 @@ msgstr "repo %s: 0x%s 已被导入" - msgid "repo %s: imported key 0x%s." - msgstr "repo %s: 已导入密钥 0x%s。" - -+#: dnf/crypto.py:177 -+#, python-format -+msgid "retrieving repo key for %s unencrypted from %s" -+msgstr "为 %s 从 %s 获取的 repo 密钥未加密" -+ - #: dnf/db/group.py:293 - msgid "" - "No available modular metadata for modular package '{}', it cannot be " -@@ -3707,7 +3671,7 @@ msgid "Modular dependency problem with Defaults:" - msgid_plural "Modular dependency problems with Defaults:" - msgstr[0] "默认设置中的模块依赖问题 :" - --#: dnf/exceptions.py:131 dnf/module/module_base.py:686 -+#: dnf/exceptions.py:131 dnf/module/module_base.py:841 - msgid "Modular dependency problem:" - msgid_plural "Modular dependency problems:" - msgstr[0] "模块依赖问题:" -@@ -3761,27 +3725,27 @@ msgstr "" - "\n" - "提示 : [d]默认, [e]启用, [x]禁用, [i]已安装的, [a]活跃的" - --#: dnf/module/module_base.py:54 dnf/module/module_base.py:421 --#: dnf/module/module_base.py:477 dnf/module/module_base.py:543 -+#: dnf/module/module_base.py:54 dnf/module/module_base.py:547 -+#: dnf/module/module_base.py:603 dnf/module/module_base.py:669 - msgid "Ignoring unnecessary profile: '{}/{}'" - msgstr "正在忽略无用的配置文件'{}/{}'" - - #: dnf/module/module_base.py:84 - #, python-brace-format - msgid "All matches for argument '{0}' in module '{1}:{2}' are not active" --msgstr "模块 '{1}:{2}' 中参数 '{0}' 的所有匹配项目都未激活" -+msgstr "模块 '{1}:{2}' 中的参数 '{0}' 的所有匹配项目都未激活" - --#: dnf/module/module_base.py:92 -+#: dnf/module/module_base.py:92 dnf/module/module_base.py:202 - #, python-brace-format - msgid "Installing module '{0}' from Fail-Safe repository {1} is not allowed" --msgstr "不允许从失效保险仓库 {1} 安装模块 '{0}'" -+msgstr "不允许从 Fail-Safe repository {1} 安装模块 '{0}'" - --#: dnf/module/module_base.py:102 -+#: dnf/module/module_base.py:102 dnf/module/module_base.py:212 - msgid "" - "Unable to match profile for argument {}. Available profiles for '{}:{}': {}" - msgstr "不能为参数 {} 匹配配置文件。'{}:{}' 可用的配置文件为 : {}" - --#: dnf/module/module_base.py:106 -+#: dnf/module/module_base.py:106 dnf/module/module_base.py:216 - msgid "Unable to match profile for argument {}" - msgstr "无法配置参数 {} 中的配置档案" - -@@ -3797,41 +3761,55 @@ msgstr "没有模块 {}:{} 的配置文件" - msgid "Default profile {} not available in module {}:{}" - msgstr "默认配置文件 {} 在模块 {}:{} 中不可用" - --#: dnf/module/module_base.py:142 -+#: dnf/module/module_base.py:142 dnf/module/module_base.py:245 - msgid "Installing module from Fail-Safe repository is not allowed" - msgstr "不允许从失效保险仓库中安装模块" - --#: dnf/module/module_base.py:159 dnf/module/module_base.py:193 --#: dnf/module/module_base.py:337 dnf/module/module_base.py:355 --#: dnf/module/module_base.py:363 dnf/module/module_base.py:417 --#: dnf/module/module_base.py:473 dnf/module/module_base.py:539 -+#: dnf/module/module_base.py:194 -+#, python-brace-format -+msgid "No active matches for argument '{0}' in module '{1}:{2}'" -+msgstr "模块 '{1}:{2}' 中的参数 '{0}' 没有活跃的匹配" -+ -+#: dnf/module/module_base.py:226 -+#, python-brace-format -+msgid "Installed profile '{0}' is not available in module '{1}' stream '{2}'" -+msgstr "在模块 '{1}' 流 '{2}' 中没有安装的配置集 '{0}'" -+ -+#: dnf/module/module_base.py:265 -+msgid "No packages available to distrosync for package name '{}'" -+msgstr "软件包名称 '{}' 没有可用的软件包用于 distrosync" -+ -+#: dnf/module/module_base.py:308 dnf/module/module_base.py:452 -+#: dnf/module/module_base.py:477 dnf/module/module_base.py:496 -+#: dnf/module/module_base.py:543 dnf/module/module_base.py:599 -+#: dnf/module/module_base.py:665 dnf/module/module_base.py:827 - msgid "Unable to resolve argument {}" - msgstr "无法解析参数 {}" - --#: dnf/module/module_base.py:160 --msgid "No match for package {}" --msgstr "没有和{}匹配的软件包" -- --#: dnf/module/module_base.py:204 -+#: dnf/module/module_base.py:319 - #, python-brace-format - msgid "Upgrading module '{0}' from Fail-Safe repository {1} is not allowed" - msgstr "不允许从失效保险仓库 {1} 中升级模块 '{0}'" - --#: dnf/module/module_base.py:223 dnf/module/module_base.py:251 -+#: dnf/module/module_base.py:338 dnf/module/module_base.py:366 - msgid "Unable to match profile in argument {}" - msgstr "无法匹配参数 {} 中的配置档案" - --#: dnf/module/module_base.py:231 -+#: dnf/module/module_base.py:346 - msgid "Upgrading module from Fail-Safe repository is not allowed" - msgstr "不允许从失效保险仓库中升级模块" - --#: dnf/module/module_base.py:367 -+#: dnf/module/module_base.py:500 - msgid "" - "Only module name is required. Ignoring unneeded information in argument: " - "'{}'" - msgstr "只需要模块名。正在忽略'{}'中的无用信息" - --#: dnf/package.py:298 -+#: dnf/module/module_base.py:828 -+msgid "No match for package {}" -+msgstr "没有和{}匹配的软件包" -+ -+#: dnf/package.py:333 - #, python-format - msgid "%s: %s check failed: %s vs %s" - msgstr "%s: %s 检查失败:%s vs %s" -@@ -3845,12 +3823,12 @@ msgstr "%s 为空文件" - #: dnf/persistor.py:91 - #, python-format - msgid "Failed to load expired repos cache: %s" --msgstr "" -+msgstr "加载过期的仓库缓存失败: %s" - - #: dnf/persistor.py:99 - #, python-format - msgid "Failed to store expired repos cache: %s" --msgstr "" -+msgstr "存储已过期的仓库缓存失败: %s" - - #: dnf/persistor.py:106 - msgid "Failed storing last makecache time." -@@ -3912,6 +3890,12 @@ msgstr "已添加 %s 仓库来自 %s" - msgid "Errors occurred during test transaction." - msgstr "测试事务过程中出现错误。" - -+#: dnf/sack.py:47 -+msgid "" -+"allow_vendor_change is disabled. This option is currently not supported for " -+"downgrade and distro-sync commands" -+msgstr "allow_vendor_change 被禁用。目前不支持 downgrade 和 distro-sync 命令" -+ - #. TRANSLATORS: This is for a single package currently being downgraded. - #: dnf/transaction.py:80 - msgctxt "currently" -@@ -3958,164 +3942,196 @@ msgstr "运行脚本" - msgid "Preparing" - msgstr "准备中" - --#: dnf/transaction_sr.py:60 -+#: dnf/transaction_sr.py:66 - #, python-brace-format --msgid "Errors in \"{filename}\":" --msgstr "" -+msgid "" -+"The following problems occurred while replaying the transaction from file " -+"\"{filename}\":" -+msgstr "在从文件 \"{filename}\" replay 事务时发生以下问题:" - --#: dnf/transaction_sr.py:70 --#, python-brace-format --msgid "Error in \"{filename}\": {error}" --msgstr "" -+#: dnf/transaction_sr.py:68 -+msgid "The following problems occurred while running a transaction:" -+msgstr "运行事务时发生以下问题:" - --#: dnf/transaction_sr.py:87 -+#: dnf/transaction_sr.py:89 - #, python-brace-format - msgid "Invalid major version \"{major}\", number expected." --msgstr "" -+msgstr "无效的主版本 \"{major}\",需要是数字。" - --#: dnf/transaction_sr.py:95 -+#: dnf/transaction_sr.py:97 - #, python-brace-format - msgid "Invalid minor version \"{minor}\", number expected." --msgstr "" -+msgstr "无效的次版本 \"{minor}\",需要是数字。" - --#: dnf/transaction_sr.py:101 -+#: dnf/transaction_sr.py:103 - #, python-brace-format - msgid "" - "Incompatible major version \"{major}\", supported major version is " - "\"{major_supp}\"." --msgstr "" -+msgstr "不兼容的主版本 \"{major}\",支持的主版本是 \"{major_supp}\"。" - --#: dnf/transaction_sr.py:244 -+#: dnf/transaction_sr.py:224 -+msgid "" -+"Conflicting TransactionReplay arguments have been specified: filename, data" -+msgstr "指定了有冲突的 TransactionReplay 参数: filename、data" -+ -+#: dnf/transaction_sr.py:265 - #, python-brace-format - msgid "Unexpected type of \"{id}\", {exp} expected." --msgstr "" -+msgstr "意外类型 \"{id}\",需要是 {exp}。" - --#: dnf/transaction_sr.py:250 -+#: dnf/transaction_sr.py:271 - #, python-brace-format - msgid "Missing key \"{key}\"." --msgstr "" -+msgstr "缺少键 \"{key}\"。" - --#: dnf/transaction_sr.py:263 -+#: dnf/transaction_sr.py:285 - #, python-brace-format - msgid "Missing object key \"{key}\" in an rpm." --msgstr "" -+msgstr "在 rpm 中缺少对象键 \"{key}\"。" - --#: dnf/transaction_sr.py:267 -+#: dnf/transaction_sr.py:289 - #, python-brace-format - msgid "Unexpected value of package reason \"{reason}\" for rpm nevra \"{nevra}\"." --msgstr "" -+msgstr "rpm nevra \"{reason}\" 的软件包原因 \"{nevra}\" 的值无效。" - --#: dnf/transaction_sr.py:275 -+#: dnf/transaction_sr.py:297 - #, python-brace-format - msgid "Cannot parse NEVRA for package \"{nevra}\"." --msgstr "" -+msgstr "无法为软件包 \"{nevra}\" 解析 NEVRA。" - --#: dnf/transaction_sr.py:286 -+#: dnf/transaction_sr.py:321 - #, python-brace-format - msgid "Cannot find rpm nevra \"{nevra}\"." --msgstr "" -+msgstr "无法找到 rpm nevra \"{nevra}\"。" - --#: dnf/transaction_sr.py:301 --#, fuzzy, python-brace-format --#| msgid "Package %s is already installed." -+#: dnf/transaction_sr.py:336 -+#, python-brace-format - msgid "Package \"{na}\" is already installed for action \"{action}\"." --msgstr "软件包 %s 已安装。" -+msgstr "已为操作 \"{action}\" 安装了软件包 \"{na}\"。" - --#: dnf/transaction_sr.py:311 -+#: dnf/transaction_sr.py:345 - #, python-brace-format - msgid "" - "Package nevra \"{nevra}\" not available in repositories for action " - "\"{action}\"." --msgstr "" -+msgstr "对于操作 \"{action}\",软件包 nevra \"{nevra}\" 没有包括在仓库中。" - --#: dnf/transaction_sr.py:322 -+#: dnf/transaction_sr.py:356 - #, python-brace-format - msgid "Package nevra \"{nevra}\" not installed for action \"{action}\"." --msgstr "" -+msgstr "没有为操作 \"{action}\" 安装软件包 nevra \"{nevra}\"。" - --#: dnf/transaction_sr.py:336 -+#: dnf/transaction_sr.py:370 - #, python-brace-format - msgid "Unexpected value of package action \"{action}\" for rpm nevra \"{nevra}\"." --msgstr "" -+msgstr "rpm nevra \"{action}\" 的软件包操作 \"{nevra}\" 无效。" - --#: dnf/transaction_sr.py:343 --#, fuzzy, python-format --#| msgid "Module or Group '%s' is not available." -+#: dnf/transaction_sr.py:377 -+#, python-format - msgid "Group id '%s' is not available." --msgstr "模块或者组 '%s' 不可用。" -+msgstr "组 id '%s' 不可用。" - --#: dnf/transaction_sr.py:364 -+#: dnf/transaction_sr.py:398 - #, python-brace-format - msgid "Missing object key \"{key}\" in groups.packages." --msgstr "" -+msgstr "在 groups.packages 中缺少对象键 \"{key}\"。" - --#: dnf/transaction_sr.py:377 dnf/transaction_sr.py:387 --#, fuzzy, python-format --#| msgid "Module or Group '%s' is not installed." -+#: dnf/transaction_sr.py:411 dnf/transaction_sr.py:421 -+#, python-format - msgid "Group id '%s' is not installed." --msgstr "模块或者组 '%s' 未安装。" -+msgstr "组 id '%s' 没有安装。" - --#: dnf/transaction_sr.py:398 --#, fuzzy, python-format --#| msgid "Environment '%s' is not available." -+#: dnf/transaction_sr.py:432 -+#, python-format - msgid "Environment id '%s' is not available." --msgstr "环境 '%s' 不可用。" -+msgstr "环境 id '%s' 不可用。" - --#: dnf/transaction_sr.py:422 -+#: dnf/transaction_sr.py:456 - #, python-brace-format - msgid "" - "Invalid value \"{group_type}\" of environments.groups.group_type, only " - "\"mandatory\" or \"optional\" is supported." - msgstr "" -+"environments.groups.group_type 无效的值 \"{group_type}\",只支持 \"mandatory\" 或 " -+"\"optional\"。" - --#: dnf/transaction_sr.py:430 -+#: dnf/transaction_sr.py:464 - #, python-brace-format - msgid "Missing object key \"{key}\" in environments.groups." --msgstr "" -+msgstr "在 environment.groups 中缺少对象键 \"{key}\"。" - --#: dnf/transaction_sr.py:508 -+#: dnf/transaction_sr.py:542 - #, python-brace-format - msgid "Unexpected value of group action \"{action}\" for group \"{group}\"." --msgstr "" -+msgstr "组 \"{action}\" 的组操作 \"{group}\" 的值无效。" - --#: dnf/transaction_sr.py:513 -+#: dnf/transaction_sr.py:547 - #, python-brace-format - msgid "Missing object key \"{key}\" in a group." --msgstr "" -+msgstr "在一个组中缺少对象键 \"{key}\"。" - --#: dnf/transaction_sr.py:537 -+#: dnf/transaction_sr.py:571 - #, python-brace-format - msgid "Unexpected value of environment action \"{action}\" for environment \"{env}\"." --msgstr "" -+msgstr "环境 \"{env}\" 的环境操作 \"{action}\" 的值无效。" - --#: dnf/transaction_sr.py:542 -+#: dnf/transaction_sr.py:576 - #, python-brace-format - msgid "Missing object key \"{key}\" in an environment." --msgstr "" -+msgstr "在环境中缺少对象键 \"{key}\"。" - --#: dnf/transaction_sr.py:581 -+#: dnf/transaction_sr.py:615 - #, python-brace-format - msgid "" - "Package nevra \"{nevra}\", which is not present in the transaction file, was" - " pulled into the transaction." --msgstr "" -+msgstr "软件包 nevra \"{nevra}\" 没有包括在事务文件中,但它被拉取到事务中。" - --#: dnf/util.py:391 dnf/util.py:393 -+#: dnf/util.py:393 dnf/util.py:395 - msgid "Problem" - msgstr "问题" - --#: dnf/util.py:444 -+#: dnf/util.py:446 - msgid "TransactionItem not found for key: {}" - msgstr "找不到键的 TransactionItem: {}" - --#: dnf/util.py:454 -+#: dnf/util.py:456 - msgid "TransactionSWDBItem not found for key: {}" - msgstr "找不到键的 TransactionSWDBItem: {}" - --#: dnf/util.py:457 -+#: dnf/util.py:459 - msgid "Errors occurred during transaction." - msgstr "事务过程中出现错误。" - -+#: dnf/util.py:595 -+msgid "Reinstalled" -+msgstr "已重装" -+ -+#: dnf/util.py:596 -+msgid "Skipped" -+msgstr "已跳过" -+ -+#: dnf/util.py:597 -+msgid "Removed" -+msgstr "已移除" -+ -+#: dnf/util.py:600 -+msgid "Failed" -+msgstr "失败" -+ -+#~ msgid "Action not handled: {}" -+#~ msgstr "操作没被处理:{}" -+ -+#~ msgid "no package matched" -+#~ msgstr "没有能够与之匹配的软件包" -+ -+#~ msgid "Not found given transaction ID" -+#~ msgstr "未找到指定事务 ID" -+ -+#~ msgid "Undoing transaction {}, from {}" -+#~ msgstr "撤销事务 {},从 {}" -+ - #~ msgid "format for displaying found packages" - #~ msgstr "用于显示已查找到软件包的格式" - --- -2.29.2 - diff --git a/SPECS/dnf.spec b/SPECS/dnf.spec index 24d28b1..89825db 100644 --- a/SPECS/dnf.spec +++ b/SPECS/dnf.spec @@ -1,11 +1,14 @@ +# Always build out-of-source +%define __cmake_in_source_build 1 + # default dependencies -%global hawkey_version 0.55.0-5 +%global hawkey_version 0.61.1 %global libcomps_version 0.1.8 -%global libmodulemd_version 1.4.0 +%global libmodulemd_version 2.9.3 %global rpm_version 4.14.2-35 # conflicts -%global conflicts_dnf_plugins_core_version 4.0.16 +%global conflicts_dnf_plugins_core_version 4.0.20 %global conflicts_dnf_plugins_extras_version 4.0.4 %global conflicts_dnfdaemon_version 0.3.19 @@ -24,19 +27,6 @@ %endif -%if 0%{?rhel} && 0%{?rhel} <= 7 -%bcond_with python3 -%else -%bcond_without python3 -%endif - -%if 0%{?rhel} >= 8 || 0%{?fedora} > 29 -# Disable python2 build -%bcond_with python2 -%else -%bcond_without python2 -%endif - # YUM compat subpackage configuration # # level=full -> deploy all compat symlinks (conflicts with yum < 4) @@ -64,13 +54,7 @@ %global confdir %{_sysconfdir}/%{name} %global pluginconfpath %{confdir}/plugins -%if %{with python2} - %global py2pluginpath %{python2_sitelib}/%{name}-plugins -%endif - -%if %{with python3} - %global py3pluginpath %{python3_sitelib}/%{name}-plugins -%endif +%global py3pluginpath %{python3_sitelib}/%{name}-plugins # Use the same directory of the main package for subpackage licence and docs %global _docdir_fmt %{name} @@ -81,53 +65,14 @@ It supports RPMs, modules and comps groups & environments. Name: dnf -Version: 4.4.2 -Release: 11%{?dist} +Version: 4.7.0 +Release: 1%{?dist} Summary: %{pkg_summary} # For a breakdown of the licensing, see PACKAGE-LICENSING -License: GPLv2+ and GPLv2 and GPL +License: GPLv2+ URL: https://github.com/rpm-software-management/dnf Source0: %{url}/archive/%{version}/%{name}-%{version}.tar.gz -# https://github.com/rpm-software-management/dnf/commit/f6d1e4308769efaa6175f70d52bfd784c62fbf98 -Patch1: 0001-tests-SQL-write-a-readonly-folder.patch -# https://github.com/rpm-software-management/dnf/commit/c2e4901cec947e5be2e5ff5afa22691841d00bdc -Patch2: 0002-Revert-Fix-setopt-cachedir-writing-outside-of-installroot.patch -# https://github.com/rpm-software-management/dnf/pull/1675 -Patch3: 0003-Post-transaction-summary-is-logged-for-API-users-RhBug-1855158.patch -# https://github.com/rpm-software-management/dnf/pull/1698 -Patch4: 0004-Log-scriptlets-output-also-for-API-users-RhBug-1847340.patch -# https://github.com/rpm-software-management/dnf/pull/1659 -# https://github.com/rpm-software-management/dnf/pull/1689 -# https://github.com/rpm-software-management/dnf/pull/1709 -# https://github.com/rpm-software-management/dnf/pull/1690 -Patch5: 0005-dnf-history-operations-that-work-with-comps-correctly.patch -# https://github.com/rpm-software-management/dnf/pull/1691 -Patch6: 0006-Remove-sourcepackages-from-install-upgrade-set.patch -# https://github.com/rpm-software-management/dnf/pull/1710 -Patch7: 0007-Fix-documentation-of-globs-not-supporting-curly-brackets.patch -# https://github.com/rpm-software-management/dnf/pull/1685 -Patch8: 0008-Module-switch-command.patch -# https://github.com/rpm-software-management/dnf/pull/1702 -Patch9: 0009-yum.misc.decompress-to-handle-uncompressed-files-RhBug-1895059.patch -# https://github.com/rpm-software-management/dnf/pull/1693 -Patch10: 0010-Make-log-rotated-permissions-match-initial-log-permissions-RhBug-1894344.patch -# https://github.com/rpm-software-management/dnf/pull/1692 -Patch11: 0011-Add-new-attribute-for-Package--from-repo.patch -# https://github.com/rpm-software-management/dnf/pull/1695 -Patch12: 0012-Change-behaviour-of-Package-.from-repo.patch -# https://github.com/rpm-software-management/dnf/pull/1686 -Patch13: 0013-Package-add-a-get-header--method.patch -# https://github.com/rpm-software-management/dnf/pull/1703 -Patch14: 0014-Add-api-function-fill-sack-from-repos-in-cache-RhBug-1865803.patch -# https://github.com/rpm-software-management/dnf/pull/1711 -Patch15: 0015-Add-tests-and-docs-for-fill-sack-from-repos-in-cache-RhBug-1865803.patch -# https://github.com/rpm-software-management/dnf/pull/1721 -Patch16: 0016-Run-tests-for-fill-sack-from-repos-in-cache-in-installroot..patch -#https://github.com/rpm-software-management/dnf/pull/1723 -Patch17: 0017-Set-persistdir-for-fill-sack-from-repos-in-cache-tests-RhBug-1865803.patch -# https://github.com/rpm-software-management/dnf/pull/1725 -Patch18: 0018-Allow-stream-switching-if-option-enabled.patch -Patch19: 0019-Update-translations.patch +Patch1: 0001-Set-top-level-directory-for-unittest.patch BuildArch: noarch BuildRequires: cmake @@ -135,22 +80,13 @@ BuildRequires: gettext # Documentation BuildRequires: systemd BuildRequires: bash-completion -%if %{with python3} BuildRequires: %{_bindir}/sphinx-build-3 Requires: python3-%{name} = %{version}-%{release} -%else -BuildRequires: %{_bindir}/sphinx-build -Requires: python2-%{name} = %{version}-%{release} -%endif %if 0%{?rhel} && 0%{?rhel} <= 7 Requires: python-dbus Requires: %{_bindir}/sqlite3 %else -%if %{with python3} Recommends: (python3-dbus if NetworkManager) -%else -Recommends: (python2-dbus if NetworkManager) -%endif Recommends: (%{_bindir}/sqlite3 if bash-completion) %endif Provides: dnf-command(alias) @@ -176,9 +112,7 @@ Provides: dnf-command(search) Provides: dnf-command(updateinfo) Provides: dnf-command(upgrade) Provides: dnf-command(upgrade-to) -Conflicts: python2-dnf-plugins-core < %{conflicts_dnf_plugins_core_version} Conflicts: python3-dnf-plugins-core < %{conflicts_dnf_plugins_core_version} -Conflicts: python2-dnf-plugins-extras-common < %{conflicts_dnf_plugins_extras_version} Conflicts: python3-dnf-plugins-extras-common < %{conflicts_dnf_plugins_extras_version} %description @@ -208,55 +142,6 @@ Conflicts: yum < 3.4.3-505 %description -n %{yum_subpackage_name} %{pkg_description} -%if %{with python2} -%package -n python2-%{name} -Summary: Python 2 interface to DNF -%{?python_provide:%python_provide python2-%{name}} -BuildRequires: python2-devel -BuildRequires: python2-hawkey >= %{hawkey_version} -BuildRequires: python2-libdnf >= %{hawkey_version} -BuildRequires: python2-libcomps >= %{libcomps_version} -BuildRequires: python2-libdnf -BuildRequires: python2-nose -BuildRequires: libmodulemd >= %{libmodulemd_version} -Requires: libmodulemd >= %{libmodulemd_version} -%if (0%{?rhel} && 0%{?rhel} <= 7) -BuildRequires: pygpgme -Requires: pygpgme -BuildRequires: python-enum34 -Requires: python-enum34 -%else -BuildRequires: python2-gpg -Requires: python2-gpg -BuildRequires: python2-enum34 -Requires: python2-enum34 -%endif -Requires: %{name}-data = %{version}-%{release} -%if 0%{?fedora} -Recommends: deltarpm -# required for DNSSEC main.gpgkey_dns_verification https://dnf.readthedocs.io/en/latest/conf_ref.html -Recommends: python2-unbound -%endif -Requires: python2-hawkey >= %{hawkey_version} -Requires: python2-libdnf >= %{hawkey_version} -Requires: python2-libcomps >= %{libcomps_version} -Requires: python2-libdnf -%if 0%{?rhel} && 0%{?rhel} <= 7 -BuildRequires: rpm-python >= %{rpm_version} -Requires: rpm-python >= %{rpm_version} -%else -BuildRequires: python2-rpm >= %{rpm_version} -Requires: python2-rpm >= %{rpm_version} -Recommends: rpm-plugin-systemd-inhibit -%endif -Conflicts: dnfdaemon < %{conflicts_dnfdaemon_version} - -%description -n python2-%{name} -Python 2 interface to DNF. -%endif -# ^ %%{with python2} - -%if %{with python3} %package -n python3-%{name} Summary: Python 3 interface to DNF %{?python_provide:%python_provide python3-%{name}} @@ -267,7 +152,6 @@ BuildRequires: python3-libcomps >= %{libcomps_version} BuildRequires: python3-libdnf BuildRequires: libmodulemd >= %{libmodulemd_version} Requires: libmodulemd >= %{libmodulemd_version} -BuildRequires: python3-nose BuildRequires: python3-gpg Requires: python3-gpg Requires: %{name}-data = %{version}-%{release} @@ -290,7 +174,6 @@ Recommends: rpm-plugin-systemd-inhibit %description -n python3-%{name} Python 3 interface to DNF. -%endif %package automatic Summary: %{pkg_summary} - automated upgrades @@ -304,40 +187,22 @@ Systemd units that can periodically download package upgrades and apply them. %prep %autosetup -p1 -mkdir build-py2 + mkdir build-py3 - %build -%if %{with python2} - pushd build-py2 - %cmake .. -DPYTHON_DESIRED:FILEPATH=%{__python2} -DDNF_VERSION=%{version} - %make_build - make doc-man - popd -%endif - -%if %{with python3} - pushd build-py3 - %cmake .. -DPYTHON_DESIRED:FILEPATH=%{__python3} -DDNF_VERSION=%{version} - %make_build - make doc-man - popd -%endif +pushd build-py3 +%cmake .. -DPYTHON_DESIRED:FILEPATH=%{__python3} -DDNF_VERSION=%{version} +%make_build +make doc-man +popd %install -%if %{with python2} - pushd build-py2 - %make_install - popd -%endif -%if %{with python3} - pushd build-py3 - %make_install - popd -%endif +pushd build-py3 +%make_install +popd %find_lang %{name} mkdir -p %{buildroot}%{confdir}/vars @@ -345,22 +210,12 @@ mkdir -p %{buildroot}%{confdir}/aliases.d mkdir -p %{buildroot}%{pluginconfpath}/ mkdir -p %{buildroot}%{_sysconfdir}/%{name}/modules.d mkdir -p %{buildroot}%{_sysconfdir}/%{name}/modules.defaults.d -%if %{with python2} -mkdir -p %{buildroot}%{py2pluginpath}/ -%endif -%if %{with python3} mkdir -p %{buildroot}%{py3pluginpath}/__pycache__/ -%endif mkdir -p %{buildroot}%{_localstatedir}/log/ mkdir -p %{buildroot}%{_var}/cache/dnf/ touch %{buildroot}%{_localstatedir}/log/%{name}.log -%if %{with python3} ln -sr %{buildroot}%{_bindir}/dnf-3 %{buildroot}%{_bindir}/dnf mv %{buildroot}%{_bindir}/dnf-automatic-3 %{buildroot}%{_bindir}/dnf-automatic -%else -ln -sr %{buildroot}%{_bindir}/dnf-2 %{buildroot}%{_bindir}/dnf -mv %{buildroot}%{_bindir}/dnf-automatic-2 %{buildroot}%{_bindir}/dnf-automatic -%endif rm -vf %{buildroot}%{_bindir}/dnf-automatic-* # Strict conf distribution @@ -372,17 +227,7 @@ rm -vf %{buildroot}%{confdir}/%{name}-strict.conf # YUM compat layer ln -sr %{buildroot}%{confdir}/%{name}.conf %{buildroot}%{_sysconfdir}/yum.conf -%if %{with python3} ln -sr %{buildroot}%{_bindir}/dnf-3 %{buildroot}%{_bindir}/yum -%else -%if "%{yum_compat_level}" == "preview" -ln -sr %{buildroot}%{_bindir}/dnf-2 %{buildroot}%{_bindir}/yum4 -ln -sr %{buildroot}%{_mandir}/man8/dnf.8.gz %{buildroot}%{_mandir}/man8/yum4.8.gz -rm -f %{buildroot}%{_mandir}/man8/yum.8.gz -%else -ln -sr %{buildroot}%{_bindir}/dnf-2 %{buildroot}%{_bindir}/yum -%endif -%endif %if "%{yum_compat_level}" == "full" mkdir -p %{buildroot}%{_sysconfdir}/yum ln -sr %{buildroot}%{pluginconfpath} %{buildroot}%{_sysconfdir}/yum/pluginconf.d @@ -392,17 +237,10 @@ ln -sr %{buildroot}%{confdir}/vars %{buildroot}%{_sysconfdir}/yum/vars %check -%if %{with python2} - pushd build-py2 - ctest -VV - popd -%endif -%if %{with python3} - pushd build-py3 - ctest -VV - popd -%endif +pushd build-py3 +ctest -VV +popd %post @@ -512,22 +350,12 @@ ln -sr %{buildroot}%{confdir}/vars %{buildroot}%{_sysconfdir}/yum/vars %exclude %{_mandir}/man8/yum.8* %endif -%if %{with python2} -%files -n python2-%{name} -%{_bindir}/%{name}-2 -%exclude %{python2_sitelib}/%{name}/automatic -%{python2_sitelib}/%{name}/ -%dir %{py2pluginpath} -%endif - -%if %{with python3} %files -n python3-%{name} %{_bindir}/%{name}-3 %exclude %{python3_sitelib}/%{name}/automatic %{python3_sitelib}/%{name}/ %dir %{py3pluginpath} %dir %{py3pluginpath}/__pycache__ -%endif %files automatic %{_bindir}/%{name}-automatic @@ -541,15 +369,39 @@ ln -sr %{buildroot}%{confdir}/vars %{buildroot}%{_sysconfdir}/yum/vars %{_unitdir}/%{name}-automatic-download.timer %{_unitdir}/%{name}-automatic-install.service %{_unitdir}/%{name}-automatic-install.timer -%if %{with python3} %{python3_sitelib}/%{name}/automatic/ -%else -%{python2_sitelib}/%{name}/automatic/ -%endif %changelog -* Mon Mar 8 2021 Marek Blaha - 4.4.2-11 -- Update translations +* Wed May 19 2021 Pavla Kratochvilova - 4.7.0-1 +- Update to 4.7.0 +- New optional parameter for filter_modules enables following modular obsoletes based on a config option module_obsoletes +- Fix module remove --all when no match spec (RhBug:1904490) +- Make an error message more informative (RhBug:1814831) +- Expand history to full term size when output is redirected (RhBug:1852577) (RhBug:1852577,1906970) +- Print additional information when verifying GPG key using DNS +- Enhanced detection of plugins removed in transaction (RhBug:1929163) +- Improve repo config path ordering to fix a comps merging issue (RhBug:1928181) +- Keep reason when package is removed (RhBug:1921063) +- Improve mechanism for application of security filters (RhBug:1918475) +- [API] Add new method for reset of security filters +- Remove hardcoded logfile permissions (RhBug:1910084) +- Preserve file mode during log rotation (RhBug:1910084) +- Increase loglevel in case of invalid config options +- Prevent traceback (catch ValueError) if pkg is from cmdline +- Check for specific key string when verifing signatures (RhBug:1915990) +- Use rpmkeys binary to verify package signature (RhBug:1915990) +- [doc] Improve description of modular filtering +- [doc] deprecated alias for dnf repoquery --deplist +- [doc] Describe install with just a name and obsoletes (RhBug:1902279) +- [doc] Fix: "sslcacert" contains path to the file +- [doc] Added proxy ssl configuration options, increase libdnf require +- [doc] Update documentation for module_obsoletes and module_stream_switch +- [doc] Improve documentation for Hotfix repositories +- [doc] fix: "makecache" command downloads only enabled repositories +- [doc] Add info that maximum parallel downloads is 20 +- [doc] installonly_limit documentation follows behavior +- [doc] Add documentation for config option sslverifystatus (RhBug:1814383) +- The noroot plugin no longer exists, remove mention * Thu Feb 11 2021 Nicola Sella - 4.4.2-10 - Allow stream switching if option enabled