diff --git a/.dnf-plugins-core.metadata b/.dnf-plugins-core.metadata index fc3009b..40ecba9 100644 --- a/.dnf-plugins-core.metadata +++ b/.dnf-plugins-core.metadata @@ -1 +1 @@ -3b8638dec2cb91a13241106b9a57114ed037d2ca SOURCES/dnf-plugins-core-4.0.18.tar.gz +40f26a50a6605eacb1e9c4a443f01655fa461767 SOURCES/dnf-plugins-core-4.0.21.tar.gz diff --git a/.gitignore b/.gitignore index dae8243..ae4a8af 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/dnf-plugins-core-4.0.18.tar.gz +SOURCES/dnf-plugins-core-4.0.21.tar.gz diff --git a/SOURCES/0001-groups-manager-Re-introduce-yum-groups-manager-funct.patch b/SOURCES/0001-groups-manager-Re-introduce-yum-groups-manager-funct.patch deleted file mode 100644 index ddebf40..0000000 --- a/SOURCES/0001-groups-manager-Re-introduce-yum-groups-manager-funct.patch +++ /dev/null @@ -1,653 +0,0 @@ -From 40f08d7a22907e6292c314462c01de94584c0854 Mon Sep 17 00:00:00 2001 -From: Marek Blaha -Date: Tue, 27 Oct 2020 15:46:03 +0100 -Subject: [PATCH 1/2] [groups-manager] Re-introduce yum-groups-manager - functionality (RhBug:1826016) - -Implements 'dnf groups-manager' command with features: -- read, merge, print and write groups metadata files -- edit group attributes name (with translated variants), - description (with translated variants), uservisible, displayorder -- add packgages to group -- remove packages from group - -= changelog = -msg: Re-introduce yum-groups-manager functionality -type: enhancement -resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1826016 ---- - dnf-plugins-core.spec | 22 ++- - doc/CMakeLists.txt | 2 + - doc/conf.py | 2 + - doc/groups-manager.rst | 94 ++++++++++++ - doc/index.rst | 1 + - libexec/dnf-utils.in | 1 + - plugins/CMakeLists.txt | 1 + - plugins/groups_manager.py | 314 ++++++++++++++++++++++++++++++++++++++ - 8 files changed, 432 insertions(+), 5 deletions(-) - create mode 100644 doc/groups-manager.rst - create mode 100644 plugins/groups_manager.py - -diff --git a/dnf-plugins-core.spec b/dnf-plugins-core.spec -index d13a996..42d0884 100644 ---- a/dnf-plugins-core.spec -+++ b/dnf-plugins-core.spec -@@ -58,6 +58,7 @@ Provides: dnf-command(debug-dump) - Provides: dnf-command(debug-restore) - Provides: dnf-command(debuginfo-install) - Provides: dnf-command(download) -+Provides: dnf-command(groups-manager) - Provides: dnf-command(repoclosure) - Provides: dnf-command(repograph) - Provides: dnf-command(repomanage) -@@ -73,6 +74,7 @@ Provides: dnf-plugin-debuginfo-install = %{version}-%{release} - Provides: dnf-plugin-download = %{version}-%{release} - Provides: dnf-plugin-generate_completion_cache = %{version}-%{release} - Provides: dnf-plugin-needs_restarting = %{version}-%{release} -+Provides: dnf-plugin-groups-manager = %{version}-%{release} - Provides: dnf-plugin-repoclosure = %{version}-%{release} - Provides: dnf-plugin-repodiff = %{version}-%{release} - Provides: dnf-plugin-repograph = %{version}-%{release} -@@ -87,7 +89,7 @@ Conflicts: dnf-plugins-extras-common-data < %{dnf_plugins_extra} - - %description - Core Plugins for DNF. This package enhances DNF with builddep, config-manager, --copr, debug, debuginfo-install, download, needs-restarting, repoclosure, -+copr, debug, debuginfo-install, download, needs-restarting, groups-manager, repoclosure, - repograph, repomanage, reposync, changelog and repodiff commands. Additionally - provides generate_completion_cache passive plugin. - -@@ -129,7 +131,8 @@ Conflicts: python-%{name} < %{version}-%{release} - %description -n python2-%{name} - Core Plugins for DNF, Python 2 interface. This package enhances DNF with builddep, - config-manager, copr, degug, debuginfo-install, download, needs-restarting, --repoclosure, repograph, repomanage, reposync, changelog and repodiff commands. -+groups-manager, repoclosure, repograph, repomanage, reposync, changelog -+and repodiff commands. - Additionally provides generate_completion_cache passive plugin. - %endif - -@@ -163,7 +166,8 @@ Conflicts: python-%{name} < %{version}-%{release} - %description -n python3-%{name} - Core Plugins for DNF, Python 3 interface. This package enhances DNF with builddep, - config-manager, copr, debug, debuginfo-install, download, needs-restarting, --repoclosure, repograph, repomanage, reposync, changelog and repodiff commands. -+groups-manager, repoclosure, repograph, repomanage, reposync, changelog -+and repodiff commands. - Additionally provides generate_completion_cache passive plugin. - %endif - -@@ -190,8 +194,8 @@ Summary: Yum-utils CLI compatibility layer - %description -n %{yum_utils_subpackage_name} - As a Yum-utils CLI compatibility layer, supplies in CLI shims for - debuginfo-install, repograph, package-cleanup, repoclosure, repomanage, --repoquery, reposync, repotrack, repodiff, builddep, config-manager, debug --and download that use new implementations using DNF. -+repoquery, reposync, repotrack, repodiff, builddep, config-manager, debug, -+download and yum-groups-manager that use new implementations using DNF. - %endif - - %if 0%{?rhel} == 0 && %{with python2} -@@ -458,6 +462,7 @@ ln -sf %{_libexecdir}/dnf-utils %{buildroot}%{_bindir}/yum-builddep - ln -sf %{_libexecdir}/dnf-utils %{buildroot}%{_bindir}/yum-config-manager - ln -sf %{_libexecdir}/dnf-utils %{buildroot}%{_bindir}/yum-debug-dump - ln -sf %{_libexecdir}/dnf-utils %{buildroot}%{_bindir}/yum-debug-restore -+ln -sf %{_libexecdir}/dnf-utils %{buildroot}%{_bindir}/yum-groups-manager - ln -sf %{_libexecdir}/dnf-utils %{buildroot}%{_bindir}/yumdownloader - # These commands don't have a dedicated man page, so let's just point them - # to the utils page which contains their descriptions. -@@ -483,6 +488,7 @@ PYTHONPATH=./plugins nosetests-%{python3_version} -s tests/ - %{_mandir}/man8/dnf-debuginfo-install.* - %{_mandir}/man8/dnf-download.* - %{_mandir}/man8/dnf-generate_completion_cache.* -+%{_mandir}/man8/dnf-groups-manager.* - %{_mandir}/man8/dnf-needs-restarting.* - %{_mandir}/man8/dnf-repoclosure.* - %{_mandir}/man8/dnf-repodiff.* -@@ -513,6 +519,7 @@ PYTHONPATH=./plugins nosetests-%{python3_version} -s tests/ - %{python2_sitelib}/dnf-plugins/debuginfo-install.* - %{python2_sitelib}/dnf-plugins/download.* - %{python2_sitelib}/dnf-plugins/generate_completion_cache.* -+%{python2_sitelib}/dnf-plugins/groups_manager.* - %{python2_sitelib}/dnf-plugins/needs_restarting.* - %{python2_sitelib}/dnf-plugins/repoclosure.* - %{python2_sitelib}/dnf-plugins/repodiff.* -@@ -538,6 +545,7 @@ PYTHONPATH=./plugins nosetests-%{python3_version} -s tests/ - %{python3_sitelib}/dnf-plugins/debuginfo-install.py - %{python3_sitelib}/dnf-plugins/download.py - %{python3_sitelib}/dnf-plugins/generate_completion_cache.py -+%{python3_sitelib}/dnf-plugins/groups_manager.py - %{python3_sitelib}/dnf-plugins/needs_restarting.py - %{python3_sitelib}/dnf-plugins/repoclosure.py - %{python3_sitelib}/dnf-plugins/repodiff.py -@@ -552,6 +560,7 @@ PYTHONPATH=./plugins nosetests-%{python3_version} -s tests/ - %{python3_sitelib}/dnf-plugins/__pycache__/debuginfo-install.* - %{python3_sitelib}/dnf-plugins/__pycache__/download.* - %{python3_sitelib}/dnf-plugins/__pycache__/generate_completion_cache.* -+%{python3_sitelib}/dnf-plugins/__pycache__/groups_manager.* - %{python3_sitelib}/dnf-plugins/__pycache__/needs_restarting.* - %{python3_sitelib}/dnf-plugins/__pycache__/repoclosure.* - %{python3_sitelib}/dnf-plugins/__pycache__/repodiff.* -@@ -579,6 +588,7 @@ PYTHONPATH=./plugins nosetests-%{python3_version} -s tests/ - %{_bindir}/yum-config-manager - %{_bindir}/yum-debug-dump - %{_bindir}/yum-debug-restore -+%{_bindir}/yum-groups-manager - %{_bindir}/yumdownloader - %{_mandir}/man1/debuginfo-install.* - %{_mandir}/man1/needs-restarting.* -@@ -591,6 +601,7 @@ PYTHONPATH=./plugins nosetests-%{python3_version} -s tests/ - %{_mandir}/man1/yum-config-manager.* - %{_mandir}/man1/yum-debug-dump.* - %{_mandir}/man1/yum-debug-restore.* -+%{_mandir}/man1/yum-groups-manager.* - %{_mandir}/man1/yumdownloader.* - %{_mandir}/man1/package-cleanup.* - %{_mandir}/man1/dnf-utils.* -@@ -612,6 +623,7 @@ PYTHONPATH=./plugins nosetests-%{python3_version} -s tests/ - %exclude %{_mandir}/man1/yum-config-manager.* - %exclude %{_mandir}/man1/yum-debug-dump.* - %exclude %{_mandir}/man1/yum-debug-restore.* -+%exclude %{_mandir}/man1/yum-groups-manager.* - %exclude %{_mandir}/man1/yumdownloader.* - %exclude %{_mandir}/man1/package-cleanup.* - %exclude %{_mandir}/man1/dnf-utils.* -diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt -index dd97eb2..3fb665d 100644 ---- a/doc/CMakeLists.txt -+++ b/doc/CMakeLists.txt -@@ -26,6 +26,7 @@ INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/dnf-builddep.8 - ${CMAKE_CURRENT_BINARY_DIR}/dnf-debuginfo-install.8 - ${CMAKE_CURRENT_BINARY_DIR}/dnf-download.8 - ${CMAKE_CURRENT_BINARY_DIR}/dnf-generate_completion_cache.8 -+ ${CMAKE_CURRENT_BINARY_DIR}/dnf-groups-manager.8 - ${CMAKE_CURRENT_BINARY_DIR}/dnf-leaves.8 - ${CMAKE_CURRENT_BINARY_DIR}/dnf-needs-restarting.8 - ${CMAKE_CURRENT_BINARY_DIR}/dnf-repoclosure.8 -@@ -61,6 +62,7 @@ INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/debuginfo-install.1 - ${CMAKE_CURRENT_BINARY_DIR}/yum-config-manager.1 - ${CMAKE_CURRENT_BINARY_DIR}/yum-debug-dump.1 - ${CMAKE_CURRENT_BINARY_DIR}/yum-debug-restore.1 -+ ${CMAKE_CURRENT_BINARY_DIR}/yum-groups-manager.1 - ${CMAKE_CURRENT_BINARY_DIR}/yumdownloader.1 - ${CMAKE_CURRENT_BINARY_DIR}/package-cleanup.1 - ${CMAKE_CURRENT_BINARY_DIR}/dnf-utils.1 -diff --git a/doc/conf.py b/doc/conf.py -index d760ef3..645185a 100644 ---- a/doc/conf.py -+++ b/doc/conf.py -@@ -251,6 +251,7 @@ man_pages = [ - ('download', 'dnf-download', u'DNF download Plugin', AUTHORS, 8), - ('generate_completion_cache', 'dnf-generate_completion_cache', - u'DNF generate_completion_cache Plugin', AUTHORS, 8), -+ ('groups-manager', 'dnf-groups-manager', u'DNF groups-manager Plugin', AUTHORS, 8), - ('leaves', 'dnf-leaves', u'DNF leaves Plugin', AUTHORS, 8), - ('local', 'dnf-local', u'DNF local Plugin', AUTHORS, 8), - ('needs_restarting', 'dnf-needs-restarting', u'DNF needs_restarting Plugin', AUTHORS, 8), -@@ -268,6 +269,7 @@ man_pages = [ - ('copr', 'yum-copr', u'redirecting to DNF copr Plugin', AUTHORS, 8), - ('debuginfo-install', 'debuginfo-install', u'redirecting to DNF debuginfo-install Plugin', - AUTHORS, 1), -+ ('groups-manager', 'yum-groups-manager', u'redirecting to DNF groups-manager Plugin', AUTHORS, 1), - ('needs_restarting', 'needs-restarting', u'redirecting to DNF needs-restarting Plugin', - AUTHORS, 1), - ('repoclosure', 'repoclosure', u'redirecting to DNF repoclosure Plugin', AUTHORS, 1), -diff --git a/doc/groups-manager.rst b/doc/groups-manager.rst -new file mode 100644 -index 0000000..f8f76a1 ---- /dev/null -+++ b/doc/groups-manager.rst -@@ -0,0 +1,94 @@ -+.. -+ Copyright (C) 2020 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. -+ -+========================= -+DNF groups-manager Plugin -+========================= -+ -+Create and edit groups repository metadata files. -+ -+-------- -+Synopsis -+-------- -+ -+``dnf groups-manager [options] [package-name-spec [package-name-spec ...]]`` -+ -+----------- -+Description -+----------- -+groups-manager plugin is used to create or edit a group metadata file for a repository. This is often much easier than writing/editing the XML by hand. The groups-manager can load an entire file of groups metadata and either create a new group or edit an existing group and then write all of the groups metadata back out. -+ -+--------- -+Arguments -+--------- -+ -+```` -+ Package to add to a group or remove from a group. -+ -+------- -+Options -+------- -+ -+All general DNF options are accepted, see `Options` in :manpage:`dnf(8)` for details. -+ -+``--load=`` -+ Load the groups metadata information from the specified file before performing any operations. Metadata from all files are merged together if the option is specified multiple times. -+ -+``--save=`` -+ Save the result to this file. You can specify the name of a file you are loading from as the data will only be saved when all the operations have been performed. This option can also be specified multiple times. -+ -+``--merge=`` -+ This is the same as loading and saving a file, however the "merge" file is loaded before any others and saved last. -+ -+``--print`` -+ Also print the result to stdout. -+ -+``--id=`` -+ The id to lookup/use for the group. If you don't specify an ````, but do specify a name that doesn't refer to an existing group, then an id for the group is generated based on the name. -+ -+``-n , --name=`` -+ The name to lookup/use for the group. If you specify an existing group id, then the group with that id will have it's name changed to this value. -+ -+``--description=`` -+ The description to use for the group. -+ -+``--display-order=`` -+ Change the integer which controls the order groups are presented in, for example in ``dnf grouplist``. -+ -+``--translated-name=`` -+ A translation of the group name in the given language. The syntax is ``lang:text``. Eg. ``en:my-group-name-in-english`` -+ -+``--translated-description=`` -+ A translation of the group description in the given language. The syntax is ``lang:text``. Eg. ``en:my-group-description-in-english``. -+ -+``--user-visible`` -+ Make the group visible in ``dnf grouplist`` (this is the default). -+ -+``--not-user-visible`` -+ Make the group not visible in ``dnf grouplist``. -+ -+``--mandatory`` -+ Store the package names specified within the mandatory section of the specified group, the default is to use the default section. -+ -+``--optional`` -+ Store the package names specified within the optional section of the specified group, the default is to use the default section. -+ -+``--remove`` -+ Instead of adding packages remove them. Note that the packages are removed from all sections (default, mandatory and optional). -+ -+``--dependencies`` -+ Also include the names of the direct dependencies for each package specified. -diff --git a/doc/index.rst b/doc/index.rst -index 91bb36e..7213253 100644 ---- a/doc/index.rst -+++ b/doc/index.rst -@@ -33,6 +33,7 @@ This documents core plugins of DNF: - debuginfo-install - download - generate_completion_cache -+ groups-manager - leaves - local - migrate -diff --git a/libexec/dnf-utils.in b/libexec/dnf-utils.in -index 667ce13..af1e893 100644 ---- a/libexec/dnf-utils.in -+++ b/libexec/dnf-utils.in -@@ -37,6 +37,7 @@ MAPPING = {'debuginfo-install': ['debuginfo-install'], - 'yum-config-manager': ['config-manager'], - 'yum-debug-dump': ['debug-dump'], - 'yum-debug-restore': ['debug-restore'], -+ 'yum-groups-manager': ['groups-manager'], - 'yumdownloader': ['download'] - } - -diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt -index 7465e53..f66d3df 100644 ---- a/plugins/CMakeLists.txt -+++ b/plugins/CMakeLists.txt -@@ -6,6 +6,7 @@ INSTALL (FILES config_manager.py DESTINATION ${PYTHON_INSTALL_DIR}/dnf-plugins) - INSTALL (FILES copr.py DESTINATION ${PYTHON_INSTALL_DIR}/dnf-plugins) - INSTALL (FILES download.py DESTINATION ${PYTHON_INSTALL_DIR}/dnf-plugins) - INSTALL (FILES generate_completion_cache.py DESTINATION ${PYTHON_INSTALL_DIR}/dnf-plugins) -+INSTALL (FILES groups_manager.py DESTINATION ${PYTHON_INSTALL_DIR}/dnf-plugins) - INSTALL (FILES leaves.py DESTINATION ${PYTHON_INSTALL_DIR}/dnf-plugins) - if (${WITHOUT_LOCAL} STREQUAL "0") - INSTALL (FILES local.py DESTINATION ${PYTHON_INSTALL_DIR}/dnf-plugins) -diff --git a/plugins/groups_manager.py b/plugins/groups_manager.py -new file mode 100644 -index 0000000..382df37 ---- /dev/null -+++ b/plugins/groups_manager.py -@@ -0,0 +1,314 @@ -+# groups_manager.py -+# DNF plugin for managing comps groups metadata files -+# -+# Copyright (C) 2020 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 argparse -+import gzip -+import libcomps -+import os -+import re -+import shutil -+import tempfile -+ -+from dnfpluginscore import _, logger -+import dnf -+import dnf.cli -+ -+ -+RE_GROUP_ID_VALID = '-a-z0-9_.:' -+RE_GROUP_ID = re.compile(r'^[{}]+$'.format(RE_GROUP_ID_VALID)) -+RE_LANG = re.compile(r'^[-a-zA-Z0-9_.@]+$') -+COMPS_XML_OPTIONS = { -+ 'default_explicit': True, -+ 'uservisible_explicit': True, -+ 'empty_groups': True} -+ -+ -+def group_id_type(value): -+ '''group id validator''' -+ if not RE_GROUP_ID.match(value): -+ raise argparse.ArgumentTypeError(_('Invalid group id')) -+ return value -+ -+ -+def translation_type(value): -+ '''translated texts validator''' -+ data = value.split(':', 2) -+ if len(data) != 2: -+ raise argparse.ArgumentTypeError( -+ _("Invalid translated data, should be in form 'lang:text'")) -+ lang, text = data -+ if not RE_LANG.match(lang): -+ raise argparse.ArgumentTypeError(_('Invalid/empty language for translated data')) -+ return lang, text -+ -+ -+def text_to_id(text): -+ '''generate group id based on its name''' -+ group_id = text.lower() -+ group_id = re.sub('[^{}]'.format(RE_GROUP_ID_VALID), '', group_id) -+ if not group_id: -+ raise dnf.cli.CliError( -+ _("Can't generate group id from '{}'. Please specify group id using --id.").format( -+ text)) -+ return group_id -+ -+ -+@dnf.plugin.register_command -+class GroupsManagerCommand(dnf.cli.Command): -+ aliases = ('groups-manager',) -+ summary = _('create and edit groups metadata file') -+ -+ def __init__(self, cli): -+ super(GroupsManagerCommand, self).__init__(cli) -+ self.comps = libcomps.Comps() -+ -+ @staticmethod -+ def set_argparser(parser): -+ # input / output options -+ parser.add_argument('--load', action='append', default=[], -+ metavar='COMPS.XML', -+ help=_('load groups metadata from file')) -+ parser.add_argument('--save', action='append', default=[], -+ metavar='COMPS.XML', -+ help=_('save groups metadata to file')) -+ parser.add_argument('--merge', metavar='COMPS.XML', -+ help=_('load and save groups metadata to file')) -+ parser.add_argument('--print', action='store_true', default=False, -+ help=_('print the result metadata to stdout')) -+ # group options -+ parser.add_argument('--id', type=group_id_type, -+ help=_('group id')) -+ parser.add_argument('-n', '--name', help=_('group name')) -+ parser.add_argument('--description', -+ help=_('group description')) -+ parser.add_argument('--display-order', type=int, -+ help=_('group display order')) -+ parser.add_argument('--translated-name', action='append', default=[], -+ metavar='LANG:TEXT', type=translation_type, -+ help=_('translated name for the group')) -+ parser.add_argument('--translated-description', action='append', default=[], -+ metavar='LANG:TEXT', type=translation_type, -+ help=_('translated description for the group')) -+ visible = parser.add_mutually_exclusive_group() -+ visible.add_argument('--user-visible', dest='user_visible', action='store_true', -+ default=None, -+ help=_('make the group user visible (default)')) -+ visible.add_argument('--not-user-visible', dest='user_visible', action='store_false', -+ default=None, -+ help=_('make the group user invisible')) -+ -+ # package list options -+ section = parser.add_mutually_exclusive_group() -+ section.add_argument('--mandatory', action='store_true', -+ help=_('add packages to the mandatory section')) -+ section.add_argument('--optional', action='store_true', -+ help=_('add packages to the optional section')) -+ section.add_argument('--remove', action='store_true', default=False, -+ help=_('remove packages from the group instead of adding them')) -+ parser.add_argument('--dependencies', action='store_true', -+ help=_('include also direct dependencies for packages')) -+ -+ parser.add_argument("packages", nargs='*', metavar='PACKAGE', -+ help=_('package specification')) -+ -+ def configure(self): -+ demands = self.cli.demands -+ -+ if self.opts.packages: -+ demands.sack_activation = True -+ demands.available_repos = True -+ demands.load_system_repo = False -+ -+ # handle --merge option (shortcut to --load and --save the same file) -+ if self.opts.merge: -+ self.opts.load.insert(0, self.opts.merge) -+ self.opts.save.append(self.opts.merge) -+ -+ # check that group is specified when editing is attempted -+ if (self.opts.description -+ or self.opts.display_order -+ or self.opts.translated_name -+ or self.opts.translated_description -+ or self.opts.user_visible is not None -+ or self.opts.packages): -+ if not self.opts.id and not self.opts.name: -+ raise dnf.cli.CliError( -+ _("Can't edit group without specifying it (use --id or --name)")) -+ -+ def load_input_files(self): -+ """ -+ Loads all input xml files. -+ Returns True if at least one file was successfuly loaded -+ """ -+ for file_name in self.opts.load: -+ file_comps = libcomps.Comps() -+ try: -+ if file_name.endswith('.gz'): -+ # libcomps does not support gzipped files - decompress to temporary -+ # location -+ with gzip.open(file_name) as gz_file: -+ temp_file = tempfile.NamedTemporaryFile(delete=False) -+ try: -+ shutil.copyfileobj(gz_file, temp_file) -+ # close temp_file to ensure the content is flushed to disk -+ temp_file.close() -+ file_comps.fromxml_f(temp_file.name) -+ finally: -+ os.unlink(temp_file.name) -+ else: -+ file_comps.fromxml_f(file_name) -+ except (IOError, OSError, libcomps.ParserError) as err: -+ # gzip module raises OSError on reading from malformed gz file -+ # get_last_errors() output often contains duplicit lines, remove them -+ seen = set() -+ for error in file_comps.get_last_errors(): -+ if error in seen: -+ continue -+ logger.error(error.strip()) -+ seen.add(error) -+ raise dnf.exceptions.Error( -+ _("Can't load file \"{}\": {}").format(file_name, err)) -+ else: -+ self.comps += file_comps -+ -+ def save_output_files(self): -+ for file_name in self.opts.save: -+ try: -+ # xml_f returns a list of errors / log entries -+ errors = self.comps.xml_f(file_name, xml_options=COMPS_XML_OPTIONS) -+ except libcomps.XMLGenError as err: -+ errors = [err] -+ if errors: -+ # xml_f() method could return more than one error. In this case -+ # raise the latest of them and log the others. -+ for err in errors[:-1]: -+ logger.error(err.strip()) -+ raise dnf.exceptions.Error(_("Can't save file \"{}\": {}").format( -+ file_name, errors[-1].strip())) -+ -+ -+ def find_group(self, group_id, name): -+ ''' -+ Try to find group according to command line parameters - first by id -+ then by name. -+ ''' -+ group = None -+ if group_id: -+ for grp in self.comps.groups: -+ if grp.id == group_id: -+ group = grp -+ break -+ if group is None and name: -+ for grp in self.comps.groups: -+ if grp.name == name: -+ group = grp -+ break -+ return group -+ -+ def edit_group(self, group): -+ ''' -+ Set attributes and package lists for selected group -+ ''' -+ def langlist_to_strdict(lst): -+ str_dict = libcomps.StrDict() -+ for lang, text in lst: -+ str_dict[lang] = text -+ return str_dict -+ -+ # set group attributes -+ if self.opts.name: -+ group.name = self.opts.name -+ if self.opts.description: -+ group.desc = self.opts.description -+ if self.opts.display_order: -+ group.display_order = self.opts.display_order -+ if self.opts.user_visible is not None: -+ group.uservisible = self.opts.user_visible -+ if self.opts.translated_name: -+ group.name_by_lang = langlist_to_strdict(self.opts.translated_name) -+ if self.opts.translated_description: -+ group.desc_by_lang = langlist_to_strdict(self.opts.translated_description) -+ -+ # edit packages list -+ if self.opts.packages: -+ # find packages according to specifications from command line -+ packages = set() -+ for pkg_spec in self.opts.packages: -+ q = self.base.sack.query().filterm(name__glob=pkg_spec).latest() -+ if not q: -+ logger.warning(_("No match for argument: {}").format(pkg_spec)) -+ continue -+ packages.update(q) -+ if self.opts.dependencies: -+ # add packages that provide requirements -+ requirements = set() -+ for pkg in packages: -+ requirements.update(pkg.requires) -+ packages.update(self.base.sack.query().filterm(provides=requirements)) -+ -+ pkg_names = {pkg.name for pkg in packages} -+ -+ if self.opts.remove: -+ for pkg_name in pkg_names: -+ for pkg in group.packages_match(name=pkg_name, -+ type=libcomps.PACKAGE_TYPE_UNKNOWN): -+ group.packages.remove(pkg) -+ else: -+ if self.opts.mandatory: -+ pkg_type = libcomps.PACKAGE_TYPE_MANDATORY -+ elif self.opts.optional: -+ pkg_type = libcomps.PACKAGE_TYPE_OPTIONAL -+ else: -+ pkg_type = libcomps.PACKAGE_TYPE_DEFAULT -+ for pkg_name in sorted(pkg_names): -+ if not group.packages_match(name=pkg_name, type=pkg_type): -+ group.packages.append(libcomps.Package(name=pkg_name, type=pkg_type)) -+ -+ def run(self): -+ self.load_input_files() -+ -+ if self.opts.id or self.opts.name: -+ # we are adding / editing a group -+ group = self.find_group(group_id=self.opts.id, name=self.opts.name) -+ if group is None: -+ # create a new group -+ if self.opts.remove: -+ raise dnf.exceptions.Error(_("Can't remove packages from non-existent group")) -+ group = libcomps.Group() -+ if self.opts.id: -+ group.id = self.opts.id -+ group.name = self.opts.id -+ elif self.opts.name: -+ group_id = text_to_id(self.opts.name) -+ if self.find_group(group_id=group_id, name=None): -+ raise dnf.cli.CliError( -+ _("Group id '{}' generated from '{}' is duplicit. " -+ "Please specify group id using --id.").format( -+ group_id, self.opts.name)) -+ group.id = group_id -+ self.comps.groups.append(group) -+ self.edit_group(group) -+ -+ self.save_output_files() -+ if self.opts.print or (not self.opts.save): -+ print(self.comps.xml_str(xml_options=COMPS_XML_OPTIONS)) --- -2.26.2 - diff --git a/SOURCES/0001-versionlock-Do-not-exclude-locked-obsoleters-RhBug1957280.patch b/SOURCES/0001-versionlock-Do-not-exclude-locked-obsoleters-RhBug1957280.patch new file mode 100644 index 0000000..133ea78 --- /dev/null +++ b/SOURCES/0001-versionlock-Do-not-exclude-locked-obsoleters-RhBug1957280.patch @@ -0,0 +1,38 @@ +From a3b9e17628994b43080b8c03b9f665a0e6514cd6 Mon Sep 17 00:00:00 2001 +From: Marek Blaha +Date: Tue, 11 May 2021 08:29:31 +0200 +Subject: [PATCH] versionlock: Do not exclude locked obsoleters (RhBug:1957280) + +The versionlock plugin excludes all obsoleters of locked packages. If +both versions (obsoleted package and its obsoleter) are locked, this +leads to the inability to install the obsoleter package. The patch +protects all locked packages from being excluded as obsoleters. + += changelog = +msg: versionlock: Locking obsoleted package does not make the obsoleter unavailable +type: bugfix +resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1957280 +--- + plugins/versionlock.py | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/plugins/versionlock.py b/plugins/versionlock.py +index d997130..c89a75d 100644 +--- a/plugins/versionlock.py ++++ b/plugins/versionlock.py +@@ -113,8 +113,10 @@ class VersionLock(dnf.Plugin): + other_versions = all_versions.difference(locked_query) + excludes_query = excludes_query.union(other_versions) + # exclude also anything that obsoletes the locked versions of packages +- excludes_query = excludes_query.union( +- self.base.sack.query().filterm(obsoletes=locked_query)) ++ obsoletes_query = self.base.sack.query().filterm(obsoletes=locked_query) ++ # leave out obsoleters that are also part of locked versions (otherwise the obsoleter package ++ # would not be installable at all) ++ excludes_query = excludes_query.union(obsoletes_query.difference(locked_query)) + + excludes_query.filterm(reponame__neq=hawkey.SYSTEM_REPO_NAME) + if excludes_query: +-- +libgit2 1.0.1 + diff --git a/SOURCES/0002-needs-restarting-add-s-to-list-services-RhBug-177293.patch b/SOURCES/0002-needs-restarting-add-s-to-list-services-RhBug-177293.patch deleted file mode 100644 index b832730..0000000 --- a/SOURCES/0002-needs-restarting-add-s-to-list-services-RhBug-177293.patch +++ /dev/null @@ -1,138 +0,0 @@ -From b2a912724d737ca7ac4350885b54117f5e043046 Mon Sep 17 00:00:00 2001 -From: Nicola Sella -Date: Thu, 5 Mar 2020 12:45:39 +0100 -Subject: [PATCH 2/2] [needs-restarting] add -s to list services - (RhBug:1772939) - -= changelog = -msg: [needs-restarting] add -s to list services (RhBug:1772939) -type: bugfix -resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1772939 - -Closes: #395 -Approved by: kontura ---- - dnf-plugins-core.spec | 6 ++++++ - doc/needs_restarting.rst | 3 +++ - plugins/needs_restarting.py | 33 +++++++++++++++++++++++++++++++++ - 3 files changed, 42 insertions(+) - -diff --git a/dnf-plugins-core.spec b/dnf-plugins-core.spec -index 42d0884..012dde8 100644 ---- a/dnf-plugins-core.spec -+++ b/dnf-plugins-core.spec -@@ -99,8 +99,10 @@ Summary: Core Plugins for DNF - %{?python_provide:%python_provide python2-%{name}} - BuildRequires: python2-dnf >= %{dnf_lowest_compatible} - %if 0%{?rhel} && 0%{?rhel} <= 7 -+BuildRequires: dbus-python - BuildRequires: python-nose - %else -+BuildRequires: python2-dbus - BuildRequires: python2-nose - %endif - BuildRequires: python2-devel -@@ -110,8 +112,10 @@ Requires: python2-distro - Requires: python2-dnf >= %{dnf_lowest_compatible} - Requires: python2-hawkey >= %{hawkey_version} - %if 0%{?rhel} && 0%{?rhel} <= 7 -+Requires: dbus-python - Requires: python-dateutil - %else -+Requires: python2-dbus - Requires: python2-dateutil - %endif - Provides: python2-dnf-plugins-extras-debug = %{version}-%{release} -@@ -140,12 +144,14 @@ Additionally provides generate_completion_cache passive plugin. - %package -n python3-%{name} - Summary: Core Plugins for DNF - %{?python_provide:%python_provide python3-%{name}} -+BuildRequires: python3-dbus - BuildRequires: python3-devel - BuildRequires: python3-dnf >= %{dnf_lowest_compatible} - BuildRequires: python3-nose - %if 0%{?fedora} - Requires: python3-distro - %endif -+Requires: python3-dbus - Requires: python3-dnf >= %{dnf_lowest_compatible} - Requires: python3-hawkey >= %{hawkey_version} - Requires: python3-dateutil -diff --git a/doc/needs_restarting.rst b/doc/needs_restarting.rst -index e79b43f..1a3fbbe 100644 ---- a/doc/needs_restarting.rst -+++ b/doc/needs_restarting.rst -@@ -48,3 +48,6 @@ All general DNF options are accepted, see `Options` in :manpage:`dnf(8)` for det - ``-r, --reboothint`` - - Only report whether a reboot is required (exit code 1) or not (exit code 0). -+ -+``-s, --services`` -+ Only list the affected systemd services. -diff --git a/plugins/needs_restarting.py b/plugins/needs_restarting.py -index 69203f4..f6bf525 100644 ---- a/plugins/needs_restarting.py -+++ b/plugins/needs_restarting.py -@@ -29,6 +29,7 @@ from dnfpluginscore import logger, _ - - import dnf - import dnf.cli -+import dbus - import functools - import os - import re -@@ -126,6 +127,30 @@ def print_cmd(pid): - print('%d : %s' % (pid, command)) - - -+def get_service_dbus(pid): -+ bus = dbus.SystemBus() -+ systemd_manager_object = bus.get_object( -+ 'org.freedesktop.systemd1', -+ '/org/freedesktop/systemd1' -+ ) -+ systemd_manager_interface = dbus.Interface( -+ systemd_manager_object, -+ 'org.freedesktop.systemd1.Manager' -+ ) -+ service_proxy = bus.get_object( -+ 'org.freedesktop.systemd1', -+ systemd_manager_interface.GetUnitByPID(pid) -+ ) -+ service_properties = dbus.Interface( -+ service_proxy, dbus_interface="org.freedesktop.DBus.Properties") -+ name = service_properties.Get( -+ "org.freedesktop.systemd1.Unit", -+ 'Id' -+ ) -+ if name.endswith(".service"): -+ return name -+ return -+ - def smap2opened_file(pid, line): - slash = line.find('/') - if slash < 0: -@@ -205,6 +230,8 @@ class NeedsRestartingCommand(dnf.cli.Command): - parser.add_argument('-r', '--reboothint', action='store_true', - help=_("only report whether a reboot is required " - "(exit code 1) or not (exit code 0)")) -+ parser.add_argument('-s', '--services', action='store_true', -+ help=_("only report affected systemd services")) - - def configure(self): - demands = self.cli.demands -@@ -251,5 +278,11 @@ class NeedsRestartingCommand(dnf.cli.Command): - if pkg.installtime > process_start(ofile.pid): - stale_pids.add(ofile.pid) - -+ if self.opts.services: -+ names = set([get_service_dbus(pid) for pid in sorted(stale_pids)]) -+ for name in names: -+ if name is not None: -+ print(name) -+ return 0 - for pid in sorted(stale_pids): - print_cmd(pid) --- -2.26.2 - diff --git a/SOURCES/0002-repomanage-Allow-running-only-with-metadata.patch b/SOURCES/0002-repomanage-Allow-running-only-with-metadata.patch new file mode 100644 index 0000000..2067f00 --- /dev/null +++ b/SOURCES/0002-repomanage-Allow-running-only-with-metadata.patch @@ -0,0 +1,49 @@ +From 716c5978a8036df22d6f5b430ba38c35d034f3ea Mon Sep 17 00:00:00 2001 +From: Aleš Matěj +Date: Tue, 8 Jun 2021 10:25:55 +0200 +Subject: [PATCH] [repomanage] Allow running only with metadata + +Requiring some packages to be present even if there are repodata was +arbitrary because they are never used. +--- + plugins/repomanage.py | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/plugins/repomanage.py b/plugins/repomanage.py +index 445006d..989bd78 100644 +--- a/plugins/repomanage.py ++++ b/plugins/repomanage.py +@@ -58,18 +58,13 @@ class RepoManageCommand(dnf.cli.Command): + if self.opts.new and self.opts.old: + raise dnf.exceptions.Error(_("Pass either --old or --new, not both!")) + +- rpm_list = [] +- rpm_list = self._get_file_list(self.opts.path, ".rpm") + verfile = {} + pkgdict = {} + module_dict = {} # {NameStream: {Version: [modules]}} + all_modular_artifacts = set() + + keepnum = int(self.opts.keep) # the number of items to keep + +- if len(rpm_list) == 0: +- raise dnf.exceptions.Error(_("No files to process")) +- + try: + repo_conf = self.base.repos.add_new_repo("repomanage_repo", self.base.conf, baseurl=[self.opts.path]) + # Always expire the repo, otherwise repomanage could use cached metadata and give identical results +@@ -88,6 +83,11 @@ class RepoManageCommand(dnf.cli.Command): + module_package.getVersionNum(), []).append(module_package) + + except dnf.exceptions.RepoError: ++ rpm_list = [] ++ rpm_list = self._get_file_list(self.opts.path, ".rpm") ++ if len(rpm_list) == 0: ++ raise dnf.exceptions.Error(_("No files to process")) ++ + self.base.reset(sack=True, repos=True) + self.base.fill_sack(load_system_repo=False, load_available_repos=False) + try: +-- +libgit2 1.0.1 + diff --git a/SOURCES/0003-repomanage-Enhance-repomanage-documentation-RhBug1898293.patch b/SOURCES/0003-repomanage-Enhance-repomanage-documentation-RhBug1898293.patch new file mode 100644 index 0000000..7563d02 --- /dev/null +++ b/SOURCES/0003-repomanage-Enhance-repomanage-documentation-RhBug1898293.patch @@ -0,0 +1,42 @@ +From 1b432bada5a3627f729cb42b99b7a93f808e3a80 Mon Sep 17 00:00:00 2001 +From: Aleš Matěj +Date: Tue, 8 Jun 2021 11:48:07 +0200 +Subject: [PATCH] [repomanage] Enhance repomanage documentation (RhBug:1898293) + += changelog = +msg: Enhance repomanage documentation +type: enhancement +resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1898293 +--- + doc/repomanage.rst | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/doc/repomanage.rst b/doc/repomanage.rst +index e4da441..e3171ef 100644 +--- a/doc/repomanage.rst ++++ b/doc/repomanage.rst +@@ -31,9 +31,10 @@ Synopsis + Description + ----------- + +-`repomanage` prints newest or oldest packages in a repository specified by for easy piping to xargs or similar programs. In case doesn't contain a valid repository it is searched for rpm packages which are then used instead. ++`repomanage` prints newest or older packages in a repository specified by for easy piping to xargs or similar programs. In case doesn't contain a valid repodata, it is searched for rpm packages which are then used instead. ++If the repodata are present, `repomanage` uses them as the source of truth, it doesn't verify that they match the present rpm packages. In fact, `repomanage` can run with just the repodata, no rpm packages are needed. + +-In order to work correctly with modular packages has to contain repodata with modular metadata. If modular content is present `repomanage` prints packages from newest or oldest versions of each stream in addition to newest or oldest non-modular packages. ++In order to work correctly with modular packages, has to contain repodata with modular metadata. If modular content is present, `repomanage` prints packages from newest or older stream versions in addition to newest or older non-modular packages. + + + Options +@@ -44,7 +45,7 @@ All general DNF options are accepted, see `Options` in :manpage:`dnf(8)` for det + The following options set what packages are displayed. These options are mutually exclusive, i.e. only one can be specified. If no option is specified, the newest packages are shown. + + ``--old`` +- Show older packages. ++ Show older packages (for a package or a stream show all versions except the newest one). + + ``--new`` + Show newest packages. +-- +libgit2 1.0.1 + diff --git a/SOURCES/0003-reposync-Check-GPG-signatures-of-downloaded-packages-RhBug-1856818.patch b/SOURCES/0003-reposync-Check-GPG-signatures-of-downloaded-packages-RhBug-1856818.patch deleted file mode 100644 index 45cc285..0000000 --- a/SOURCES/0003-reposync-Check-GPG-signatures-of-downloaded-packages-RhBug-1856818.patch +++ /dev/null @@ -1,194 +0,0 @@ -From a4f21266a6dab9e77913d56c04aba1e579f0e0c1 Mon Sep 17 00:00:00 2001 -From: Marek Blaha -Date: Fri, 23 Oct 2020 09:06:35 +0200 -Subject: [PATCH 1/2] [reposync] Reorder options alphabetically - ---- - doc/reposync.rst | 30 +++++++++++++++--------------- - plugins/reposync.py | 18 +++++++++--------- - 2 files changed, 24 insertions(+), 24 deletions(-) - -diff --git a/doc/reposync.rst b/doc/reposync.rst -index 71a435dc..3b820f33 100644 ---- a/doc/reposync.rst -+++ b/doc/reposync.rst -@@ -39,36 +39,36 @@ Options - - All general DNF options are accepted. Namely, the ``--repoid`` option can be used to specify the repositories to synchronize. See `Options` in :manpage:`dnf(8)` for details. - --``-p , --download-path=`` -- Root path under which the downloaded repositories are stored, relative to the current working directory. Defaults to the current working directory. Every downloaded repository has a subdirectory named after its ID under this path. -- --``--norepopath`` -- Don't add the reponame to the download path. Can only be used when syncing a single repository (default is to add the reponame). -- --``--download-metadata`` -- Download all repository metadata. Downloaded copy is instantly usable as a repository, no need to run createrepo_c on it. -- - ``-a , --arch=`` - Download only packages of given architectures (default is all architectures). Can be used multiple times. - --``--source`` -- Operate on source packages. -+``--delete`` -+ Delete local packages no longer present in repository. -+ -+``--download-metadata`` -+ Download all repository metadata. Downloaded copy is instantly usable as a repository, no need to run createrepo_c on it. - - ``-m, --downloadcomps`` - Also download and uncompress comps.xml. Consider using ``--download-metadata`` option which will download all available repository metadata. - -+``--metadata-path`` -+ Root path under which the downloaded metadata are stored. It defaults to ``--download-path`` value if not given. -+ - ``-n, --newest-only`` - Download only newest packages per-repo. - --``--delete`` -- Delete local packages no longer present in repository. -+``--norepopath`` -+ Don't add the reponame to the download path. Can only be used when syncing a single repository (default is to add the reponame). - --``--metadata-path`` -- Root path under which the downloaded metadata are stored. It defaults to ``--download-path`` value if not given. -+``-p , --download-path=`` -+ Root path under which the downloaded repositories are stored, relative to the current working directory. Defaults to the current working directory. Every downloaded repository has a subdirectory named after its ID under this path. - - ``--remote-time`` - Try to set the timestamps of the downloaded files to those on the remote side. - -+``--source`` -+ Operate on source packages. -+ - ``-u, --urls`` - Just print urls of what would be downloaded, don't download. - -diff --git a/plugins/reposync.py b/plugins/reposync.py -index 7556e7eb..6f572cac 100644 ---- a/plugins/reposync.py -+++ b/plugins/reposync.py -@@ -63,24 +63,24 @@ def set_argparser(parser): - help=_('download only packages for this ARCH')) - parser.add_argument('--delete', default=False, action='store_true', - help=_('delete local packages no longer present in repository')) -- parser.add_argument('-m', '--downloadcomps', default=False, action='store_true', -- help=_('also download and uncompress comps.xml')) - parser.add_argument('--download-metadata', default=False, action='store_true', - help=_('download all the metadata.')) -+ parser.add_argument('-m', '--downloadcomps', default=False, action='store_true', -+ help=_('also download and uncompress comps.xml')) -+ parser.add_argument('--metadata-path', -+ help=_('where to store downloaded repository metadata. ' -+ 'Defaults to the value of --download-path.')) - parser.add_argument('-n', '--newest-only', default=False, action='store_true', - help=_('download only newest packages per-repo')) -- parser.add_argument('-p', '--download-path', default='./', -- help=_('where to store downloaded repositories')) - parser.add_argument('--norepopath', default=False, action='store_true', - help=_("Don't add the reponame to the download path.")) -- parser.add_argument('--metadata-path', -- help=_('where to store downloaded repository metadata. ' -- 'Defaults to the value of --download-path.')) -- parser.add_argument('--source', default=False, action='store_true', -- help=_('operate on source packages')) -+ parser.add_argument('-p', '--download-path', default='./', -+ help=_('where to store downloaded repositories')) - parser.add_argument('--remote-time', default=False, action='store_true', - help=_('try to set local timestamps of local files by ' - 'the one on the server')) -+ parser.add_argument('--source', default=False, action='store_true', -+ help=_('operate on source packages')) - parser.add_argument('-u', '--urls', default=False, action='store_true', - help=_("Just list urls of what would be downloaded, " - "don't download")) - -From 978b7f2b1c654fed7b1b4cf45cb607143226804c Mon Sep 17 00:00:00 2001 -From: Marek Blaha -Date: Fri, 23 Oct 2020 09:14:02 +0200 -Subject: [PATCH 2/2] [reposync] Check GPG signatures of downloaded packages - (RhBug:1856818) - -YUMv3 reposync used to have --gpgcheck option to remove packages that fail GPG -signature checking after downloading. -This patch implements the option for DNF. - -= changelog = -msg: Add --gpgcheck option to reposync (RhBug:1856818) -type: enhancement -resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1856818 ---- - doc/reposync.rst | 4 ++++ - plugins/reposync.py | 21 +++++++++++++++++++++ - 2 files changed, 25 insertions(+) - -diff --git a/doc/reposync.rst b/doc/reposync.rst -index 3b820f33..de40957f 100644 ---- a/doc/reposync.rst -+++ b/doc/reposync.rst -@@ -48,6 +48,10 @@ All general DNF options are accepted. Namely, the ``--repoid`` option can be use - ``--download-metadata`` - Download all repository metadata. Downloaded copy is instantly usable as a repository, no need to run createrepo_c on it. - -+``-g, --gpgcheck`` -+ Remove packages that fail GPG signature checking after downloading. Exit code is ``1`` if at least one package was removed. -+ Note that for repositories with ``gpgcheck=0`` set in their configuration the GPG signature is not checked even with this option used. -+ - ``-m, --downloadcomps`` - Also download and uncompress comps.xml. Consider using ``--download-metadata`` option which will download all available repository metadata. - -diff --git a/plugins/reposync.py b/plugins/reposync.py -index 6f572cac..c891bfa2 100644 ---- a/plugins/reposync.py -+++ b/plugins/reposync.py -@@ -24,6 +24,7 @@ - import hawkey - import os - import shutil -+import types - - from dnfpluginscore import _, logger - from dnf.cli.option_parser import OptionParser -@@ -65,6 +66,9 @@ def set_argparser(parser): - help=_('delete local packages no longer present in repository')) - parser.add_argument('--download-metadata', default=False, action='store_true', - help=_('download all the metadata.')) -+ parser.add_argument('-g', '--gpgcheck', default=False, action='store_true', -+ help=_('Remove packages that fail GPG signature checking ' -+ 'after downloading')) - parser.add_argument('-m', '--downloadcomps', default=False, action='store_true', - help=_('also download and uncompress comps.xml')) - parser.add_argument('--metadata-path', -@@ -114,6 +118,7 @@ def configure(self): - - def run(self): - self.base.conf.keepcache = True -+ gpgcheck_ok = True - for repo in self.base.repos.iter_enabled(): - if self.opts.remote_time: - repo._repo.setPreserveRemoteTime(True) -@@ -150,8 +155,24 @@ def run(self): - self.print_urls(pkglist) - else: - self.download_packages(pkglist) -+ if self.opts.gpgcheck: -+ for pkg in pkglist: -+ local_path = self.pkg_download_path(pkg) -+ # base.package_signature_check uses pkg.localPkg() to determine -+ # the location of the package rpm file on the disk. -+ # Set it to the correct download path. -+ pkg.localPkg = types.MethodType( -+ lambda s, local_path=local_path: local_path, pkg) -+ result, error = self.base.package_signature_check(pkg) -+ if result != 0: -+ logger.warning(_("Removing {}: {}").format( -+ os.path.basename(local_path), error)) -+ os.unlink(local_path) -+ gpgcheck_ok = False - if self.opts.delete: - self.delete_old_local_packages(repo, pkglist) -+ if not gpgcheck_ok: -+ raise dnf.exceptions.Error(_("GPG signature check failed.")) - - def repo_target(self, repo): - return _pkgdir(self.opts.destdir or self.opts.download_path, diff --git a/SOURCES/0004-Update-translations.patch b/SOURCES/0004-Update-translations.patch index 4572853..3ab0465 100644 --- a/SOURCES/0004-Update-translations.patch +++ b/SOURCES/0004-Update-translations.patch @@ -1,798 +1,463 @@ -From ffce18035e04a92d482bf775b450df2dadcbe19b Mon Sep 17 00:00:00 2001 +From a15c6beee8ba3af9005cc49794ac6517f018d7a1 Mon Sep 17 00:00:00 2001 From: Marek Blaha -Date: Mon, 8 Mar 2021 15:51:24 +0100 +Date: Mon, 13 Sep 2021 10:01:53 +0200 Subject: [PATCH] Update translations --- - po/CMakeLists.txt | 1 + - po/dnf-plugins-core.pot | 199 ++++++++++++++++---- - po/fr.po | 221 ++++++++++++++++++---- - po/ja.po | 405 ++++++++++++++++++++++++++++------------ - po/ko.po | 214 +++++++++++++++++---- - po/zh_CN.po | 402 +++++++++++++++++++++++++++------------ - 6 files changed, 1095 insertions(+), 347 deletions(-) + po/fr.po | 222 +++++++++++++++++---- + po/ja.po | 409 +++++++++++++++++++++++++++----------- + po/ko.po | 556 ++++++++++++++++++++++++++++++++++------------------ + po/zh_CN.po | 417 +++++++++++++++++++++++++++------------ + 4 files changed, 1130 insertions(+), 474 deletions(-) -diff --git a/po/CMakeLists.txt b/po/CMakeLists.txt -index 4f106fc..1ef5055 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-plugins-core.pot b/po/dnf-plugins-core.pot -index 7cd717e..f796147 100644 ---- a/po/dnf-plugins-core.pot -+++ b/po/dnf-plugins-core.pot -@@ -8,7 +8,7 @@ msgid "" +diff --git a/po/fr.po b/po/fr.po +index dfa06ad..e517103 100644 +--- a/po/fr.po ++++ b/po/fr.po +@@ -3,23 +3,24 @@ + # José Fournier , 2017. #zanata + # Jérôme Fenal , 2017. #zanata + # Jean-Baptiste Holcroft , 2018. #zanata, 2020. +-# Ludek Janda , 2018. #zanata ++# Ludek Janda , 2018. #zanata, 2021. + # 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-07-09 13:27+0000\n" +-"Last-Translator: Julien Humbert \n" +-"Language-Team: French \n" +"POT-Creation-Date: 2021-02-22 10:06+0100\n" - "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" - "Last-Translator: FULL NAME \n" - "Language-Team: LANGUAGE \n" -@@ -560,7 +560,7 @@ msgstr "" ++"PO-Revision-Date: 2021-09-03 10:36+0000\n" ++"Last-Translator: Ludek Janda \n" ++"Language-Team: French \n" + "Language: fr\n" + "MIME-Version: 1.0\n" + "Content-Type: text/plain; charset=UTF-8\n" + "Content-Transfer-Encoding: 8bit\n" + "Plural-Forms: nplurals=2; plural=n > 1;\n" +-"X-Generator: Weblate 4.1.1\n" ++"X-Generator: Weblate 4.8\n" + + #: plugins/builddep.py:45 + msgid "[PACKAGE|PACKAGE.spec]" +@@ -642,7 +643,7 @@ msgstr "" msgid "when running with --url, limit to specific protocols" - msgstr "" + msgstr "si --url est renseigné, limite aux protocoles spécifiés" -#: plugins/download.py:121 plugins/reposync.py:293 +#: plugins/download.py:121 plugins/reposync.py:314 #, python-format msgid "Failed to get mirror for package: %s" - msgstr "" -@@ -583,6 +583,120 @@ msgstr "" + msgstr "Échec de l’obtention du miroir pour le paquet : %s" +@@ -665,6 +666,125 @@ msgstr "Aucune source définie pour %s" msgid "No package %s available." - msgstr "" + msgstr "Aucun paquet %s n’est disponible." +#: plugins/groups_manager.py:49 +msgid "Invalid group id" -+msgstr "" ++msgstr "id de groupe invalide" + +#: plugins/groups_manager.py:58 +msgid "Invalid translated data, should be in form 'lang:text'" -+msgstr "" ++msgstr "Données traduites invalides, doivent être au format « lang : text »" + +#: plugins/groups_manager.py:61 +msgid "Invalid/empty language for translated data" -+msgstr "" ++msgstr "Langue non valide / vide pour les données traduites" + +#: plugins/groups_manager.py:71 +msgid "Can't generate group id from '{}'. Please specify group id using --id." +msgstr "" ++"Impossible de générer l'id du groupe à partir de «{}». Veuillez spécifier " ++"l'id du groupe en utilisant --id." + +#: plugins/groups_manager.py:79 +msgid "create and edit groups metadata file" -+msgstr "" ++msgstr "créer et modifier le fichier de métadonnées des groupes" + +#: plugins/groups_manager.py:90 +msgid "load groups metadata from file" -+msgstr "" ++msgstr "charger des métadonnées de groupes à partir d'un fichier" + +#: plugins/groups_manager.py:93 +msgid "save groups metadata to file" -+msgstr "" ++msgstr "enregistrer les métadonnées des groupes dans un fichier" + +#: plugins/groups_manager.py:95 +msgid "load and save groups metadata to file" -+msgstr "" ++msgstr "charge et enregistre les métadonnées des groupes dans un fichier" + +#: plugins/groups_manager.py:97 +msgid "print the result metadata to stdout" -+msgstr "" ++msgstr "affiche les métadonnées du résultat sur la sortie standard" + +#: plugins/groups_manager.py:100 +msgid "group id" -+msgstr "" ++msgstr "id du groupe" + +#: plugins/groups_manager.py:101 +msgid "group name" -+msgstr "" ++msgstr "Nom du groupe" + +#: plugins/groups_manager.py:103 +msgid "group description" -+msgstr "" ++msgstr "description du groupe" + +#: plugins/groups_manager.py:105 +msgid "group display order" -+msgstr "" ++msgstr "ordre d'affichage du groupe" + +#: plugins/groups_manager.py:108 +msgid "translated name for the group" -+msgstr "" ++msgstr "nom traduit pour le groupe" + +#: plugins/groups_manager.py:111 +msgid "translated description for the group" -+msgstr "" ++msgstr "description traduite pour le groupe" + +#: plugins/groups_manager.py:115 +msgid "make the group user visible (default)" -+msgstr "" ++msgstr "rendre l'utilisateur du groupe visible (par défaut)" + +#: plugins/groups_manager.py:118 +msgid "make the group user invisible" -+msgstr "" ++msgstr "rendre l'utilisateur du groupe invisible" + +#: plugins/groups_manager.py:123 +msgid "add packages to the mandatory section" -+msgstr "" ++msgstr "ajoute les paquets à la section obligatoire" + +#: plugins/groups_manager.py:125 +msgid "add packages to the optional section" -+msgstr "" ++msgstr "ajoute les paquets à la section optionnelle" + +#: plugins/groups_manager.py:127 +msgid "remove packages from the group instead of adding them" -+msgstr "" ++msgstr "supprime les paquets du groupe au lieu de les ajouter" + +#: plugins/groups_manager.py:129 +msgid "include also direct dependencies for packages" -+msgstr "" ++msgstr "inclus également les dépendances directes pour les paquets" + +#: plugins/groups_manager.py:132 +msgid "package specification" -+msgstr "" ++msgstr "spécification du paquet" + +#: plugins/groups_manager.py:156 +msgid "Can't edit group without specifying it (use --id or --name)" +msgstr "" ++"Un groupe ne peut pas être édité sans le spécifier (utilisez --id ou --name)" + +#: plugins/groups_manager.py:190 +msgid "Can't load file \"{}\": {}" -+msgstr "" ++msgstr "Impossible de charger le fichier « {} » : {}" + +#: plugins/groups_manager.py:206 +msgid "Can't save file \"{}\": {}" -+msgstr "" ++msgstr "Impossible d’enregistrer le fichier « {} » : {}" + +#: plugins/groups_manager.py:259 +msgid "No match for argument: {}" -+msgstr "" ++msgstr "Aucune correspondance pour l’argument : {}" + +#: plugins/groups_manager.py:296 +msgid "Can't remove packages from non-existent group" -+msgstr "" ++msgstr "Les paquets ne peuvent pas être retirés d'un groupe qui n'existe pas" + +#: plugins/groups_manager.py:305 +msgid "" -+"Group id '{}' generated from '{}' is duplicit. Please specify group id using " -+"--id." ++"Group id '{}' generated from '{}' is duplicit. Please specify group id using" ++" --id." +msgstr "" ++"L'id du groupe « {} » qui a été généré pour « {} » est en double. Veuillez " ++"le spécifier en utilisant --id." + #: plugins/leaves.py:32 msgid "List installed packages not required by any other package" msgstr "" -@@ -615,43 +729,47 @@ msgstr "" +@@ -698,7 +818,7 @@ msgstr "migrer les données d’historique, de groupe et de yumdb, vers dnf" msgid "Migrating history data..." - msgstr "" + msgstr "Migration des données d’historique …" -#: plugins/needs_restarting.py:65 +#: plugins/needs_restarting.py:66 #, python-brace-format msgid "" "No installed package found for package name \"{pkg}\" specified in needs-" - "restarting file \"{file}\"." - msgstr "" +@@ -707,44 +827,48 @@ msgstr "" + "Aucun paquet installé trouvé pour le nom de paquet « {pkg} » spécifié dans " + "needs-restarting du fichier « {file} »." -#: plugins/needs_restarting.py:199 +#: plugins/needs_restarting.py:224 msgid "determine updated binaries that need restarting" - msgstr "" + msgstr "détermine les binaires mis à jour qui nécessitent un redémarrage" -#: plugins/needs_restarting.py:204 +#: plugins/needs_restarting.py:229 msgid "only consider this user's processes" - msgstr "" + msgstr "considère uniquement les processus de cet utilisateur" -#: plugins/needs_restarting.py:206 +#: plugins/needs_restarting.py:231 msgid "" "only report whether a reboot is required (exit code 1) or not (exit code 0)" msgstr "" + "indique uniquement si un démarrage (reboot) est requis (exit code 1) ou non " + "(exit code 0)" -#: plugins/needs_restarting.py:230 +#: plugins/needs_restarting.py:234 +msgid "only report affected systemd services" -+msgstr "" ++msgstr "signaler uniquement les services systemd affectés" + +#: plugins/needs_restarting.py:257 msgid "Core libraries or services have been updated since boot-up:" msgstr "" + "les bibliothèques et les services de base ont été mis à jour depuis le " + "démarrage (boot-up) :" -#: plugins/needs_restarting.py:235 +#: plugins/needs_restarting.py:262 msgid "Reboot is required to fully utilize these updates." msgstr "" + "Un nouveau démarrage est requis pour pouvoir bénéficier totalement de ces " + "mises à jour." -#: plugins/needs_restarting.py:236 +#: plugins/needs_restarting.py:263 msgid "More information:" - msgstr "" + msgstr "Plus d’information :" -#: plugins/needs_restarting.py:240 +#: plugins/needs_restarting.py:267 msgid "No core libraries or services have been updated since boot-up." msgstr "" + "Aucune bibliothèque ou service de base n’a été mis à jour depuis le " + "démarrage." -#: plugins/needs_restarting.py:242 +#: plugins/needs_restarting.py:269 msgid "Reboot should not be necessary." - msgstr "" + msgstr "Un nouveau démarrage ne devrait pas être utile." -@@ -871,84 +989,96 @@ msgstr "" +@@ -981,39 +1105,33 @@ msgstr "N paquets les plus récents à conserver — par défaut 1" msgid "Path to directory" - msgstr "" + msgstr "Chemin vers le répertoire" -#: plugins/reposync.py:54 +#: plugins/reposync.py:55 msgid "download all packages from remote repo" - msgstr "" + msgstr "télécharger tous les paquets depuis le dépôt distant" -#: plugins/reposync.py:63 +#: plugins/reposync.py:64 msgid "download only packages for this ARCH" - msgstr "" + msgstr "télécharger seulement les paquets s’appliquant à cette ARCH" -#: plugins/reposync.py:65 +#: plugins/reposync.py:66 msgid "delete local packages no longer present in repository" - msgstr "" + msgstr "supprimer les paquets locaux qui ne sont plus présents dans le dépôt" -#: plugins/reposync.py:67 -msgid "also download and uncompress comps.xml" --msgstr "" +-msgstr "également télécharger et décompresser comps.xml" - -#: plugins/reposync.py:69 +#: plugins/reposync.py:68 msgid "download all the metadata." - msgstr "" + msgstr "télécharger toutes les métadonnées." -#: plugins/reposync.py:71 -msgid "download only newest packages per-repo" +-msgstr "ne télécharger que les nouveaux paquets per-rep" +#: plugins/reposync.py:70 +msgid "Remove packages that fail GPG signature checking after downloading" - msgstr "" ++msgstr "" ++"Retire les paquets qui ont échoué la vérification de la signature GPG après " ++"téléchargement" #: plugins/reposync.py:73 -msgid "where to store downloaded repositories" +-msgstr "lieu où stocker les dépôts téléchargés" +msgid "also download and uncompress comps.xml" - msgstr "" ++msgstr "également télécharger et décompresser comps.xml" #: plugins/reposync.py:75 -msgid "Don't add the reponame to the download path." --msgstr "" +-msgstr "N’ajoutez pas le nom du dépôt dans le chemin de téléchargement." - -#: plugins/reposync.py:77 msgid "" - "where to store downloaded repository metadata. Defaults to the value of --" - "download-path." - msgstr "" + "where to store downloaded repository metadata. Defaults to the value of " + "--download-path." +@@ -1021,51 +1139,71 @@ msgstr "" + "là où stocker les métadonnées du dépôt. Prend par défaut la valeur de " + "--download-path." +#: plugins/reposync.py:78 +msgid "download only newest packages per-repo" -+msgstr "" ++msgstr "ne télécharger que les nouveaux paquets per-rep" + #: plugins/reposync.py:80 -msgid "operate on source packages" +-msgstr "opère sur les paquets source" +msgid "Don't add the reponame to the download path." - msgstr "" ++msgstr "N’ajoutez pas le nom du dépôt dans le chemin de téléchargement." #: plugins/reposync.py:82 +msgid "where to store downloaded repositories" -+msgstr "" ++msgstr "lieu où stocker les dépôts téléchargés" + +#: plugins/reposync.py:84 msgid "try to set local timestamps of local files by the one on the server" msgstr "" + "essayez de définir les horodatages locaux des fichiers locaux par celui du " + "serveur" -#: plugins/reposync.py:85 +#: plugins/reposync.py:87 +msgid "operate on source packages" -+msgstr "" ++msgstr "opère sur les paquets source" + +#: plugins/reposync.py:89 msgid "Just list urls of what would be downloaded, don't download" msgstr "" + "Uniquement lister les URL qui seraient téléchargées, ne pas télécharger" -#: plugins/reposync.py:109 +#: plugins/reposync.py:113 msgid "Can't use --norepopath with multiple repositories" - msgstr "" + msgstr "Impossible d’utiliser --norepopath avec de multiples dépôts" -#: plugins/reposync.py:127 +#: plugins/reposync.py:132 #, python-format msgid "Failed to get mirror for metadata: %s" - msgstr "" + msgstr "Échec de l’obtention du miroir pour les métadonnées : %s" -#: plugins/reposync.py:144 +#: plugins/reposync.py:149 msgid "Failed to get mirror for the group file." - msgstr "" + msgstr "Échec de l’obtention du miroir pour le fichier de groupe." +#: plugins/reposync.py:168 +msgid "Removing {}: {}" -+msgstr "" ++msgstr "Suppression de « {} » : {}" + #: plugins/reposync.py:175 +msgid "GPG signature check failed." -+msgstr "" ++msgstr "La vérification de la signature GPG a échoué." + +#: plugins/reposync.py:196 msgid "Download target '{}' is outside of download path '{}'." msgstr "" + "La cible de téléchargement « {} » est en dehors du chemin de téléchargement " + "« {} »." -#: plugins/reposync.py:190 +#: plugins/reposync.py:211 #, python-format msgid "[DELETED] %s" - msgstr "" + msgstr "[DELETED] %s" -#: plugins/reposync.py:192 +#: plugins/reposync.py:213 #, python-format msgid "failed to delete file %s" - msgstr "" + msgstr "n’a pas pu supprimer le fichier %s" -#: plugins/reposync.py:201 +#: plugins/reposync.py:222 #, python-format msgid "comps.xml for repository %s saved" - msgstr "" -@@ -1018,3 +1148,4 @@ msgstr "" - #: plugins/versionlock.py:136 - msgid "Use package specifications as they are, do not try to parse them" - msgstr "" -+ -diff --git a/po/fr.po b/po/fr.po -index dfa06ad..d47761a 100644 ---- a/po/fr.po -+++ b/po/fr.po -@@ -6,20 +6,21 @@ - # Ludek Janda , 2018. #zanata - # Jean-Baptiste Holcroft , 2019. #zanata, 2020. - # Julien Humbert , 2020. + msgstr "comps.xml pour le dépôt %s sauvegardé" +diff --git a/po/ja.po b/po/ja.po +index 5e443ec..854e20e 100644 +--- a/po/ja.po ++++ b/po/ja.po +@@ -1,20 +1,21 @@ + # Ooyama Yosiyuki , 2015. #zanata +-# Ludek Janda , 2018. #zanata ++# Ludek Janda , 2018. #zanata, 2021. + # Casey Jones , 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-09 13:27+0000\n" --"Last-Translator: Julien Humbert \n" --"Language-Team: French \n" +-"PO-Revision-Date: 2020-05-04 06:40+0000\n" +-"Last-Translator: Casey Jones \n" +-"Language-Team: Japanese \n" +"POT-Creation-Date: 2021-02-22 10:06+0100\n" -+"PO-Revision-Date: 2021-03-08 11:08+0000\n" -+"Last-Translator: Sundeep Anand \n" -+"Language-Team: French \n" - "Language: fr\n" ++"PO-Revision-Date: 2021-09-03 10:36+0000\n" ++"Last-Translator: Ludek Janda \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=2; plural=n > 1;\n" --"X-Generator: Weblate 4.1.1\n" -+"X-Generator: Weblate 4.5.1\n" + "Plural-Forms: nplurals=1; plural=0;\n" +-"X-Generator: Weblate 4.0.3\n" ++"X-Generator: Weblate 4.8\n" #: plugins/builddep.py:45 msgid "[PACKAGE|PACKAGE.spec]" -@@ -642,7 +643,7 @@ msgstr "" - msgid "when running with --url, limit to specific protocols" - msgstr "si --url est renseigné, limite aux protocoles spécifiés" +@@ -35,7 +36,7 @@ msgstr "スペックファイルの解析にマクロを定義" --#: plugins/download.py:121 plugins/reposync.py:293 -+#: plugins/download.py:121 plugins/reposync.py:314 + #: plugins/builddep.py:95 + msgid "skip build dependencies not available in repositories" +-msgstr "" ++msgstr "リポジトリーで利用できないビルドの依存関係をスキップします" + + #: plugins/builddep.py:98 + msgid "treat commandline arguments as spec files" +@@ -83,31 +84,32 @@ msgstr "一致するパッケージはありません: %s" + #: plugins/changelog.py:37 + #, python-brace-format + msgid "Not a valid date: \"{0}\"." +-msgstr "" ++msgstr "有効な日付ではありません: \"{0}\"。" + + #: plugins/changelog.py:43 + msgid "Show changelog data of packages" +-msgstr "" ++msgstr "パッケージの changelog データを表示します" + + #: plugins/changelog.py:51 + msgid "" + "show changelog entries since DATE. To avoid ambiguosity, YYYY-MM-DD format " + "is recommended." +-msgstr "" ++msgstr "DATE 以降の changelog エントリーを表示します。不明瞭さを避けるため、YYYY-MM-DD のフォーマットが推奨されます。" + + #: plugins/changelog.py:55 + msgid "show given number of changelog entries per package" +-msgstr "" ++msgstr "パッケージごとの changelog エントリーの与えられた数を表示します" + + #: plugins/changelog.py:58 + msgid "" + "show only new changelog entries for packages, that provide an upgrade for " + "some of already installed packages." + msgstr "" ++"パッケージ向けの新しい changelog エントリーのみを表示します。これは、インストール済みのパッケージの一部にアップグレードを提供します。" + + #: plugins/changelog.py:60 + msgid "PACKAGE" +-msgstr "" ++msgstr "パッケージ" + + #: plugins/changelog.py:81 plugins/debuginfo-install.py:90 #, python-format - msgid "Failed to get mirror for package: %s" - msgstr "Échec de l’obtention du miroir pour le paquet : %s" -@@ -665,6 +666,126 @@ msgstr "Aucune source définie pour %s" - msgid "No package %s available." - msgstr "Aucun paquet %s n’est disponible." - -+#: plugins/groups_manager.py:49 -+msgid "Invalid group id" -+msgstr "ID de groupe non valide" -+ -+#: plugins/groups_manager.py:58 -+msgid "Invalid translated data, should be in form 'lang:text'" -+msgstr "" -+"Les données traduites non valides doivent être sous la forme \"lang:text\"" -+ -+#: plugins/groups_manager.py:61 -+msgid "Invalid/empty language for translated data" -+msgstr "Langue non valable/vide pour les données traduites" -+ -+#: plugins/groups_manager.py:71 -+msgid "Can't generate group id from '{}'. Please specify group id using --id." -+msgstr "" -+"Impossible de générer un id de groupe à partir de '{}'. Veuillez spécifier " -+"l'id du groupe en utilisant --id." -+ -+#: plugins/groups_manager.py:79 -+msgid "create and edit groups metadata file" -+msgstr "créer et modifier le fichier de métadonnées des groupes" -+ -+#: plugins/groups_manager.py:90 -+msgid "load groups metadata from file" -+msgstr "charger les groupes de métadonnées du fichier" -+ -+#: plugins/groups_manager.py:93 -+msgid "save groups metadata to file" -+msgstr "enregistrer les métadonnées des groupes dans un fichier" -+ -+#: plugins/groups_manager.py:95 -+msgid "load and save groups metadata to file" -+msgstr "charger et enregistrer les métadonnées des groupes dans un fichier" -+ -+#: plugins/groups_manager.py:97 -+msgid "print the result metadata to stdout" -+msgstr "imprimer les métadonnées de résultat sur stdout" -+ -+#: plugins/groups_manager.py:100 -+msgid "group id" -+msgstr "id groupe" -+ -+#: plugins/groups_manager.py:101 -+msgid "group name" -+msgstr "nom du groupe" -+ -+#: plugins/groups_manager.py:103 -+msgid "group description" -+msgstr "description du groupe" -+ -+#: plugins/groups_manager.py:105 -+msgid "group display order" -+msgstr "ordre d'affichage des groupes" -+ -+#: plugins/groups_manager.py:108 -+msgid "translated name for the group" -+msgstr "nom traduit pour le groupe" -+ -+#: plugins/groups_manager.py:111 -+msgid "translated description for the group" -+msgstr "description traduite pour le groupe" -+ -+#: plugins/groups_manager.py:115 -+msgid "make the group user visible (default)" -+msgstr "rendre l'utilisateur du groupe visible (par défaut)" -+ -+#: plugins/groups_manager.py:118 -+msgid "make the group user invisible" -+msgstr "rendre l'utilisateur du groupe invisible" -+ -+#: plugins/groups_manager.py:123 -+msgid "add packages to the mandatory section" -+msgstr "ajouter des paquets à la section obligatoire" -+ -+#: plugins/groups_manager.py:125 -+msgid "add packages to the optional section" -+msgstr "ajouter des paquets à la section facultative" -+ -+#: plugins/groups_manager.py:127 -+msgid "remove packages from the group instead of adding them" -+msgstr "retirer des paquets du groupe au lieu de les ajouter" -+ -+#: plugins/groups_manager.py:129 -+msgid "include also direct dependencies for packages" -+msgstr "inclure également les dépendances directes pour les paquets" -+ -+#: plugins/groups_manager.py:132 -+msgid "package specification" -+msgstr "caractéristiques du paquet" -+ -+#: plugins/groups_manager.py:156 -+msgid "Can't edit group without specifying it (use --id or --name)" -+msgstr "" -+"Impossible de modifier le groupe sans le spécifier (utiliser --id ou --name)" -+ -+#: plugins/groups_manager.py:190 -+msgid "Can't load file \"{}\": {}" -+msgstr "Impossible de charger le fichier \"{}\" : {}" -+ -+#: plugins/groups_manager.py:206 -+msgid "Can't save file \"{}\": {}" -+msgstr "Impossible d'enregistrer le fichier \"{}\" : {}" -+ -+#: plugins/groups_manager.py:259 -+msgid "No match for argument: {}" -+msgstr "Aucune correspondance pour l’argument : {}" -+ -+#: plugins/groups_manager.py:296 -+msgid "Can't remove packages from non-existent group" -+msgstr "Impossible de retirer des paquets d'un groupe inexistant" -+ -+#: plugins/groups_manager.py:305 -+msgid "" -+"Group id '{}' generated from '{}' is duplicit. Please specify group id using" -+" --id." -+msgstr "" -+"L'identifiant de groupe '{}' généré à partir de '{}' est redondant. Veuillez" -+" spécifier l'identifiant du groupe en utilisant --id." -+ - #: plugins/leaves.py:32 - msgid "List installed packages not required by any other package" - msgstr "" -@@ -698,7 +819,7 @@ msgstr "migrer les données d’historique, de groupe et de yumdb, vers dnf" - msgid "Migrating history data..." - msgstr "Migration des données d’historique …" - --#: plugins/needs_restarting.py:65 -+#: plugins/needs_restarting.py:66 - #, python-brace-format - msgid "" - "No installed package found for package name \"{pkg}\" specified in needs-" -@@ -707,44 +828,48 @@ msgstr "" - "Aucun paquet installé trouvé pour le nom de paquet « {pkg} » spécifié dans " - "needs-restarting du fichier « {file} »." - --#: plugins/needs_restarting.py:199 -+#: plugins/needs_restarting.py:224 - msgid "determine updated binaries that need restarting" - msgstr "détermine les binaires mis à jour qui nécessitent un redémarrage" - --#: plugins/needs_restarting.py:204 -+#: plugins/needs_restarting.py:229 - msgid "only consider this user's processes" - msgstr "considère uniquement les processus de cet utilisateur" - --#: plugins/needs_restarting.py:206 -+#: plugins/needs_restarting.py:231 - msgid "" - "only report whether a reboot is required (exit code 1) or not (exit code 0)" - msgstr "" - "indique uniquement si un démarrage (reboot) est requis (exit code 1) ou non " - "(exit code 0)" - --#: plugins/needs_restarting.py:230 -+#: plugins/needs_restarting.py:234 -+msgid "only report affected systemd services" -+msgstr "ne signaler que les services systémiques concernés" -+ -+#: plugins/needs_restarting.py:257 - msgid "Core libraries or services have been updated since boot-up:" - msgstr "" - "les bibliothèques et les services de base ont été mis à jour depuis le " - "démarrage (boot-up) :" - --#: plugins/needs_restarting.py:235 -+#: plugins/needs_restarting.py:262 - msgid "Reboot is required to fully utilize these updates." - msgstr "" - "Un nouveau démarrage est requis pour pouvoir bénéficier totalement de ces " - "mises à jour." - --#: plugins/needs_restarting.py:236 -+#: plugins/needs_restarting.py:263 - msgid "More information:" - msgstr "Plus d’information :" - --#: plugins/needs_restarting.py:240 -+#: plugins/needs_restarting.py:267 - msgid "No core libraries or services have been updated since boot-up." - msgstr "" - "Aucune bibliothèque ou service de base n’a été mis à jour depuis le " - "démarrage." - --#: plugins/needs_restarting.py:242 -+#: plugins/needs_restarting.py:269 - msgid "Reboot should not be necessary." - msgstr "Un nouveau démarrage ne devrait pas être utile." - -@@ -981,39 +1106,33 @@ msgstr "N paquets les plus récents à conserver — par défaut 1" - msgid "Path to directory" - msgstr "Chemin vers le répertoire" - --#: plugins/reposync.py:54 -+#: plugins/reposync.py:55 - msgid "download all packages from remote repo" - msgstr "télécharger tous les paquets depuis le dépôt distant" - --#: plugins/reposync.py:63 -+#: plugins/reposync.py:64 - msgid "download only packages for this ARCH" - msgstr "télécharger seulement les paquets s’appliquant à cette ARCH" - --#: plugins/reposync.py:65 -+#: plugins/reposync.py:66 - msgid "delete local packages no longer present in repository" - msgstr "supprimer les paquets locaux qui ne sont plus présents dans le dépôt" - --#: plugins/reposync.py:67 --msgid "also download and uncompress comps.xml" --msgstr "également télécharger et décompresser comps.xml" -- --#: plugins/reposync.py:69 -+#: plugins/reposync.py:68 - msgid "download all the metadata." - msgstr "télécharger toutes les métadonnées." - --#: plugins/reposync.py:71 --msgid "download only newest packages per-repo" --msgstr "ne télécharger que les nouveaux paquets per-rep" -+#: plugins/reposync.py:70 -+msgid "Remove packages that fail GPG signature checking after downloading" -+msgstr "" -+"Supprimer les paquets qui échouent à la vérification de la signature GPG " -+"après le téléchargement" - - #: plugins/reposync.py:73 --msgid "where to store downloaded repositories" --msgstr "lieu où stocker les dépôts téléchargés" -+msgid "also download and uncompress comps.xml" -+msgstr "également télécharger et décompresser comps.xml" - - #: plugins/reposync.py:75 --msgid "Don't add the reponame to the download path." --msgstr "N’ajoutez pas le nom du dépôt dans le chemin de téléchargement." -- --#: plugins/reposync.py:77 - msgid "" - "where to store downloaded repository metadata. Defaults to the value of " - "--download-path." -@@ -1021,51 +1140,71 @@ msgstr "" - "là où stocker les métadonnées du dépôt. Prend par défaut la valeur de " - "--download-path." - -+#: plugins/reposync.py:78 -+msgid "download only newest packages per-repo" -+msgstr "ne télécharger que les nouveaux paquets per-rep" -+ - #: plugins/reposync.py:80 --msgid "operate on source packages" --msgstr "opère sur les paquets source" -+msgid "Don't add the reponame to the download path." -+msgstr "N’ajoutez pas le nom du dépôt dans le chemin de téléchargement." - - #: plugins/reposync.py:82 -+msgid "where to store downloaded repositories" -+msgstr "lieu où stocker les dépôts téléchargés" -+ -+#: plugins/reposync.py:84 - msgid "try to set local timestamps of local files by the one on the server" - msgstr "" - "essayez de définir les horodatages locaux des fichiers locaux par celui du " - "serveur" - --#: plugins/reposync.py:85 -+#: plugins/reposync.py:87 -+msgid "operate on source packages" -+msgstr "opère sur les paquets source" -+ -+#: plugins/reposync.py:89 - msgid "Just list urls of what would be downloaded, don't download" - msgstr "" - "Uniquement lister les URL qui seraient téléchargées, ne pas télécharger" - --#: plugins/reposync.py:109 -+#: plugins/reposync.py:113 - msgid "Can't use --norepopath with multiple repositories" - msgstr "Impossible d’utiliser --norepopath avec de multiples dépôts" - --#: plugins/reposync.py:127 -+#: plugins/reposync.py:132 - #, python-format - msgid "Failed to get mirror for metadata: %s" - msgstr "Échec de l’obtention du miroir pour les métadonnées : %s" - --#: plugins/reposync.py:144 -+#: plugins/reposync.py:149 - msgid "Failed to get mirror for the group file." - msgstr "Échec de l’obtention du miroir pour le fichier de groupe." - -+#: plugins/reposync.py:168 -+msgid "Removing {}: {}" -+msgstr "Suppression {}: {}" -+ - #: plugins/reposync.py:175 -+msgid "GPG signature check failed." -+msgstr "La vérification de la signature du GPG a échoué." -+ -+#: plugins/reposync.py:196 - msgid "Download target '{}' is outside of download path '{}'." - msgstr "" - "La cible de téléchargement « {} » est en dehors du chemin de téléchargement " - "« {} »." - --#: plugins/reposync.py:190 -+#: plugins/reposync.py:211 - #, python-format - msgid "[DELETED] %s" - msgstr "[DELETED] %s" - --#: plugins/reposync.py:192 -+#: plugins/reposync.py:213 - #, python-format - msgid "failed to delete file %s" - msgstr "n’a pas pu supprimer le fichier %s" - --#: plugins/reposync.py:201 -+#: plugins/reposync.py:222 - #, python-format - msgid "comps.xml for repository %s saved" - msgstr "comps.xml pour le dépôt %s sauvegardé" -diff --git a/po/ja.po b/po/ja.po -index 5e443ec..663b522 100644 ---- a/po/ja.po -+++ b/po/ja.po -@@ -1,20 +1,21 @@ - # Ooyama Yosiyuki , 2015. #zanata - # Ludek Janda , 2018. #zanata - # Casey Jones , 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-05-04 06:40+0000\n" --"Last-Translator: Casey Jones \n" --"Language-Team: Japanese \n" -+"POT-Creation-Date: 2021-02-22 10:06+0100\n" -+"PO-Revision-Date: 2021-03-08 11:08+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.0.3\n" -+"X-Generator: Weblate 4.5.1\n" - - #: plugins/builddep.py:45 - msgid "[PACKAGE|PACKAGE.spec]" -@@ -35,7 +36,7 @@ msgstr "スペックファイルの解析にマクロを定義" - - #: plugins/builddep.py:95 - msgid "skip build dependencies not available in repositories" --msgstr "" -+msgstr "リポジトリーで利用できないビルドの依存関係をスキップします" - - #: plugins/builddep.py:98 - msgid "treat commandline arguments as spec files" -@@ -83,31 +84,32 @@ msgstr "一致するパッケージはありません: %s" - #: plugins/changelog.py:37 - #, python-brace-format - msgid "Not a valid date: \"{0}\"." --msgstr "" -+msgstr "有効な日付ではありません: \"{0}\"。" - - #: plugins/changelog.py:43 - msgid "Show changelog data of packages" --msgstr "" -+msgstr "パッケージの changelog データを表示します" - - #: plugins/changelog.py:51 - msgid "" - "show changelog entries since DATE. To avoid ambiguosity, YYYY-MM-DD format " - "is recommended." --msgstr "" -+msgstr "DATE 以降の changelog エントリーを表示します。不明瞭さを避けるため、YYYY-MM-DD のフォーマットが推奨されます。" - - #: plugins/changelog.py:55 - msgid "show given number of changelog entries per package" --msgstr "" -+msgstr "パッケージごとの changelog エントリーの与えられた数を表示します" - - #: plugins/changelog.py:58 - msgid "" - "show only new changelog entries for packages, that provide an upgrade for " - "some of already installed packages." - msgstr "" -+"パッケージ向けの新しい changelog エントリーのみを表示します。これは、インストール済みのパッケージの一部にアップグレードを提供します。" - - #: plugins/changelog.py:60 - msgid "PACKAGE" --msgstr "" -+msgstr "パッケージ" - - #: plugins/changelog.py:81 plugins/debuginfo-install.py:90 - #, python-format -@@ -116,20 +118,20 @@ msgstr "一致した引数がありません: %s" +@@ -116,20 +118,20 @@ msgstr "一致した引数がありません: %s" #: plugins/changelog.py:109 msgid "Listing changelogs since {}" @@ -853,6 +518,15 @@ index 5e443ec..663b522 100644 #: plugins/config_manager.py:131 #, python-format +@@ -246,7 +250,7 @@ msgstr "" + " list --available-by-user=NAME\n" + " search project\n" + "\n" +-" Examples:\n" ++" 例:\n" + " copr enable rhscl/perl516 epel-6-x86_64\n" + " copr enable ignatenkobrain/ocltoys\n" + " copr disable rhscl/perl516\n" @@ -274,7 +278,7 @@ msgstr "利用可能な Copr リポジトリーをユーザー NAME ごとに一 #: plugins/copr.py:115 @@ -1148,646 +822,1431 @@ index 5e443ec..663b522 100644 msgid "Migrating history data..." msgstr "履歴データを移行中..." --#: plugins/needs_restarting.py:65 -+#: plugins/needs_restarting.py:66 - #, python-brace-format - msgid "" - "No installed package found for package name \"{pkg}\" specified in needs-" - "restarting file \"{file}\"." - msgstr "" -+"needs-restarting ファイル \"{file}\" に指定されている {pkg} " -+"というパッケージのインストール済みパッケージが見つかりません。" +-#: plugins/needs_restarting.py:65 ++#: plugins/needs_restarting.py:66 + #, python-brace-format + msgid "" + "No installed package found for package name \"{pkg}\" specified in needs-" + "restarting file \"{file}\"." + msgstr "" ++"needs-restarting ファイル \"{file}\" に指定されている {pkg} " ++"というパッケージのインストール済みパッケージが見つかりません。" + +-#: plugins/needs_restarting.py:199 ++#: plugins/needs_restarting.py:224 + msgid "determine updated binaries that need restarting" + msgstr "再起動が必要な更新済みバイナリーを決定します" + +-#: plugins/needs_restarting.py:204 ++#: plugins/needs_restarting.py:229 + msgid "only consider this user's processes" + msgstr "このユーザーのプロセスのみを検討します" + +-#: plugins/needs_restarting.py:206 ++#: plugins/needs_restarting.py:231 + msgid "" + "only report whether a reboot is required (exit code 1) or not (exit code 0)" +-msgstr "" ++msgstr "再起動が必要か (終了コード 1) 必要でないか (終了コード 0) のみを報告します" ++ ++#: plugins/needs_restarting.py:234 ++msgid "only report affected systemd services" ++msgstr "影響を受ける systemd サービスのみを報告" + +-#: plugins/needs_restarting.py:230 ++#: plugins/needs_restarting.py:257 + msgid "Core libraries or services have been updated since boot-up:" +-msgstr "" ++msgstr "起動以降にコアライブラリーまたはサービスがアップデートされました:" + +-#: plugins/needs_restarting.py:235 ++#: plugins/needs_restarting.py:262 + msgid "Reboot is required to fully utilize these updates." +-msgstr "" ++msgstr "これらのアップデートを完全に活用するには、再起動が必要です。" + +-#: plugins/needs_restarting.py:236 ++#: plugins/needs_restarting.py:263 + msgid "More information:" +-msgstr "" ++msgstr "詳細情報:" + +-#: plugins/needs_restarting.py:240 ++#: plugins/needs_restarting.py:267 + msgid "No core libraries or services have been updated since boot-up." +-msgstr "" ++msgstr "起動以降にアップデートされたコアライブラリーまたはサービスはありません。" + +-#: plugins/needs_restarting.py:242 ++#: plugins/needs_restarting.py:269 + msgid "Reboot should not be necessary." +-msgstr "" ++msgstr "再起動な必要ありません。" + + #: plugins/post-transaction-actions.py:71 + #, python-format + msgid "Bad Action Line \"%s\": %s" +-msgstr "" ++msgstr "不正なアクション行 \"%s\": %s" + + #. unsupported state, skip it + #: plugins/post-transaction-actions.py:130 + #, python-format + msgid "Bad Transaction State: %s" +-msgstr "" ++msgstr "不正なトランザクション状態: %s" + + #: plugins/post-transaction-actions.py:153 + #: plugins/post-transaction-actions.py:155 + #, python-format + msgid "post-transaction-actions: %s" +-msgstr "" ++msgstr "post-transaction-actions: %s" + + #: plugins/post-transaction-actions.py:157 + #, python-format + msgid "post-transaction-actions: Bad Command \"%s\": %s" +-msgstr "" ++msgstr "post-transaction-actions: 不正なコマンド \"%s\": %s" + + #: plugins/repoclosure.py:42 + msgid "Display a list of unresolved dependencies for repositories" +@@ -718,129 +869,137 @@ msgstr "このパッケージのみのクロージャーを確認します" + + #: plugins/repodiff.py:45 + msgid "List differences between two sets of repositories" +-msgstr "" ++msgstr "2 セットのリポジトリー間の違いを一覧表示します" + + #: plugins/repodiff.py:58 + msgid "Specify old repository, can be used multiple times" +-msgstr "" ++msgstr "古いリポジトリーを指定します、これは複数回使用できます" + + #: plugins/repodiff.py:60 + msgid "Specify new repository, can be used multiple times" +-msgstr "" ++msgstr "新しいリポジトリーを指定します、これは複数回使用できます" + + #: plugins/repodiff.py:63 + msgid "" + "Specify architectures to compare, can be used multiple times. By default, " + "only source rpms are compared." +-msgstr "" ++msgstr "比較するアーキテクチャーを指定します、これは複数回使用できます。デフォルトで、ソース rpms のみが比較されます。" + + #: plugins/repodiff.py:67 + msgid "Output additional data about the size of the changes." +-msgstr "" ++msgstr "変更サイズに関する追加データを出力します。" + + #: plugins/repodiff.py:69 + msgid "" + "Compare packages also by arch. By default packages are compared just by " + "name." +-msgstr "" ++msgstr "パッケージを Arch でも比較します。デフォルトで、パッケージは名前のみで比較されます。" + + #: plugins/repodiff.py:72 + msgid "Output a simple one line message for modified packages." +-msgstr "" ++msgstr "変更されたパッケージに簡単な 1 行メッセージを出力します。" + + #: plugins/repodiff.py:74 + msgid "" + "Split the data for modified packages between upgraded and downgraded " + "packages." +-msgstr "" ++msgstr "アップグレードされたパッケージとダウングレードされたパッケージとの間で、変更されたパッケージのデータを分割します。" + + #: plugins/repodiff.py:86 + msgid "Both old and new repositories must be set." +-msgstr "" ++msgstr "新旧両方のリポジトリーを設定する必要があります。" + + #: plugins/repodiff.py:178 + msgid "Size change: {} bytes" +-msgstr "" ++msgstr "サイズの変更: {} バイト" + + #: plugins/repodiff.py:184 + msgid "Added package : {}" +-msgstr "" ++msgstr "追加されたパッケージ : {}" + + #: plugins/repodiff.py:187 + msgid "Removed package: {}" +-msgstr "" ++msgstr "削除されたパッケージ: {}" + + #: plugins/repodiff.py:190 + msgid "Obsoleted by : {}" +-msgstr "" ++msgstr "により廃止されました: {}" + + #: plugins/repodiff.py:195 + msgid "" + "\n" + "Upgraded packages" + msgstr "" ++"\n" ++"アップグレードされたパッケージ" + + #: plugins/repodiff.py:200 + msgid "" + "\n" + "Downgraded packages" + msgstr "" ++"\n" ++"ダウングレードされたパッケージ" + + #: plugins/repodiff.py:207 + msgid "" + "\n" + "Modified packages" + msgstr "" ++"\n" ++"変更されたパッケージ" + + #: plugins/repodiff.py:212 + msgid "" + "\n" + "Summary" + msgstr "" ++"\n" ++"サマリー" + + #: plugins/repodiff.py:213 + msgid "Added packages: {}" +-msgstr "" ++msgstr "追加されたパッケージ: {}" + + #: plugins/repodiff.py:214 + msgid "Removed packages: {}" +-msgstr "" ++msgstr "削除されたパッケージ: {}" + + #: plugins/repodiff.py:216 + msgid "Upgraded packages: {}" +-msgstr "" ++msgstr "アップグレードされたパッケージ: {}" + + #: plugins/repodiff.py:217 + msgid "Downgraded packages: {}" +-msgstr "" ++msgstr "ダウングレードされたパッケージ: {}" + + #: plugins/repodiff.py:219 + msgid "Modified packages: {}" +-msgstr "" ++msgstr "変更されたパッケージ: {}" --#: plugins/needs_restarting.py:199 -+#: plugins/needs_restarting.py:224 - msgid "determine updated binaries that need restarting" - msgstr "再起動が必要な更新済みバイナリーを決定します" + #: plugins/repodiff.py:222 + msgid "Size of added packages: {}" +-msgstr "" ++msgstr "追加されたパッケージのサイズ: {}" --#: plugins/needs_restarting.py:204 -+#: plugins/needs_restarting.py:229 - msgid "only consider this user's processes" - msgstr "このユーザーのプロセスのみを検討します" + #: plugins/repodiff.py:223 + msgid "Size of removed packages: {}" +-msgstr "" ++msgstr "削除されたパッケージのサイズ: {}" --#: plugins/needs_restarting.py:206 -+#: plugins/needs_restarting.py:231 + #: plugins/repodiff.py:225 + msgid "Size of modified packages: {}" +-msgstr "" ++msgstr "変更されたパッケージのサイズ: {}" + + #: plugins/repodiff.py:228 + msgid "Size of upgraded packages: {}" +-msgstr "" ++msgstr "アップグレードされたパッケージのサイズ: {}" + + #: plugins/repodiff.py:230 + msgid "Size of downgraded packages: {}" +-msgstr "" ++msgstr "ダウングレードされたパッケージのサイズ: {}" + + #: plugins/repodiff.py:232 + msgid "Size change: {}" +-msgstr "" ++msgstr "サイズの変更: {}" + + #: plugins/repograph.py:50 + msgid "Output a full package dependency graph in dot format" +@@ -887,84 +1046,96 @@ msgstr "維持する最新の N パッケージ - デフォルトは 1 に設定 + msgid "Path to directory" + msgstr "ディレクトリーへのパス" + +-#: plugins/reposync.py:54 ++#: plugins/reposync.py:55 + msgid "download all packages from remote repo" + msgstr "リモート repo からすべてのパッケージをダウンロードします" + +-#: plugins/reposync.py:63 ++#: plugins/reposync.py:64 + msgid "download only packages for this ARCH" + msgstr "この ARCH 向けのパッケージのみをダウンロード" + +-#: plugins/reposync.py:65 ++#: plugins/reposync.py:66 + msgid "delete local packages no longer present in repository" + msgstr "リポジトリーにもはや存在しないローカルパッケージを削除" + +-#: plugins/reposync.py:67 +-msgid "also download and uncompress comps.xml" +-msgstr "" +- +-#: plugins/reposync.py:69 ++#: plugins/reposync.py:68 + msgid "download all the metadata." +-msgstr "" ++msgstr "すべてのメタデータをダウンロードします。" + +-#: plugins/reposync.py:71 +-msgid "download only newest packages per-repo" +-msgstr "最新のパッケージ per-repo のみをダウンロード" ++#: plugins/reposync.py:70 ++msgid "Remove packages that fail GPG signature checking after downloading" ++msgstr "ダウンロード後に GPG 署名の確認に失敗するパッケージを削除します" + + #: plugins/reposync.py:73 +-msgid "where to store downloaded repositories" +-msgstr "" ++msgid "also download and uncompress comps.xml" ++msgstr "comps.xml もダウンロードして展開します" + + #: plugins/reposync.py:75 +-msgid "Don't add the reponame to the download path." +-msgstr "" +- +-#: plugins/reposync.py:77 msgid "" - "only report whether a reboot is required (exit code 1) or not (exit code 0)" + "where to store downloaded repository metadata. Defaults to the value of " + "--download-path." -msgstr "" -+msgstr "再起動が必要か (終了コード 1) 必要でないか (終了コード 0) のみを報告します" ++msgstr "ダウンロード済みリポジトリーメタデータの保管場所。初期値は --download-path です。" ++ ++#: plugins/reposync.py:78 ++msgid "download only newest packages per-repo" ++msgstr "最新のパッケージ per-repo のみをダウンロード" --#: plugins/needs_restarting.py:230 -+#: plugins/needs_restarting.py:234 -+msgid "only report affected systemd services" -+msgstr "影響を受ける systemd サービスのみを報告" + #: plugins/reposync.py:80 +-msgid "operate on source packages" +-msgstr "ソースパッケージでの操作" ++msgid "Don't add the reponame to the download path." ++msgstr "ダウンロードパスにはリポネームを追加しないでください。" + + #: plugins/reposync.py:82 ++msgid "where to store downloaded repositories" ++msgstr "ダウンロード済みリポジトリーの保管場所" + -+#: plugins/needs_restarting.py:257 - msgid "Core libraries or services have been updated since boot-up:" ++#: plugins/reposync.py:84 + msgid "try to set local timestamps of local files by the one on the server" -msgstr "" -+msgstr "起動以降にコアライブラリーまたはサービスがアップデートされました:" ++msgstr "サーバー上から、ローカルファイルのローカル timestamps の設定を試みます" --#: plugins/needs_restarting.py:235 -+#: plugins/needs_restarting.py:262 - msgid "Reboot is required to fully utilize these updates." +-#: plugins/reposync.py:85 ++#: plugins/reposync.py:87 ++msgid "operate on source packages" ++msgstr "ソースパッケージでの操作" ++ ++#: plugins/reposync.py:89 + msgid "Just list urls of what would be downloaded, don't download" -msgstr "" -+msgstr "これらのアップデートを完全に活用するには、再起動が必要です。" ++msgstr "ダウンロードする予定のものの URL をリストするだけで、ダウンロードしないでください" --#: plugins/needs_restarting.py:236 -+#: plugins/needs_restarting.py:263 - msgid "More information:" +-#: plugins/reposync.py:109 ++#: plugins/reposync.py:113 + msgid "Can't use --norepopath with multiple repositories" -msgstr "" -+msgstr "詳細情報:" ++msgstr "複数のリポジトリーでは -norepopath は使えません" --#: plugins/needs_restarting.py:240 -+#: plugins/needs_restarting.py:267 - msgid "No core libraries or services have been updated since boot-up." +-#: plugins/reposync.py:127 ++#: plugins/reposync.py:132 + #, python-format + msgid "Failed to get mirror for metadata: %s" -msgstr "" -+msgstr "起動以降にアップデートされたコアライブラリーまたはサービスはありません。" ++msgstr "メタデータのミラー取得に失敗しました: %s" --#: plugins/needs_restarting.py:242 -+#: plugins/needs_restarting.py:269 - msgid "Reboot should not be necessary." +-#: plugins/reposync.py:144 ++#: plugins/reposync.py:149 + msgid "Failed to get mirror for the group file." -msgstr "" -+msgstr "再起動な必要ありません。" ++msgstr "グループファイルのミラー取得に失敗しました。" ++ ++#: plugins/reposync.py:168 ++msgid "Removing {}: {}" ++msgstr "{} の削除中: {}" - #: plugins/post-transaction-actions.py:71 - #, python-format - msgid "Bad Action Line \"%s\": %s" + #: plugins/reposync.py:175 ++msgid "GPG signature check failed." ++msgstr "GPG 署名の確認に失敗しました。" ++ ++#: plugins/reposync.py:196 + msgid "Download target '{}' is outside of download path '{}'." -msgstr "" -+msgstr "不正なアクション行 \"%s\": %s" ++msgstr "ダウンロードターゲット '{}' は、ダウンロードパス '{}' の外にあります。" - #. unsupported state, skip it - #: plugins/post-transaction-actions.py:130 +-#: plugins/reposync.py:190 ++#: plugins/reposync.py:211 #, python-format - msgid "Bad Transaction State: %s" --msgstr "" -+msgstr "不正なトランザクション状態: %s" + msgid "[DELETED] %s" + msgstr "[DELETED] %s" - #: plugins/post-transaction-actions.py:153 - #: plugins/post-transaction-actions.py:155 +-#: plugins/reposync.py:192 ++#: plugins/reposync.py:213 #, python-format - msgid "post-transaction-actions: %s" --msgstr "" -+msgstr "post-transaction-actions: %s" + msgid "failed to delete file %s" + msgstr "ファイル %s の削除に失敗しました" - #: plugins/post-transaction-actions.py:157 +-#: plugins/reposync.py:201 ++#: plugins/reposync.py:222 #, python-format - msgid "post-transaction-actions: Bad Command \"%s\": %s" + msgid "comps.xml for repository %s saved" + msgstr "リポジトリー %s の comps.xml が保存されました" +@@ -992,15 +1163,15 @@ msgstr "除外を追加:" + + #: plugins/versionlock.py:36 + msgid "Package already locked in equivalent form:" -msgstr "" -+msgstr "post-transaction-actions: 不正なコマンド \"%s\": %s" ++msgstr "同等の形で既にロックされているパッケージ:" - #: plugins/repoclosure.py:42 - msgid "Display a list of unresolved dependencies for repositories" -@@ -718,129 +869,137 @@ msgstr "このパッケージのみのクロージャーを確認します" + #: plugins/versionlock.py:37 + msgid "Package {} is already locked" +-msgstr "" ++msgstr "パッケージ {} は既にロックされています" - #: plugins/repodiff.py:45 - msgid "List differences between two sets of repositories" + #: plugins/versionlock.py:38 + msgid "Package {} is already excluded" -msgstr "" -+msgstr "2 セットのリポジトリー間の違いを一覧表示します" ++msgstr "パッケージ{}はすでに除外されています" - #: plugins/repodiff.py:58 - msgid "Specify old repository, can be used multiple times" + #: plugins/versionlock.py:39 + msgid "Deleting versionlock for:" +@@ -1032,7 +1203,7 @@ msgstr "パッケージバージョンロックの制御" + + #: plugins/versionlock.py:136 + msgid "Use package specifications as they are, do not try to parse them" +-msgstr "" ++msgstr "パッケージ仕様をそのまま使用し、解析を試みないでください" + + #~ msgid "" + #~ "\n" +diff --git a/po/ko.po b/po/ko.po +index 3f4eb89..520a72b 100644 +--- a/po/ko.po ++++ b/po/ko.po +@@ -1,55 +1,56 @@ + # Ludek Janda , 2018. #zanata, 2020. ++# simmon , 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: Ludek Janda \n" +-"Language-Team: Korean \n" ++"POT-Creation-Date: 2021-02-22 10:06+0100\n" ++"PO-Revision-Date: 2021-04-18 16:02+0000\n" ++"Last-Translator: simmon \n" ++"Language-Team: Korean \n" + "Language: ko\n" + "MIME-Version: 1.0\n" + "Content-Type: text/plain; charset=UTF-8\n" + "Content-Transfer-Encoding: 8bit\n" + "Plural-Forms: nplurals=1; plural=0;\n" +-"X-Generator: Weblate 4.2.2\n" ++"X-Generator: Weblate 4.5.3\n" + + #: plugins/builddep.py:45 + msgid "[PACKAGE|PACKAGE.spec]" +-msgstr "" ++msgstr "[PACKAGE|PACKAGE.spec]" + + #: plugins/builddep.py:85 + #, python-format + msgid "'%s' is not of the format 'MACRO EXPR'" +-msgstr "" ++msgstr "'%s'는 'MACRO EXPR' 형식이 아닙니다" + + #: plugins/builddep.py:90 + msgid "packages with builddeps to install" -msgstr "" -+msgstr "古いリポジトリーを指定します、これは複数回使用できます" ++msgstr "설치 할 builddeps가 있는 꾸러미(package)" - #: plugins/repodiff.py:60 - msgid "Specify new repository, can be used multiple times" + #: plugins/builddep.py:93 + msgid "define a macro for spec file parsing" -msgstr "" -+msgstr "新しいリポジトリーを指定します、これは複数回使用できます" ++msgstr "특정한 파일 구문분석을 위해 매크로를 정의한다" - #: plugins/repodiff.py:63 - msgid "" - "Specify architectures to compare, can be used multiple times. By default, " - "only source rpms are compared." + #: plugins/builddep.py:95 + msgid "skip build dependencies not available in repositories" -msgstr "" -+msgstr "比較するアーキテクチャーを指定します、これは複数回使用できます。デフォルトで、ソース rpms のみが比較されます。" ++msgstr "저장소에서 사용 할 수 없는 구성 의존성을 건너띄기 한다" - #: plugins/repodiff.py:67 - msgid "Output additional data about the size of the changes." + #: plugins/builddep.py:98 + msgid "treat commandline arguments as spec files" -msgstr "" -+msgstr "変更サイズに関する追加データを出力します。" ++msgstr "명령줄 인수를 지정한 파일로 다룬다" - #: plugins/repodiff.py:69 - msgid "" - "Compare packages also by arch. By default packages are compared just by " - "name." + #: plugins/builddep.py:100 + msgid "treat commandline arguments as source rpm" -msgstr "" -+msgstr "パッケージを Arch でも比較します。デフォルトで、パッケージは名前のみで比較されます。" ++msgstr "명령줄 인수를 rpm 소스로 다룬다" - #: plugins/repodiff.py:72 - msgid "Output a simple one line message for modified packages." + #: plugins/builddep.py:144 + msgid "RPM: {}" -msgstr "" -+msgstr "変更されたパッケージに簡単な 1 行メッセージを出力します。" ++msgstr "RPM: {}" - #: plugins/repodiff.py:74 - msgid "" - "Split the data for modified packages between upgraded and downgraded " - "packages." + #: plugins/builddep.py:153 + msgid "Some packages could not be found." -msgstr "" -+msgstr "アップグレードされたパッケージとダウングレードされたパッケージとの間で、変更されたパッケージのデータを分割します。" ++msgstr "몇몇 꾸러미(packages)를 찾을 수 없습니다." - #: plugins/repodiff.py:86 - msgid "Both old and new repositories must be set." + #. No provides, no files + #. Richdeps can have no matches but it could be correct (solver must decide +@@ -57,86 +58,86 @@ msgstr "" + #: plugins/builddep.py:173 + #, python-format + msgid "No matching package to install: '%s'" -msgstr "" -+msgstr "新旧両方のリポジトリーを設定する必要があります。" ++msgstr "설치: '%s' 꾸러미(package)가 일치하지 않습니다" - #: plugins/repodiff.py:178 - msgid "Size change: {} bytes" + #: plugins/builddep.py:191 + #, python-format + msgid "Failed to open: '%s', not a valid source rpm file." -msgstr "" -+msgstr "サイズの変更: {} バイト" ++msgstr "여는데 실패하였습니다: '%s', 유효한 rpm 파일 출처가 아닙니다." - #: plugins/repodiff.py:184 - msgid "Added package : {}" + #: plugins/builddep.py:204 plugins/builddep.py:220 plugins/builddep.py:237 + msgid "Not all dependencies satisfied" -msgstr "" -+msgstr "追加されたパッケージ : {}" ++msgstr "모든 의존성을 만족하지 않습니다" - #: plugins/repodiff.py:187 - msgid "Removed package: {}" + #: plugins/builddep.py:211 + #, python-format + msgid "Failed to open: '%s', not a valid spec file: %s" -msgstr "" -+msgstr "削除されたパッケージ: {}" ++msgstr "여는데 실패하였습니다 '%s', 지정한 파일: %s가 유효하지 않습니다" - #: plugins/repodiff.py:190 - msgid "Obsoleted by : {}" + #: plugins/builddep.py:230 plugins/repoclosure.py:118 + #, python-format + msgid "no package matched: %s" +-msgstr "일치하는 패키지 없음 : %s" ++msgstr "일치하는 꾸러미(package) 없음: %s" + + #: plugins/changelog.py:37 + #, python-brace-format + msgid "Not a valid date: \"{0}\"." -msgstr "" -+msgstr "により廃止されました: {}" ++msgstr "유효한 날자가 아닙니다: \"{0}\"." - #: plugins/repodiff.py:195 - msgid "" - "\n" - "Upgraded packages" - msgstr "" -+"\n" -+"アップグレードされたパッケージ" + #: plugins/changelog.py:43 + msgid "Show changelog data of packages" +-msgstr "" ++msgstr "꾸러미(packages)의 변화 기록자료를 보여줍니다" - #: plugins/repodiff.py:200 + #: plugins/changelog.py:51 msgid "" - "\n" - "Downgraded packages" - msgstr "" -+"\n" -+"ダウングレードされたパッケージ" + "show changelog entries since DATE. To avoid ambiguosity, YYYY-MM-DD format " + "is recommended." +-msgstr "" ++msgstr "DATE 이후에 변화기록를 보여줍니다. 모호함을 피하기 위하여, YYYY-MM-DD 형식을 추천합니다." - #: plugins/repodiff.py:207 - msgid "" - "\n" - "Modified packages" - msgstr "" -+"\n" -+"変更されたパッケージ" + #: plugins/changelog.py:55 + msgid "show given number of changelog entries per package" +-msgstr "" ++msgstr "주어진 수의 꾸러미(package) 마다 변화기록 항목을 보여줍니다" - #: plugins/repodiff.py:212 + #: plugins/changelog.py:58 msgid "" - "\n" - "Summary" - msgstr "" -+"\n" -+"サマリー" + "show only new changelog entries for packages, that provide an upgrade for " + "some of already installed packages." +-msgstr "" ++msgstr "몇몇 이미 설치된 꾸러미(package)들의 최신화를 제공하는 꾸러미를 위하여 새로운 변화기록만을 보여줍니다." - #: plugins/repodiff.py:213 - msgid "Added packages: {}" + #: plugins/changelog.py:60 + msgid "PACKAGE" -msgstr "" -+msgstr "追加されたパッケージ: {}" ++msgstr "꾸러미(package)" - #: plugins/repodiff.py:214 - msgid "Removed packages: {}" + #: plugins/changelog.py:81 plugins/debuginfo-install.py:90 + #, python-format + msgid "No match for argument: %s" +-msgstr "인수와 일치하는 항목 없음 : %s" ++msgstr "인수가 일치하지 않습니다: %s" + + #: plugins/changelog.py:109 + msgid "Listing changelogs since {}" -msgstr "" -+msgstr "削除されたパッケージ: {}" ++msgstr "{} 이 후의 변화기록 목록" - #: plugins/repodiff.py:216 - msgid "Upgraded packages: {}" + #: plugins/changelog.py:111 + msgid "Listing only latest changelog" + msgid_plural "Listing {} latest changelogs" +-msgstr[0] "" ++msgstr[0] "최신화된 변화기록 목록 {}" + + #: plugins/changelog.py:116 + msgid "Listing only new changelogs since installed version of the package" -msgstr "" -+msgstr "アップグレードされたパッケージ: {}" ++msgstr "꾸러미 설치 버전 이후의 새로운 변화 기록만 목록화함" - #: plugins/repodiff.py:217 - msgid "Downgraded packages: {}" + #: plugins/changelog.py:118 + msgid "Listing all changelogs" -msgstr "" -+msgstr "ダウングレードされたパッケージ: {}" ++msgstr "모든 변화기록 목록" - #: plugins/repodiff.py:219 - msgid "Modified packages: {}" + #: plugins/changelog.py:122 + msgid "Changelogs for {}" -msgstr "" -+msgstr "変更されたパッケージ: {}" ++msgstr "{}의 변경 사항" - #: plugins/repodiff.py:222 - msgid "Size of added packages: {}" + #: plugins/config_manager.py:37 + #, python-brace-format + msgid "manage {prog} configuration options and repositories" -msgstr "" -+msgstr "追加されたパッケージのサイズ: {}" ++msgstr "{prog} 환경 선택과 저장소 관리" - #: plugins/repodiff.py:223 - msgid "Size of removed packages: {}" + #: plugins/config_manager.py:44 + msgid "repo to modify" +@@ -160,21 +161,23 @@ msgstr "변수 값을 표준 출력으로 출력" + + #: plugins/config_manager.py:60 + msgid "enable repos (automatically saves)" -msgstr "" -+msgstr "削除されたパッケージのサイズ: {}" ++msgstr "저장소 활성화 (자동으로 저장합니다)" - #: plugins/repodiff.py:225 - msgid "Size of modified packages: {}" + #: plugins/config_manager.py:63 + msgid "disable repos (automatically saves)" -msgstr "" -+msgstr "変更されたパッケージのサイズ: {}" ++msgstr "저장소 비활성화 (자동으로 저장합니다)" - #: plugins/repodiff.py:228 - msgid "Size of upgraded packages: {}" + #: plugins/config_manager.py:77 + msgid "one of the following arguments is required: {}" -msgstr "" -+msgstr "アップグレードされたパッケージのサイズ: {}" ++msgstr "다음 인수 중 하나가 필요합니다: {}" - #: plugins/repodiff.py:230 - msgid "Size of downgraded packages: {}" + #: plugins/config_manager.py:86 + msgid "" + "Warning: --enablerepo/--disablerepo arguments have no meaningwith config " + "manager. Use --set-enabled/--set-disabled instead." + msgstr "" ++"경고: -- --enablerepo/--disablerepo 인수는 설정 관리자와 함께 의미를 갖고 있지 않습니다. 대신에 --set-" ++"enabled/--set-disabled를 사용하세요." + + #: plugins/config_manager.py:131 + #, python-format +@@ -189,7 +192,7 @@ msgstr "다음 위치에서 레포 추가 : %s" + #: plugins/config_manager.py:206 + msgid "Configuration of repo failed" + msgid_plural "Configuration of repos failed" +-msgstr[0] "저장소 구성에 실패했습니다." ++msgstr[0] "저장소 구성에 실패했습니다" + + #: plugins/config_manager.py:216 + #, python-format +@@ -237,7 +240,21 @@ msgid "" + " " + msgstr "" + "\n" +-" 프로젝트 이름 / 프로젝트 제거 - 설치 / 사용 / 사용 안 함 목록 - 사용 가능 사용자 = NAME 검색 프로젝트 예 : copr enable rhscl / perl516 epel-6-x86_64 copr enable ignatenkobrain / ocltoys copr 비활성화 rhscl / perl516 copr 제거 rhscl / perl516 copr 목록 - 사용 가능 목록 - 사용 가능 사용자 = ignatenkobrain copr 검색 테스트\n" ++" enable name/project [chroot]\n" ++" disable name/project\n" ++" remove name/project\n" ++" list --installed/enabled/disabled\n" ++" list --available-by-user=NAME\n" ++" search project\n" ++"\n" ++" Examples:\n" ++" copr enable rhscl/perl516 epel-6-x86_64\n" ++" copr enable ignatenkobrain/ocltoys\n" ++" copr disable rhscl/perl516\n" ++" copr remove rhscl/perl516\n" ++" copr list --enabled\n" ++" copr list --available-by-user=ignatenkobrain\n" ++" copr search tests\n" + " " + + #: plugins/copr.py:107 +@@ -258,7 +275,7 @@ msgstr "사용자가 사용할 수있는 Copr 저장소를 나열합니다. NAME + + #: plugins/copr.py:115 + msgid "Specify an instance of Copr to work with" -msgstr "" -+msgstr "ダウングレードされたパッケージのサイズ: {}" ++msgstr "일하는 Copr의 예를 지정합니다" - #: plugins/repodiff.py:232 - msgid "Size change: {}" + #: plugins/copr.py:149 plugins/copr.py:217 plugins/copr.py:237 + msgid "Error: " +@@ -269,14 +286,16 @@ msgid "" + "specify Copr hub either with `--hub` or using " + "`copr_hub/copr_username/copr_projectname` format" + msgstr "" ++"Corp hub를 `--hub` 또는 사용하기 `copr_hub/copr_username/copr_projectname`형식으로 " ++"지정합니다" + + #: plugins/copr.py:153 + msgid "multiple hubs specified" -msgstr "" -+msgstr "サイズの変更: {}" ++msgstr "지정된 여러 허브" - #: plugins/repograph.py:50 - msgid "Output a full package dependency graph in dot format" -@@ -887,84 +1046,96 @@ msgstr "維持する最新の N パッケージ - デフォルトは 1 に設定 - msgid "Path to directory" - msgstr "ディレクトリーへのパス" + #: plugins/copr.py:218 plugins/copr.py:222 + msgid "exactly two additional parameters to copr command are required" +-msgstr "copr 명령에 정확히 두 개의 추가 매개 변수가 필요합니다." ++msgstr "copr 명령에 정확히 두 개의 추가 매개 변수가 필요합니다" --#: plugins/reposync.py:54 -+#: plugins/reposync.py:55 - msgid "download all packages from remote repo" - msgstr "リモート repo からすべてのパッケージをダウンロードします" + #: plugins/copr.py:238 + msgid "use format `copr_username/copr_projectname` to reference copr project" +@@ -300,6 +319,17 @@ msgid "" + "Please do not file bug reports about these packages in Fedora\n" + "Bugzilla. In case of problems, contact the owner of this repository.\n" + msgstr "" ++"\n" ++"Core 저정소를 활성화합니다. 이 저장소는 주요 배포판 부분이 아님을 알고 있기 바라고,\n" ++"품질이 다를 수 있습니다.\n" ++"\n" ++"페도라 프로젝트는\n" ++"에\n" ++"Core FAQ에 있는 설명된 규칙을 넘는 저장소 내용 이상의 권한을 시험하지 않으며,\n" ++"그리고 꾸러미(package)는 어떤 품질이나 보안 수준을 유지하지 않습니다.\n" ++"\n" ++"페도라 버그질라에 이들 꾸러미에 대한 파일 결점 보고를 제출하지 마세요.\n" ++"이들 문제는, 이들 저장소 소유자와 접촉하세요.\n" --#: plugins/reposync.py:63 -+#: plugins/reposync.py:64 - msgid "download only packages for this ARCH" - msgstr "この ARCH 向けのパッケージのみをダウンロード" + #: plugins/copr.py:271 + msgid "Repository successfully enabled." +@@ -323,6 +353,8 @@ msgid "" + " about Copr hub - the default one was assumed. Re-enable the project to fix " + "this." + msgstr "" ++"* 이들 coprs은 Copr hub에 대하여 어떤 정보도 포함하지 않는 오래된 형태의 저장소 파일을 갖고 있습니다. 이 문제를 수정하기" ++" 위하여 프로젝트를 재활성화하세요." --#: plugins/reposync.py:65 -+#: plugins/reposync.py:66 - msgid "delete local packages no longer present in repository" - msgstr "リポジトリーにもはや存在しないローカルパッケージを削除" + #: plugins/copr.py:353 + msgid "Can't parse repositories for username '{}'." +@@ -334,7 +366,7 @@ msgstr "{} 명의 경찰 목록" --#: plugins/reposync.py:67 --msgid "also download and uncompress comps.xml" + #: plugins/copr.py:364 + msgid "No description given" +-msgstr "설명이 없습니다." ++msgstr "설명이 없습니다" + + #: plugins/copr.py:376 + msgid "Can't parse search for '{}'." +@@ -381,19 +413,31 @@ msgid "" + "\n" + "These repositories have been enabled automatically." + msgstr "" ++"활성화된 Core 저장소의 유지는 다른 저장소에 이를 독립적으로\n" ++"만드는 것으로 결정하였습니다.\n" ++"그런 저장소는 주요 Corp 저장소에서 성공적인 RPM 설치를\n" ++"위하여 일반적으로 필요합니다(이들은 실행 의존성을 제공합니다).\n" ++"\n" ++"위도 여기에 적용되며 품질과 결점-보고에 대한 참고 사항을 알아야 하고,\n" ++"페도라 프로젝트는 그 내용을 통제하지 않습니다.\n" ++"목록을 다시 검토합니다:\n" ++"\n" ++"{0}\n" ++"\n" ++"이들 저장소는 자동으로 활성화 됩니다." + + #: plugins/copr.py:549 + msgid "Do you want to keep them enabled?" -msgstr "" -- --#: plugins/reposync.py:69 -+#: plugins/reposync.py:68 - msgid "download all the metadata." ++msgstr "계속 사용하길 원하시나요?" + + #: plugins/copr.py:582 + #, python-brace-format + msgid "Failed to remove copr repo {0}/{1}/{2}" -msgstr "" -+msgstr "すべてのメタデータをダウンロードします。" ++msgstr "copr repo {0}/{1}/{2} 제거를 실패하였습니다" --#: plugins/reposync.py:71 --msgid "download only newest packages per-repo" --msgstr "最新のパッケージ per-repo のみをダウンロード" -+#: plugins/reposync.py:70 -+msgid "Remove packages that fail GPG signature checking after downloading" -+msgstr "ダウンロード後に GPG 署名の確認に失敗するパッケージを削除します" + #: plugins/copr.py:593 + msgid "Failed to disable copr repo {}/{}" +-msgstr "copr repo {} / {}를 사용 중지하지 못했습니다." ++msgstr "copr repo {} / {}를 사용 중지를 실패하였습니다" - #: plugins/reposync.py:73 --msgid "where to store downloaded repositories" --msgstr "" -+msgid "also download and uncompress comps.xml" -+msgstr "comps.xml もダウンロードして展開します" + #: plugins/copr.py:611 plugins/copr.py:648 + msgid "Unknown response from server." +@@ -404,14 +448,12 @@ msgid "Interact with Playground repository." + msgstr "놀이터 저장소와 상호 작용하십시오." + + #: plugins/copr.py:639 +-#, fuzzy +-#| msgid "Interact with Playground repository." + msgid "Enabling a Playground repository." +-msgstr "놀이터 저장소와 상호 작용하십시오." ++msgstr "동작 저장소와 활용하기." - #: plugins/reposync.py:75 --msgid "Don't add the reponame to the download path." + #: plugins/copr.py:640 + msgid "Do you want to continue?" -msgstr "" -- --#: plugins/reposync.py:77 ++msgstr "계속하기를 원하십니까?" + + #: plugins/copr.py:683 + msgid "Playground repositories successfully enabled." +@@ -427,7 +469,7 @@ msgstr "놀이터 저장소가 성공적으로 업데이트되었습니다." + + #: plugins/debug.py:53 + msgid "dump information about installed rpm packages to file" +-msgstr "설치된 rpm 패키지에 대한 정보를 파일에 덤프하십시오." ++msgstr "설치된 rpm 꾸러미(package)에 대한 정보를 파일에 덤프하십시오" + + #: plugins/debug.py:67 + msgid "do not attempt to dump the repository contents." +@@ -444,7 +486,7 @@ msgstr "작성된 출력 : %s" + + #: plugins/debug.py:172 + msgid "restore packages recorded in debug-dump file" +-msgstr "디버그 덤프 파일에 기록 된 패키지 복원" ++msgstr "디버그 덤프 파일에 기록 된 꾸러미(package) 복원" + + #: plugins/debug.py:185 + msgid "output commands that would be run to stdout." +@@ -452,13 +494,13 @@ msgstr "stdout으로 실행될 출력 명령." + + #: plugins/debug.py:188 + msgid "Install the latest version of recorded packages." +-msgstr "기록 된 패키지의 최신 버전을 설치하십시오." ++msgstr "기록 된 꾸러미의 최신 버전을 설치하십시오." + + #: plugins/debug.py:191 msgid "" - "where to store downloaded repository metadata. Defaults to the value of " - "--download-path." + "Ignore architecture and install missing packages matching the name, epoch, " + "version and release." +-msgstr "아키텍처를 무시하고 이름, 기원, 버전 및 릴리스와 일치하는 누락 된 패키지를 설치하십시오." ++msgstr "구조를 무시하고 이름, 기원, 버전및 출시와 일치하는 누락 된 꾸러미를 설치하십시오." + + #: plugins/debug.py:196 + msgid "limit to specified type" +@@ -468,7 +510,7 @@ msgstr "특정 유형으로 제한" + msgid "" + "Allow removing of install-only packages. Using this option may result in an " + "attempt to remove the running kernel." -msgstr "" -+msgstr "ダウンロード済みリポジトリーメタデータの保管場所。初期値は --download-path です。" -+ -+#: plugins/reposync.py:78 -+msgid "download only newest packages per-repo" -+msgstr "最新のパッケージ per-repo のみをダウンロード" ++msgstr "설치전용 꾸리미 제거를 허용합니다. 이 선택의 사용은 동작하고 있는 커널을 제거하는 결과가 나타날 수 있습니다." - #: plugins/reposync.py:80 --msgid "operate on source packages" --msgstr "ソースパッケージでの操作" -+msgid "Don't add the reponame to the download path." -+msgstr "ダウンロードパスにはリポネームを追加しないでください。" + #: plugins/debug.py:202 + msgid "name of dump file" +@@ -477,7 +519,7 @@ msgstr "덤프 파일의 이름" + #: plugins/debug.py:273 + #, python-format + msgid "Package %s is not available" +-msgstr "꾸러미 %s 사용할 수 없습니다" ++msgstr "꾸러미(package) %s 사용 할 수 없습니다" - #: plugins/reposync.py:82 -+msgid "where to store downloaded repositories" -+msgstr "ダウンロード済みリポジトリーの保管場所" -+ -+#: plugins/reposync.py:84 - msgid "try to set local timestamps of local files by the one on the server" --msgstr "" -+msgstr "サーバー上から、ローカルファイルのローカル timestamps の設定を試みます" + #: plugins/debug.py:283 + #, python-format +@@ -486,31 +528,31 @@ msgstr "잘못된 dnf 디버그 파일 : %s" --#: plugins/reposync.py:85 -+#: plugins/reposync.py:87 -+msgid "operate on source packages" -+msgstr "ソースパッケージでの操作" -+ -+#: plugins/reposync.py:89 - msgid "Just list urls of what would be downloaded, don't download" --msgstr "" -+msgstr "ダウンロードする予定のものの URL をリストするだけで、ダウンロードしないでください" + #: plugins/debuginfo-install.py:56 + msgid "install debuginfo packages" +-msgstr "debuginfo 패키지 설치" ++msgstr "디버그정보 꾸러미(package) 설치" --#: plugins/reposync.py:109 -+#: plugins/reposync.py:113 - msgid "Can't use --norepopath with multiple repositories" + #: plugins/debuginfo-install.py:180 + #, python-format + msgid "" + "Could not find debuginfo package for the following available packages: %s" -msgstr "" -+msgstr "複数のリポジトリーでは -norepopath は使えません" ++msgstr "다음 사용가능한 꾸러미(package): %s 를 위하여 디버그정보 꾸러미를 찾을 수 없습니다" --#: plugins/reposync.py:127 -+#: plugins/reposync.py:132 + #: plugins/debuginfo-install.py:185 #, python-format - msgid "Failed to get mirror for metadata: %s" + msgid "" + "Could not find debugsource package for the following available packages: %s" -msgstr "" -+msgstr "メタデータのミラー取得に失敗しました: %s" ++msgstr "다음 가용한 꾸러미(package): %s 를 위하여 디버그자원 꾸러미(package)를 찾을 수 없습니다" --#: plugins/reposync.py:144 -+#: plugins/reposync.py:149 - msgid "Failed to get mirror for the group file." + #: plugins/debuginfo-install.py:190 + #, python-format + msgid "" + "Could not find debuginfo package for the following installed packages: %s" -msgstr "" -+msgstr "グループファイルのミラー取得に失敗しました。" -+ -+#: plugins/reposync.py:168 -+msgid "Removing {}: {}" -+msgstr "{} の削除中: {}" ++msgstr "다음 설치된 꾸러미(package): %s 를 위한 디버그정보 꾸러미(package)를 찾을 수 없습니다" - #: plugins/reposync.py:175 -+msgid "GPG signature check failed." -+msgstr "GPG 署名の確認に失敗しました。" -+ -+#: plugins/reposync.py:196 - msgid "Download target '{}' is outside of download path '{}'." + #: plugins/debuginfo-install.py:195 + #, python-format + msgid "" + "Could not find debugsource package for the following installed packages: %s" -msgstr "" -+msgstr "ダウンロードターゲット '{}' は、ダウンロードパス '{}' の外にあります。" ++msgstr "다음 설치된 꾸러미(package): %s 를 위하여 디버그자원 꾸러미(package)를 찾을 수 없습니다" --#: plugins/reposync.py:190 -+#: plugins/reposync.py:211 - #, python-format - msgid "[DELETED] %s" - msgstr "[DELETED] %s" + #: plugins/debuginfo-install.py:199 + msgid "Unable to find a match" +@@ -518,51 +560,51 @@ msgstr "일치하는 항목을 찾을 수 없습니다" --#: plugins/reposync.py:192 -+#: plugins/reposync.py:213 - #, python-format - msgid "failed to delete file %s" - msgstr "ファイル %s の削除に失敗しました" + #: plugins/download.py:41 + msgid "Download package to current directory" +-msgstr "현재 디렉토리에 패키지 다운로드" ++msgstr "현재 디렉토리에 꾸러미 내려받기" --#: plugins/reposync.py:201 -+#: plugins/reposync.py:222 - #, python-format - msgid "comps.xml for repository %s saved" - msgstr "リポジトリー %s の comps.xml が保存されました" -@@ -992,15 +1163,15 @@ msgstr "除外を追加:" + #: plugins/download.py:51 + msgid "packages to download" +-msgstr "다운로드 할 패키지" ++msgstr "내려받기 할 꾸러미" - #: plugins/versionlock.py:36 - msgid "Package already locked in equivalent form:" --msgstr "" -+msgstr "同等の形で既にロックされているパッケージ。" + #: plugins/download.py:53 + msgid "download the src.rpm instead" +-msgstr "대신 src.rpm을 다운로드하십시오." ++msgstr "대신 src.rpm을 내려받으세요" - #: plugins/versionlock.py:37 - msgid "Package {} is already locked" --msgstr "" -+msgstr "パッケージ {} は既にロックされています" + #: plugins/download.py:55 + msgid "download the -debuginfo package instead" +-msgstr "대신 -debuginfo 패키지를 다운로드하십시오." ++msgstr "대신 -debuginfo 꾸러미(package)를 내려받아요" - #: plugins/versionlock.py:38 - msgid "Package {} is already excluded" + #: plugins/download.py:57 + msgid "download the -debugsource package instead" -msgstr "" -+msgstr "パッケージ{}はすでに除外されています" ++msgstr "대신 -debuginfo 꾸러미(package)를 내려받으세요" - #: plugins/versionlock.py:39 - msgid "Deleting versionlock for:" -@@ -1032,7 +1203,7 @@ msgstr "パッケージバージョンロックの制御" + #: plugins/download.py:60 + msgid "limit the query to packages of given architectures." +-msgstr "쿼리를 주어진 아키텍처의 패키지로 제한하십시오." ++msgstr "요청를 주어진 구조 꾸러미(package)로 제한하십시오." - #: plugins/versionlock.py:136 - msgid "Use package specifications as they are, do not try to parse them" + #: plugins/download.py:62 + msgid "resolve and download needed dependencies" +-msgstr "필요한 종속성을 해결하고 다운로드하십시오." ++msgstr "필요한 종속성을 해결하고 내려받아요" + + #: plugins/download.py:64 + msgid "" + "when running with --resolve, download all dependencies (do not exclude " + "already installed ones)" -msgstr "" -+msgstr "パッケージ仕様をそのまま使用し、解析を試みないでください" ++msgstr "--resolve 와 함께 실행 할 때에, 모든 의존성을 내려받습니다 (이미 설치된 것들은 포함하지 않습니다)" - #~ msgid "" - #~ "\n" -diff --git a/po/ko.po b/po/ko.po -index 3f4eb89..a8ba74b 100644 ---- a/po/ko.po -+++ b/po/ko.po -@@ -3,7 +3,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 10:06+0100\n" - "PO-Revision-Date: 2020-09-12 11:29+0000\n" - "Last-Translator: Ludek Janda \n" - "Language-Team: Korean \n" -@@ -559,7 +559,7 @@ msgstr "다운로드 대신 rpms를 다운로드 할 수있는 URL 목록 인쇄 + #: plugins/download.py:67 + msgid "" + "print list of urls where the rpms can be downloaded instead of downloading" +-msgstr "다운로드 대신 rpms를 다운로드 할 수있는 URL 목록 인쇄" ++msgstr "내려받기 대신 rpms를 내려받기 할 수 있는 URL 목록 인쇄" + + #: plugins/download.py:72 msgid "when running with --url, limit to specific protocols" - msgstr "--url을 사용하여 실행하면 특정 프로토콜로 제한됩니다." +-msgstr "--url을 사용하여 실행하면 특정 프로토콜로 제한됩니다." ++msgstr "--url을 사용하여 실행하면 특정 통신규약이 제한됩니다" -#: plugins/download.py:121 plugins/reposync.py:293 +#: plugins/download.py:121 plugins/reposync.py:314 #, python-format msgid "Failed to get mirror for package: %s" - msgstr "패키지 미러링에 실패했습니다. %s" -@@ -582,6 +582,132 @@ msgstr "소스 rpm이 정의되지 않았습니다. %s" - msgid "No package %s available." - msgstr "패키지 없음 %s 유효한." +-msgstr "패키지 미러링에 실패했습니다. %s" ++msgstr "꾸러미 연결주소 얻기에 실패했습니다: %s" + #: plugins/download.py:243 + msgid "Exiting due to strict setting." +@@ -570,7 +612,7 @@ msgstr "엄격한 설정으로 인해 종료됩니다." + + #: plugins/download.py:261 + msgid "Error in resolve of packages:" +-msgstr "패키지 해결 오류 :" ++msgstr "꾸러미(package) 해결 오류 :" + + #: plugins/download.py:279 + #, python-format +@@ -580,27 +622,141 @@ msgstr "소스 rpm이 정의되지 않았습니다. %s" + #: plugins/download.py:296 plugins/download.py:309 + #, python-format + msgid "No package %s available." +-msgstr "패키지 없음 %s 유효한." ++msgstr "가용한 꾸러미(package) %s가 없습니다." ++ +#: plugins/groups_manager.py:49 +msgid "Invalid group id" -+msgstr "" ++msgstr "유효하지 않는 그룹 id" + +#: plugins/groups_manager.py:58 +msgid "Invalid translated data, should be in form 'lang:text'" -+msgstr "" ++msgstr "잘못 번역된 자료, 형식 'lang:text' 에 있어야 합니다" + +#: plugins/groups_manager.py:61 +msgid "Invalid/empty language for translated data" -+msgstr "" ++msgstr "번역된 자료가 유효하지 않음/비워짐" + +#: plugins/groups_manager.py:71 +msgid "Can't generate group id from '{}'. Please specify group id using --id." -+msgstr "" ++msgstr "'{}' 에서 그룹 id를 발생 할 수 없습니다. --id를 사용하여 그룹 id를 지정해 주세요." + +#: plugins/groups_manager.py:79 +msgid "create and edit groups metadata file" -+msgstr "" ++msgstr "그룹 메타데이타 파일 생성하고 수정합니다" + +#: plugins/groups_manager.py:90 +msgid "load groups metadata from file" -+msgstr "" ++msgstr "파일에서 그룹 메타파일을 적재합니다" + +#: plugins/groups_manager.py:93 +msgid "save groups metadata to file" -+msgstr "" ++msgstr "그룹 메타자료를 파일에 저장합니다" + +#: plugins/groups_manager.py:95 +msgid "load and save groups metadata to file" -+msgstr "" ++msgstr "그룹 메타파일을 파일에 적재하고 저장합니다" + +#: plugins/groups_manager.py:97 -+#, fuzzy -+#| msgid "print variable values to stdout" +msgid "print the result metadata to stdout" -+msgstr "변수 값을 표준 출력으로 출력" ++msgstr "결과 메타데이타를 표준출력으로 출력한다" + +#: plugins/groups_manager.py:100 +msgid "group id" -+msgstr "" ++msgstr "그룹 id" + +#: plugins/groups_manager.py:101 +msgid "group name" -+msgstr "" ++msgstr "그룹 이름" + +#: plugins/groups_manager.py:103 -+#, fuzzy -+#| msgid "No description given" +msgid "group description" -+msgstr "설명이 없습니다." ++msgstr "그룹 설명" + +#: plugins/groups_manager.py:105 +msgid "group display order" -+msgstr "" ++msgstr "그룸 표시 순서" + +#: plugins/groups_manager.py:108 +msgid "translated name for the group" -+msgstr "" ++msgstr "그룹을 위한 번역된 이름" + +#: plugins/groups_manager.py:111 +msgid "translated description for the group" -+msgstr "" ++msgstr "그룹을 위한 번역 설명" + +#: plugins/groups_manager.py:115 +msgid "make the group user visible (default)" -+msgstr "" ++msgstr "그룹 사용자를 표시 (기본값)" + +#: plugins/groups_manager.py:118 +msgid "make the group user invisible" -+msgstr "" ++msgstr "그룹 사용자를 보이지 않게 표시" + +#: plugins/groups_manager.py:123 +msgid "add packages to the mandatory section" -+msgstr "" ++msgstr "꾸러미(package)를 필 수 부분에 추가합니다" + +#: plugins/groups_manager.py:125 +msgid "add packages to the optional section" -+msgstr "" ++msgstr "꾸러미(package)를 선택 부분에 추가합니다" + +#: plugins/groups_manager.py:127 +msgid "remove packages from the group instead of adding them" -+msgstr "" ++msgstr "추가하기 대신에 그룹에서 꾸러미(package)를 제거합니다" + +#: plugins/groups_manager.py:129 -+#, fuzzy -+#| msgid "Display a list of unresolved dependencies for repositories" +msgid "include also direct dependencies for packages" -+msgstr "저장소에 대한 확인되지 않은 종속성 목록 표시" ++msgstr "꾸러미(package)를 위해 직접적인 의존성을 포함한다" + +#: plugins/groups_manager.py:132 +msgid "package specification" -+msgstr "" ++msgstr "꾸러미(package) 사양" + +#: plugins/groups_manager.py:156 +msgid "Can't edit group without specifying it (use --id or --name)" -+msgstr "" ++msgstr "이것(user --id 또느 --name)을 특정하지 않고 그룹을 수정 할 수 없습니다" + +#: plugins/groups_manager.py:190 -+#, fuzzy -+#| msgid "Can't write file '{}'" +msgid "Can't load file \"{}\": {}" -+msgstr "'{}'파일을 쓸 수 없습니다." ++msgstr "파일 \"{}\": {} 를 적재 할 수 없습니다" + +#: plugins/groups_manager.py:206 -+#, fuzzy -+#| msgid "Can't write file '{}'" +msgid "Can't save file \"{}\": {}" -+msgstr "'{}'파일을 쓸 수 없습니다." ++msgstr "파일 \"{}\": {}을 저장 할 수 없습니다" + +#: plugins/groups_manager.py:259 -+#, fuzzy -+#| msgid "No match for argument: %s" +msgid "No match for argument: {}" -+msgstr "인수와 일치하는 항목 없음 : %s" ++msgstr "일치하는 인수가 없습니다 :{}" + +#: plugins/groups_manager.py:296 +msgid "Can't remove packages from non-existent group" -+msgstr "" ++msgstr "존재하지 않는 그룹에서 꾸러미(package)를 제거 할 수 없습니다" + +#: plugins/groups_manager.py:305 +msgid "" +"Group id '{}' generated from '{}' is duplicit. Please specify group id using" +" --id." -+msgstr "" -+ ++msgstr "'{}'에서 발생한 그룹 id '{}'는 중복되었습니다. --id를 사용하여 그룹 id를 지정하기 바랍니다." + #: plugins/leaves.py:32 msgid "List installed packages not required by any other package" - msgstr "다른 패키지에서 필요하지 않은 설치된 패키지 나열" -@@ -614,43 +740,47 @@ msgstr "yum의 히스토리, 그룹 및 yumdb 데이터를 dnf로 마이그레 +-msgstr "다른 패키지에서 필요하지 않은 설치된 패키지 나열" ++msgstr "다른 꾸러미(package)에서 필요하지 않은 설치된 꾸러미(packages) 나열" + + #: plugins/local.py:122 + msgid "Unable to create a directory '{}' due to '{}'" +-msgstr "'{}'(으)로 인해 '{}'디렉토리를 만들 수 없습니다." ++msgstr "'{}'(으)로 인해 '{}'디렉토리를 만들 수 없습니다" + + #: plugins/local.py:126 + msgid "'{}' is not a directory" +-msgstr "'{}'은 (는) 디렉토리가 아닙니다." ++msgstr "'{}'는 디렉토리가 아닙니다" + + #: plugins/local.py:135 + msgid "Copying '{}' to local repo" +-msgstr "'{}'을 (를) 로컬 저장소로 복사 중입니다." ++msgstr "'{}'을 로컬 저장소로 복사 중입니다" + + #: plugins/local.py:141 + msgid "Can't write file '{}'" +-msgstr "'{}'파일을 쓸 수 없습니다." ++msgstr "'{}'파일을 쓸 수 없습니다" + + #: plugins/local.py:156 + msgid "Rebuilding local repo" +@@ -608,73 +764,79 @@ msgstr "지역 레포 복구" + + #: plugins/migrate.py:45 + msgid "migrate yum's history, group and yumdb data to dnf" +-msgstr "yum의 히스토리, 그룹 및 yumdb 데이터를 dnf로 마이그레이션합니다." ++msgstr "yum 사용기록, 그룹 및 yumdb 데이터를 dnf로 마이그레이션합니다" + + #: plugins/migrate.py:54 msgid "Migrating history data..." msgstr "기록 데이터 마이그레이션 중 ..." --#: plugins/needs_restarting.py:65 -+#: plugins/needs_restarting.py:66 - #, python-brace-format +-#: plugins/needs_restarting.py:65 ++#: plugins/needs_restarting.py:66 + #, python-brace-format + msgid "" + "No installed package found for package name \"{pkg}\" specified in needs-" + "restarting file \"{file}\"." + msgstr "" ++"재시작이 필요한 파일 \"{file}\" 에 지정한 꾸러미 이름 \"{pkg}\"을 위하여 설치된 꾸러미(package)를 찾을 수 " ++"없습니다." + +-#: plugins/needs_restarting.py:199 ++#: plugins/needs_restarting.py:224 + msgid "determine updated binaries that need restarting" + msgstr "다시 시작해야하는 업데이트 된 바이너리 결정" + +-#: plugins/needs_restarting.py:204 ++#: plugins/needs_restarting.py:229 + msgid "only consider this user's processes" +-msgstr "이 사용자의 프로세스 만 고려하십시오." ++msgstr "이 사용자의 프로세스만 고려하세요" + +-#: plugins/needs_restarting.py:206 ++#: plugins/needs_restarting.py:231 + msgid "" + "only report whether a reboot is required (exit code 1) or not (exit code 0)" +-msgstr "" ++msgstr "재시작이 요구되는 (exit code 1) 또는 아닌(exit code0) 경우에만 보고합니다" + +-#: plugins/needs_restarting.py:230 ++#: plugins/needs_restarting.py:234 ++msgid "only report affected systemd services" ++msgstr "systemd 서비스에 영향을 미치는 것만 보고합니다" ++ ++#: plugins/needs_restarting.py:257 + msgid "Core libraries or services have been updated since boot-up:" +-msgstr "" ++msgstr "Core 라이브러리와 서비스는 재시작 이 후에 최신화 됩니다:" + +-#: plugins/needs_restarting.py:235 ++#: plugins/needs_restarting.py:262 + msgid "Reboot is required to fully utilize these updates." +-msgstr "" ++msgstr "재시작은 이들 최신화를 완전히 사용하려면 필요합니다." + +-#: plugins/needs_restarting.py:236 ++#: plugins/needs_restarting.py:263 + msgid "More information:" +-msgstr "" ++msgstr "자세한 정보:" + +-#: plugins/needs_restarting.py:240 ++#: plugins/needs_restarting.py:267 + msgid "No core libraries or services have been updated since boot-up." +-msgstr "" ++msgstr "핵심 라이브러리와 서비스는 재시작 이 후에 최신화 되지 않습니다." + +-#: plugins/needs_restarting.py:242 ++#: plugins/needs_restarting.py:269 + msgid "Reboot should not be necessary." +-msgstr "" ++msgstr "재시작은 필요하지 않을 수 있습니다." + + #: plugins/post-transaction-actions.py:71 + #, python-format + msgid "Bad Action Line \"%s\": %s" +-msgstr "" ++msgstr "잘못된 동작 선 \"%s\": %s" + + #. unsupported state, skip it + #: plugins/post-transaction-actions.py:130 + #, python-format + msgid "Bad Transaction State: %s" +-msgstr "" ++msgstr "잘못된 연결 상태: %s" + + #: plugins/post-transaction-actions.py:153 + #: plugins/post-transaction-actions.py:155 + #, python-format + msgid "post-transaction-actions: %s" +-msgstr "" ++msgstr "연결 후 동작: %s" + + #: plugins/post-transaction-actions.py:157 + #, python-format + msgid "post-transaction-actions: Bad Command \"%s\": %s" +-msgstr "" ++msgstr "연결 후 동작: 잘못된 명령 \"%s\": %s" + + #: plugins/repoclosure.py:42 + msgid "Display a list of unresolved dependencies for repositories" +@@ -686,149 +848,157 @@ msgstr "재구 축은 해결되지 않은 종속성으로 종료되었습니다. + + #: plugins/repoclosure.py:153 + msgid "check packages of the given archs, can be specified multiple times" +-msgstr "지정된 아치의 패키지를 검사하고 여러 번 지정할 수 있습니다." ++msgstr "지정된 아치의 꾸러미(package)를 검사하고 여러 번 지정할 수 있습니다" + + #: plugins/repoclosure.py:156 + msgid "Specify repositories to check" +-msgstr "확인할 저장소를 지정하십시오." ++msgstr "점검 할 저장소를 지정하세요" + + #: plugins/repoclosure.py:158 + msgid "Check only the newest packages in the repos" +-msgstr "리포지토리의 최신 패키지 만 확인하십시오." ++msgstr "저장소 최신 꾸러미(package)만 확인하세요" + + #: plugins/repoclosure.py:161 + msgid "Check closure for this package only" +-msgstr "이 패키지의 폐쇄 만 확인하십시오." ++msgstr "이 꾸러미(package)의 폐쇄만 확인하세요" + + #: plugins/repodiff.py:45 + msgid "List differences between two sets of repositories" +-msgstr "" ++msgstr "두 개의 저장소 구성 사이의 목록 차이점" + + #: plugins/repodiff.py:58 + msgid "Specify old repository, can be used multiple times" +-msgstr "" ++msgstr "여러번 사용될 수 있는, 오래된 저장소를 지정합니다" + + #: plugins/repodiff.py:60 + msgid "Specify new repository, can be used multiple times" +-msgstr "" ++msgstr "여러 번 사용 될 수 있는, 새로운 저장소를 지정합니다" + + #: plugins/repodiff.py:63 msgid "" - "No installed package found for package name \"{pkg}\" specified in needs-" - "restarting file \"{file}\"." - msgstr "" + "Specify architectures to compare, can be used multiple times. By default, " + "only source rpms are compared." +-msgstr "" ++msgstr "비교 할 구조를 지정하고, 여러 번 사용 될 수 있습니다. 기본적으로, 자원 rpms만 비교됩니다." --#: plugins/needs_restarting.py:199 -+#: plugins/needs_restarting.py:224 - msgid "determine updated binaries that need restarting" - msgstr "다시 시작해야하는 업데이트 된 바이너리 결정" + #: plugins/repodiff.py:67 + msgid "Output additional data about the size of the changes." +-msgstr "" ++msgstr "크기 변화에 대한 추가 자료를 출력합니다." --#: plugins/needs_restarting.py:204 -+#: plugins/needs_restarting.py:229 - msgid "only consider this user's processes" - msgstr "이 사용자의 프로세스 만 고려하십시오." + #: plugins/repodiff.py:69 + msgid "" + "Compare packages also by arch. By default packages are compared just by " + "name." +-msgstr "" ++msgstr "구조에 의해 꾸러미(package) 또한 비교합니다. 기본적으로 꾸러미(package)는 이름으로만 비교됩니다." --#: plugins/needs_restarting.py:206 -+#: plugins/needs_restarting.py:231 + #: plugins/repodiff.py:72 + msgid "Output a simple one line message for modified packages." +-msgstr "" ++msgstr "수정된 꾸러미(pacakage)지를 위해 단순히 한 줄 메시지를 출력합니다." + + #: plugins/repodiff.py:74 msgid "" - "only report whether a reboot is required (exit code 1) or not (exit code 0)" - msgstr "" + "Split the data for modified packages between upgraded and downgraded " + "packages." +-msgstr "" ++msgstr "향상 또는 향상 꾸러미 사이에서 변형된 꾸러미를 위해 자료를 분할합니다." --#: plugins/needs_restarting.py:230 -+#: plugins/needs_restarting.py:234 -+msgid "only report affected systemd services" -+msgstr "" -+ -+#: plugins/needs_restarting.py:257 - msgid "Core libraries or services have been updated since boot-up:" - msgstr "" + #: plugins/repodiff.py:86 + msgid "Both old and new repositories must be set." +-msgstr "" ++msgstr "오래된 것과 새로운 저장소 모두 구성되어야 합니다." --#: plugins/needs_restarting.py:235 -+#: plugins/needs_restarting.py:262 - msgid "Reboot is required to fully utilize these updates." + #: plugins/repodiff.py:178 + msgid "Size change: {} bytes" +-msgstr "" ++msgstr "크기 변화: {} bytes" + + #: plugins/repodiff.py:184 + msgid "Added package : {}" +-msgstr "" ++msgstr "추가된 꾸러미(package) : {}" + + #: plugins/repodiff.py:187 + msgid "Removed package: {}" +-msgstr "" ++msgstr "제거된 꾸러미(package): {}" + + #: plugins/repodiff.py:190 + msgid "Obsoleted by : {}" +-msgstr "" ++msgstr "사용되지 않음 : {}" + + #: plugins/repodiff.py:195 + msgid "" + "\n" + "Upgraded packages" msgstr "" ++"\n" ++"향상된 꾸러미(package)" --#: plugins/needs_restarting.py:236 -+#: plugins/needs_restarting.py:263 - msgid "More information:" + #: plugins/repodiff.py:200 + msgid "" + "\n" + "Downgraded packages" msgstr "" ++"\n" ++"꾸러미 하향설치" --#: plugins/needs_restarting.py:240 -+#: plugins/needs_restarting.py:267 - msgid "No core libraries or services have been updated since boot-up." + #: plugins/repodiff.py:207 + msgid "" + "\n" + "Modified packages" msgstr "" ++"\n" ++"변형된 꾸러미(package)" --#: plugins/needs_restarting.py:242 -+#: plugins/needs_restarting.py:269 - msgid "Reboot should not be necessary." + #: plugins/repodiff.py:212 + msgid "" + "\n" + "Summary" msgstr "" ++"\n" ++"요약" + + #: plugins/repodiff.py:213 + msgid "Added packages: {}" +-msgstr "" ++msgstr "추가된 꾸러미(package): {}" + + #: plugins/repodiff.py:214 + msgid "Removed packages: {}" +-msgstr "" ++msgstr "제거된 꾸러미(package): {}" + + #: plugins/repodiff.py:216 + msgid "Upgraded packages: {}" +-msgstr "" ++msgstr "향상된 꾸러미(package): {}" + + #: plugins/repodiff.py:217 + msgid "Downgraded packages: {}" +-msgstr "" ++msgstr "하향설치된 꾸러미: {}" + + #: plugins/repodiff.py:219 + msgid "Modified packages: {}" +-msgstr "" ++msgstr "변형된 꾸러미(package): {}" + + #: plugins/repodiff.py:222 + msgid "Size of added packages: {}" +-msgstr "" ++msgstr "크기가 증가된 꾸러미(package): {}" + + #: plugins/repodiff.py:223 + msgid "Size of removed packages: {}" +-msgstr "" ++msgstr "크기가 제거된 꾸러미(package): {}" + + #: plugins/repodiff.py:225 + msgid "Size of modified packages: {}" +-msgstr "" ++msgstr "크기가 변형된 꾸러미(package): {}" + + #: plugins/repodiff.py:228 + msgid "Size of upgraded packages: {}" +-msgstr "" ++msgstr "크기가 향상된 꾸러미: {}" + + #: plugins/repodiff.py:230 + msgid "Size of downgraded packages: {}" +-msgstr "" ++msgstr "크기가 하향설치된 꾸러미: {}" + + #: plugins/repodiff.py:232 + msgid "Size change: {}" +-msgstr "" ++msgstr "크기 변경: {}" + + #: plugins/repograph.py:50 + msgid "Output a full package dependency graph in dot format" +-msgstr "도트 형식의 전체 패키지 종속성 그래프 출력" ++msgstr "도트 형식의 전체 꾸러미(package) 종속성 그래프 출력" -@@ -871,84 +1001,96 @@ msgstr "보관할 최신 N 패키지 - 기본값은 1입니다." + #: plugins/repograph.py:110 + #, python-format +@@ -837,27 +1007,27 @@ msgstr "아무것도 제공하지 않습니다 : '%s'" + + #: plugins/repomanage.py:45 + msgid "Manage a directory of rpm packages" +-msgstr "rpm 패키지 디렉토리 관리" ++msgstr "rpm 꾸러미(package) 디렉토리 관리" + + #: plugins/repomanage.py:59 + msgid "Pass either --old or --new, not both!" +-msgstr "--old 또는 --new 중 하나를 전달하십시오." ++msgstr "--old 또는 --new 중 하나를 전달하세요!" + + #: plugins/repomanage.py:71 + msgid "No files to process" +-msgstr "처리 할 파일이 없습니다." ++msgstr "처리 할 파일 없음" + + #: plugins/repomanage.py:93 + msgid "Could not open {}" +-msgstr "{}을 (를) 열 수 없습니다." ++msgstr "{}을 열 수 없습니다" + + #: plugins/repomanage.py:177 + msgid "Print the older packages" +-msgstr "이전 패키지 인쇄" ++msgstr "이전 꾸러미(package) 인쇄" + + #: plugins/repomanage.py:179 + msgid "Print the newest packages" +-msgstr "최신 패키지 인쇄" ++msgstr "최신 꾸러미(package) 인쇄" + + #: plugins/repomanage.py:181 + msgid "Space separated output, not newline" +@@ -865,97 +1035,109 @@ msgstr "공백으로 구분 된 출력이 아닌 개행 문자" + + #: plugins/repomanage.py:183 + msgid "Newest N packages to keep - defaults to 1" +-msgstr "보관할 최신 N 패키지 - 기본값은 1입니다." ++msgstr "보관할 최신 N 꾸러미(package) - 기본값은 1입니다" + + #: plugins/repomanage.py:186 msgid "Path to directory" msgstr "디렉토리 경로" -#: plugins/reposync.py:54 +#: plugins/reposync.py:55 msgid "download all packages from remote repo" - msgstr "원격 저장소에서 모든 패키지를 다운로드하십시오." +-msgstr "원격 저장소에서 모든 패키지를 다운로드하십시오." ++msgstr "원격 저장소에서 모든 꾸러미(package)를 내려받아요" -#: plugins/reposync.py:63 +#: plugins/reposync.py:64 msgid "download only packages for this ARCH" - msgstr "이 ARCH 용 패키지 만 다운로드하십시오." +-msgstr "이 ARCH 용 패키지 만 다운로드하십시오." ++msgstr "이 ARCH용 꾸러미(package)만 내려받아요" -#: plugins/reposync.py:65 +#: plugins/reposync.py:66 msgid "delete local packages no longer present in repository" - msgstr "저장소에 더 이상 존재하지 않는 로컬 패키지 삭제" +-msgstr "저장소에 더 이상 존재하지 않는 로컬 패키지 삭제" ++msgstr "저장소에 더 이상 존재하지 않는 로컬 꾸러미(package) 삭제" -#: plugins/reposync.py:67 -msgid "also download and uncompress comps.xml" @@ -1796,19 +2255,21 @@ index 3f4eb89..a8ba74b 100644 -#: plugins/reposync.py:69 +#: plugins/reposync.py:68 msgid "download all the metadata." - msgstr "" +-msgstr "" ++msgstr "모든 메타데이타 내려받기." -#: plugins/reposync.py:71 -msgid "download only newest packages per-repo" -msgstr "repo 당 최신 패키지 만 다운로드하십시오." +#: plugins/reposync.py:70 +msgid "Remove packages that fail GPG signature checking after downloading" -+msgstr "" ++msgstr "내려받기 후에 점검한 GPG 서명이 실패한 꾸러미를 제거합니다" #: plugins/reposync.py:73 -msgid "where to store downloaded repositories" +-msgstr "" +msgid "also download and uncompress comps.xml" - msgstr "" ++msgstr "또한 comps.xml 내려받기와 압축 풀기" #: plugins/reposync.py:75 -msgid "Don't add the reponame to the download path." @@ -1818,62 +2279,69 @@ index 3f4eb89..a8ba74b 100644 msgid "" "where to store downloaded repository metadata. Defaults to the value of " "--download-path." - msgstr "" - +-msgstr "" ++msgstr "내려받은 저장소 메타데이타를 저장하기 위한 장소. --download-path의 값으로 기본 지정합니다." ++ +#: plugins/reposync.py:78 +msgid "download only newest packages per-repo" -+msgstr "repo 당 최신 패키지 만 다운로드하십시오." -+ ++msgstr "저장소 최신 꾸러미(package)만 내려받아요" + #: plugins/reposync.py:80 -msgid "operate on source packages" -msgstr "소스 패키지를 조작한다." +msgid "Don't add the reponame to the download path." -+msgstr "" ++msgstr "내려받기 경로에 저장소이름을 추가하지 않습니다." #: plugins/reposync.py:82 +msgid "where to store downloaded repositories" -+msgstr "" ++msgstr "내려받기 한 저장소를 저장할 위치" + +#: plugins/reposync.py:84 msgid "try to set local timestamps of local files by the one on the server" - msgstr "" +-msgstr "" ++msgstr "서버에 있는 하나에서 로컬파일의 로컬 타임스템프 설정을 시도하세요" -#: plugins/reposync.py:85 +#: plugins/reposync.py:87 +msgid "operate on source packages" -+msgstr "소스 패키지를 조작한다." ++msgstr "자원 꾸러미에서 동작합니다" + +#: plugins/reposync.py:89 msgid "Just list urls of what would be downloaded, don't download" - msgstr "" +-msgstr "" ++msgstr "내려 받을 수 있는 url만 목록화하며, 내려 받지 않습니다" -#: plugins/reposync.py:109 +#: plugins/reposync.py:113 msgid "Can't use --norepopath with multiple repositories" - msgstr "" +-msgstr "" ++msgstr "다중 저장소와 함께 --norepath를 사용 할 수 없습니다" -#: plugins/reposync.py:127 +#: plugins/reposync.py:132 #, python-format msgid "Failed to get mirror for metadata: %s" - msgstr "" +-msgstr "" ++msgstr "메타데이타에 대한 연결주소 얻기를 실패하였습니다:%s" -#: plugins/reposync.py:144 +#: plugins/reposync.py:149 msgid "Failed to get mirror for the group file." - msgstr "" - +-msgstr "" ++msgstr "그룹 파일을 위하여 연결주소 얻기에 실패하였습니다." ++ +#: plugins/reposync.py:168 +msgid "Removing {}: {}" -+msgstr "" -+ ++msgstr "제거하기{}: {}" + #: plugins/reposync.py:175 +msgid "GPG signature check failed." -+msgstr "" ++msgstr "GPG 서명 점검이 실패하였습니다." + +#: plugins/reposync.py:196 msgid "Download target '{}' is outside of download path '{}'." - msgstr "" +-msgstr "" ++msgstr "내려받기 대상 '{}'는 내려받기 경로'{}'의 밖에 있습니다." -#: plugins/reposync.py:190 +#: plugins/reposync.py:211 @@ -1892,15 +2360,104 @@ index 3f4eb89..a8ba74b 100644 #, python-format msgid "comps.xml for repository %s saved" msgstr "저장소에 대한 comps.xml %s 저장된" + + #: plugins/show_leaves.py:54 + msgid "New leaves:" +-msgstr "새 잎 :" ++msgstr "독립 꾸러미(package):" + + #: plugins/versionlock.py:32 + #, python-format +@@ -964,59 +1146,59 @@ msgstr "버전 잠금 설정을 읽을 수 없습니다 : %s" + + #: plugins/versionlock.py:33 + msgid "Locklist not set" +-msgstr "잠금 목록이 설정되지 않았습니다." ++msgstr "잠금 목록 설정되지 않음" + + #: plugins/versionlock.py:34 + msgid "Adding versionlock on:" +-msgstr "" ++msgstr "버전잠금 설정 추가하기:" + + #: plugins/versionlock.py:35 + msgid "Adding exclude on:" +-msgstr "" ++msgstr "제외 하기 추가하기:" + + #: plugins/versionlock.py:36 + msgid "Package already locked in equivalent form:" +-msgstr "" ++msgstr "꾸러미(package)는 이미 동일한 형태로 잠겨졌습니다:" + + #: plugins/versionlock.py:37 + msgid "Package {} is already locked" +-msgstr "" ++msgstr "꾸러미(package) {} 는 이미 잠겨졌습니다" + + #: plugins/versionlock.py:38 + msgid "Package {} is already excluded" +-msgstr "" ++msgstr "꾸러미(package) {} 는 이미 제외되었습니다" + + #: plugins/versionlock.py:39 + msgid "Deleting versionlock for:" +-msgstr "" ++msgstr "버전 잠금을 제거하기:" + + #: plugins/versionlock.py:40 + msgid "No package found for:" +-msgstr "" ++msgstr "찾고자 하는 꾸러미(package)가 없습니다:" + + #: plugins/versionlock.py:41 + msgid "Excludes from versionlock plugin were not applied" +-msgstr "" ++msgstr "버전 잠금 플러그인에서 제외는 적용되지 않습니다" + + #: plugins/versionlock.py:42 + msgid "Versionlock plugin: number of lock rules from file \"{}\" applied: {}" +-msgstr "" ++msgstr "버전 잠금 플러그인: 적용된 파일 \"{} \"에서 잠금 규칙의 수: {}" + + #: plugins/versionlock.py:43 + msgid "Versionlock plugin: number of exclude rules from file \"{}\" applied: {}" +-msgstr "" ++msgstr "버전 잠금 플러그인: 적용된 파일 \"{} \"에서 제외 규칙의 수: {}" + + #: plugins/versionlock.py:44 + msgid "Versionlock plugin: could not parse pattern:" +-msgstr "" ++msgstr "버전 잠금 플러그인: 유형을 구문 분석 할 수 없습니다:" + + #: plugins/versionlock.py:130 + msgid "control package version locks" +-msgstr "" ++msgstr "꾸러미 버전 잠금을 제어합니다" + + #: plugins/versionlock.py:136 + msgid "Use package specifications as they are, do not try to parse them" +-msgstr "" ++msgstr "꾸러미(package) 사양을 그대로 사용하며, 구문 분석을 시도하지 않습니다" + + #~ msgid "" + #~ "\n" diff --git a/po/zh_CN.po b/po/zh_CN.po -index 151441d..27645c4 100644 +index 151441d..ea0afbc 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po -@@ -5,20 +5,21 @@ +@@ -1,24 +1,26 @@ + # Tommy He , 2015. #zanata + # Tommy He , 2016. #zanata + # mosquito , 2016. #zanata +-# Charles Lee , 2017. #zanata, 2020. ++# Charles Lee , 2017. #zanata, 2020, 2021. # cheng ye <18969068329@163.com>, 2017. #zanata - # Ludek Janda , 2018. #zanata +-# Ludek Janda , 2018. #zanata ++# Ludek Janda , 2018. #zanata, 2021. # Hongqiao Chen , 2020. +# Sundeep Anand , 2021. ++# Qiyu Yan , 2021. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" @@ -1910,8 +2467,8 @@ index 151441d..27645c4 100644 -"Last-Translator: Charles Lee \n" -"Language-Team: Chinese (Simplified) \n" +"POT-Creation-Date: 2021-02-22 10:06+0100\n" -+"PO-Revision-Date: 2021-03-08 11:08+0000\n" -+"Last-Translator: Sundeep Anand \n" ++"PO-Revision-Date: 2021-09-03 07:40+0000\n" ++"Last-Translator: Ludek Janda \n" +"Language-Team: Chinese (Simplified) \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" @@ -1919,11 +2476,11 @@ index 151441d..27645c4 100644 "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" ++"X-Generator: Weblate 4.8\n" #: plugins/builddep.py:45 msgid "[PACKAGE|PACKAGE.spec]" -@@ -39,7 +40,7 @@ msgstr "定义一个用于处理 Spec 文件的宏" +@@ -39,7 +41,7 @@ msgstr "定义一个用于处理 Spec 文件的宏" #: plugins/builddep.py:95 msgid "skip build dependencies not available in repositories" @@ -1932,7 +2489,7 @@ index 151441d..27645c4 100644 #: plugins/builddep.py:98 msgid "treat commandline arguments as spec files" -@@ -51,7 +52,7 @@ msgstr "将命令行参数作为源码 RPM 处理" +@@ -51,7 +53,7 @@ msgstr "将命令行参数作为源码 RPM 处理" #: plugins/builddep.py:144 msgid "RPM: {}" @@ -1941,12 +2498,12 @@ index 151441d..27645c4 100644 #: plugins/builddep.py:153 msgid "Some packages could not be found." -@@ -87,27 +88,27 @@ msgstr "无匹配软件包: %s" +@@ -87,27 +89,27 @@ msgstr "无匹配软件包: %s" #: plugins/changelog.py:37 #, python-brace-format msgid "Not a valid date: \"{0}\"." -msgstr "" -+msgstr "无效的日期 : \"{0}\"." ++msgstr "无效的日期 : \"{0}\"。" #: plugins/changelog.py:43 msgid "Show changelog data of packages" @@ -1970,11 +2527,11 @@ index 151441d..27645c4 100644 "show only new changelog entries for packages, that provide an upgrade for " "some of already installed packages." -msgstr "" -+msgstr "只显示软件包新的改变日志信息,为已安装的软件包提供升级" ++msgstr "只显示软件包新的改变日志信息,为已安装的软件包提供升级。" #: plugins/changelog.py:60 msgid "PACKAGE" -@@ -120,20 +121,20 @@ msgstr "未找到匹配的参数: %s" +@@ -120,20 +122,20 @@ msgstr "未找到匹配的参数: %s" #: plugins/changelog.py:109 msgid "Listing changelogs since {}" @@ -1985,7 +2542,7 @@ index 151441d..27645c4 100644 msgid "Listing only latest changelog" msgid_plural "Listing {} latest changelogs" -msgstr[0] "" -+msgstr[0] "只列出最新的改变日志" ++msgstr[0] "只列出最新 {} 项更改日志" #: plugins/changelog.py:116 msgid "Listing only new changelogs since installed version of the package" @@ -1999,7 +2556,7 @@ index 151441d..27645c4 100644 #: plugins/changelog.py:122 msgid "Changelogs for {}" -@@ -142,7 +143,7 @@ msgstr "{}的变更记录" +@@ -142,7 +144,7 @@ msgstr "{}的变更记录" #: plugins/config_manager.py:37 #, python-brace-format msgid "manage {prog} configuration options and repositories" @@ -2008,7 +2565,7 @@ index 151441d..27645c4 100644 #: plugins/config_manager.py:44 msgid "repo to modify" -@@ -166,21 +167,23 @@ msgstr "打印变量值到标准输出" +@@ -166,21 +168,23 @@ msgstr "打印变量值到标准输出" #: plugins/config_manager.py:60 msgid "enable repos (automatically saves)" @@ -2035,7 +2592,25 @@ index 151441d..27645c4 100644 #: plugins/config_manager.py:131 #, python-format -@@ -278,7 +281,7 @@ msgstr "按照用户 NAME 列出可用的 Copr 仓库" +@@ -220,7 +224,7 @@ msgstr "否" + + #: plugins/copr.py:79 + msgid "Interact with Copr repositories." +-msgstr "与 Copr 仓库交互" ++msgstr "与 Copr 仓库交互。" + + #: plugins/copr.py:81 + msgid "" +@@ -250,7 +254,7 @@ msgstr "" + " list --available-by-user=NAME\n" + " search project\n" + "\n" +-" Examples:\n" ++" 例如:\n" + " copr enable rhscl/perl516 epel-6-x86_64\n" + " copr enable ignatenkobrain/ocltoys\n" + " copr disable rhscl/perl516\n" +@@ -278,7 +282,7 @@ msgstr "按照用户 NAME 列出可用的 Copr 仓库" #: plugins/copr.py:115 msgid "Specify an instance of Copr to work with" @@ -2044,7 +2619,7 @@ index 151441d..27645c4 100644 #: plugins/copr.py:149 plugins/copr.py:217 plugins/copr.py:237 msgid "Error: " -@@ -289,10 +292,11 @@ msgid "" +@@ -289,10 +293,11 @@ msgid "" "specify Copr hub either with `--hub` or using " "`copr_hub/copr_username/copr_projectname` format" msgstr "" @@ -2057,7 +2632,7 @@ index 151441d..27645c4 100644 #: plugins/copr.py:218 plugins/copr.py:222 msgid "exactly two additional parameters to copr command are required" -@@ -320,6 +324,17 @@ msgid "" +@@ -320,6 +325,17 @@ msgid "" "Please do not file bug reports about these packages in Fedora\n" "Bugzilla. In case of problems, contact the owner of this repository.\n" msgstr "" @@ -2075,7 +2650,7 @@ index 151441d..27645c4 100644 #: plugins/copr.py:271 msgid "Repository successfully enabled." -@@ -343,6 +358,7 @@ msgid "" +@@ -343,6 +359,7 @@ msgid "" " about Copr hub - the default one was assumed. Re-enable the project to fix " "this." msgstr "" @@ -2083,7 +2658,16 @@ index 151441d..27645c4 100644 #: plugins/copr.py:353 msgid "Can't parse repositories for username '{}'." -@@ -401,15 +417,27 @@ msgid "" +@@ -374,7 +391,7 @@ msgstr "安全及明智的答案。退出。" + + #: plugins/copr.py:417 + msgid "This command has to be run under the root user." +-msgstr "该命令必须以 root 用户运行" ++msgstr "该命令必须以 root 用户运行。" + + #: plugins/copr.py:481 + msgid "" +@@ -401,15 +418,27 @@ msgid "" "\n" "These repositories have been enabled automatically." msgstr "" @@ -2109,11 +2693,11 @@ index 151441d..27645c4 100644 #, python-brace-format msgid "Failed to remove copr repo {0}/{1}/{2}" -msgstr "" -+msgstr "删除 copr repo {0}/{1}/{2} 失败" ++msgstr "删除 copr 仓库 {0}/{1}/{2} 失败" #: plugins/copr.py:593 msgid "Failed to disable copr repo {}/{}" -@@ -424,14 +452,12 @@ msgid "Interact with Playground repository." +@@ -424,14 +453,12 @@ msgid "Interact with Playground repository." msgstr "与 Playground 仓库交互。" #: plugins/copr.py:639 @@ -2121,7 +2705,7 @@ index 151441d..27645c4 100644 -#| msgid "Interact with Playground repository." msgid "Enabling a Playground repository." -msgstr "与 Playground 仓库交互。" -+msgstr "启用一个 Playground 仓库。" ++msgstr "启用 Playground 仓库。" #: plugins/copr.py:640 msgid "Do you want to continue?" @@ -2130,16 +2714,25 @@ index 151441d..27645c4 100644 #: plugins/copr.py:683 msgid "Playground repositories successfully enabled." -@@ -488,7 +514,7 @@ msgstr "限制到指定类型" +@@ -488,7 +515,7 @@ msgstr "限制到指定类型" msgid "" "Allow removing of install-only packages. Using this option may result in an " "attempt to remove the running kernel." -msgstr "" -+msgstr "允许删除只安装的软件包。使用这个选项可能会导致尝试删除正在运行的内核。" ++msgstr "允许删除仅安装(install-only)的软件包。使用这个选项可能会导致尝试删除正在运行的内核。" #: plugins/debug.py:202 msgid "name of dump file" -@@ -512,25 +538,25 @@ msgstr "安装调试信息软件包" +@@ -497,7 +524,7 @@ msgstr "转储文件名称" + #: plugins/debug.py:273 + #, python-format + msgid "Package %s is not available" +-msgstr "软件包 %s 不可用。" ++msgstr "软件包 %s 不可用" + + #: plugins/debug.py:283 + #, python-format +@@ -512,25 +539,25 @@ msgstr "安装调试信息软件包" #, python-format msgid "" "Could not find debuginfo package for the following available packages: %s" @@ -2169,7 +2762,7 @@ index 151441d..27645c4 100644 #: plugins/debuginfo-install.py:199 msgid "Unable to find a match" -@@ -554,7 +580,7 @@ msgstr "取而代之下载 -debuginfo 软件包" +@@ -554,11 +581,11 @@ msgstr "取而代之下载 -debuginfo 软件包" #: plugins/download.py:57 msgid "download the -debugsource package instead" @@ -2178,7 +2771,12 @@ index 151441d..27645c4 100644 #: plugins/download.py:60 msgid "limit the query to packages of given architectures." -@@ -568,7 +594,7 @@ msgstr "解析并下载所需的依赖关系" +-msgstr "限定查询指定架构的软件包" ++msgstr "限定查询指定架构的软件包。" + + #: plugins/download.py:62 + msgid "resolve and download needed dependencies" +@@ -568,7 +595,7 @@ msgstr "解析并下载所需的依赖关系" msgid "" "when running with --resolve, download all dependencies (do not exclude " "already installed ones)" @@ -2187,7 +2785,7 @@ index 151441d..27645c4 100644 #: plugins/download.py:67 msgid "" -@@ -579,7 +605,7 @@ msgstr "打印 rpm 可被下载的 url 列表而不是直接下载" +@@ -579,7 +606,7 @@ msgstr "打印 rpm 可被下载的 url 列表而不是直接下载" msgid "when running with --url, limit to specific protocols" msgstr "当执行时带有 --url 参数,则限制使用指定协议" @@ -2196,7 +2794,7 @@ index 151441d..27645c4 100644 #, python-format msgid "Failed to get mirror for package: %s" msgstr "获取针对以下软件包的镜像失败:%s" -@@ -602,13 +628,127 @@ msgstr "未找到所定义 %s 的源代码软件包 SRPM" +@@ -602,13 +629,127 @@ msgstr "未找到所定义 %s 的源代码软件包 SRPM" msgid "No package %s available." msgstr "没有可用的软件包 %s。" @@ -2325,7 +2923,7 @@ index 151441d..27645c4 100644 #: plugins/local.py:126 msgid "'{}' is not a directory" -@@ -634,67 +774,71 @@ msgstr "迁移 yum 的历史、分组以及 yumdb 数据至 dnf" +@@ -634,67 +775,71 @@ msgstr "迁移 yum 的历史、分组以及 yumdb 数据至 dnf" msgid "Migrating history data..." msgstr "正在迁移历史数据…" @@ -2354,12 +2952,12 @@ index 151441d..27645c4 100644 "only report whether a reboot is required (exit code 1) or not (exit code 0)" -msgstr "" +msgstr "只报告需要重新引导 (退出代码为 1) 或不需要重新引导 (退出代码为 0)" -+ + +-#: plugins/needs_restarting.py:230 +#: plugins/needs_restarting.py:234 +msgid "only report affected systemd services" +msgstr "只报告受影响的 systemd 服务" - --#: plugins/needs_restarting.py:230 ++ +#: plugins/needs_restarting.py:257 msgid "Core libraries or services have been updated since boot-up:" -msgstr "" @@ -2369,7 +2967,7 @@ index 151441d..27645c4 100644 +#: plugins/needs_restarting.py:262 msgid "Reboot is required to fully utilize these updates." -msgstr "" -+msgstr "需要重新启动后才可以使这些更新完全生效" ++msgstr "需要重新启动后才可以使这些更新完全生效。" -#: plugins/needs_restarting.py:236 +#: plugins/needs_restarting.py:263 @@ -2407,17 +3005,17 @@ index 151441d..27645c4 100644 #, python-format msgid "post-transaction-actions: %s" -msgstr "" -+msgstr "交易后的操作: %s" ++msgstr "事物后的操作: %s" #: plugins/post-transaction-actions.py:157 #, python-format msgid "post-transaction-actions: Bad Command \"%s\": %s" -msgstr "" -+msgstr "交易后的操作 : 错误命令 \"%s\": %s" ++msgstr "事物后的操作 : 无效的命令 \"%s\": %s" #: plugins/repoclosure.py:42 msgid "Display a list of unresolved dependencies for repositories" -@@ -722,129 +866,137 @@ msgstr "仅为该软件包检查依赖闭合性" +@@ -722,129 +867,137 @@ msgstr "仅为该软件包检查依赖闭合性" #: plugins/repodiff.py:45 msgid "List differences between two sets of repositories" @@ -2488,7 +3086,7 @@ index 151441d..27645c4 100644 #: plugins/repodiff.py:190 msgid "Obsoleted by : {}" -msgstr "" -+msgstr "过期于 : {}" ++msgstr "被下述软件包弃用:{}" #: plugins/repodiff.py:195 msgid "" @@ -2579,7 +3177,7 @@ index 151441d..27645c4 100644 #: plugins/repograph.py:50 msgid "Output a full package dependency graph in dot format" -@@ -891,84 +1043,96 @@ msgstr "要保留的最新的 N 个软件包 - 默认值为 1" +@@ -891,84 +1044,96 @@ msgstr "要保留的最新的 N 个软件包 - 默认值为 1" msgid "Path to directory" msgstr "指向目录的路径" @@ -2606,14 +3204,14 @@ index 151441d..27645c4 100644 +#: plugins/reposync.py:68 msgid "download all the metadata." -msgstr "" -+msgstr "下载所有元数据" ++msgstr "下载所有元数据。" -#: plugins/reposync.py:71 -msgid "download only newest packages per-repo" -msgstr "只下载最新的软件包 per-repo" +#: plugins/reposync.py:70 +msgid "Remove packages that fail GPG signature checking after downloading" -+msgstr "下载后删除无法进行 GPG 签名检查的软件包" ++msgstr "下载后删除无法通过 GPG 签名检查的软件包" #: plugins/reposync.py:73 -msgid "where to store downloaded repositories" @@ -2644,7 +3242,7 @@ index 151441d..27645c4 100644 #: plugins/reposync.py:82 +msgid "where to store downloaded repositories" -+msgstr "存储下载的仓库的位置" ++msgstr "在何处存储已下载的仓库" + +#: plugins/reposync.py:84 msgid "try to set local timestamps of local files by the one on the server" @@ -2665,7 +3263,7 @@ index 151441d..27645c4 100644 +#: plugins/reposync.py:113 msgid "Can't use --norepopath with multiple repositories" -msgstr "" -+msgstr "不能使用 --norepopath 与多个仓库一起使用。" ++msgstr "不能将 --norepopath 与多个仓库一起使用" -#: plugins/reposync.py:127 +#: plugins/reposync.py:132 @@ -2678,7 +3276,7 @@ index 151441d..27645c4 100644 +#: plugins/reposync.py:149 msgid "Failed to get mirror for the group file." -msgstr "" -+msgstr "获取组文件镜像失败" ++msgstr "获取组文件镜像失败。" + +#: plugins/reposync.py:168 +msgid "Removing {}: {}" @@ -2710,7 +3308,7 @@ index 151441d..27645c4 100644 #, python-format msgid "comps.xml for repository %s saved" msgstr "仓库 %s 的 comps.xml 已保存" -@@ -996,15 +1160,15 @@ msgstr "正在添加排除:" +@@ -996,15 +1161,15 @@ msgstr "正在添加排除:" #: plugins/versionlock.py:36 msgid "Package already locked in equivalent form:" @@ -2729,7 +3327,7 @@ index 151441d..27645c4 100644 #: plugins/versionlock.py:39 msgid "Deleting versionlock for:" -@@ -1036,7 +1200,7 @@ msgstr "控制软件包版本锁" +@@ -1036,7 +1201,7 @@ msgstr "控制软件包版本锁" #: plugins/versionlock.py:136 msgid "Use package specifications as they are, do not try to parse them" @@ -2739,5 +3337,5 @@ index 151441d..27645c4 100644 #~ msgid "" #~ "\n" -- -2.29.2 +2.31.1 diff --git a/SPECS/dnf-plugins-core.spec b/SPECS/dnf-plugins-core.spec index 5fa1aa9..393a80b 100644 --- a/SPECS/dnf-plugins-core.spec +++ b/SPECS/dnf-plugins-core.spec @@ -6,6 +6,8 @@ %global yum_utils_subpackage_name yum-utils %endif +%define __cmake_in_source_build 1 + %if 0%{?rhel} && 0%{?rhel} <= 7 %bcond_with python3 %else @@ -31,16 +33,17 @@ %endif Name: dnf-plugins-core -Version: 4.0.18 -Release: 4%{?dist} +Version: 4.0.21 +Release: 3%{?dist} Summary: Core Plugins for DNF License: GPLv2+ URL: https://github.com/rpm-software-management/dnf-plugins-core Source0: %{url}/archive/%{version}/%{name}-%{version}.tar.gz -Patch1: 0001-groups-manager-Re-introduce-yum-groups-manager-funct.patch -Patch2: 0002-needs-restarting-add-s-to-list-services-RhBug-177293.patch -Patch3: 0003-reposync-Check-GPG-signatures-of-downloaded-packages-RhBug-1856818.patch +Patch1: 0001-versionlock-Do-not-exclude-locked-obsoleters-RhBug1957280.patch +Patch2: 0002-repomanage-Allow-running-only-with-metadata.patch +Patch3: 0003-repomanage-Enhance-repomanage-documentation-RhBug1898293.patch Patch4: 0004-Update-translations.patch + BuildArch: noarch BuildRequires: cmake BuildRequires: gettext @@ -102,10 +105,8 @@ Summary: Core Plugins for DNF BuildRequires: python2-dnf >= %{dnf_lowest_compatible} %if 0%{?rhel} && 0%{?rhel} <= 7 BuildRequires: dbus-python -BuildRequires: python-nose %else BuildRequires: python2-dbus -BuildRequires: python2-nose %endif BuildRequires: python2-devel %if 0%{?fedora} @@ -148,7 +149,6 @@ Summary: Core Plugins for DNF BuildRequires: python3-dbus BuildRequires: python3-devel BuildRequires: python3-dnf >= %{dnf_lowest_compatible} -BuildRequires: python3-nose %if 0%{?fedora} Requires: python3-distro %endif @@ -479,10 +479,14 @@ ln -sf %{_mandir}/man1/%{yum_utils_subpackage_name}.1.gz %{buildroot}%{_mandir}/ %check %if %{with python2} -PYTHONPATH=./plugins nosetests-%{python2_version} -s tests/ + pushd build-py2 + ctest -VV + popd %endif %if %{with python3} -PYTHONPATH=./plugins nosetests-%{python3_version} -s tests/ + pushd build-py3 + ctest -VV + popd %endif %files @@ -762,8 +766,22 @@ PYTHONPATH=./plugins nosetests-%{python3_version} -s tests/ %endif %changelog -* Mon Mar 8 2021 Marek Blaha - 4.0.18-4 -- Update translations (RhBug:1899687) +* Mon Sep 13 2021 Marek Blaha - 4.0.21-3 +- Translations update (RhBug:1961633) + +* Tue Jul 27 2021 Pavla Kratochvilova - 4.0.21-2 +- [versionlock] Locking obsoleted package does not make the obsoleter unavailable (RhBug:1957280) +- [repomanage] Allow running with metadata only +- [repomanage] Enhance repomanage documentation (RhBug:1898293) + +* Wed May 19 2021 Pavla Kratochvilova - 4.0.21-1 +- Update to 4.0.21 +- [repomanage] Don't use cached metadata (RhBug:1899852) +- [needs-restarting] fix -r in nspawn containers (RhBug:1913962,1914251) +- doc: add packages to needs-restarting conf +- Set blacklist subcommand as deprecated +- Removed dependency on dnf.yum.misc.Checksum class (RhBug:1935465) +- Bugs fixed (RhBug:1914827,1916782) * Fri Jan 15 2021 Nicola Sella - 4.0.18-3 - [reposync] Check GPG signatures of downloaded packages (RhBug:1856818)