[Yum-devel] [PATCH 3/3] Create list of pkgtups we couldn't find, and output them in listTrans.

James Antill james at and.org
Thu Jun 2 16:56:56 UTC 2011


---
 output.py       |    4 +++-
 yum/__init__.py |   33 +++++++++++++++++++++++++++++++--
 yum/packages.py |   39 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 73 insertions(+), 3 deletions(-)

diff --git a/output.py b/output.py
index 71e4e24..398dafa 100755
--- a/output.py
+++ b/output.py
@@ -1048,7 +1048,9 @@ class YumOutput:
             pkglist_lines.append((action, lines))
 
         for (action, pkglist) in [(_('Skipped (dependency problems)'),
-                                   self.skipped_packages),]:
+                                   self.skipped_packages),
+                                  (_('Not installed'), self._not_found_i.values()),
+                                  (_('Not available'), self._not_found_a.values())]:
             lines = []
             for po in pkglist:
                 a_wid = _add_line(lines, data, a_wid, po)
diff --git a/yum/__init__.py b/yum/__init__.py
index 209c5c6..77c4d00 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -79,7 +79,7 @@ warnings.simplefilter("ignore", Errors.YumFutureDeprecationWarning)
 
 from packages import parsePackages, comparePoEVR
 from packages import YumAvailablePackage, YumLocalPackage, YumInstalledPackage
-from packages import YumUrlPackage
+from packages import YumUrlPackage, YumNotFoundPackage
 from constants import *
 from yum.rpmtrans import RPMTransaction,SimpleCliCallBack
 from yum.i18n import to_unicode, to_str
@@ -182,6 +182,8 @@ class YumBase(depsolve.Depsolve):
         self._tags = None
         self._ts_save_file = None
         self.skipped_packages = []   # packages skip by the skip-broken code
+        self._not_found_a = {}
+        self._not_found_i = {}
         self.logger = logging.getLogger("yum.YumBase")
         self.verbose_logger = logging.getLogger("yum.verbose.YumBase")
         self._override_sigchecks = False
@@ -1225,6 +1227,27 @@ class YumBase(depsolve.Depsolve):
             return 1, orig_restring
         return rescode, restring
 
