Hello community,

here is the log from the commit of package dnf for openSUSE:Factory checked in 
at 2019-04-28 20:11:34
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/dnf (Old)
 and      /work/SRC/openSUSE:Factory/.dnf.new.5536 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "dnf"

Sun Apr 28 20:11:34 2019 rev:13 rq:698279 version:4.2.5

Changes:
--------
--- /work/SRC/openSUSE:Factory/dnf/dnf.changes  2019-04-21 09:04:53.322657070 
+0200
+++ /work/SRC/openSUSE:Factory/.dnf.new.5536/dnf.changes        2019-04-28 
20:12:01.830471536 +0200
@@ -1,0 +2,22 @@
+Fri Apr 26 11:11:22 UTC 2019 - Neal Gompa <[email protected]>
+
+- Update to version 4.2.5
+  + Fix multilib obsoletes (rh#1672947)
+  + Do not remove group package if other packages depend on it
+  + Remove duplicates from "dnf list" and "dnf info" outputs
+  + Installroot now requires absolute path
+  + Allow globs in setopt in repoid part
+  + Fix formatting of message about free space required
+  + [doc] Add info of relation update_cache with fill_sack (rh#1658694)
+  + Fix installation failiure when duplicate RPMs are specified (rh#1687286)
+  + Add command abbreviations (rh#1634232)
+  + Allow plugins to terminate dnf (rh#1701807)
+  + Fix installation of bash completion helper (rh#1695853)
+- Drop patches that are part of this release
+  * 0001-Add-command-abbreviations-RhBug-1634232.patch
+  * 0002-CMake-Actually-install-aliases.patch
+  * 0001-Fix-the-installation-of-completion_helper.py.patch
+- Backport fix for rendering exception messages in Python 3
+  * 0001-Python2-3-compatibility-for-exceptions-representatio.patch
+
+-------------------------------------------------------------------

Old:
----
  0001-Add-command-abbreviations-RhBug-1634232.patch
  0001-Fix-the-installation-of-completion_helper.py.patch
  0002-CMake-Actually-install-aliases.patch
  dnf-4.2.2.tar.gz

New:
----
  0001-Python2-3-compatibility-for-exceptions-representatio.patch
  dnf-4.2.5.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ dnf.spec ++++++
--- /var/tmp/diff_new_pack.oLbFU0/_old  2019-04-28 20:12:02.622471043 +0200
+++ /var/tmp/diff_new_pack.oLbFU0/_new  2019-04-28 20:12:02.626471041 +0200
@@ -17,7 +17,7 @@
 #
 
 
-%global hawkey_version 0.28.1
+%global hawkey_version 0.31.0
 %global libcomps_version 0.1.8
 %global rpm_version 4.14.0
 %global min_plugins_core 4.0.6
@@ -34,7 +34,7 @@
 %bcond_with tests
 
 Name:           dnf
-Version:        4.2.2
+Version:        4.2.5
 Release:        0
 Summary:        Package manager forked from Yum, using libsolv as a dependency 
resolver
 # For a breakdown of the licensing, see PACKAGE-LICENSING
@@ -44,13 +44,8 @@
 Source0:        %{url}/archive/%{version}/%{name}-%{version}.tar.gz
 
 # Backports from upstream
-## Restore command abbreviations dropped between dnf 2.7.5 to now
-Patch0001:      0001-Add-command-abbreviations-RhBug-1634232.patch
-## Fix installation of aliases
-Patch0002:      0002-CMake-Actually-install-aliases.patch
-## Fix installation of completion helper
-Patch0003:      0001-Fix-the-installation-of-completion_helper.py.patch
-
+## Fix exception message reporting in Python 3
+Patch0001:      0001-Python2-3-compatibility-for-exceptions-representatio.patch
 
 BuildRequires:  bash-completion
 BuildRequires:  cmake

++++++ 0001-Python2-3-compatibility-for-exceptions-representatio.patch ++++++
>From db5772cd0c3742894f5f2285c5ce6a7dc0f5c0f8 Mon Sep 17 00:00:00 2001
From: Marek Blaha <[email protected]>
Date: Tue, 23 Apr 2019 16:39:17 +0200
Subject: [PATCH] Python2/3 compatibility for exceptions representation

In Python3 the __unicode__() method is not called and that resulted in
different output when a MarkingError occured.

Python2:
Error: Unable to find a match: ninja-build-0:1.8.2-5.fc29.x86_64

Python3:
Error: Unable to find a match
---
 dnf/exceptions.py | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/dnf/exceptions.py b/dnf/exceptions.py
index 336ec3c2..20db9b9d 100644
--- a/dnf/exceptions.py
+++ b/dnf/exceptions.py
@@ -39,10 +39,11 @@ class Error(Exception):
         self.value = None if value is None else ucd(value)
 
     def __str__(self):
-        return "%s" %(self.value,)
+        return "{}".format(self.value)
 
     def __unicode__(self):
-        return '%s' % self.value
+        return ucd(self.__str__())
+
 
 
 class CompsError(Error):
@@ -78,9 +79,6 @@ class DownloadError(Error):
     def __str__(self):
         return self.errmap2str(self.errmap)
 
-    def __unicode__(self):
-        return ucd(self.__str__())
-
 
 class LockError(Error):
     pass
@@ -94,8 +92,8 @@ class MarkingError(Error):
         super(MarkingError, self).__init__(value)
         self.pkg_spec = None if pkg_spec is None else ucd(pkg_spec)
 
-    def __unicode__(self):
-        string = super(MarkingError, self).__unicode__()
+    def __str__(self):
+        string = super(MarkingError, self).__str__()
         if self.pkg_spec:
             string += ': ' + self.pkg_spec
         return string
-- 
2.20.1

++++++ dnf-4.2.2.tar.gz -> dnf-4.2.5.tar.gz ++++++
++++ 5549 lines of diff (skipped)
++++    retrying with extended exclude list
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/VERSION.cmake new/dnf-4.2.5/VERSION.cmake
--- old/dnf-4.2.2/VERSION.cmake 2019-03-27 12:42:04.000000000 +0100
+++ new/dnf-4.2.5/VERSION.cmake 2019-04-25 10:44:57.000000000 +0200
@@ -1 +1 @@
-SET(DNF_VERSION "4.2.2")
+SET(DNF_VERSION "4.2.5")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/dnf/base.py new/dnf-4.2.5/dnf/base.py
--- old/dnf-4.2.2/dnf/base.py   2019-03-27 12:42:04.000000000 +0100
+++ new/dnf-4.2.5/dnf/base.py   2019-04-25 10:44:57.000000000 +0200
@@ -74,6 +74,7 @@
 import hawkey
 import itertools
 import logging
+import math
 import os
 import operator
 import re
@@ -133,15 +134,13 @@
 
     def _add_repo_to_sack(self, repo):
         repo.load()
-        hrepo = repo._hawkey_repo
-        repo._repo.initHyRepo(hrepo)
         mdload_flags = dict(load_filelists=True,
                             load_presto=repo.deltarpm,
                             load_updateinfo=True)
         if repo.load_metadata_other:
             mdload_flags["load_other"] = True
         try:
-            self._sack.load_repo(hrepo, build_cache=True, **mdload_flags)
+            self._sack.load_repo(repo._repo, build_cache=True, **mdload_flags)
         except hawkey.Exception as e:
             logger.debug(_("loading repo '{}' failure: {}").format(repo.id, e))
             raise dnf.exceptions.RepoError(
@@ -353,7 +352,8 @@
                 repo._repo.setMaxMirrorTries(1)
 
         if not self.repos._any_enabled():
-            logger.info(_('There are no enabled repos.'))
+            logger.info(_('There are no enabled repositories in "{}".').format(
+                '", "'.join(self.conf.reposdir)))
             return False
 
         for r in self.repos.iter_enabled():
@@ -383,9 +383,6 @@
         """Prepare the Sack and the Goal objects. """
         timer = dnf.logging.Timer('sack setup')
         self.reset(sack=True, goal=True)
-        if self._repos is not None:
-            for repo in self._repos.values():
-                repo._hawkey_repo = repo._init_hawkey_repo()
         self._sack = dnf.sack._build_sack(self)
         lock = dnf.lock.build_metadata_lock(self.conf.cachedir, 
self.conf.exit_on_lock)
         with lock:
@@ -498,9 +495,6 @@
         """Make the Base object forget about various things."""
         if sack:
             self._sack = None
-            if self._repos is not None:
-                for repo in self._repos.values():
-                    repo._hawkey_repo = None
         if repos:
             self._repos = dnf.repodict.RepoDict()
         if goal:
@@ -646,9 +640,10 @@
         for pkg in goal.list_installs():
             self._ds_callback.pkg_added(pkg, 'i')
             obs = goal.obsoleted_by_package(pkg)
-            # skip obsoleted packages that are not part of all_obsoleted
-            # they are handled as upgrades/downgrades
-            obs = [i for i in obs if i in all_obsoleted]
+            # Skip obsoleted packages that are not part of all_obsoleted,
+            # they are handled as upgrades/downgrades.
+            # Also keep RPMs with the same name - they're not always in 
all_obsoleted.
+            obs = [i for i in obs if i in all_obsoleted or i.name == pkg.name]
 
             # TODO: move to libdnf: getBestReason
             reason = goal.get_reason(pkg)
@@ -680,9 +675,11 @@
                 upgraded = obs.pop(0)
             else:
                 obs.remove(upgraded)
-            # skip obsoleted packages that are not part of all_obsoleted
-            # they are handled as upgrades/downgrades
-            obs = [i for i in obs if i in all_obsoleted]
+            # Skip obsoleted packages that are not part of all_obsoleted,
+            # they are handled as upgrades/downgrades.
+            # Also keep RPMs with the same name - they're not always in 
all_obsoleted.
+            obs = [i for i in obs if i in all_obsoleted or i.name == pkg.name]
+
             cb = lambda pkg: self._ds_callback.pkg_added(pkg, 'od')
             dnf.util.mapall(cb, obs)
             if pkg in self._get_installonly_query():
@@ -895,13 +892,15 @@
         """
         summary = ''
         # do disk space report first
-        p = re.compile(r'needs (\d+)MB on the (\S+) filesystem')
+        p = re.compile(r'needs (\d+)(K|M)B on the (\S+) filesystem')
         disk = {}
         for m in p.finditer(errstring):
-            if m.group(2) not in disk:
-                disk[m.group(2)] = int(m.group(1))
-            if disk[m.group(2)] < int(m.group(1)):
-                disk[m.group(2)] = int(m.group(1))
+            size_in_mb = int(m.group(1)) if m.group(2) == 'M' else math.ceil(
+                int(m.group(1)) / 1024.0)
+            if m.group(3) not in disk:
+                disk[m.group(3)] = size_in_mb
+            if disk[m.group(3)] < size_in_mb:
+                disk[m.group(3)] = size_in_mb
 
         if disk:
             summary += _('Disk Requirements:') + "\n"
@@ -1033,7 +1032,10 @@
         return tid
 
     def _verify_transaction(self, verify_pkg_cb=None):
-        total = len(self.transaction)
+        transaction_items = [
+            tsi for tsi in self.transaction
+            if tsi.action != 
libdnf.transaction.TransactionItemAction_REASON_CHANGE]
+        total = len(transaction_items)
 
         def display_banner(pkg, count):
             count += 1
@@ -1062,7 +1064,7 @@
         # because DNF trusts error codes returned by RPM.
         # Verification banner is displayed to preserve UX.
         # TODO: drop in future DNF
-        for tsi in self._transaction:
+        for tsi in transaction_items:
             count = display_banner(tsi.pkg, count)
 
         rpmdbv = rpmdb_sack._rpmdb_version()
@@ -1464,9 +1466,16 @@
         if not query:
             return
 
-        unneeded_pkgs = query._unneeded(self.history.swdb, debug_solver=False)
-        unneeded_pkgs_history = query.filter(pkg=[i for i in query if 
self.history.group.is_removable_pkg(i.name)])
-        unneeded_pkgs = unneeded_pkgs.union(unneeded_pkgs_history)
+        unneeded_pkgs = query._safe_to_remove(self.history.swdb, 
debug_solver=False)
+        unneeded_pkgs_history = query.filter(
+            pkg=[i for i in query if 
self.history.group.is_removable_pkg(i.name)])
+        pkg_with_dependent_pkgs = 
unneeded_pkgs_history.difference(unneeded_pkgs)
+
+        # mark packages with dependent packages as a dependency to allow 
removal with dependent
+        # package
+        for pkg in pkg_with_dependent_pkgs:
+            self.history.set_reason(pkg, 
libdnf.transaction.TransactionItemReason_DEPENDENCY)
+        unneeded_pkgs = unneeded_pkgs.intersection(unneeded_pkgs_history)
 
         remove_packages = query.intersection(unneeded_pkgs)
         if remove_packages:
@@ -1813,7 +1822,7 @@
                 logger.error(msg, spec)
                 no_match_pkg_specs.append(spec)
         no_match_module_specs = []
-        module_debsolv_errors = ()
+        module_depsolv_errors = ()
         if WITH_MODULES and install_specs.grp_specs:
             try:
                 module_base = dnf.module.module_base.ModuleBase(self)
@@ -1825,7 +1834,7 @@
                 if e.error_group_specs:
                     for e_spec in e.error_group_specs:
                         error_group_specs.append("@" + e_spec)
-                module_debsolv_errors = e.module_debsolv_errors
+                module_depsolv_errors = e.module_depsolv_errors
 
         else:
             no_match_module_specs = install_specs.grp_specs
@@ -1836,12 +1845,12 @@
             self._install_groups(no_match_module_specs, exclude_specs, 
no_match_group_specs, strict)
 
         if no_match_group_specs or error_group_specs or no_match_pkg_specs or 
error_pkg_specs \
-                or module_debsolv_errors:
+                or module_depsolv_errors:
             raise 
dnf.exceptions.MarkingErrors(no_match_group_specs=no_match_group_specs,
                                                
error_group_specs=error_group_specs,
                                                
no_match_pkg_specs=no_match_pkg_specs,
                                                error_pkg_specs=error_pkg_specs,
-                                               
module_debsolv_errors=module_debsolv_errors)
+                                               
module_depsolv_errors=module_depsolv_errors)
 
     def install(self, pkg_spec, reponame=None, strict=True, forms=None):
         # :api
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/dnf/cli/CMakeLists.txt new/dnf-4.2.5/dnf/cli/CMakeLists.txt
--- old/dnf-4.2.2/dnf/cli/CMakeLists.txt        2019-03-27 12:42:04.000000000 
+0100
+++ new/dnf-4.2.5/dnf/cli/CMakeLists.txt        2019-04-25 10:44:57.000000000 
+0200
@@ -1,4 +1,6 @@
 FILE(GLOB cli_SRCS *.py)
 INSTALL (FILES ${cli_SRCS} DESTINATION ${PYTHON_INSTALL_DIR}/dnf/cli)
+# completion_helper.py is generated so the glob alone won't see it:
+INSTALL (FILES completion_helper.py DESTINATION ${PYTHON_INSTALL_DIR}/dnf/cli)
 
-ADD_SUBDIRECTORY (commands)
\ No newline at end of file
+ADD_SUBDIRECTORY (commands)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/dnf/cli/commands/__init__.py 
new/dnf-4.2.5/dnf/cli/commands/__init__.py
--- old/dnf-4.2.2/dnf/cli/commands/__init__.py  2019-03-27 12:42:04.000000000 
+0100
+++ new/dnf-4.2.5/dnf/cli/commands/__init__.py  2019-04-25 10:44:57.000000000 
+0200
@@ -97,8 +97,7 @@
         scheme = dnf.pycomp.urlparse.urlparse(lfile)[0]
         if scheme in ('http', 'ftp', 'file', 'https'):
             return
-
-    msg = _('There are no enabled repos.')
+    msg = _('There are no enabled repositories in "{}".').format('", 
"'.join(base.conf.reposdir))
     raise dnf.cli.CliError(msg)
 
 
@@ -236,7 +235,7 @@
     provides command.
     """
 
-    aliases = ('provides', 'whatprovides')
+    aliases = ('provides', 'whatprovides', 'prov')
     summary = _('find what package provides the given value')
 
     @staticmethod
@@ -817,7 +816,7 @@
     history command.
     """
 
-    aliases = ('history',)
+    aliases = ('history', 'hist')
     summary = _('display, or use, the transaction history')
 
     transaction_ids = set()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/dnf/cli/commands/distrosync.py 
new/dnf-4.2.5/dnf/cli/commands/distrosync.py
--- old/dnf-4.2.2/dnf/cli/commands/distrosync.py        2019-03-27 
12:42:04.000000000 +0100
+++ new/dnf-4.2.5/dnf/cli/commands/distrosync.py        2019-04-25 
10:44:57.000000000 +0200
@@ -28,7 +28,7 @@
     distro-synch command.
     """
 
-    aliases = ('distro-sync', 'distrosync', 'distribution-synchronization')
+    aliases = ('distro-sync', 'distrosync', 'distribution-synchronization', 
'dsync')
     summary = _('synchronize installed packages to the latest available 
versions')
 
     @staticmethod
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/dnf/cli/commands/downgrade.py 
new/dnf-4.2.5/dnf/cli/commands/downgrade.py
--- old/dnf-4.2.2/dnf/cli/commands/downgrade.py 2019-03-27 12:42:04.000000000 
+0100
+++ new/dnf-4.2.5/dnf/cli/commands/downgrade.py 2019-04-25 10:44:57.000000000 
+0200
@@ -30,7 +30,7 @@
     downgrade command.
     """
 
-    aliases = ('downgrade',)
+    aliases = ('downgrade', 'dg')
     summary = _("Downgrade a package")
 
     @staticmethod
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/dnf/cli/commands/group.py new/dnf-4.2.5/dnf/cli/commands/group.py
--- old/dnf-4.2.2/dnf/cli/commands/group.py     2019-03-27 12:42:04.000000000 
+0100
+++ new/dnf-4.2.5/dnf/cli/commands/group.py     2019-04-25 10:44:57.000000000 
+0200
@@ -41,7 +41,7 @@
                        'groupremove'  : 'remove',
                        'grouperase'   : 'remove',
                        'groupinfo'    : 'info'}
-    aliases = ('group', 'groups') + tuple(direct_commands.keys())
+    aliases = ('group', 'groups', 'grp') + tuple(direct_commands.keys())
     summary = _('display, or use, the groups information')
 
     _CMD_ALIASES = {'update'     : 'upgrade',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/dnf/cli/commands/install.py 
new/dnf-4.2.5/dnf/cli/commands/install.py
--- old/dnf-4.2.2/dnf/cli/commands/install.py   2019-03-27 12:42:04.000000000 
+0100
+++ new/dnf-4.2.5/dnf/cli/commands/install.py   2019-04-25 10:44:57.000000000 
+0200
@@ -43,7 +43,7 @@
                    'install-nevra': hawkey.FORM_NEVRA}
     alternatives_provide = 'alternative-for({})'
 
-    aliases = ('install', 'localinstall') + tuple(nevra_forms.keys())
+    aliases = ('install', 'localinstall', 'in') + tuple(nevra_forms.keys())
     summary = _('install a package or packages on your system')
 
     @staticmethod
@@ -91,10 +91,10 @@
                     if e.error_group_specs:
                         for e_spec in e.error_group_specs:
                             error_module_specs.append("@" + e_spec)
-                    module_debsolv_errors = e.module_debsolv_errors
-                    if module_debsolv_errors:
+                    module_depsolv_errors = e.module_depsolv_errors
+                    if module_depsolv_errors:
                         
logger.error(dnf.module.module_base.format_modular_solver_errors(
-                            module_debsolv_errors[0]))
+                            module_depsolv_errors[0]))
             else:
                 skipped_grp_specs = self.opts.grp_specs
         if self.opts.filenames and nevra_forms:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/dnf/cli/commands/makecache.py 
new/dnf-4.2.5/dnf/cli/commands/makecache.py
--- old/dnf-4.2.2/dnf/cli/commands/makecache.py 2019-03-27 12:42:04.000000000 
+0100
+++ new/dnf-4.2.5/dnf/cli/commands/makecache.py 2019-04-25 10:44:57.000000000 
+0200
@@ -33,7 +33,7 @@
 
 
 class MakeCacheCommand(commands.Command):
-    aliases = ('makecache',)
+    aliases = ('makecache', 'mc')
     summary = _('generate the metadata cache')
 
     @staticmethod
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/dnf/cli/commands/module.py 
new/dnf-4.2.5/dnf/cli/commands/module.py
--- old/dnf-4.2.2/dnf/cli/commands/module.py    2019-03-27 12:42:04.000000000 
+0100
+++ new/dnf-4.2.5/dnf/cli/commands/module.py    2019-04-25 10:44:57.000000000 
+0200
@@ -118,7 +118,7 @@
                 if self.base.conf.strict:
                     if e.no_match_group_specs or e.error_group_specs:
                         raise e
-                    if e.module_debsolv_errors and e.module_debsolv_errors[1] 
!= \
+                    if e.module_depsolv_errors and e.module_depsolv_errors[1] 
!= \
                             
libdnf.module.ModulePackageContainer.ModuleErrorType_ERROR_IN_DEFAULTS:
                         raise e
                 logger.error(str(e))
@@ -149,7 +149,7 @@
                 if self.base.conf.strict:
                     if e.no_match_group_specs or e.error_group_specs:
                         raise e
-                    if e.module_debsolv_errors and e.module_debsolv_errors[1] 
!= \
+                    if e.module_depsolv_errors and e.module_depsolv_errors[1] 
!= \
                             
libdnf.module.ModulePackageContainer.ModuleErrorType_ERROR_IN_DEFAULTS:
                         raise e
                 logger.error(str(e))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/dnf/cli/commands/reinstall.py 
new/dnf-4.2.5/dnf/cli/commands/reinstall.py
--- old/dnf-4.2.2/dnf/cli/commands/reinstall.py 2019-03-27 12:42:04.000000000 
+0100
+++ new/dnf-4.2.5/dnf/cli/commands/reinstall.py 2019-04-25 10:44:57.000000000 
+0200
@@ -34,7 +34,7 @@
     """A class containing methods needed by the cli to execute the reinstall 
command.
     """
 
-    aliases = ('reinstall',)
+    aliases = ('reinstall', 'rei')
     summary = _('reinstall a package')
 
     @staticmethod
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/dnf/cli/commands/remove.py 
new/dnf-4.2.5/dnf/cli/commands/remove.py
--- old/dnf-4.2.2/dnf/cli/commands/remove.py    2019-03-27 12:42:04.000000000 
+0100
+++ new/dnf-4.2.5/dnf/cli/commands/remove.py    2019-04-25 10:44:57.000000000 
+0200
@@ -42,7 +42,7 @@
                    'erase-na': hawkey.FORM_NA,
                    'erase-nevra': hawkey.FORM_NEVRA}
 
-    aliases = ('remove', 'erase',) + tuple(nevra_forms.keys())
+    aliases = ('remove', 'erase', 'rm') + tuple(nevra_forms.keys())
     summary = _('remove a package or packages from your system')
 
     @staticmethod
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/dnf/cli/commands/repoquery.py 
new/dnf-4.2.5/dnf/cli/commands/repoquery.py
--- old/dnf-4.2.2/dnf/cli/commands/repoquery.py 2019-03-27 12:42:04.000000000 
+0100
+++ new/dnf-4.2.5/dnf/cli/commands/repoquery.py 2019-04-25 10:44:57.000000000 
+0200
@@ -100,7 +100,7 @@
                    'repoquery-na': hawkey.FORM_NA,
                    'repoquery-nevra': hawkey.FORM_NEVRA}
 
-    aliases = ('repoquery',) + tuple(nevra_forms.keys())
+    aliases = ('repoquery', 'rq') + tuple(nevra_forms.keys())
     summary = _('search for packages matching keyword')
 
     @staticmethod
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/dnf/cli/commands/search.py 
new/dnf-4.2.5/dnf/cli/commands/search.py
--- old/dnf-4.2.2/dnf/cli/commands/search.py    2019-03-27 12:42:04.000000000 
+0100
+++ new/dnf-4.2.5/dnf/cli/commands/search.py    2019-04-25 10:44:57.000000000 
+0200
@@ -42,7 +42,7 @@
     search command.
     """
 
-    aliases = ('search',)
+    aliases = ('search', 'se')
     summary = _('search package details for the given string')
 
     @staticmethod
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/dnf/cli/commands/shell.py new/dnf-4.2.5/dnf/cli/commands/shell.py
--- old/dnf-4.2.2/dnf/cli/commands/shell.py     2019-03-27 12:42:04.000000000 
+0100
+++ new/dnf-4.2.5/dnf/cli/commands/shell.py     2019-04-25 10:44:57.000000000 
+0200
@@ -43,7 +43,7 @@
 
 class ShellCommand(commands.Command, cmd.Cmd):
 
-    aliases = ('shell',)
+    aliases = ('shell', 'sh')
     summary = _('run an interactive DNF shell')
 
     MAPPING = {'repo': 'repo',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/dnf/cli/commands/upgrade.py 
new/dnf-4.2.5/dnf/cli/commands/upgrade.py
--- old/dnf-4.2.2/dnf/cli/commands/upgrade.py   2019-03-27 12:42:04.000000000 
+0100
+++ new/dnf-4.2.5/dnf/cli/commands/upgrade.py   2019-04-25 10:44:57.000000000 
+0200
@@ -36,7 +36,7 @@
     """A class containing methods needed by the cli to execute the
     update command.
     """
-    aliases = ('upgrade', 'update', 'upgrade-to', 'update-to', 'localupdate')
+    aliases = ('upgrade', 'update', 'upgrade-to', 'update-to', 'localupdate', 
'up')
     summary = _('upgrade a package or packages on your system')
 
     @staticmethod
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/dnf/cli/commands/upgrademinimal.py 
new/dnf-4.2.5/dnf/cli/commands/upgrademinimal.py
--- old/dnf-4.2.2/dnf/cli/commands/upgrademinimal.py    2019-03-27 
12:42:04.000000000 +0100
+++ new/dnf-4.2.5/dnf/cli/commands/upgrademinimal.py    2019-04-25 
10:44:57.000000000 +0200
@@ -27,7 +27,7 @@
     command.
     """
 
-    aliases = ('upgrade-minimal', 'update-minimal')
+    aliases = ('upgrade-minimal', 'update-minimal', 'up-min')
     summary = _("upgrade, but only 'newest' package match which fixes a 
problem"
                 " that affects your system")
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/dnf/cli/output.py new/dnf-4.2.5/dnf/cli/output.py
--- old/dnf-4.2.2/dnf/cli/output.py     2019-03-27 12:42:04.000000000 +0100
+++ new/dnf-4.2.5/dnf/cli/output.py     2019-04-25 10:44:57.000000000 +0200
@@ -647,6 +647,14 @@
             if len(lst) > 0:
                 thingslisted = 1
                 print('%s' % description)
+                info_set = set()
+                if outputType == 'list':
+                    unique_item_dict = {}
+                    for pkg in lst:
+                        unique_item_dict[str(pkg) + str(pkg._from_repo)] = pkg
+
+                    lst = unique_item_dict.values()
+
                 for pkg in sorted(lst):
                     key = (pkg.name, pkg.arch)
                     highlight = False
@@ -663,7 +671,7 @@
                         self.simpleList(pkg, ui_overflow=True,
                                         highlight=highlight, columns=columns)
                     elif outputType == 'info':
-                        print(self.infoOutput(pkg, highlight=highlight) + "\n")
+                        info_set.add(self.infoOutput(pkg, highlight=highlight) 
+ "\n")
                     elif outputType == 'name':
                         self.simple_name_list(pkg)
                     elif outputType == 'nevra':
@@ -671,6 +679,9 @@
                     else:
                         pass
 
+                if info_set:
+                    print("\n".join(sorted(info_set)))
+
             if thingslisted == 0:
                 return 1, [_('No packages to list')]
             return 0, []
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/dnf/conf/config.py new/dnf-4.2.5/dnf/conf/config.py
--- old/dnf-4.2.2/dnf/conf/config.py    2019-03-27 12:42:04.000000000 +0100
+++ new/dnf-4.2.5/dnf/conf/config.py    2019-04-25 10:44:57.000000000 +0200
@@ -24,7 +24,7 @@
 from dnf.i18n import ucd, _
 from dnf.pycomp import basestring
 
-import copy
+import fnmatch
 import dnf.conf.substitutions
 import dnf.const
 import dnf.exceptions
@@ -438,10 +438,10 @@
                 self._set_value(optname, False, dnf.conf.PRIO_COMMANDLINE)
 
         repo_setopts = getattr(opts, 'repo_setopts', {})
-        if self._section in repo_setopts:
-            # pylint: disable=W0212
-            setopts = repo_setopts[self._section].items()
-            for name, values in setopts:
+        for repoid, setopts in repo_setopts.items():
+            if not fnmatch.fnmatch(self._section, repoid):
+                continue
+            for name, values in setopts.items():
                 for val in values:
                     if hasattr(self._config, name):
                         try:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/dnf/exceptions.py new/dnf-4.2.5/dnf/exceptions.py
--- old/dnf-4.2.2/dnf/exceptions.py     2019-03-27 12:42:04.000000000 +0100
+++ new/dnf-4.2.5/dnf/exceptions.py     2019-04-25 10:44:57.000000000 +0200
@@ -21,6 +21,7 @@
 from dnf.i18n import ucd, _, P_
 import dnf.util
 import libdnf
+import warnings
 
 class DeprecationWarning(DeprecationWarning):
     # :api
@@ -102,7 +103,7 @@
 
 class MarkingErrors(Error):
     def __init__(self, no_match_group_specs=(), error_group_specs=(), 
no_match_pkg_specs=(),
-                 error_pkg_specs=(), module_debsolv_errors=()):
+                 error_pkg_specs=(), module_depsolv_errors=()):
         """Initialize the marking error instance."""
         msg = _("Problems in request:")
         if (no_match_pkg_specs):
@@ -113,25 +114,32 @@
             msg += "\n" + _("missing groups or modules: ") + ", 
".join(no_match_group_specs)
         if (error_group_specs):
             msg += "\n" + _("broken groups or modules: ") + ", 
".join(error_group_specs)
-        if (module_debsolv_errors):
-            msg_mod = 
dnf.util._format_resolve_problems(module_debsolv_errors[0])
-            if module_debsolv_errors[1] == \
+        if (module_depsolv_errors):
+            msg_mod = 
dnf.util._format_resolve_problems(module_depsolv_errors[0])
+            if module_depsolv_errors[1] == \
                     
libdnf.module.ModulePackageContainer.ModuleErrorType_ERROR_IN_DEFAULTS:
                 msg += "\n" + "\n".join([P_('Modular dependency problem with 
Defaults:',
                                             'Modular dependency problems with 
Defaults:',
-                                            len(module_debsolv_errors)),
+                                            len(module_depsolv_errors)),
                                         msg_mod])
             else:
                 msg += "\n" + "\n".join([P_('Modular dependency problem:',
                                             'Modular dependency problems:',
-                                            len(module_debsolv_errors)),
+                                            len(module_depsolv_errors)),
                                         msg_mod])
         super(MarkingErrors, self).__init__(msg)
         self.no_match_group_specs = no_match_group_specs
         self.error_group_specs = error_group_specs
         self.no_match_pkg_specs = no_match_pkg_specs
         self.error_pkg_specs = error_pkg_specs
-        self.module_debsolv_errors = module_debsolv_errors
+        self.module_depsolv_errors = module_depsolv_errors
+
+    @property
+    def module_debsolv_errors(self):
+        msg = "Attribute module_debsolv_errors is deprecated. Use 
module_depsolv_errors " \
+              "attribute instead."
+        warnings.warn(msg, DeprecationWarning, stacklevel=2)
+        return self.module_depsolv_errors
 
 class MetadataError(Error):
     pass
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/dnf/i18n.py new/dnf-4.2.5/dnf/i18n.py
--- old/dnf-4.2.2/dnf/i18n.py   2019-03-27 12:42:04.000000000 +0100
+++ new/dnf-4.2.5/dnf/i18n.py   2019-04-25 10:44:57.000000000 +0200
@@ -80,11 +80,16 @@
 def setup_locale():
     try:
         dnf.pycomp.setlocale(locale.LC_ALL, '')
-    except locale.Error as e:
-        # default to C locale if we get a failure.
-        print('Failed to set locale, defaulting to C', file=sys.stderr)
-        os.environ['LC_ALL'] = 'C'
-        dnf.pycomp.setlocale(locale.LC_ALL, 'C')
+    except locale.Error:
+        # default to C.UTF-8 or C locale if we got a failure.
+        try:
+            dnf.pycomp.setlocale(locale.LC_ALL, 'C.UTF-8')
+            os.environ['LC_ALL'] = 'C.UTF-8'
+        except locale.Error:
+            dnf.pycomp.setlocale(locale.LC_ALL, 'C')
+            os.environ['LC_ALL'] = 'C'
+        print('Failed to set locale, defaulting to 
{}'.format(os.environ['LC_ALL']),
+              file=sys.stderr)
 
 def setup_stdout():
     """ Check that stdout is of suitable encoding and handle the situation if
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/dnf/module/module_base.py new/dnf-4.2.5/dnf/module/module_base.py
--- old/dnf-4.2.2/dnf/module/module_base.py     2019-03-27 12:42:04.000000000 
+0100
+++ new/dnf-4.2.5/dnf/module/module_base.py     2019-04-25 10:44:57.000000000 
+0200
@@ -48,13 +48,13 @@
         if no_match_specs or error_specs or solver_errors:
             raise 
dnf.exceptions.MarkingErrors(no_match_group_specs=no_match_specs,
                                                error_group_specs=error_specs,
-                                               
module_debsolv_errors=solver_errors)
+                                               
module_depsolv_errors=solver_errors)
 
     def disable(self, module_specs):
         no_match_specs, solver_errors = 
self._modules_reset_or_disable(module_specs, STATE_DISABLED)
         if no_match_specs or solver_errors:
             raise 
dnf.exceptions.MarkingErrors(no_match_group_specs=no_match_specs,
-                                               
module_debsolv_errors=solver_errors)
+                                               
module_depsolv_errors=solver_errors)
 
     def install(self, module_specs, strict=True):
         no_match_specs, error_specs, solver_errors, module_dicts = \
@@ -126,13 +126,13 @@
         if no_match_specs or error_specs or solver_errors:
             raise 
dnf.exceptions.MarkingErrors(no_match_group_specs=no_match_specs,
                                                error_group_specs=error_specs,
-                                               
module_debsolv_errors=solver_errors)
+                                               
module_depsolv_errors=solver_errors)
 
     def reset(self, module_specs):
         no_match_specs, solver_errors = 
self._modules_reset_or_disable(module_specs, STATE_UNKNOWN)
         if no_match_specs:
             raise 
dnf.exceptions.MarkingErrors(no_match_group_specs=no_match_specs,
-                                               
module_debsolv_errors=solver_errors)
+                                               
module_depsolv_errors=solver_errors)
 
     def upgrade(self, module_specs):
         no_match_specs = []
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/dnf/plugin.py new/dnf-4.2.5/dnf/plugin.py
--- old/dnf-4.2.2/dnf/plugin.py 2019-03-27 12:42:04.000000000 +0100
+++ new/dnf-4.2.5/dnf/plugin.py 2019-04-25 10:44:57.000000000 +0200
@@ -102,6 +102,8 @@
         for plugin in self.plugins:
             try:
                 getattr(plugin, method)()
+            except dnf.exceptions.Error:
+                raise
             except Exception:
                 exc_type, exc_value, exc_traceback = sys.exc_info()
                 except_list = traceback.format_exception(exc_type, exc_value, 
exc_traceback)
@@ -194,7 +196,7 @@
         try:
             module = importlib.import_module(name)
         except Exception as e:
-            logger.error(_('Failed loading plugin: %s'), module)
+            logger.error(_('Failed loading plugin "%s": %s'), module, e)
             logger.log(dnf.logging.SUBDEBUG, '', exc_info=True)
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/dnf/repo.py new/dnf-4.2.5/dnf/repo.py
--- old/dnf-4.2.2/dnf/repo.py   2019-03-27 12:42:04.000000000 +0100
+++ new/dnf-4.2.5/dnf/repo.py   2019-04-25 10:44:57.000000000 +0200
@@ -436,7 +436,6 @@
         if parent_conf:
             self._repo.setSubstitutions(parent_conf.substitutions)
         self._substitutions = dnf.conf.substitutions.Substitutions()
-        self._hawkey_repo = self._init_hawkey_repo()
         self._check_config_file_age = parent_conf.check_config_file_age \
             if parent_conf is not None else True
 
@@ -488,16 +487,6 @@
 
     def __setattr__(self, name, value):
         super(Repo, self).__setattr__(name, value)
-        if name == 'cost':
-            self._hawkey_repo.cost = self.cost
-        if name == 'priority':
-            self._hawkey_repo.priority = self.priority
-
-    def _init_hawkey_repo(self):
-        hrepo = hawkey.Repo(self.id)
-        hrepo.cost = self.cost
-        hrepo.priority = self.priority
-        return hrepo
 
     def disable(self):
         # :api
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/dnf/rpm/transaction.py new/dnf-4.2.5/dnf/rpm/transaction.py
--- old/dnf-4.2.2/dnf/rpm/transaction.py        2019-03-27 12:42:04.000000000 
+0100
+++ new/dnf-4.2.5/dnf/rpm/transaction.py        2019-04-25 10:44:57.000000000 
+0200
@@ -11,6 +11,7 @@
 
 from __future__ import absolute_import
 from __future__ import unicode_literals
+from dnf.i18n import _
 import rpm
 
 read_ts = None
@@ -111,9 +112,11 @@
         self.ts.setFlags(origflags)
 
         reserrors = []
-        if tserrors:
+        if tserrors is not None:
             for (descr, (etype, mount, need)) in tserrors:
                 reserrors.append(descr)
+            if not reserrors:
+                reserrors.append(_('Errors occurred during test transaction.'))
 
         return reserrors
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/dnf/sack.py new/dnf-4.2.5/dnf/sack.py
--- old/dnf-4.2.2/dnf/sack.py   2019-03-27 12:42:04.000000000 +0100
+++ new/dnf-4.2.5/dnf/sack.py   2019-04-25 10:44:57.000000000 +0200
@@ -31,7 +31,6 @@
 class Sack(hawkey.Sack):
     def __init__(self, *args, **kwargs):
         super(Sack, self).__init__(*args, **kwargs)
-        self._moduleContainer = None
 
     def _configure(self, installonly=None, installonly_limit=0):
         if installonly:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/dnf/util.py new/dnf-4.2.5/dnf/util.py
--- old/dnf-4.2.2/dnf/util.py   2019-03-27 12:42:04.000000000 +0100
+++ new/dnf-4.2.5/dnf/util.py   2019-04-25 10:44:57.000000000 +0200
@@ -63,7 +63,11 @@
     setattr(namespace, "filenames", [])
     setattr(namespace, "grp_specs", [])
     setattr(namespace, "pkg_specs", [])
+    tmp_set = set()
     for value in values:
+        if value in tmp_set:
+            continue
+        tmp_set.add(value)
         schemes = dnf.pycomp.urlparse.urlparse(value)[0]
         if value.endswith('.rpm'):
             namespace.filenames.append(value)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/dnf.spec new/dnf-4.2.5/dnf.spec
--- old/dnf-4.2.2/dnf.spec      2019-03-27 12:42:04.000000000 +0100
+++ new/dnf-4.2.5/dnf.spec      2019-04-25 10:44:57.000000000 +0200
@@ -1,5 +1,5 @@
 # default dependencies
-%global hawkey_version 0.28.0
+%global hawkey_version 0.31.0
 %global libcomps_version 0.1.8
 %global libmodulemd_version 1.4.0
 %global rpm_version 4.14.0
@@ -79,7 +79,7 @@
 It supports RPMs, modules and comps groups & environments.
 
 Name:           dnf
-Version:        4.2.2
+Version:        4.2.5
 Release:        1%{?dist}
 Summary:        %{pkg_summary}
 # For a breakdown of the licensing, see PACKAGE-LICENSING
@@ -212,7 +212,7 @@
 %description -n python2-%{name}
 Python 2 interface to DNF.
 %endif
-# ^ %{with python2}
+# ^ %%{with python2}
 
 %if %{with python3}
 %package -n python3-%{name}
@@ -412,6 +412,7 @@
 %dir %{confdir}/protected.d
 %dir %{confdir}/vars
 %dir %{confdir}/aliases.d
+%exclude %{confdir}/aliases.d/zypper.conf
 %config(noreplace) %{confdir}/%{name}.conf
 %config(noreplace) %{confdir}/protected.d/%{name}.conf
 %config(noreplace) %{_sysconfdir}/logrotate.d/%{name}
@@ -498,6 +499,19 @@
 %endif
 
 %changelog
+* Thu Apr 25 2019 Pavla Kratochvilova <[email protected]> - 4.2.5-1
+- Fix multilib obsoletes (RhBug:1672947)
+- Do not remove group package if other packages depend on it
+- Remove duplicates from "dnf list" and "dnf info" outputs
+- Installroot now requires absolute path
+- Fix the installation of completion_helper.py
+- Allow globs in setopt in repoid part
+- Fix formatting of message about free space required
+- [doc] Add info of relation update_cache with fill_sack (RhBug:1658694)
+- Fix installation failiure when duplicit RPMs are specified (RhBug:1687286)
+- Add command abbreviations (RhBug:1634232)
+- Allow plugins to terminate dnf (RhBug:1701807)
+
 * Wed Mar 27 2019 Pavla Kratochvilova <[email protected]> - 4.2.2-1
 - [conf] Use environment variables prefixed with DNF_VAR_
 - Enhance documentation of --whatdepends option (RhBug:1687070)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/doc/api_base.rst new/dnf-4.2.5/doc/api_base.rst
--- old/dnf-4.2.2/doc/api_base.rst      2019-03-27 12:42:04.000000000 +0100
+++ new/dnf-4.2.5/doc/api_base.rst      2019-04-25 10:44:57.000000000 +0200
@@ -146,9 +146,15 @@
 
   .. method:: update_cache(timer=False)
 
-    Downloads and caches in binary format metadata for all known repos. Tries 
to avoid downloading whenever possible (e.g. when the local metadata hasn’t 
expired yet or when the metadata timestamp hasn’t changed).
+    Downloads and caches in binary format metadata for all known repos. Tries 
to avoid downloading
+    whenever possible (e.g. when the local metadata hasn’t expired yet or when 
the metadata
+    timestamp hasn’t changed).
 
-    If 'timer' equals 'True', DNF becomes more resource-aware, meaning DNF 
will not do anything if running on battery power and will terminate immediately 
if it’s too soon after the last successful update_cache operation7.
+    If 'timer' equals 'True', DNF becomes more resource-aware, meaning DNF 
will not do anything if
+    running on battery power and will terminate immediately if it’s too soon 
after the last
+    successful update_cache operation.
+
+    When the method is used after :meth:`fill_sack`, information about 
packages will not be updated.
 
   .. _package_marking-label:
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/doc/api_cli.rst new/dnf-4.2.5/doc/api_cli.rst
--- old/dnf-4.2.2/doc/api_cli.rst       2019-03-27 12:42:04.000000000 +0100
+++ new/dnf-4.2.5/doc/api_cli.rst       2019-04-25 10:44:57.000000000 +0200
@@ -37,7 +37,7 @@
 
     .. attribute:: allow_erasing
 
-      If ``True``, the dependnecy solver is allowed to look for solutions that 
include removing other packages while looking to fulfill the current packaging 
requests. Defaults to ``False``. Also see :meth:`dnf.Base.resolve`.
+      If ``True``, the dependency solver is allowed to look for solutions that 
include removing other packages while looking to fulfill the current packaging 
requests. Defaults to ``False``. Also see :meth:`dnf.Base.resolve`.
 
     .. attribute:: available_repos
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/doc/api_conf.rst new/dnf-4.2.5/doc/api_conf.rst
--- old/dnf-4.2.2/doc/api_conf.rst      2019-03-27 12:42:04.000000000 +0100
+++ new/dnf-4.2.5/doc/api_conf.rst      2019-04-25 10:44:57.000000000 +0200
@@ -100,7 +100,7 @@
 
   .. attribute:: installroot
 
-    The root of the filesystem for all packaging operations.
+    The root of the filesystem for all packaging operations. It requires 
absolute path.
 
   .. attribute:: keepcache
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/doc/api_queries.rst new/dnf-4.2.5/doc/api_queries.rst
--- old/dnf-4.2.2/doc/api_queries.rst   2019-03-27 12:42:04.000000000 +0100
+++ new/dnf-4.2.5/doc/api_queries.rst   2019-04-25 10:44:57.000000000 +0200
@@ -85,7 +85,7 @@
     upgrades          boolean        see :meth:`upgrades`. Defaults to 
``False``.
     ===============   ============== 
======================================================
 
-    *The key can also accept a list of values with specified type.
+    \* The key can also accept a list of values with specified type.
 
     The key name can be supplemented with a relation-specifying suffix, 
separated by ``__``:
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/doc/cli_vs_yum.rst new/dnf-4.2.5/doc/cli_vs_yum.rst
--- old/dnf-4.2.2/doc/cli_vs_yum.rst    2019-03-27 12:42:04.000000000 +0100
+++ new/dnf-4.2.5/doc/cli_vs_yum.rst    2019-04-25 10:44:57.000000000 +0200
@@ -391,11 +391,11 @@
 ``package-cleanup --oldkernels``         ``dnf remove --oldinstallonly``
 ==================================       =====================================
 
-================
-yum-updateonboot
-================
+=============================
+yum-updateonboot and yum-cron
+=============================
 
-DNF does not have a direct replacement of yum-updateonboot command.
+DNF does not have a direct replacement of yum-updateonboot and yum-cron 
commands.
 However, the similar result can be achieved by ``dnf automatic`` command (see 
:doc:`automatic`).
 
 You can either use the shortcut::
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/doc/command_ref.rst new/dnf-4.2.5/doc/command_ref.rst
--- old/dnf-4.2.2/doc/command_ref.rst   2019-03-27 12:42:04.000000000 +0100
+++ new/dnf-4.2.5/doc/command_ref.rst   2019-04-25 10:44:57.000000000 +0200
@@ -228,7 +228,7 @@
 ``--installroot=<path>``
     Specifies an alternative installroot, relative to where all packages will 
be
     installed. Think of this like doing ``chroot <root> dnf``, except using
-    ``--installroot`` allows dnf to work before the chroot is created.
+    ``--installroot`` allows dnf to work before the chroot is created. It 
requires absolute path.
 
 - *cachedir*, *log files*, *releasever*, and *gpgkey* are taken from or
   stored in the installroot. *Gpgkeys* are imported into the installroot from
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/doc/release_notes.rst new/dnf-4.2.5/doc/release_notes.rst
--- old/dnf-4.2.2/doc/release_notes.rst 2019-03-27 12:42:04.000000000 +0100
+++ new/dnf-4.2.5/doc/release_notes.rst 2019-04-25 10:44:57.000000000 +0200
@@ -20,6 +20,30 @@
 ###################
 
 ===================
+4.2.5 Release Notes
+===================
+
+- Fix multilib obsoletes (RhBug:1672947)
+- Do not remove group package if other packages depend on it
+- Remove duplicates from "dnf list" and "dnf info" outputs
+- Installroot now requires absolute path
+- Fix the installation of completion_helper.py
+- Allow globs in setopt in repoid part
+- Fix formatting of message about free space required
+- [doc] Add info of relation update_cache with fill_sack (RhBug:1658694)
+- Fix installation failiure when duplicit RPMs are specified (RhBug:1687286)
+- Add command abbreviations (RhBug:1634232)
+- Allow plugins to terminate dnf (RhBug:1701807)
+
+Bugs fixed in 4.2.5:
+
+* :rhbug:`1701807`
+* :rhbug:`1634232`
+* :rhbug:`1687286`
+* :rhbug:`1658694`
+* :rhbug:`1672947`
+
+===================
 4.2.2 Release Notes
 ===================
 
@@ -355,6 +379,7 @@
 * :attr:`dnf.conf.Conf.ignorearch`
 * Introduced new configuration option ``autocheck_running_kernel``
 * :meth:`dnf.subject.Subject.get_best_selector` can use three additional key 
words: ``obsoletes``, ``reports``, and ``reponame``.
+
 From commandline it is possible to use new option ``--noautoremove`` to 
disable removal of dependencies that are no longer used.
 
 Bugs fixed in 2.6.2:
@@ -625,8 +650,7 @@
 * ``--releasever`` :doc:`command line argument <command_ref>` now doesn't 
detect release number from running system.
 * ``--repofrompath`` :doc:`command line argument <command_ref>` can now be 
combined with ``--repo`` instead of ``--enablerepo``.
 * Alternative of yum's ``deplist`` changes from ``dnf repoquery --requires`` 
to ``dnf repoquery --deplist``.
-* New systemd units `dnf-automatic-notifyonly`, `dnf-automatic-download`, 
`dnf-automatic-download`
-were added for a better customizability of :doc:`dnf-automatic <automatic>`.
+* New systemd units `dnf-automatic-notifyonly`, `dnf-automatic-download`, 
`dnf-automatic-download` were added for a better customizability of 
:doc:`dnf-automatic <automatic>`.
 
 DNF command additions in 2.0.0:
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/doc/summaries_cache new/dnf-4.2.5/doc/summaries_cache
--- old/dnf-4.2.2/doc/summaries_cache   2019-03-27 12:42:04.000000000 +0100
+++ new/dnf-4.2.5/doc/summaries_cache   2019-04-25 10:44:57.000000000 +0200
@@ -2702,5 +2702,25 @@
     [
         1687070,
         "[REF] Provide single command, which tells what depends on specific 
package."
+    ],
+    [
+        1701807,
+        "dnf ignores exception error raised by plugin etckeeper-dnf"
+    ],
+    [
+        1634232,
+        "dnf lost aliases for command arguments"
+    ],
+    [
+        1687286,
+        "Specifying same RPM filename in commandline breaks installation"
+    ],
+    [
+        1658694,
+        "DNF Python API update_cache() breaks transaction check"
+    ],
+    [
+        1672947,
+        "dnf prints tracebacks RuntimeError: TransactionItem not found for key"
     ]
 ]
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/etc/dnf/CMakeLists.txt new/dnf-4.2.5/etc/dnf/CMakeLists.txt
--- old/dnf-4.2.2/etc/dnf/CMakeLists.txt        2019-03-27 12:42:04.000000000 
+0100
+++ new/dnf-4.2.5/etc/dnf/CMakeLists.txt        2019-04-25 10:44:57.000000000 
+0200
@@ -1,2 +1,3 @@
 INSTALL (FILES "dnf.conf" "automatic.conf" DESTINATION ${SYSCONFDIR}/dnf)
+ADD_SUBDIRECTORY (aliases.d)
 ADD_SUBDIRECTORY (protected.d)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/etc/dnf/aliases.d/CMakeLists.txt 
new/dnf-4.2.5/etc/dnf/aliases.d/CMakeLists.txt
--- old/dnf-4.2.2/etc/dnf/aliases.d/CMakeLists.txt      1970-01-01 
01:00:00.000000000 +0100
+++ new/dnf-4.2.5/etc/dnf/aliases.d/CMakeLists.txt      2019-04-25 
10:44:57.000000000 +0200
@@ -0,0 +1 @@
+INSTALL (FILES "zypper.conf" DESTINATION ${SYSCONFDIR}/dnf/aliases.d)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/etc/dnf/aliases.d/zypper.conf 
new/dnf-4.2.5/etc/dnf/aliases.d/zypper.conf
--- old/dnf-4.2.2/etc/dnf/aliases.d/zypper.conf 1970-01-01 01:00:00.000000000 
+0100
+++ new/dnf-4.2.5/etc/dnf/aliases.d/zypper.conf 2019-04-25 10:44:57.000000000 
+0200
@@ -0,0 +1,7 @@
+[aliases]
+dup = distro-sync
+dist-upgrade = distro-sync
+ref = makecache
+refresh = makecache
+ri = reinstall
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/po/CMakeLists.txt new/dnf-4.2.5/po/CMakeLists.txt
--- old/dnf-4.2.2/po/CMakeLists.txt     2019-03-27 12:42:04.000000000 +0100
+++ new/dnf-4.2.5/po/CMakeLists.txt     2019-04-25 10:44:57.000000000 +0200
@@ -3,7 +3,7 @@
 file (RELATIVE_PATH SRCDIR ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/dnf)
 ADD_CUSTOM_TARGET (gettext-export
                    find ${SRCDIR} -iname "*.py" |
-                   xargs xgettext --from-code=UTF-8 --keyword=P_:1,2 
--keyword=C_:1c,2 -c --output=dnf.pot &&
+                   xargs xgettext -F --from-code=UTF-8 --keyword=P_:1,2 
--keyword=C_:1c,2 -c --output=dnf.pot &&
                    zanata push -f
                    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
                    COMMENT "Pushing translation source file to zanata")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/rel-eng/packages/dnf new/dnf-4.2.5/rel-eng/packages/dnf
--- old/dnf-4.2.2/rel-eng/packages/dnf  2019-03-27 12:42:04.000000000 +0100
+++ new/dnf-4.2.5/rel-eng/packages/dnf  2019-04-25 10:44:57.000000000 +0200
@@ -1 +1 @@
-4.2.2-1 ./
+4.2.5-1 ./
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/tests/conf/test_parser.py new/dnf-4.2.5/tests/conf/test_parser.py
--- old/dnf-4.2.2/tests/conf/test_parser.py     2019-03-27 12:42:04.000000000 
+0100
+++ new/dnf-4.2.5/tests/conf/test_parser.py     2019-04-25 10:44:57.000000000 
+0200
@@ -60,4 +60,4 @@
         conf = dnf.conf.Conf()
         conf.config_file_path = FN
         conf.read()
-        self.assertEqual(conf.installroot, '')
+        self.assertEqual(conf.reposdir, '')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/dnf-4.2.2/tests/etc/empty_option.conf 
new/dnf-4.2.5/tests/etc/empty_option.conf
--- old/dnf-4.2.2/tests/etc/empty_option.conf   2019-03-27 12:42:04.000000000 
+0100
+++ new/dnf-4.2.5/tests/etc/empty_option.conf   2019-04-25 10:44:57.000000000 
+0200
@@ -1,2 +1,2 @@
 [main]
-installroot =
+reposdir =


Reply via email to