Hello community,
here is the log from the commit of package dnf-plugins-core for
openSUSE:Factory checked in at 2020-01-19 20:57:50
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/dnf-plugins-core (Old)
and /work/SRC/openSUSE:Factory/.dnf-plugins-core.new.26092 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "dnf-plugins-core"
Sun Jan 19 20:57:50 2020 rev:11 rq:765594 version:4.0.13
Changes:
--------
--- /work/SRC/openSUSE:Factory/dnf-plugins-core/dnf-plugins-core.changes
2019-12-16 15:19:37.951157555 +0100
+++
/work/SRC/openSUSE:Factory/.dnf-plugins-core.new.26092/dnf-plugins-core.changes
2020-01-19 20:58:35.864086815 +0100
@@ -1,0 +2,12 @@
+Sun Jan 19 16:04:23 UTC 2020 - Neal Gompa <[email protected]>
+
+- Update to version 4.0.13
+ + Fix: config_manager respect config file location during save
+ + Redesign reposync --latest for modular system (rh#1775434)
+ + [reposync] Fix --delete with multiple repos (rh#1774103)
+ + [doc] Skip creating and installing migrate documentation for Python 3+
+ + [config-manager] Allow use of --set-enabled without arguments (rh#1679213)
+ + [versionlock] Prevent conflicting/duplicate entries (rh#1782052)
+- Deconflict with zypper-needs-restarting on SLE to unblock PackageHub updates
+
+-------------------------------------------------------------------
Old:
----
dnf-plugins-core-4.0.12.tar.gz
New:
----
dnf-plugins-core-4.0.13.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ dnf-plugins-core.spec ++++++
--- /var/tmp/diff_new_pack.ARwwKY/_old 2020-01-19 20:58:36.340087065 +0100
+++ /var/tmp/diff_new_pack.ARwwKY/_new 2020-01-19 20:58:36.340087065 +0100
@@ -2,7 +2,7 @@
# spec file for package dnf-plugins-core
#
# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
-# Copyright (c) 2019 Neal Gompa <[email protected]>.
+# Copyright (c) 2020 Neal Gompa <[email protected]>.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -42,6 +42,14 @@
%global yum_utils_subpackage_name dnf-utils
%endif
+# Deal with SLE Backports issues
+%if 0%{?sle_version} && 0%{?is_backports}
+%bcond_without deconflict
+%global deconflict_prefix dnfutils-
+%else
+%bcond_with deconflict
+%global deconflict_prefix %{nil}
+%endif
# Tests are broken on SUSE for now
%bcond_with tests
@@ -49,7 +57,7 @@
#global prerel rc1
Name: dnf-plugins-core
-Version: 4.0.12
+Version: 4.0.13
Release: 0
Summary: Core Plugins for DNF
License: GPL-2.0+
@@ -156,9 +164,11 @@
Conflicts: yum-changelog
Conflicts: yum-utils
%endif
+%if ! %{with deconflict}
# Cf. https://github.com/openSUSE/zypper/pull/254
Conflicts: zypper < 1.14.26
Conflicts: zypper-needs-restarting
+%endif
Requires: %{name} = %{version}-%{release}
Requires: dnf >= %{dnf_lowest_compatible}
Requires: python3-dnf >= %{dnf_lowest_compatible}
@@ -310,8 +320,11 @@
ln -sf %{_libexecdir}/dnf-utils %{buildroot}%{_bindir}/yum-debug-restore
ln -sf %{_libexecdir}/dnf-utils %{buildroot}%{_bindir}/yumdownloader
-# We never shipped this plugin, and we never will, since we never used YUM...
-rm %{buildroot}%{_mandir}/man8/dnf-migrate.8*
+%if %{with deconflict}
+# Deal with conflicts to unblock backports
+mv %{buildroot}%{_bindir}/needs-restarting
%{buildroot}%{_bindir}/dnfutils-needs-restarting
+mv %{buildroot}%{_mandir}/man1/needs-restarting.1
%{buildroot}%{_mandir}/man1/dnfutils-needs-restarting.1
+%endif
%if ! %{with copr_plugin}
# Delete if we're not shipping COPR plugin
@@ -384,8 +397,8 @@
%{_mandir}/man1/dnf-utils.1*
%{_bindir}/debuginfo-install
%{_mandir}/man1/debuginfo-install.1*
-%{_bindir}/needs-restarting
-%{_mandir}/man1/needs-restarting.1*
+%{_bindir}/%{?deconflict_prefix}needs-restarting
+%{_mandir}/man1/%{?deconflict_prefix}needs-restarting.1*
%{_bindir}/find-repos-of-install
%{_bindir}/package-cleanup
%{_mandir}/man1/package-cleanup.1*
++++++ dnf-plugins-core-4.0.12.tar.gz -> dnf-plugins-core-4.0.13.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/dnf-plugins-core-4.0.12/dnf-plugins-core.spec
new/dnf-plugins-core-4.0.13/dnf-plugins-core.spec
--- old/dnf-plugins-core-4.0.12/dnf-plugins-core.spec 2019-11-25
12:04:52.000000000 +0100
+++ new/dnf-plugins-core-4.0.13/dnf-plugins-core.spec 2020-01-15
10:53:42.000000000 +0100
@@ -31,7 +31,7 @@
%endif
Name: dnf-plugins-core
-Version: 4.0.12
+Version: 4.0.13
Release: 1%{?dist}
Summary: Core Plugins for DNF
License: GPLv2+
@@ -740,6 +740,14 @@
%endif
%changelog
+* Wed Jan 15 2020 Aleš Matěj <[email protected]> - 4.0.13-1
+- Fix: config_manager respect config file location during save
+- Redesign reposync --latest for modular system (RhBug:1775434)
+- [reposync] Fix --delete with multiple repos (RhBug:1774103)
+- [doc] Skip creating and installing migrate documentation for Python 3+
+- [config-manager] Allow use of --set-enabled without arguments (RhBug:1679213)
+- [versionlock] Prevent conflicting/duplicate entries (RhBug:1782052)
+
* Mon Nov 25 2019 Aleš Matěj <[email protected]> - 4.0.12-1
- [reposync] Add --urls option (RhBug:1686602)
- [versionlock] Add --raw option (RhBug:1645564)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/dnf-plugins-core-4.0.12/doc/CMakeLists.txt
new/dnf-plugins-core-4.0.13/doc/CMakeLists.txt
--- old/dnf-plugins-core-4.0.12/doc/CMakeLists.txt 2019-11-25
12:04:52.000000000 +0100
+++ new/dnf-plugins-core-4.0.13/doc/CMakeLists.txt 2020-01-15
10:53:42.000000000 +0100
@@ -27,7 +27,6 @@
${CMAKE_CURRENT_BINARY_DIR}/dnf-download.8
${CMAKE_CURRENT_BINARY_DIR}/dnf-generate_completion_cache.8
${CMAKE_CURRENT_BINARY_DIR}/dnf-leaves.8
- ${CMAKE_CURRENT_BINARY_DIR}/dnf-migrate.8
${CMAKE_CURRENT_BINARY_DIR}/dnf-needs-restarting.8
${CMAKE_CURRENT_BINARY_DIR}/dnf-repoclosure.8
${CMAKE_CURRENT_BINARY_DIR}/dnf-repodiff.8
@@ -40,6 +39,10 @@
${CMAKE_CURRENT_BINARY_DIR}/yum-copr.8
${CMAKE_CURRENT_BINARY_DIR}/yum-versionlock.8
DESTINATION share/man/man8)
+if (${PYTHON_VERSION_MAJOR} STREQUAL "2")
+INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/dnf-migrate.8
+ DESTINATION share/man/man8)
+endif()
if (${WITHOUT_LOCAL} STREQUAL "0")
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/dnf-local.8
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/dnf-plugins-core-4.0.12/doc/conf.py
new/dnf-plugins-core-4.0.13/doc/conf.py
--- old/dnf-plugins-core-4.0.12/doc/conf.py 2019-11-25 12:04:52.000000000
+0100
+++ new/dnf-plugins-core-4.0.13/doc/conf.py 2020-01-15 10:53:42.000000000
+0100
@@ -80,6 +80,8 @@
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = ['_build']
+if sys.version_info[0] > 2:
+ exclude_patterns.append('migrate.rst')
# The reST default role (used for this markup: `text`) to use for all
# documents.
@@ -251,7 +253,6 @@
u'DNF generate_completion_cache Plugin', AUTHORS, 8),
('leaves', 'dnf-leaves', u'DNF leaves Plugin', AUTHORS, 8),
('local', 'dnf-local', u'DNF local Plugin', AUTHORS, 8),
- ('migrate', 'dnf-migrate', u'DNF migrate Plugin', AUTHORS, 8),
('needs_restarting', 'dnf-needs-restarting', u'DNF needs_restarting
Plugin', AUTHORS, 8),
('repoclosure', 'dnf-repoclosure', u'DNF repoclosure Plugin', AUTHORS, 8),
('repodiff', 'dnf-repodiff', u'DNF repodiff Plugin', AUTHORS, 8),
@@ -292,6 +293,8 @@
('dnf-utils', 'yum-utils', u'classic YUM utilities implemented as CLI
shims on top of DNF',
AUTHORS, 1),
]
+if sys.version_info[0] < 3:
+ man_pages.append(('migrate', 'dnf-migrate', u'DNF migrate Plugin',
AUTHORS, 8))
# If true, show URL addresses after external links.
#man_show_urls = False
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/dnf-plugins-core-4.0.12/doc/release_notes.rst
new/dnf-plugins-core-4.0.13/doc/release_notes.rst
--- old/dnf-plugins-core-4.0.12/doc/release_notes.rst 2019-11-25
12:04:52.000000000 +0100
+++ new/dnf-plugins-core-4.0.13/doc/release_notes.rst 2020-01-15
10:53:42.000000000 +0100
@@ -22,6 +22,24 @@
.. contents::
====================
+4.0.13 Release Notes
+====================
+
+- Fix: config_manager respect config file location during save
+- [reposync] Fix --delete with multiple repos (RhBug:1774103)
+- Redesign reposync --latest for modular system (RhBug:1775434)
+- [doc] Skip creating and installing migrate documentation for Python 3+
+- [config-manager] Allow use of --set-enabled without arguments (RhBug:1679213)
+- [versionlock] Prevent conflicting/duplicate entries (RhBug:1782052)
+
+Bugs fixed in 4.0.13:
+
+* :rhbug:`1679213`
+* :rhbug:`1782052`
+* :rhbug:`1775434`
+* :rhbug:`1774103`
+
+====================
4.0.12 Release Notes
====================
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/dnf-plugins-core-4.0.12/doc/summaries_cache
new/dnf-plugins-core-4.0.13/doc/summaries_cache
--- old/dnf-plugins-core-4.0.12/doc/summaries_cache 2019-11-25
12:04:52.000000000 +0100
+++ new/dnf-plugins-core-4.0.13/doc/summaries_cache 2020-01-15
10:53:42.000000000 +0100
@@ -522,5 +522,21 @@
[
1706386,
"[RFE] Discoverable man page names for DNF plugins"
+ ],
+ [
+ 1679213,
+ "yum-config-manager --enable/--disable without arguments is ambiguous"
+ ],
+ [
+ 1782052,
+ "dnf versionlock will accept equivalent package names to add or
exclude multiple times"
+ ],
+ [
+ 1775434,
+ "reposync does not properly sync modules with --newest option"
+ ],
+ [
+ 1774103,
+ "The '--delete' option when used with reposync command deletes the
packages immediately after download."
]
]
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/dnf-plugins-core-4.0.12/plugins/config_manager.py
new/dnf-plugins-core-4.0.13/plugins/config_manager.py
--- old/dnf-plugins-core-4.0.12/plugins/config_manager.py 2019-11-25
12:04:52.000000000 +0100
+++ new/dnf-plugins-core-4.0.13/plugins/config_manager.py 2020-01-15
10:53:42.000000000 +0100
@@ -67,11 +67,6 @@
def run(self):
"""Execute the util action here."""
-
- if self.opts.set_enabled and not self.opts.crepo:
- logger.error(_("Error: Trying to enable already enabled repos."))
- self.opts.set_enabled = False
-
if self.opts.add_repo:
self.add_repo()
else:
@@ -114,8 +109,9 @@
print("%s = %s" % (name, val))
if not self.opts.crepo or 'main' in self.opts.crepo:
if self.opts.save and modify:
- # modify [main] in dnf.conf
- self.base.conf.write_raw_configfile(dnf.const.CONF_FILENAME,
'main', sbc.substitutions, modify)
+ # modify [main] in global configuration file
+
self.base.conf.write_raw_configfile(self.base.conf.config_file_path, 'main',
+ sbc.substitutions, modify)
if self.opts.dump:
print(self.base.output.fmtSection('main'))
print(self.base.conf.dump())
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/dnf-plugins-core-4.0.12/plugins/reposync.py
new/dnf-plugins-core-4.0.13/plugins/reposync.py
--- old/dnf-plugins-core-4.0.12/plugins/reposync.py 2019-11-25
12:04:52.000000000 +0100
+++ new/dnf-plugins-core-4.0.13/plugins/reposync.py 2020-01-15
10:53:42.000000000 +0100
@@ -145,7 +145,7 @@
else:
self.download_packages(pkglist)
if self.opts.delete:
- self.delete_old_local_packages(pkglist)
+ self.delete_old_local_packages(repo, pkglist)
def repo_target(self, repo):
return _pkgdir(self.opts.destdir or self.opts.download_path, repo.id)
@@ -169,25 +169,20 @@
pkg_download_path, repo_target))
return pkg_download_path
- def delete_old_local_packages(self, packages_to_download):
- download_map = dict()
- for pkg in packages_to_download:
- download_map[(pkg.repo.id, os.path.basename(pkg.location))] =
pkg.location
- # delete any *.rpm file, that is not going to be downloaded from
repository
- for repo in self.base.repos.iter_enabled():
- repo_target = self.repo_target(repo)
- for dirpath, dirnames, filenames in os.walk(repo_target):
- for filename in filenames:
- path = os.path.join(dirpath, filename)
- if filename.endswith('.rpm') and os.path.isfile(path):
- location = download_map.get((repo.id, filename))
- if location is None or os.path.join(repo_target,
location) != path:
- # Delete disappeared or relocated file
- try:
- os.unlink(path)
- logger.info(_("[DELETED] %s"), path)
- except OSError:
- logger.error(_("failed to delete file %s"),
path)
+ def delete_old_local_packages(self, repo, pkglist):
+ # delete any *.rpm file under target path, that was not downloaded
from repository
+ downloaded_files = set(self.pkg_download_path(pkg) for pkg in pkglist)
+ for dirpath, dirnames, filenames in os.walk(self.repo_target(repo)):
+ for filename in filenames:
+ path = os.path.join(dirpath, filename)
+ if filename.endswith('.rpm') and os.path.isfile(path):
+ if path not in downloaded_files:
+ # Delete disappeared or relocated file
+ try:
+ os.unlink(path)
+ logger.info(_("[DELETED] %s"), path)
+ except OSError:
+ logger.error(_("failed to delete file %s"), path)
def getcomps(self, repo):
comps_fn = repo._repo.getCompsFn()
@@ -203,11 +198,35 @@
repo._repo.downloadMetadata(repo_target)
return True
+ def _get_latest(self, query):
+ """
+ return query with latest nonmodular package and all packages from
latest version per stream
+ """
+ if not dnf.base.WITH_MODULES:
+ return query.latest()
+ query.apply()
+ module_packages = self.base._moduleContainer.getModulePackages()
+ all_artifacts = set()
+ module_dict = {} # {NameStream: {Version: [modules]}}
+ for module_package in module_packages:
+ all_artifacts.update(module_package.getArtifacts())
+ module_dict.setdefault(module_package.getNameStream(),
{}).setdefault(
+ module_package.getVersionNum(), []).append(module_package)
+ non_modular_latest = query.filter(
+ pkg__neq=query.filter(nevra_strict=all_artifacts)).latest()
+ latest_artifacts = set()
+ for version_dict in module_dict.values():
+ keys = sorted(version_dict.keys(), reverse=True)
+ for module in version_dict[keys[0]]:
+ latest_artifacts.update(module.getArtifacts())
+ latest_modular_query = query.filter(nevra_strict=latest_artifacts)
+ return latest_modular_query.union(non_modular_latest)
+
def get_pkglist(self, repo):
query =
self.base.sack.query(flags=hawkey.IGNORE_MODULAR_EXCLUDES).available().filterm(
reponame=repo.id)
if self.opts.newest_only:
- query = query.latest()
+ query = self._get_latest(query)
if self.opts.source:
query.filterm(arch='src')
elif self.opts.arches:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/dnf-plugins-core-4.0.12/plugins/versionlock.py
new/dnf-plugins-core-4.0.13/plugins/versionlock.py
--- old/dnf-plugins-core-4.0.12/plugins/versionlock.py 2019-11-25
12:04:52.000000000 +0100
+++ new/dnf-plugins-core-4.0.13/plugins/versionlock.py 2020-01-15
10:53:42.000000000 +0100
@@ -33,6 +33,9 @@
NO_LOCKLIST = _('Locklist not set')
ADDING_SPEC = _('Adding versionlock on:')
EXCLUDING_SPEC = _('Adding exclude on:')
+EXISTING_SPEC = _('Package already locked in equivalent form:')
+ALREADY_LOCKED = _('Package {} is already locked')
+ALREADY_EXCLUDED = _('Package {} is already excluded')
DELETING_SPEC = _('Deleting versionlock for:')
NOTFOUND_SPEC = _('No package found for:')
NO_VERSIONLOCK = _('Excludes from versionlock plugin were not applied')
@@ -155,13 +158,25 @@
cmd = self.opts.subcommand
if cmd == 'add':
- _write_locklist(self.base, self.opts.package, self.opts.raw, True,
- "\n# Added locks on %s\n" % time.ctime(),
- ADDING_SPEC, '')
+ (entry, entry_cmd) = _search_locklist(self.opts.package)
+ if entry == '':
+ _write_locklist(self.base, self.opts.package, self.opts.raw,
True,
+ "\n# Added lock on %s\n" % time.ctime(),
+ ADDING_SPEC, '')
+ elif cmd != entry_cmd:
+ raise dnf.exceptions.Error(ALREADY_EXCLUDED.format(entry))
+ else:
+ logger.info("%s %s", EXISTING_SPEC, entry)
elif cmd == 'exclude':
- _write_locklist(self.base, self.opts.package, self.opts.raw, False,
- "\n# Added exclude on %s\n" % time.ctime(),
- EXCLUDING_SPEC, '!')
+ (entry, entry_cmd) = _search_locklist(self.opts.package)
+ if entry == '':
+ _write_locklist(self.base, self.opts.package, self.opts.raw,
False,
+ "\n# Added exclude on %s\n" % time.ctime(),
+ EXCLUDING_SPEC, '!')
+ elif cmd != entry_cmd:
+ raise dnf.exceptions.Error(ALREADY_LOCKED.format(entry))
+ else:
+ logger.info("%s %s", EXISTING_SPEC, entry)
elif cmd == 'list':
for pat in _read_locklist():
logger.info(pat)
@@ -202,6 +217,17 @@
return locklist
+def _search_locklist(package):
+ found = action = ''
+ locked_specs = _read_locklist()
+ for ent in locked_specs:
+ if _match(ent, package):
+ found = ent
+ action = 'exclude' if ent.startswith('!') else 'add'
+ break
+ return (found, action)
+
+
def _write_locklist(base, args, raw, try_installed, comment, info, prefix):
specs = set()
for pat in args:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/dnf-plugins-core-4.0.12/rel-eng/packages/dnf-plugins-core
new/dnf-plugins-core-4.0.13/rel-eng/packages/dnf-plugins-core
--- old/dnf-plugins-core-4.0.12/rel-eng/packages/dnf-plugins-core
2019-11-25 12:04:52.000000000 +0100
+++ new/dnf-plugins-core-4.0.13/rel-eng/packages/dnf-plugins-core
2020-01-15 10:53:42.000000000 +0100
@@ -1 +1 @@
-4.0.12-1 ./
+4.0.13-1 ./