+    def _add_not_found(self, pkgs, nevra_dict):
+        if pkgs:
+            return None
+
+        pkgtup = (nevra_dict['name'], nevra_dict['arch'],
+                  nevra_dict['epoch'], nevra_dict['version'],
+                  nevra_dict['release'])
+        if None in pkgtup:
+            return None
+        return pkgtup
+    def _add_not_found_a(self, pkgs, nevra_dict):
+        pkgtup = self._add_not_found(pkgs, nevra_dict)
+        if pkgtup is None:
+            return
+        self._not_found_a[pkgtup] = YumNotFoundPackage(pkgtup)
+    def _add_not_found_i(self, pkgs, nevra_dict):
+        pkgtup = self._add_not_found(pkgs, nevra_dict)
+        if pkgtup is None:
+            return
+        self._not_found_i[pkgtup] = YumNotFoundPackage(pkgtup)
+
     def _checkMissingObsoleted(self):
         """ 
         If multiple packages is obsoleting the same package
@@ -2973,6 +2996,7 @@ class YumBase(depsolve.Depsolve):
         pkgs = self.pkgSack.searchPkgTuple(pkgtup)
 
         if len(pkgs) == 0:
+            self._add_not_found_a(pkgs, pkgtup)
             if allow_missing: #  This can happen due to excludes after .up has
                 return None   # happened.
             raise Errors.DepError, _('Package tuple %s could not be found in packagesack') % str(pkgtup)
@@ -2994,6 +3018,7 @@ class YumBase(depsolve.Depsolve):
 
         pkgs = self.rpmdb.searchPkgTuple(pkgtup)
         if len(pkgs) == 0:
+            self._add_not_found_i(pkgs, pkgtup)
             raise Errors.RpmDBError, _('Package tuple %s could not be found in rpmdb') % str(pkgtup)
 
         # Dito. FIXME from getPackageObject() for len() > 1 ... :)
@@ -3419,6 +3444,7 @@ class YumBase(depsolve.Depsolve):
                 pkgs = self.pkgSack.searchNevra(name=nevra_dict['name'],
                      epoch=nevra_dict['epoch'], arch=nevra_dict['arch'],
                      ver=nevra_dict['version'], rel=nevra_dict['release'])
+                self._add_not_found_a(pkgs, nevra_dict)
                 
             if pkgs:
                 # if was_pattern or nevra-dict['arch'] is none, take the list
@@ -3759,6 +3785,7 @@ class YumBase(depsolve.Depsolve):
                 availpkgs = self.pkgSack.searchNevra(name=nevra_dict['name'],
                             epoch=nevra_dict['epoch'], arch=nevra_dict['arch'],
                             ver=nevra_dict['version'], rel=nevra_dict['release'])
+                self._add_not_found_a(availpkgs, nevra_dict)
                 if len(availpkgs) > 1:
                     availpkgs = self._compare_providers(availpkgs, requiringPo)
                     availpkgs = map(lambda x: x[0], availpkgs)
@@ -3949,7 +3976,7 @@ class YumBase(depsolve.Depsolve):
                 pkgs = self.rpmdb.searchNevra(name=nevra_dict['name'], 
                             epoch=nevra_dict['epoch'], arch=nevra_dict['arch'], 
                             ver=nevra_dict['version'], rel=nevra_dict['release'])
-
+                self._add_not_found_i(pkgs, nevra_dict)
                 if len(pkgs) == 0:
                     if not kwargs.get('silence_warnings', False):
                         self.logger.warning(_("No package matched to remove"))
@@ -4268,6 +4295,8 @@ class YumBase(depsolve.Depsolve):
                                              arch=nevra_dict['arch'], 
                                              ver=nevra_dict['version'],
                                              rel=nevra_dict['release'])
+            self._add_not_found_a(apkgs, nevra_dict)
+
         if not apkgs:
             # Do we still want to return errors here?
             # We don't in the cases below, so I didn't here...
diff --git a/yum/packages.py b/yum/packages.py
index 95c50a1..0d16293 100644
--- a/yum/packages.py
+++ b/yum/packages.py
@@ -274,6 +274,15 @@ class PackageObject(object):
     def __str__(self):
         return self.ui_envra
 
+    def printVer(self):
+        """returns a printable version string - including epoch, if it's set"""
+        if self.epoch != '0':
+            ver = '%s:%s-%s' % (self.epoch, self.version, self.release)
+        else:
+            ver = '%s-%s' % (self.version, self.release)
+
+        return ver
+
     def verCMP(self, other):
         """ Compare package to another one, only rpm-version ordering. """
         if not other:
@@ -354,6 +363,36 @@ class PackageObject(object):
             if csumid:
                 return (csumtype, csum)
 
+
+_not_found_repo = FakeRepository('-')
+_not_found_repo.cost = 0
+class YumNotFoundPackage(PackageObject):
+
+    def __init__(self, pkgtup):
+        self.name    = pkgtup[0]
+        self.arch    = pkgtup[1]
+        self.epoch   = pkgtup[2]
+        self.version = pkgtup[3]
+        self.release = pkgtup[4]
+        self.pkgtup  = pkgtup
+
+        self.size = 0
+        self._checksums = [] # (type, checksum, id(0,1)
+
+        self.repo = _not_found_repo
+        self.repoid = _not_found_repo.id
+
+    # Fakeout output.py that it's a real pkg. ...
+    def _ui_from_repo(self):
+        """ This just returns '-' """
+        return self.repoid
+    ui_from_repo = property(fget=lambda self: self._ui_from_repo())
+
+    def verifyLocalPkg(self):
+        """check the package checksum vs the localPkg
+           return True if pkg is good, False if not"""
+        return False
+
 #  This is the virtual base class of actual packages, it basically requires a
 # repo. even though it doesn't set one up in it's __init__. It also doesn't have
 # PackageObject methods ... so is basically unusable on it's own
-- 
1.7.5.2



More information about the Yum-devel mailing list