Blame SOURCES/0014-feat-repomanage-Add-new-option-oldonly.patch

9f4a6f
From eb1d6edf55c167d575ce3d16bd6349e382d05600 Mon Sep 17 00:00:00 2001
9f4a6f
From: Masahiro Matsuya <mmatsuya@redhat.com>
9f4a6f
Date: Wed, 13 Apr 2022 18:42:03 +0900
9f4a6f
Subject: [PATCH] feat(repomanage): Add new option --oldonly
9f4a6f
9f4a6f
= changelog =
9f4a6f
msg:           repomanage: Add new option --oldonly
9f4a6f
type:          enhancement
9f4a6f
resolves:      https://bugzilla.redhat.com/show_bug.cgi?id=2034736
9f4a6f
resolves:      https://bugzilla.redhat.com/show_bug.cgi?id=2058676
9f4a6f
---
9f4a6f
 doc/repomanage.rst    |  3 +++
9f4a6f
 plugins/repomanage.py | 46 ++++++++++++++++++++++++++++++++++++++++---
9f4a6f
 2 files changed, 46 insertions(+), 3 deletions(-)
9f4a6f
9f4a6f
diff --git a/doc/repomanage.rst b/doc/repomanage.rst
9f4a6f
index e3171ef..3c01289 100644
9f4a6f
--- a/doc/repomanage.rst
9f4a6f
+++ b/doc/repomanage.rst
9f4a6f
@@ -47,6 +47,9 @@ The following options set what packages are displayed. These options are mutuall
9f4a6f
 ``--old``
9f4a6f
     Show older packages (for a package or a stream show all versions except the newest one).
9f4a6f
 
9f4a6f
+``--oldonly``
9f4a6f
+    Show older packages (same as --old, but exclude the newest packages even when it's included in the older stream versions).
9f4a6f
+
9f4a6f
 ``--new``
9f4a6f
     Show newest packages.
9f4a6f
 
9f4a6f
diff --git a/plugins/repomanage.py b/plugins/repomanage.py
9f4a6f
index 67a6fc7..d23497a 100644
9f4a6f
--- a/plugins/repomanage.py
9f4a6f
+++ b/plugins/repomanage.py
9f4a6f
@@ -57,6 +57,12 @@ class RepoManageCommand(dnf.cli.Command):
9f4a6f
     def run(self):
9f4a6f
         if self.opts.new and self.opts.old:
9f4a6f
             raise dnf.exceptions.Error(_("Pass either --old or --new, not both!"))
9f4a6f
+        if self.opts.new and self.opts.oldonly:
9f4a6f
+            raise dnf.exceptions.Error(_("Pass either --oldonly or --new, not both!"))
9f4a6f
+        if self.opts.old and self.opts.oldonly:
9f4a6f
+            raise dnf.exceptions.Error(_("Pass either --old or --oldonly, not both!"))
9f4a6f
+        if not self.opts.old and not self.opts.oldonly:
9f4a6f
+            self.opts.new = True
9f4a6f
 
9f4a6f
         verfile = {}
9f4a6f
         pkgdict = {}
9f4a6f
@@ -123,8 +129,7 @@ class RepoManageCommand(dnf.cli.Command):
9f4a6f
         # modular packages
9f4a6f
         keepnum_latest_stream_artifacts = set()
9f4a6f
 
9f4a6f
-        # if new
9f4a6f
-        if not self.opts.old:
9f4a6f
+        if self.opts.new:
9f4a6f
             # regular packages
9f4a6f
             for (n, a) in pkgdict.keys():
9f4a6f
                 evrlist = pkgdict[(n, a)]
9f4a6f
@@ -146,7 +151,6 @@ class RepoManageCommand(dnf.cli.Command):
9f4a6f
                     for stream in streams_by_version[i]:
9f4a6f
                         keepnum_latest_stream_artifacts.update(set(stream.getArtifacts()))
9f4a6f
 
9f4a6f
-
9f4a6f
         if self.opts.old:
9f4a6f
             # regular packages
9f4a6f
             for (n, a) in pkgdict.keys():
9f4a6f
@@ -169,6 +173,40 @@ class RepoManageCommand(dnf.cli.Command):
9f4a6f
                     for stream in streams_by_version[i]:
9f4a6f
                         keepnum_latest_stream_artifacts.update(set(stream.getArtifacts()))
9f4a6f
 
9f4a6f
+        if self.opts.oldonly:
9f4a6f
+            # regular packages
9f4a6f
+            for (n, a) in pkgdict.keys():
9f4a6f
+                evrlist = pkgdict[(n, a)]
9f4a6f
+
9f4a6f
+                oldevrs = evrlist[:-keepnum]
9f4a6f
+
9f4a6f
+                for package in oldevrs:
9f4a6f
+                    nevra = self._package_to_nevra(package)
9f4a6f
+                    for fpkg in verfile[nevra]:
9f4a6f
+                        outputpackages.append(fpkg)
9f4a6f
+
9f4a6f
+            # modular packages
9f4a6f
+            keepnum_newer_stream_artifacts = set()
9f4a6f
+
9f4a6f
+            for streams_by_version in module_dict.values():
9f4a6f
+                sorted_stream_versions = sorted(streams_by_version.keys())
9f4a6f
+
9f4a6f
+                new_sorted_stream_versions = sorted_stream_versions[-keepnum:]
9f4a6f
+
9f4a6f
+                for i in new_sorted_stream_versions:
9f4a6f
+                    for stream in streams_by_version[i]:
9f4a6f
+                        keepnum_newer_stream_artifacts.update(set(stream.getArtifacts()))
9f4a6f
+
9f4a6f
+            for streams_by_version in module_dict.values():
9f4a6f
+                sorted_stream_versions = sorted(streams_by_version.keys())
9f4a6f
+
9f4a6f
+                old_sorted_stream_versions = sorted_stream_versions[:-keepnum]
9f4a6f
+
9f4a6f
+                for i in old_sorted_stream_versions:
9f4a6f
+                    for stream in streams_by_version[i]:
9f4a6f
+                        for artifact in stream.getArtifacts():
9f4a6f
+                            if artifact not in keepnum_newer_stream_artifacts:
9f4a6f
+                                keepnum_latest_stream_artifacts.add(artifact)
9f4a6f
 
9f4a6f
         modular_packages = [self._package_to_path(x) for x in query.filter(pkg__eq=query.filter(nevra_strict=keepnum_latest_stream_artifacts)).available()]
9f4a6f
         outputpackages = outputpackages + modular_packages
9f4a6f
@@ -183,6 +221,8 @@ class RepoManageCommand(dnf.cli.Command):
9f4a6f
     def set_argparser(parser):
9f4a6f
         parser.add_argument("-o", "--old", action="store_true",
9f4a6f
                             help=_("Print the older packages"))
9f4a6f
+        parser.add_argument("-O", "--oldonly", action="store_true",
9f4a6f
+                            help=_("Print the older packages. Exclude the newest packages."))
9f4a6f
         parser.add_argument("-n", "--new", action="store_true",
9f4a6f
                             help=_("Print the newest packages"))
9f4a6f
         parser.add_argument("-s", "--space", action="store_true",
9f4a6f
-- 
9f4a6f
2.36.1
9f4a6f