Blob Blame History Raw
From fa6afad083ffc19438603f43d17785f5741505b4 Mon Sep 17 00:00:00 2001
From: Jaroslav Rohel <jrohel@redhat.com>
Date: Mon, 16 Dec 2019 12:52:41 +0100
Subject: [PATCH 1/2] Sort packages in transaction output by nevra
 (RhBug:1773436)

---
 dnf/cli/output.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dnf/cli/output.py b/dnf/cli/output.py
index 2ff41b6255..1d3eb1e94a 100644
--- a/dnf/cli/output.py
+++ b/dnf/cli/output.py
@@ -1147,7 +1147,7 @@ def _add_line(lines, data, a_wid, po, obsoletes=[]):
                 for i in tsi._item.getReplacedBy():
                     replaces.setdefault(i, set()).add(tsi)
 
-            for tsi in pkglist:
+            for tsi in sorted(pkglist, key=lambda x: x.pkg):
                 if tsi.action not in dnf.transaction.FORWARD_ACTIONS + [libdnf.transaction.TransactionItemAction_REMOVE]:
                     continue
 

From 0779b458ca30e895b72bcfb2d513c13b12f605df Mon Sep 17 00:00:00 2001
From: Jaroslav Rohel <jrohel@redhat.com>
Date: Mon, 16 Dec 2019 14:53:00 +0100
Subject: [PATCH 2/2] Sort packages in post transaction output by nevra

---
 dnf/cli/output.py | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/dnf/cli/output.py b/dnf/cli/output.py
index 1d3eb1e94a..5dc0af6f4b 100644
--- a/dnf/cli/output.py
+++ b/dnf/cli/output.py
@@ -23,6 +23,7 @@
 
 from copy import deepcopy
 import fnmatch
+import functools
 import hawkey
 import itertools
 import libdnf.transaction
@@ -1449,11 +1450,26 @@ def _fits_in_cols(msgs, num):
                 col_lens[col] *= -1
             return col_lens
 
+        def _tsi_or_pkg_nevra_cmp(item1, item2):
+            """Compares two transaction items or packages by nevra.
+               Used as a fallback when tsi does not contain package object.
+            """
+            ret = (item1.name > item2.name) - (item1.name < item2.name)
+            if ret != 0:
+                return ret
+            nevra1 = hawkey.NEVRA(name=item1.name, epoch=item1.epoch, version=item1.version,
+                                  release=item1.release, arch=item1.arch)
+            nevra2 = hawkey.NEVRA(name=item2.name, epoch=item2.epoch, version=item2.version,
+                                  release=item2.release, arch=item2.arch)
+            ret = nevra1.evr_cmp(nevra2, self.sack)
+            if ret != 0:
+                return ret
+            return (item1.arch > item2.arch) - (item1.arch < item2.arch)
+
         out = ''
         list_bunch = _make_lists(transaction, self.base._goal)
         skipped_conflicts, skipped_broken = self._skipped_packages(report_problems=False)
         skipped = skipped_conflicts.union(skipped_broken)
-        skipped = sorted(set([str(pkg) for pkg in skipped]))
 
         for (action, tsis) in [(_('Upgraded'), list_bunch.upgraded),
                                (_('Downgraded'), list_bunch.downgraded),
@@ -1471,7 +1487,7 @@ def _fits_in_cols(msgs, num):
                 continue
             msgs = []
             out += '\n%s:\n' % action
-            for tsi in tsis:
+            for tsi in sorted(tsis, key=functools.cmp_to_key(_tsi_or_pkg_nevra_cmp)):
                 msgs.append(str(tsi))
             for num in (8, 7, 6, 5, 4, 3, 2):
                 cols = _fits_in_cols(msgs, num)