Alon Bar-Lev has uploaded a new change for review.

Change subject: core: miniyum: fix provides in addition to packages
......................................................................

core: miniyum: fix provides in addition to packages

1. pull only native arch.

2. pull only latest version of package for each provides.

Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1073172
Change-Id: I6b161c167ad410e2ad54dba2be5cda6cc8c6239e
Signed-off-by: Alon Bar-Lev <[email protected]>
---
M src/otopi/miniyum.py
1 file changed, 67 insertions(+), 13 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/otopi refs/changes/02/25702/1

diff --git a/src/otopi/miniyum.py b/src/otopi/miniyum.py
index 0a24bd4..7b11a5b 100755
--- a/src/otopi/miniyum.py
+++ b/src/otopi/miniyum.py
@@ -31,6 +31,9 @@
 _ = lambda m: gettext.dgettext(message=m, domain='otopi')
 
 
+import rpmUtils.miscutils
+
+
 import yum
 import yum.rpmtrans
 import yum.callbacks
@@ -356,9 +359,9 @@
 
     @classmethod
     def _get_package_name(clz, po):
-        return '%s-%s%s-%s.%s' % (
+        return '%s%s-%s-%s.%s' % (
+            '' if po.epoch == '0' else '%s:' % po.epoch,
             po.name,
-            '%s:' % po.epoch if po.epoch == 0 else '',
             po.version,
             po.release,
             po.arch
@@ -437,6 +440,55 @@
 
         return ret
 
+    def _queryProvides(self, packages, showdups=None):
+        database = {}
+        ret = []
+
+        for po in self._yb.searchPackageProvides(args=packages):
+            if po.arch in (
+                list(self._yb.arch.legit_multi_arches) +
+                ['noarch']
+            ):
+                database.setdefault(
+                    '%s%s' % (
+                        po.epoch,
+                        po.name,
+                    ),
+                    [],
+                ).append(po)
+
+        if showdups:
+            ret = sum(database.values(), [])
+        else:
+            for entry in database.values():
+                class EVR(object):
+
+                    def _evr(self, po):
+                        return (
+                            po['epoch'],
+                            po['version'],
+                            po['release'],
+                        )
+
+                    def __init__(self, po):
+                        self._po = po
+
+                    def __cmp__(self, other):
+                        return rpmUtils.miscutils.compareEVR(
+                            self._evr(self._po),
+                            self._evr(other._po),
+                        )
+
+                ret.append(
+                    sorted(
+                        entry,
+                        key=lambda x: EVR(x),
+                        reverse=True,
+                    )[0]
+                )
+
+        return ret
+
     def _queue(
         self,
         action,
@@ -454,12 +506,9 @@
                         'queue package %s for %s' % (package, action)
                     )
 
-                    mergedpatterns = []
+                    provides = self._queryProvides(packages=(package,))
 
-                    for po in self._yb.searchPackageProvides(args=(package,)):
-                        mergedpatterns.append(MiniYum._get_package_name(po))
-
-                    if not mergedpatterns:
+                    if not provides:
                         raise RuntimeError(
                             _('Package {package} cannot be found').format(
                                 package=package,
@@ -467,7 +516,7 @@
                         )
 
                     holder = self._yb.doPackageLists(
-                        patterns=mergedpatterns,
+                        patterns=[self._get_package_name(p) for p in provides],
                     )
 
                     for po in getpackages(holder):
@@ -930,15 +979,20 @@
     def queryPackages(self, pkgnarrow='all', patterns=None, showdups=None):
         try:
             with self._disableOutput:
-                mergedpatterns = list(patterns)
                 ret = []
-
-                for po in self._yb.searchPackageProvides(args=patterns):
-                    mergedpatterns.append(MiniYum._get_package_name(po))
 
                 holder = self._yb.doPackageLists(
                     pkgnarrow=pkgnarrow,
-                    patterns=mergedpatterns,
+                    patterns=(
+                        list(patterns) +
+                        [
+                            self._get_package_name(p)
+                            for p in self._queryProvides(
+                                packages=patterns,
+                                showdups=showdups,
+                            )
+                        ]
+                    ),
                     showdups=showdups,
                 )
                 for op, l in (


-- 
To view, visit http://gerrit.ovirt.org/25702
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I6b161c167ad410e2ad54dba2be5cda6cc8c6239e
Gerrit-PatchSet: 1
Gerrit-Project: otopi
Gerrit-Branch: master
Gerrit-Owner: Alon Bar-Lev <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to