From 9e4b0ed44260e915427f4c0bb9024c68eca961b0 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Jun 24 2021 04:21:29 +0000 Subject: import dnf-plugins-core-4.0.21-1.el8 --- 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/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/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 deleted file mode 100644 index 4572853..0000000 --- a/SOURCES/0004-Update-translations.patch +++ /dev/null @@ -1,2743 +0,0 @@ -From ffce18035e04a92d482bf775b450df2dadcbe19b Mon Sep 17 00:00:00 2001 -From: Marek Blaha -Date: Mon, 8 Mar 2021 15:51:24 +0100 -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(-) - -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 "" - 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: YEAR-MO-DA HO:MI+ZONE\n" - "Last-Translator: FULL NAME \n" - "Language-Team: LANGUAGE \n" -@@ -560,7 +560,7 @@ msgstr "" - msgid "when running with --url, limit to specific protocols" - msgstr "" - --#: 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 "" - msgid "No package %s available." - msgstr "" - -+#: plugins/groups_manager.py:49 -+msgid "Invalid group id" -+msgstr "" -+ -+#: plugins/groups_manager.py:58 -+msgid "Invalid translated data, should be in form 'lang:text'" -+msgstr "" -+ -+#: plugins/groups_manager.py:61 -+msgid "Invalid/empty language for translated data" -+msgstr "" -+ -+#: plugins/groups_manager.py:71 -+msgid "Can't generate group id from '{}'. Please specify group id using --id." -+msgstr "" -+ -+#: plugins/groups_manager.py:79 -+msgid "create and edit groups metadata file" -+msgstr "" -+ -+#: plugins/groups_manager.py:90 -+msgid "load groups metadata from file" -+msgstr "" -+ -+#: plugins/groups_manager.py:93 -+msgid "save groups metadata to file" -+msgstr "" -+ -+#: plugins/groups_manager.py:95 -+msgid "load and save groups metadata to file" -+msgstr "" -+ -+#: plugins/groups_manager.py:97 -+msgid "print the result metadata to stdout" -+msgstr "" -+ -+#: plugins/groups_manager.py:100 -+msgid "group id" -+msgstr "" -+ -+#: plugins/groups_manager.py:101 -+msgid "group name" -+msgstr "" -+ -+#: plugins/groups_manager.py:103 -+msgid "group description" -+msgstr "" -+ -+#: plugins/groups_manager.py:105 -+msgid "group display order" -+msgstr "" -+ -+#: plugins/groups_manager.py:108 -+msgid "translated name for the group" -+msgstr "" -+ -+#: plugins/groups_manager.py:111 -+msgid "translated description for the group" -+msgstr "" -+ -+#: plugins/groups_manager.py:115 -+msgid "make the group user visible (default)" -+msgstr "" -+ -+#: plugins/groups_manager.py:118 -+msgid "make the group user invisible" -+msgstr "" -+ -+#: plugins/groups_manager.py:123 -+msgid "add packages to the mandatory section" -+msgstr "" -+ -+#: plugins/groups_manager.py:125 -+msgid "add packages to the optional section" -+msgstr "" -+ -+#: plugins/groups_manager.py:127 -+msgid "remove packages from the group instead of adding them" -+msgstr "" -+ -+#: plugins/groups_manager.py:129 -+msgid "include also direct dependencies for packages" -+msgstr "" -+ -+#: plugins/groups_manager.py:132 -+msgid "package specification" -+msgstr "" -+ -+#: plugins/groups_manager.py:156 -+msgid "Can't edit group without specifying it (use --id or --name)" -+msgstr "" -+ -+#: plugins/groups_manager.py:190 -+msgid "Can't load file \"{}\": {}" -+msgstr "" -+ -+#: plugins/groups_manager.py:206 -+msgid "Can't save file \"{}\": {}" -+msgstr "" -+ -+#: plugins/groups_manager.py:259 -+msgid "No match for argument: {}" -+msgstr "" -+ -+#: plugins/groups_manager.py:296 -+msgid "Can't remove packages from non-existent group" -+msgstr "" -+ -+#: plugins/groups_manager.py:305 -+msgid "" -+"Group id '{}' generated from '{}' is duplicit. Please specify group id using " -+"--id." -+msgstr "" -+ - #: plugins/leaves.py:32 - msgid "List installed packages not required by any other package" - msgstr "" -@@ -615,43 +729,47 @@ msgstr "" - 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 "" - --#: 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 "" - --#: 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/needs_restarting.py:235 -+#: plugins/needs_restarting.py:262 - msgid "Reboot is required to fully utilize these updates." - msgstr "" - --#: plugins/needs_restarting.py:236 -+#: plugins/needs_restarting.py:263 - msgid "More information:" - msgstr "" - --#: plugins/needs_restarting.py:240 -+#: plugins/needs_restarting.py:267 - msgid "No core libraries or services have been updated since boot-up." - msgstr "" - --#: plugins/needs_restarting.py:242 -+#: plugins/needs_restarting.py:269 - msgid "Reboot should not be necessary." - msgstr "" - -@@ -871,84 +989,96 @@ msgstr "" - msgid "Path to directory" - msgstr "" - --#: plugins/reposync.py:54 -+#: plugins/reposync.py:55 - msgid "download all packages from remote repo" - msgstr "" - --#: plugins/reposync.py:63 -+#: plugins/reposync.py:64 - msgid "download only packages for this ARCH" - msgstr "" - --#: 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 "" - --#: plugins/reposync.py:71 --msgid "download only newest packages per-repo" -+#: plugins/reposync.py:70 -+msgid "Remove packages that fail GPG signature checking after downloading" - msgstr "" - - #: plugins/reposync.py:73 --msgid "where to store downloaded repositories" -+msgid "also download and uncompress comps.xml" - msgstr "" - - #: plugins/reposync.py:75 --msgid "Don't add the reponame to the download path." --msgstr "" -- --#: plugins/reposync.py:77 - msgid "" - "where to store downloaded repository metadata. Defaults to the value of --" - "download-path." - msgstr "" - -+#: plugins/reposync.py:78 -+msgid "download only newest packages per-repo" -+msgstr "" -+ - #: plugins/reposync.py:80 --msgid "operate on source packages" -+msgid "Don't add the reponame to the download path." - msgstr "" - - #: 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 "" - --#: 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 "" - --#: plugins/reposync.py:109 -+#: plugins/reposync.py:113 - msgid "Can't use --norepopath with multiple repositories" - msgstr "" - --#: plugins/reposync.py:127 -+#: plugins/reposync.py:132 - #, python-format - msgid "Failed to get mirror for metadata: %s" - msgstr "" - --#: plugins/reposync.py:144 -+#: plugins/reposync.py:149 - msgid "Failed to get mirror for the group file." - msgstr "" - -+#: plugins/reposync.py:168 -+msgid "Removing {}: {}" -+msgstr "" -+ - #: plugins/reposync.py:175 -+msgid "GPG signature check failed." -+msgstr "" -+ -+#: plugins/reposync.py:196 - msgid "Download target '{}' is outside of download path '{}'." - msgstr "" - --#: plugins/reposync.py:190 -+#: plugins/reposync.py:211 - #, python-format - msgid "[DELETED] %s" - msgstr "" - --#: plugins/reposync.py:192 -+#: plugins/reposync.py:213 - #, python-format - msgid "failed to delete file %s" - msgstr "" - --#: 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. -+# 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: 2021-03-08 11:08+0000\n" -+"Last-Translator: Sundeep Anand \n" -+"Language-Team: French \n" - "Language: fr\n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" - "Plural-Forms: nplurals=2; plural=n > 1;\n" --"X-Generator: Weblate 4.1.1\n" -+"X-Generator: Weblate 4.5.1\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" - --#: 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 "É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" - - #: plugins/changelog.py:109 - msgid "Listing changelogs since {}" --msgstr "" -+msgstr "{} 以降の changelogs を一覧表示します" - - #: plugins/changelog.py:111 - msgid "Listing only latest changelog" - msgid_plural "Listing {} latest changelogs" --msgstr[0] "" -+msgstr[0] "最新の changelog のみを一覧表示します" - - #: plugins/changelog.py:116 - msgid "Listing only new changelogs since installed version of the package" --msgstr "" -+msgstr "パッケージのインストールされたバージョン以降の新しい changelogs のみを一覧表示します" - - #: plugins/changelog.py:118 - msgid "Listing all changelogs" --msgstr "" -+msgstr "すべての changelogs を一覧表示します" - - #: plugins/changelog.py:122 - msgid "Changelogs for {}" -@@ -138,7 +140,7 @@ msgstr "{} の Changelogs" - #: plugins/config_manager.py:37 - #, python-brace-format - msgid "manage {prog} configuration options and repositories" --msgstr "" -+msgstr "{prog} 設定オプションおよびリポジトリーを管理します" - - #: plugins/config_manager.py:44 - msgid "repo to modify" -@@ -162,21 +164,23 @@ msgstr "stdout に変数値を印刷" - - #: plugins/config_manager.py:60 - msgid "enable repos (automatically saves)" --msgstr "" -+msgstr "レポを有効にする (自動保存)" - - #: plugins/config_manager.py:63 - msgid "disable repos (automatically saves)" --msgstr "" -+msgstr "レポを無効にする (自動保存)" - - #: plugins/config_manager.py:77 - msgid "one of the following arguments is required: {}" --msgstr "" -+msgstr "以下のいずれかの引数が必要です。{}" - - #: plugins/config_manager.py:86 - msgid "" - "Warning: --enablerepo/--disablerepo arguments have no meaningwith config " - "manager. Use --set-enabled/--set-disabled instead." - msgstr "" -+"警告: --enablerepo/--disablerepo の引数は config manager では意味がありません。代わりに -set-" -+"enabled/--set-disabled を使用してください。" - - #: plugins/config_manager.py:131 - #, python-format -@@ -274,7 +278,7 @@ msgstr "利用可能な Copr リポジトリーをユーザー NAME ごとに一 - - #: plugins/copr.py:115 - msgid "Specify an instance of Copr to work with" --msgstr "" -+msgstr "作業する Copr のインスタンスを指定します" - - #: plugins/copr.py:149 plugins/copr.py:217 plugins/copr.py:237 - msgid "Error: " -@@ -285,10 +289,12 @@ msgid "" - "specify Copr hub either with `--hub` or using " - "`copr_hub/copr_username/copr_projectname` format" - msgstr "" -+"`--hub` または `copr_hub/copr_username/copr_projectname` フォーマットを使って、Copr " -+"ハブを指定します" - - #: plugins/copr.py:153 - msgid "multiple hubs specified" --msgstr "" -+msgstr "複数のハブが指定されています" - - #: plugins/copr.py:218 plugins/copr.py:222 - msgid "exactly two additional parameters to copr command are required" -@@ -316,6 +322,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" -+"Copr リポジトリーを有効化しています。このリポジトリーは\n" -+"主要ディストリビューションの一部ではないため、品質が一定していない点に注意してください。\n" -+"\n" -+"Fedora Project は、このリポジトリーのコンテンツに関して、 の \n" -+"Copr FAQ で示されたルールを超えて権利を行使することは\n" -+"ありません。また、パッケージは、任意の品質またはセキュリ\n" -+"ティーレベルを固守していません。\n" -+"\n" -+"Fedora Bugzilla でこれらのパッケージに関するバグ報告をしないでください。\n" -+"問題が発生した場合は、このリポジトリーのオーナーに連絡してください。\n" - - #: plugins/copr.py:271 - msgid "Repository successfully enabled." -@@ -339,6 +356,8 @@ msgid "" - " about Copr hub - the default one was assumed. Re-enable the project to fix " - "this." - msgstr "" -+"* これらの coprs には、Copr ハブに関する情報がない古いフォーマットの repo " -+"ファイルがあります。デフォルトは仮定です。これを修正するには、プロジェクトを再度有効化してください。" - - #: plugins/copr.py:353 - msgid "Can't parse repositories for username '{}'." -@@ -397,19 +416,33 @@ msgid "" - "\n" - "These repositories have been enabled automatically." - msgstr "" -+"有効化した Copr リポジトリの管理者は\n" -+"他のリポジトリに依存するように決めました。\n" -+"そのようなリポジトリは主な Corp レジストリー\n" -+"ランタイム依存関係を提供) から RPM のインストールを\n" -+"成功させるために通常必要です。\n" -+"\n" -+"上記の品質とバグ報告についての注意点が\n" -+"ここでも適用されますが、Fedora Project は内容を\n" -+"管理していないことに注意してください。以下のリストを確認\n" -+"してください。\n" -+"\n" -+"{0}\n" -+"\n" -+"これらのリポジトリは自動的に有効になっています。" - - #: plugins/copr.py:549 - msgid "Do you want to keep them enabled?" --msgstr "" -+msgstr "有効にしておきますか?" - - #: plugins/copr.py:582 - #, python-brace-format - msgid "Failed to remove copr repo {0}/{1}/{2}" --msgstr "" -+msgstr "copr repo {0}/{1}/{2} の削除に失敗しました" - - #: plugins/copr.py:593 - msgid "Failed to disable copr repo {}/{}" --msgstr "copr repo {}/{} の無効化に失敗しました。" -+msgstr "copr repo {}/{} の無効化に失敗しました" - - #: plugins/copr.py:611 plugins/copr.py:648 - msgid "Unknown response from server." -@@ -420,14 +453,12 @@ msgid "Interact with Playground repository." - msgstr "Playground リポジトリーとの対話。" - - #: plugins/copr.py:639 --#, fuzzy --#| msgid "Interact with Playground repository." - msgid "Enabling a Playground repository." --msgstr "Playground リポジトリーとの対話。" -+msgstr "Playgroundのリポジトリーの有効化。" - - #: plugins/copr.py:640 - msgid "Do you want to continue?" --msgstr "" -+msgstr "続行しますか?" - - #: plugins/copr.py:683 - msgid "Playground repositories successfully enabled." -@@ -484,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 "インストールのみのパッケージの削除を許可します。このオプションを使用すると、実行しているカーネルの削除を試みる可能性があります。" - - #: plugins/debug.py:202 - msgid "name of dump file" -@@ -508,25 +539,25 @@ msgstr "debuginfo パッケージのインストール" - #, python-format - msgid "" - "Could not find debuginfo package for the following available packages: %s" --msgstr "" -+msgstr "次の利用可能なパッケージの debuginfo パッケージが見つかりませんでした: %s" - - #: plugins/debuginfo-install.py:185 - #, python-format - msgid "" - "Could not find debugsource package for the following available packages: %s" --msgstr "" -+msgstr "次の利用可能なパッケージの debugsource パッケージが見つかりませんでした: %s" - - #: plugins/debuginfo-install.py:190 - #, python-format - msgid "" - "Could not find debuginfo package for the following installed packages: %s" --msgstr "" -+msgstr "次のインストールされたパッケージの debuginfo パッケージが見つかりませんでした: %s" - - #: plugins/debuginfo-install.py:195 - #, python-format - msgid "" - "Could not find debugsource package for the following installed packages: %s" --msgstr "" -+msgstr "次のインストールされたパッケージの debugsource パッケージが見つかりませんでした: %s" - - #: plugins/debuginfo-install.py:199 - msgid "Unable to find a match" -@@ -550,7 +581,7 @@ msgstr "代わりに -debuginfo パッケージをダウンロードします" - - #: plugins/download.py:57 - msgid "download the -debugsource package instead" --msgstr "" -+msgstr "代わりに、-debugsource パッケージをダウンロードします" - - #: plugins/download.py:60 - msgid "limit the query to packages of given architectures." -@@ -564,7 +595,7 @@ msgstr "必要な依存関係を解決し、ダウンロードします" - msgid "" - "when running with --resolve, download all dependencies (do not exclude " - "already installed ones)" --msgstr "" -+msgstr "--resolve で実行する場合、すべての依存関係をダウンロードします (インストール済みのものを除外しないでください)" - - #: plugins/download.py:67 - msgid "" -@@ -575,7 +606,7 @@ msgstr "ダウンロードする代わりに、rpm をダウンロードでき - msgid "when running with --url, limit to specific protocols" - 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" -@@ -598,6 +629,120 @@ msgstr "%s に対して定義されているソース rpm はありません" - msgid "No package %s available." - msgstr "利用可能なパッケージ %s はありません。" - -+#: plugins/groups_manager.py:49 -+msgid "Invalid group id" -+msgstr "'無効なグループ ID" -+ -+#: plugins/groups_manager.py:58 -+msgid "Invalid translated data, should be in form 'lang:text'" -+msgstr "無効な翻訳データです。'lang:text' の形式で指定する必要があります" -+ -+#: plugins/groups_manager.py:61 -+msgid "Invalid/empty language for translated data" -+msgstr "翻訳されたデータの無効または空な言語" -+ -+#: plugins/groups_manager.py:71 -+msgid "Can't generate group id from '{}'. Please specify group id using --id." -+msgstr "'{}' からグループ ID を生成できません。--id を使用してグループ ID を指定してください。" -+ -+#: plugins/groups_manager.py:79 -+msgid "create and edit groups metadata file" -+msgstr "グループメタデータファイルの作成および編集" -+ -+#: plugins/groups_manager.py:90 -+msgid "load groups metadata from file" -+msgstr "ファイルからグループメタデータを読み込みます" -+ -+#: plugins/groups_manager.py:93 -+msgid "save groups metadata to file" -+msgstr "グループメタデータをファイルに保存します" -+ -+#: plugins/groups_manager.py:95 -+msgid "load and save groups metadata to file" -+msgstr "グループメタデータをファイルにロードして保存します" -+ -+#: plugins/groups_manager.py:97 -+msgid "print the result metadata to stdout" -+msgstr "生成されたメタデータを stdout に出力します" -+ -+#: plugins/groups_manager.py:100 -+msgid "group id" -+msgstr "グループ id" -+ -+#: plugins/groups_manager.py:101 -+msgid "group name" -+msgstr "グループ名" -+ -+#: plugins/groups_manager.py:103 -+msgid "group description" -+msgstr "グループ説明" -+ -+#: plugins/groups_manager.py:105 -+msgid "group display order" -+msgstr "グループ表示順序" -+ -+#: plugins/groups_manager.py:108 -+msgid "translated name for the group" -+msgstr "グループの翻訳名" -+ -+#: plugins/groups_manager.py:111 -+msgid "translated description for the group" -+msgstr "グループの翻訳説明" -+ -+#: plugins/groups_manager.py:115 -+msgid "make the group user visible (default)" -+msgstr "グループユーザーを表示させる (デフォルト)" -+ -+#: plugins/groups_manager.py:118 -+msgid "make the group user invisible" -+msgstr "グループユーザーを非表示の状態にする" -+ -+#: plugins/groups_manager.py:123 -+msgid "add packages to the mandatory section" -+msgstr "必須セクションへのパッケージの追加" -+ -+#: plugins/groups_manager.py:125 -+msgid "add packages to the optional section" -+msgstr "オプションセクションへのパッケージの追加" -+ -+#: plugins/groups_manager.py:127 -+msgid "remove packages from the group instead of adding them" -+msgstr "パッケージを追加する代わりに、グループからパッケージを削除します" -+ -+#: plugins/groups_manager.py:129 -+msgid "include also direct dependencies for packages" -+msgstr "リポジトリーの直接の依存関係を含みます" -+ -+#: plugins/groups_manager.py:132 -+msgid "package specification" -+msgstr "パッケージ仕様" -+ -+#: plugins/groups_manager.py:156 -+msgid "Can't edit group without specifying it (use --id or --name)" -+msgstr "指定せずにはグループを編集できません (--id または --name を使用してください)" -+ -+#: plugins/groups_manager.py:190 -+msgid "Can't load file \"{}\": {}" -+msgstr "ファイル '{}' を書き込みできません: {}" -+ -+#: plugins/groups_manager.py:206 -+msgid "Can't save file \"{}\": {}" -+msgstr "ファイル '{}' を保存できません: {}" -+ -+#: plugins/groups_manager.py:259 -+msgid "No match for argument: {}" -+msgstr "一致した引数がありません: {}" -+ -+#: plugins/groups_manager.py:296 -+msgid "Can't remove packages from non-existent group" -+msgstr "存在しないグループからパッケージを削除できません" -+ -+#: plugins/groups_manager.py:305 -+msgid "" -+"Group id '{}' generated from '{}' is duplicit. Please specify group id using" -+" --id." -+msgstr "'{}' から生成されたグループ ID '{}' は重複しています。--id を使用してグループ ID を指定してください。" -+ - #: plugins/leaves.py:32 - msgid "List installed packages not required by any other package" - msgstr "他のパッケージから必要とされないインスール済みパッケージを一覧表示します" -@@ -630,67 +775,73 @@ msgstr "yum の履歴、グループ、および yumdb データを dnf へ移 - 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: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: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 "起動以降にコアライブラリーまたはサービスがアップデートされました:" - --#: 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/repodiff.py:222 - msgid "Size of added packages: {}" --msgstr "" -+msgstr "追加されたパッケージのサイズ: {}" - - #: plugins/repodiff.py:223 - msgid "Size of removed packages: {}" --msgstr "" -+msgstr "削除されたパッケージのサイズ: {}" - - #: 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 "" - "where to store downloaded repository metadata. Defaults to the value of " - "--download-path." --msgstr "" -+msgstr "ダウンロード済みリポジトリーメタデータの保管場所。初期値は --download-path です。" -+ -+#: plugins/reposync.py:78 -+msgid "download only newest packages per-repo" -+msgstr "最新のパッケージ per-repo のみをダウンロード" - - #: 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/reposync.py:84 - msgid "try to set local timestamps of local files by the one on the server" --msgstr "" -+msgstr "サーバー上から、ローカルファイルのローカル timestamps の設定を試みます" - --#: 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/reposync.py:109 -+#: plugins/reposync.py:113 - msgid "Can't use --norepopath with multiple repositories" --msgstr "" -+msgstr "複数のリポジトリーでは -norepopath は使えません" - --#: plugins/reposync.py:127 -+#: plugins/reposync.py:132 - #, python-format - msgid "Failed to get mirror for metadata: %s" --msgstr "" -+msgstr "メタデータのミラー取得に失敗しました: %s" - --#: plugins/reposync.py:144 -+#: plugins/reposync.py:149 - msgid "Failed to get mirror for the group file." --msgstr "" -+msgstr "グループファイルのミラー取得に失敗しました。" -+ -+#: plugins/reposync.py:168 -+msgid "Removing {}: {}" -+msgstr "{} の削除中: {}" - - #: 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 "ダウンロードターゲット '{}' は、ダウンロードパス '{}' の外にあります。" - --#: 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 "ファイル %s の削除に失敗しました" - --#: 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/versionlock.py:36 - msgid "Package already locked in equivalent form:" --msgstr "" -+msgstr "同等の形で既にロックされているパッケージ。" - - #: plugins/versionlock.py:37 - msgid "Package {} is already locked" --msgstr "" -+msgstr "パッケージ {} は既にロックされています" - - #: plugins/versionlock.py:38 - msgid "Package {} is already excluded" --msgstr "" -+msgstr "パッケージ{}はすでに除外されています" - - #: 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..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 목록 인쇄 - msgid "when running with --url, limit to specific protocols" - 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 유효한." - -+#: plugins/groups_manager.py:49 -+msgid "Invalid group id" -+msgstr "" -+ -+#: plugins/groups_manager.py:58 -+msgid "Invalid translated data, should be in form 'lang:text'" -+msgstr "" -+ -+#: plugins/groups_manager.py:61 -+msgid "Invalid/empty language for translated data" -+msgstr "" -+ -+#: plugins/groups_manager.py:71 -+msgid "Can't generate group id from '{}'. Please specify group id using --id." -+msgstr "" -+ -+#: plugins/groups_manager.py:79 -+msgid "create and edit groups metadata file" -+msgstr "" -+ -+#: plugins/groups_manager.py:90 -+msgid "load groups metadata from file" -+msgstr "" -+ -+#: plugins/groups_manager.py:93 -+msgid "save groups metadata to file" -+msgstr "" -+ -+#: plugins/groups_manager.py:95 -+msgid "load and save groups metadata to file" -+msgstr "" -+ -+#: plugins/groups_manager.py:97 -+#, fuzzy -+#| msgid "print variable values to stdout" -+msgid "print the result metadata to stdout" -+msgstr "변수 값을 표준 출력으로 출력" -+ -+#: plugins/groups_manager.py:100 -+msgid "group id" -+msgstr "" -+ -+#: plugins/groups_manager.py:101 -+msgid "group name" -+msgstr "" -+ -+#: plugins/groups_manager.py:103 -+#, fuzzy -+#| msgid "No description given" -+msgid "group description" -+msgstr "설명이 없습니다." -+ -+#: plugins/groups_manager.py:105 -+msgid "group display order" -+msgstr "" -+ -+#: plugins/groups_manager.py:108 -+msgid "translated name for the group" -+msgstr "" -+ -+#: plugins/groups_manager.py:111 -+msgid "translated description for the group" -+msgstr "" -+ -+#: plugins/groups_manager.py:115 -+msgid "make the group user visible (default)" -+msgstr "" -+ -+#: plugins/groups_manager.py:118 -+msgid "make the group user invisible" -+msgstr "" -+ -+#: plugins/groups_manager.py:123 -+msgid "add packages to the mandatory section" -+msgstr "" -+ -+#: plugins/groups_manager.py:125 -+msgid "add packages to the optional section" -+msgstr "" -+ -+#: plugins/groups_manager.py:127 -+msgid "remove packages from the group instead of adding them" -+msgstr "" -+ -+#: plugins/groups_manager.py:129 -+#, fuzzy -+#| msgid "Display a list of unresolved dependencies for repositories" -+msgid "include also direct dependencies for packages" -+msgstr "저장소에 대한 확인되지 않은 종속성 목록 표시" -+ -+#: plugins/groups_manager.py:132 -+msgid "package specification" -+msgstr "" -+ -+#: plugins/groups_manager.py:156 -+msgid "Can't edit group without specifying it (use --id or --name)" -+msgstr "" -+ -+#: plugins/groups_manager.py:190 -+#, fuzzy -+#| msgid "Can't write file '{}'" -+msgid "Can't load file \"{}\": {}" -+msgstr "'{}'파일을 쓸 수 없습니다." -+ -+#: plugins/groups_manager.py:206 -+#, fuzzy -+#| msgid "Can't write file '{}'" -+msgid "Can't save file \"{}\": {}" -+msgstr "'{}'파일을 쓸 수 없습니다." -+ -+#: plugins/groups_manager.py:259 -+#, fuzzy -+#| msgid "No match for argument: %s" -+msgid "No match for argument: {}" -+msgstr "인수와 일치하는 항목 없음 : %s" -+ -+#: plugins/groups_manager.py:296 -+msgid "Can't remove packages from non-existent group" -+msgstr "" -+ -+#: plugins/groups_manager.py:305 -+msgid "" -+"Group id '{}' generated from '{}' is duplicit. Please specify group id using" -+" --id." -+msgstr "" -+ - #: plugins/leaves.py:32 - msgid "List installed packages not required by any other package" - msgstr "다른 패키지에서 필요하지 않은 설치된 패키지 나열" -@@ -614,43 +740,47 @@ msgstr "yum의 히스토리, 그룹 및 yumdb 데이터를 dnf로 마이그레 - 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 "" - --#: 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 "" - --#: 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/needs_restarting.py:235 -+#: plugins/needs_restarting.py:262 - msgid "Reboot is required to fully utilize these updates." - msgstr "" - --#: plugins/needs_restarting.py:236 -+#: plugins/needs_restarting.py:263 - msgid "More information:" - msgstr "" - --#: plugins/needs_restarting.py:240 -+#: plugins/needs_restarting.py:267 - msgid "No core libraries or services have been updated since boot-up." - msgstr "" - --#: plugins/needs_restarting.py:242 -+#: plugins/needs_restarting.py:269 - msgid "Reboot should not be necessary." - msgstr "" - -@@ -871,84 +1001,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 "원격 저장소에서 모든 패키지를 다운로드하십시오." - --#: 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 "" - --#: 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 "" - - #: plugins/reposync.py:73 --msgid "where to store downloaded repositories" -+msgid "also download and uncompress comps.xml" - msgstr "" - - #: plugins/reposync.py:75 --msgid "Don't add the reponame to the download path." --msgstr "" -- --#: plugins/reposync.py:77 - msgid "" - "where to store downloaded repository metadata. Defaults to the value of " - "--download-path." - msgstr "" - -+#: plugins/reposync.py:78 -+msgid "download only newest packages per-repo" -+msgstr "repo 당 최신 패키지 만 다운로드하십시오." -+ - #: 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/reposync.py:84 - msgid "try to set local timestamps of local files by the one on the server" - msgstr "" - --#: 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 "" - --#: plugins/reposync.py:109 -+#: plugins/reposync.py:113 - msgid "Can't use --norepopath with multiple repositories" - msgstr "" - --#: plugins/reposync.py:127 -+#: plugins/reposync.py:132 - #, python-format - msgid "Failed to get mirror for metadata: %s" - msgstr "" - --#: plugins/reposync.py:144 -+#: plugins/reposync.py:149 - msgid "Failed to get mirror for the group file." - msgstr "" - -+#: plugins/reposync.py:168 -+msgid "Removing {}: {}" -+msgstr "" -+ - #: plugins/reposync.py:175 -+msgid "GPG signature check failed." -+msgstr "" -+ -+#: plugins/reposync.py:196 - msgid "Download target '{}' is outside of download path '{}'." - msgstr "" - --#: 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 "파일을 삭제하지 못했습니다. %s" - --#: plugins/reposync.py:201 -+#: plugins/reposync.py:222 - #, python-format - msgid "comps.xml for repository %s saved" - msgstr "저장소에 대한 comps.xml %s 저장된" -diff --git a/po/zh_CN.po b/po/zh_CN.po -index 151441d..27645c4 100644 ---- a/po/zh_CN.po -+++ b/po/zh_CN.po -@@ -5,20 +5,21 @@ - # cheng ye <18969068329@163.com>, 2017. #zanata - # Ludek Janda , 2018. #zanata - # Hongqiao Chen , 2020. -+# Sundeep Anand , 2021. - msgid "" - msgstr "" - "Project-Id-Version: PACKAGE VERSION\n" - "Report-Msgid-Bugs-To: \n" --"POT-Creation-Date: 2020-10-05 09:18-0400\n" --"PO-Revision-Date: 2020-07-09 13:27+0000\n" --"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" -+"Language-Team: Chinese (Simplified) \n" - "Language: zh_CN\n" - "MIME-Version: 1.0\n" - "Content-Type: text/plain; charset=UTF-8\n" - "Content-Transfer-Encoding: 8bit\n" - "Plural-Forms: nplurals=1; plural=0;\n" --"X-Generator: Weblate 4.1.1\n" -+"X-Generator: Weblate 4.5.1\n" - - #: plugins/builddep.py:45 - msgid "[PACKAGE|PACKAGE.spec]" -@@ -39,7 +40,7 @@ msgstr "定义一个用于处理 Spec 文件的宏" - - #: 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" -@@ -51,7 +52,7 @@ msgstr "将命令行参数作为源码 RPM 处理" - - #: plugins/builddep.py:144 - msgid "RPM: {}" --msgstr "" -+msgstr "RPM软件包: {}" - - #: plugins/builddep.py:153 - msgid "Some packages could not be found." -@@ -87,27 +88,27 @@ 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 "查看软件包的改变日志数据" - - #: plugins/changelog.py:51 - msgid "" - "show changelog entries since DATE. To avoid ambiguosity, YYYY-MM-DD format " - "is recommended." --msgstr "" -+msgstr "显示自 DATE 开始的改变日志信息。为了避免混淆,推荐使用 YYYY-MM-DD 格式。" - - #: plugins/changelog.py:55 - msgid "show given number of changelog entries per package" --msgstr "" -+msgstr "每个软件包显示指定数量的改变日志信息" - - #: plugins/changelog.py:58 - msgid "" - "show only new changelog entries for packages, that provide an upgrade for " - "some of already installed packages." --msgstr "" -+msgstr "只显示软件包新的改变日志信息,为已安装的软件包提供升级" - - #: plugins/changelog.py:60 - msgid "PACKAGE" -@@ -120,20 +121,20 @@ msgstr "未找到匹配的参数: %s" - - #: plugins/changelog.py:109 - msgid "Listing changelogs since {}" --msgstr "" -+msgstr "列出自 {} 后的改变日志信息" - - #: 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 "在列出安装的软件包版本后的新改变日志" - - #: plugins/changelog.py:118 - msgid "Listing all changelogs" --msgstr "" -+msgstr "列出所有改变日志" - - #: plugins/changelog.py:122 - msgid "Changelogs for {}" -@@ -142,7 +143,7 @@ msgstr "{}的变更记录" - #: plugins/config_manager.py:37 - #, python-brace-format - msgid "manage {prog} configuration options and repositories" --msgstr "" -+msgstr "管理 {prog} 配置选项和软件仓库" - - #: plugins/config_manager.py:44 - msgid "repo to modify" -@@ -166,21 +167,23 @@ msgstr "打印变量值到标准输出" - - #: plugins/config_manager.py:60 - msgid "enable repos (automatically saves)" --msgstr "" -+msgstr "启用仓库(自动保存)" - - #: plugins/config_manager.py:63 - msgid "disable repos (automatically saves)" --msgstr "" -+msgstr "禁用仓库(自动保存)" - - #: plugins/config_manager.py:77 - msgid "one of the following arguments is required: {}" --msgstr "" -+msgstr "需要以下参数之一:{}" - - #: plugins/config_manager.py:86 - msgid "" - "Warning: --enablerepo/--disablerepo arguments have no meaningwith config " - "manager. Use --set-enabled/--set-disabled instead." - msgstr "" -+"警告:--enablerepo/--disablerepo 参数对于 config manager 没有作用。请使用 --set-" -+"enabled/--set-disabled。" - - #: plugins/config_manager.py:131 - #, python-format -@@ -278,7 +281,7 @@ msgstr "按照用户 NAME 列出可用的 Copr 仓库" - - #: plugins/copr.py:115 - msgid "Specify an instance of Copr to work with" --msgstr "" -+msgstr "指定需要使用的 Copr 实例" - - #: plugins/copr.py:149 plugins/copr.py:217 plugins/copr.py:237 - msgid "Error: " -@@ -289,10 +292,11 @@ msgid "" - "specify Copr hub either with `--hub` or using " - "`copr_hub/copr_username/copr_projectname` format" - msgstr "" -+"使用 `--hub` 或使用 `copr_hub/copr_username/copr_projectname` 格式指定 Copr hub" - - #: plugins/copr.py:153 - msgid "multiple hubs specified" --msgstr "" -+msgstr "指定多个 hub" - - #: plugins/copr.py:218 plugins/copr.py:222 - msgid "exactly two additional parameters to copr command are required" -@@ -320,6 +324,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" -+"启用一个 Copr 仓库。请注意这个仓库\n" -+"不是主发行版本的一部分,质量可能会有所不同。\n" -+"\n" -+"Fedora 项目对其不行使除了于 Copr 常见问题\n" -+"\n" -+"中所提出的规则外的任何权力,并且其软件包不保证达到特定质量\n" -+"和安全水准。\n" -+"\n" -+"请不要在 Fedora Bugzilla 中报告这些软件包中出现的\n" -+"问题。当出现问题时,请联系仓库的所有者。\n" - - #: plugins/copr.py:271 - msgid "Repository successfully enabled." -@@ -343,6 +358,7 @@ msgid "" - " about Copr hub - the default one was assumed. Re-enable the project to fix " - "this." - msgstr "" -+"* 这些 coprs 有使用旧格式的 repo 文件,它们没有包括 Copr hub 的信息 - 假设使用默认值。重新启用项目来解决这个问题。" - - #: plugins/copr.py:353 - msgid "Can't parse repositories for username '{}'." -@@ -401,15 +417,27 @@ msgid "" - "\n" - "These repositories have been enabled automatically." - msgstr "" -+"启用的 Copr 仓库的维护人员决定\n" -+"它需要依赖于其他仓库。这些仓库\n" -+"通常是必需的,如果需要从主 Copr 仓库\n" -+"(它们会提供运行时依赖软件包)安装 RPM。\n" -+"\n" -+"请注意上面关于质量和程序错误报告的备注\n" -+"也适用于这里,Fedora Project 不控制内容。\n" -+"请检查列表:\n" -+"\n" -+"{0}\n" -+"\n" -+"这些仓库已被自动启用。" - - #: plugins/copr.py:549 - msgid "Do you want to keep them enabled?" --msgstr "" -+msgstr "您需要保持它们被启用吗?" - - #: plugins/copr.py:582 - #, python-brace-format - msgid "Failed to remove copr repo {0}/{1}/{2}" --msgstr "" -+msgstr "删除 copr repo {0}/{1}/{2} 失败" - - #: plugins/copr.py:593 - msgid "Failed to disable copr repo {}/{}" -@@ -424,14 +452,12 @@ msgid "Interact with Playground repository." - msgstr "与 Playground 仓库交互。" - - #: plugins/copr.py:639 --#, fuzzy --#| msgid "Interact with Playground repository." - msgid "Enabling a Playground repository." --msgstr "与 Playground 仓库交互。" -+msgstr "启用一个 Playground 仓库。" - - #: plugins/copr.py:640 - msgid "Do you want to continue?" --msgstr "" -+msgstr "您希望继续吗?" - - #: plugins/copr.py:683 - msgid "Playground repositories successfully enabled." -@@ -488,7 +514,7 @@ msgstr "限制到指定类型" - msgid "" - "Allow removing of install-only packages. Using this option may result in an " - "attempt to remove the running kernel." --msgstr "" -+msgstr "允许删除只安装的软件包。使用这个选项可能会导致尝试删除正在运行的内核。" - - #: plugins/debug.py:202 - msgid "name of dump file" -@@ -512,25 +538,25 @@ msgstr "安装调试信息软件包" - #, python-format - msgid "" - "Could not find debuginfo package for the following available packages: %s" --msgstr "" -+msgstr "无法为以下可用的软件包找到 debuginfo 软件包: %s" - - #: plugins/debuginfo-install.py:185 - #, python-format - msgid "" - "Could not find debugsource package for the following available packages: %s" --msgstr "" -+msgstr "无法为以下可用的软件包找到 debugsource 软件包: %s" - - #: plugins/debuginfo-install.py:190 - #, python-format - msgid "" - "Could not find debuginfo package for the following installed packages: %s" --msgstr "" -+msgstr "无法为以下安装的软件包找到 debuginfo 软件包: %s" - - #: plugins/debuginfo-install.py:195 - #, python-format - msgid "" - "Could not find debugsource package for the following installed packages: %s" --msgstr "" -+msgstr "无法为以下安装的软件包找到 debugsource 软件包: %s" - - #: plugins/debuginfo-install.py:199 - msgid "Unable to find a match" -@@ -554,7 +580,7 @@ msgstr "取而代之下载 -debuginfo 软件包" - - #: plugins/download.py:57 - msgid "download the -debugsource package instead" --msgstr "" -+msgstr "取而代之下载 -debugsource 软件包" - - #: plugins/download.py:60 - msgid "limit the query to packages of given architectures." -@@ -568,7 +594,7 @@ msgstr "解析并下载所需的依赖关系" - msgid "" - "when running with --resolve, download all dependencies (do not exclude " - "already installed ones)" --msgstr "" -+msgstr "当运行时使用 --resolve,下载所有依赖软件包 (不排除已安装的软件包)" - - #: plugins/download.py:67 - msgid "" -@@ -579,7 +605,7 @@ msgstr "打印 rpm 可被下载的 url 列表而不是直接下载" - msgid "when running with --url, limit to specific protocols" - 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" -@@ -602,13 +628,127 @@ msgstr "未找到所定义 %s 的源代码软件包 SRPM" - msgid "No package %s available." - msgstr "没有可用的软件包 %s。" - -+#: plugins/groups_manager.py:49 -+msgid "Invalid group id" -+msgstr "无效的组 ID" -+ -+#: plugins/groups_manager.py:58 -+msgid "Invalid translated data, should be in form 'lang:text'" -+msgstr "无效的翻译数据,格式应该是 'lang:text'" -+ -+#: plugins/groups_manager.py:61 -+msgid "Invalid/empty language for translated data" -+msgstr "翻译数据的无效/空语言" -+ -+#: plugins/groups_manager.py:71 -+msgid "Can't generate group id from '{}'. Please specify group id using --id." -+msgstr "无法从 '{}' 生成组 ID。请使用 --id 指定组 ID。" -+ -+#: plugins/groups_manager.py:79 -+msgid "create and edit groups metadata file" -+msgstr "创建并编辑组元数据文件" -+ -+#: plugins/groups_manager.py:90 -+msgid "load groups metadata from file" -+msgstr "从文件加载组元数据" -+ -+#: plugins/groups_manager.py:93 -+msgid "save groups metadata to file" -+msgstr "将组元数据保存到文件中" -+ -+#: plugins/groups_manager.py:95 -+msgid "load and save groups metadata to file" -+msgstr "将组元数据加载并保存到文件中" -+ -+#: plugins/groups_manager.py:97 -+msgid "print the result metadata to stdout" -+msgstr "将结果元数据输出到标准输出" -+ -+#: plugins/groups_manager.py:100 -+msgid "group id" -+msgstr "组 id" -+ -+#: plugins/groups_manager.py:101 -+msgid "group name" -+msgstr "组名称" -+ -+#: plugins/groups_manager.py:103 -+msgid "group description" -+msgstr "组描述" -+ -+#: plugins/groups_manager.py:105 -+msgid "group display order" -+msgstr "组显示顺序" -+ -+#: plugins/groups_manager.py:108 -+msgid "translated name for the group" -+msgstr "组的翻译名称" -+ -+#: plugins/groups_manager.py:111 -+msgid "translated description for the group" -+msgstr "组的翻译描述" -+ -+#: plugins/groups_manager.py:115 -+msgid "make the group user visible (default)" -+msgstr "使组用户可见(默认)" -+ -+#: plugins/groups_manager.py:118 -+msgid "make the group user invisible" -+msgstr "使组用户不可见" -+ -+#: plugins/groups_manager.py:123 -+msgid "add packages to the mandatory section" -+msgstr "在必填部分添加软件包" -+ -+#: plugins/groups_manager.py:125 -+msgid "add packages to the optional section" -+msgstr "在可选部分添加软件包" -+ -+#: plugins/groups_manager.py:127 -+msgid "remove packages from the group instead of adding them" -+msgstr "从组群中删除软件包而不是添加它们" -+ -+#: plugins/groups_manager.py:129 -+msgid "include also direct dependencies for packages" -+msgstr "同时包括软件包的直接依赖软件包" -+ -+#: plugins/groups_manager.py:132 -+msgid "package specification" -+msgstr "软件包规格" -+ -+#: plugins/groups_manager.py:156 -+msgid "Can't edit group without specifying it (use --id or --name)" -+msgstr "没有指定组(使用 --id 或 --name)就无法编辑组" -+ -+#: plugins/groups_manager.py:190 -+msgid "Can't load file \"{}\": {}" -+msgstr "无法加载文件 \"{}\": {}" -+ -+#: plugins/groups_manager.py:206 -+msgid "Can't save file \"{}\": {}" -+msgstr "无法保存文件 \"{}\": {}" -+ -+#: plugins/groups_manager.py:259 -+msgid "No match for argument: {}" -+msgstr "未找到匹配的参数: {}" -+ -+#: plugins/groups_manager.py:296 -+msgid "Can't remove packages from non-existent group" -+msgstr "无法从不存在的组中删除软件包" -+ -+#: plugins/groups_manager.py:305 -+msgid "" -+"Group id '{}' generated from '{}' is duplicit. Please specify group id using" -+" --id." -+msgstr "从 '{}' 生成的组 id '{}' 是显式的。请使用 --id 指定组 ID。" -+ - #: plugins/leaves.py:32 - msgid "List installed packages not required by any other package" - msgstr "列出已安装但不被任何其他软件包所需要的软件包" - - #: plugins/local.py:122 - msgid "Unable to create a directory '{}' due to '{}'" --msgstr "无法创建目录 '{}' 由于 '{}'" -+msgstr "无法创建目录 '{}' 由于 '{}'" - - #: plugins/local.py:126 - msgid "'{}' is not a directory" -@@ -634,67 +774,71 @@ msgstr "迁移 yum 的历史、分组以及 yumdb 数据至 dnf" - 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 "" -+msgstr "没有为在需要重新启动文件 \"{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 "在引导后 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 "在引导后没有 core 库或服务被更新。" - --#: 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" -@@ -722,129 +866,137 @@ msgstr "仅为该软件包检查依赖闭合性" - - #: 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 "" - "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 "同时按架构比较软件包。在默认情况下只按名称比较软件包。" - - #: plugins/repodiff.py:72 - msgid "Output a simple one line message for modified packages." --msgstr "" -+msgstr "为修改的软件包输出一个简单的单行信息。" - - #: 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/repodiff.py:222 - msgid "Size of added packages: {}" --msgstr "" -+msgstr "添加的软件包的大小 : {}" - - #: plugins/repodiff.py:223 - msgid "Size of removed packages: {}" --msgstr "" -+msgstr "删除的软件包的大小 : {}" - - #: 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" -@@ -891,84 +1043,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 "下载远程仓库中的全部软件包" - --#: 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 "" - "where to store downloaded repository metadata. Defaults to the value of " - "--download-path." --msgstr "" -+msgstr "存储下载的仓库元数据的位置。默认为 --download-path 的值。" -+ -+#: plugins/reposync.py:78 -+msgid "download only newest packages per-repo" -+msgstr "只下载最新的软件包 per-repo" - - #: plugins/reposync.py:80 --msgid "operate on source packages" --msgstr "在源软件包中操作" -+msgid "Don't add the reponame to the download path." -+msgstr "不要在下载路径中添加仓库名(reponame)。" - - #: 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 "根据服务器上的文件设置本地文件的本地时间戳" - --#: 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/reposync.py:109 -+#: plugins/reposync.py:113 - msgid "Can't use --norepopath with multiple repositories" --msgstr "" -+msgstr "不能使用 --norepopath 与多个仓库一起使用。" - --#: plugins/reposync.py:127 -+#: plugins/reposync.py:132 - #, python-format - msgid "Failed to get mirror for metadata: %s" --msgstr "" -+msgstr "获取元数据镜像失败:%s" - --#: plugins/reposync.py:144 -+#: plugins/reposync.py:149 - msgid "Failed to get mirror for the group file." --msgstr "" -+msgstr "获取组文件镜像失败" -+ -+#: plugins/reposync.py:168 -+msgid "Removing {}: {}" -+msgstr "正在删除 {}: {}" - - #: 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 "下载的目标 '{}' 在下载路径 '{}' 以外。" - --#: 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 "无法删除文件 %s" - --#: plugins/reposync.py:201 -+#: plugins/reposync.py:222 - #, python-format - msgid "comps.xml for repository %s saved" - msgstr "仓库 %s 的 comps.xml 已保存" -@@ -996,15 +1160,15 @@ msgstr "正在添加排除:" - - #: plugins/versionlock.py:36 - msgid "Package already locked in equivalent form:" --msgstr "" -+msgstr "软件包已使用等同的格式锁定:" - - #: plugins/versionlock.py:37 - msgid "Package {} is already locked" --msgstr "" -+msgstr "软件包 {} 已被锁定" - - #: plugins/versionlock.py:38 - msgid "Package {} is already excluded" --msgstr "" -+msgstr "软件包 {} 已被排除" - - #: plugins/versionlock.py:39 - msgid "Deleting versionlock for:" -@@ -1036,7 +1200,7 @@ msgstr "控制软件包版本锁" - - #: plugins/versionlock.py:136 - msgid "Use package specifications as they are, do not try to parse them" --msgstr "" -+msgstr "按原样使用程序包规格,请勿尝试解析它们" - - #~ msgid "" - #~ "\n" --- -2.29.2 - diff --git a/SPECS/dnf-plugins-core.spec b/SPECS/dnf-plugins-core.spec index 5fa1aa9..c9fcdba 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,13 @@ %endif Name: dnf-plugins-core -Version: 4.0.18 -Release: 4%{?dist} +Version: 4.0.21 +Release: 1%{?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 -Patch4: 0004-Update-translations.patch + BuildArch: noarch BuildRequires: cmake BuildRequires: gettext @@ -102,10 +101,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 +145,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 +475,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 +762,14 @@ PYTHONPATH=./plugins nosetests-%{python3_version} -s tests/ %endif %changelog -* Mon Mar 8 2021 Marek Blaha - 4.0.18-4 -- Update translations (RhBug:1899687) +* 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)