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

seth vidal skvidal at fedoraproject.org
Thu Jun 2 17:04:33 UTC 2011


On Thu, 2011-06-02 at 12:56 -0400, James Antill wrote:
> ---
>  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


What's the goal of this?

-sv




More information about the Yum-devel mailing list