[yum] update to latest HEAD.

James Antill james at fedoraproject.org
Thu Mar 7 23:16:25 UTC 2013


commit e495f1986797e6d5c3fa97d21ac07444b69acbba
Author: James Antill <james at and.org>
Date:   Thu Mar 7 18:16:11 2013 -0500

    update to latest HEAD.
    
    - Queue for drpm rebuilding.
    - Sort drpms.

 yum-HEAD.patch |  310 ++++++++++++++++++++++++++++++++++++--------------------
 yum.spec       |    7 +-
 2 files changed, 207 insertions(+), 110 deletions(-)
---
diff --git a/yum-HEAD.patch b/yum-HEAD.patch
index a08a2f9..6a9c3c3 100644
--- a/yum-HEAD.patch
+++ b/yum-HEAD.patch
@@ -185395,7 +185395,7 @@ index c1af4ad..e3e3956 100644
      pass
      
 diff --git a/yum/__init__.py b/yum/__init__.py
-index 99039e0..4a491a6 100644
+index 99039e0..801815a 100644
 --- a/yum/__init__.py
 +++ b/yum/__init__.py
 @@ -21,6 +21,7 @@ The Yum RPM software updater.
@@ -186509,7 +186509,7 @@ index 99039e0..4a491a6 100644
          errors = {}
          def adderror(po, msg):
              errors.setdefault(po, []).append(msg)
-@@ -1943,116 +2218,192 @@ class YumBase(depsolve.Depsolve):
+@@ -1943,116 +2218,196 @@ class YumBase(depsolve.Depsolve):
          self.history.close()
  
          self.plugins.run('predownload', pkglist=pkglist)
@@ -186682,6 +186682,9 @@ index 99039e0..4a491a6 100644
 +                    if isinstance(po, DeltaPackage):
 +                        presto.rebuild(po, adderror)
 +                        return
++                    else:
++                        presto.dequeue_max()
++
 +                    if po.repoid not in done_repos:
 +                        done_repos.add(po.repoid)
 +                        #  Check a single package per. repo. ... to give a hint to
@@ -186711,6 +186714,7 @@ index 99039e0..4a491a6 100644
 +                    adderror(po, exception2msg(e))
 +            if async:
 +                urlgrabber.grabber.parallel_wait()
++            presto.dequeue_all()
 +            presto.wait()
 +
 +            if hasattr(urlgrabber.progress, 'text_meter_total_size'):
@@ -186791,7 +186795,7 @@ index 99039e0..4a491a6 100644
          if type(fo) is types.InstanceType:
              fo = fo.filename
              
-@@ -2076,9 +2427,12 @@ class YumBase(depsolve.Depsolve):
+@@ -2076,9 +2431,12 @@ class YumBase(depsolve.Depsolve):
          return 1
          
      def downloadHeader(self, po):
@@ -186806,7 +186810,7 @@ index 99039e0..4a491a6 100644
          if hasattr(po, 'pkgtype') and po.pkgtype == 'local':
              return
                  
-@@ -2122,15 +2476,17 @@ class YumBase(depsolve.Depsolve):
+@@ -2122,15 +2480,17 @@ class YumBase(depsolve.Depsolve):
              return
  
      def sigCheckPkg(self, po):
@@ -186832,7 +186836,7 @@ index 99039e0..4a491a6 100644
          if self._override_sigchecks:
              check = False
              hasgpgkey = 0
-@@ -2181,6 +2537,9 @@ class YumBase(depsolve.Depsolve):
+@@ -2181,6 +2541,9 @@ class YumBase(depsolve.Depsolve):
          return result, msg
  
      def cleanUsedHeadersPackages(self):
@@ -186842,7 +186846,7 @@ index 99039e0..4a491a6 100644
          filelist = []
          for txmbr in self.tsInfo:
              if txmbr.po.state not in TS_INSTALL_STATES:
-@@ -2218,27 +2577,42 @@ class YumBase(depsolve.Depsolve):
+@@ -2218,27 +2581,42 @@ class YumBase(depsolve.Depsolve):
                      _('%s removed'), fn)
          
      def cleanHeaders(self):
@@ -186887,7 +186891,7 @@ index 99039e0..4a491a6 100644
          cachedir = self.conf.persistdir + "/rpmdb-indexes/"
          if not os.path.exists(cachedir):
              filelist = []
-@@ -2271,9 +2645,31 @@ class YumBase(depsolve.Depsolve):
+@@ -2271,9 +2649,31 @@ class YumBase(depsolve.Depsolve):
          return 0, [msg]
  
      def doPackageLists(self, pkgnarrow='all', patterns=None, showdups=None,
@@ -186922,7 +186926,7 @@ index 99039e0..4a491a6 100644
          if showdups is None:
              showdups = self.conf.showdupesfromrepos
          ygh = misc.GenericHolder(iter=pkgnarrow)
-@@ -2295,6 +2691,8 @@ class YumBase(depsolve.Depsolve):
+@@ -2295,6 +2695,8 @@ class YumBase(depsolve.Depsolve):
              ndinst = {} # Newest versions by name.arch
              for po in self.rpmdb.returnPackages(patterns=patterns,
                                                  ignore_case=ic):
@@ -186931,7 +186935,7 @@ index 99039e0..4a491a6 100644
                  dinst[po.pkgtup] = po
                  if showdups:
                      continue
-@@ -2304,8 +2702,13 @@ class YumBase(depsolve.Depsolve):
+@@ -2304,8 +2706,13 @@ class YumBase(depsolve.Depsolve):
              installed = dinst.values()
                          
              if showdups:
@@ -186946,7 +186950,7 @@ index 99039e0..4a491a6 100644
              else:
                  try:
                      avail = self.pkgSack.returnNewestByNameArch(patterns=patterns,
-@@ -2323,16 +2726,30 @@ class YumBase(depsolve.Depsolve):
+@@ -2323,16 +2730,30 @@ class YumBase(depsolve.Depsolve):
                      key = (pkg.name, pkg.arch)
                      if pkg.pkgtup in dinst:
                          reinstall_available.append(pkg)
@@ -186980,7 +186984,7 @@ index 99039e0..4a491a6 100644
                  if len(matches) > 1:
                      updates.append(matches[0])
                      self.verbose_logger.log(logginglevels.DEBUG_1,
-@@ -2352,13 +2769,19 @@ class YumBase(depsolve.Depsolve):
+@@ -2352,13 +2773,19 @@ class YumBase(depsolve.Depsolve):
          elif pkgnarrow == 'installed':
              installed = self.rpmdb.returnPackages(patterns=patterns,
                                                    ignore_case=ic)
@@ -187001,7 +187005,7 @@ index 99039e0..4a491a6 100644
              else:
                  try:
                      avail = self.pkgSack.returnNewestByNameArch(patterns=patterns,
-@@ -2392,9 +2815,21 @@ class YumBase(depsolve.Depsolve):
+@@ -2392,9 +2819,21 @@ class YumBase(depsolve.Depsolve):
              avail = set(avail)
              for po in self.rpmdb.returnPackages(patterns=patterns,
                                                  ignore_case=ic):
@@ -187023,7 +187027,7 @@ index 99039e0..4a491a6 100644
          # obsoleting packages (and what they obsolete)
          elif pkgnarrow == 'obsoletes':
              self.conf.obsoletes = 1
-@@ -2402,6 +2837,7 @@ class YumBase(depsolve.Depsolve):
+@@ -2402,6 +2841,7 @@ class YumBase(depsolve.Depsolve):
              for (pkgtup, instTup) in self.up.getObsoletesTuples():
                  (n,a,e,v,r) = pkgtup
                  pkgs = self.pkgSack.searchNevra(name=n, arch=a, ver=v, rel=r, epoch=e)
@@ -187031,7 +187035,7 @@ index 99039e0..4a491a6 100644
                  instpo = self.getInstalledPackageObject(instTup)
                  for po in pkgs:
                      obsoletes.append(po)
-@@ -2433,7 +2869,12 @@ class YumBase(depsolve.Depsolve):
+@@ -2433,7 +2873,12 @@ class YumBase(depsolve.Depsolve):
              recentlimit = now-(self.conf.recent*86400)
              if showdups:
                  avail = self.pkgSack.returnPackages(patterns=patterns,
@@ -187045,7 +187049,7 @@ index 99039e0..4a491a6 100644
              else:
                  try:
                      avail = self.pkgSack.returnNewestByNameArch(patterns=patterns,
-@@ -2461,14 +2902,13 @@ class YumBase(depsolve.Depsolve):
+@@ -2461,14 +2906,13 @@ class YumBase(depsolve.Depsolve):
  
          
      def findDeps(self, pkgs):
@@ -187065,7 +187069,7 @@ index 99039e0..4a491a6 100644
          results = {}
  
          for pkg in pkgs:
-@@ -2495,10 +2935,22 @@ class YumBase(depsolve.Depsolve):
+@@ -2495,10 +2939,22 @@ class YumBase(depsolve.Depsolve):
      # pre 3.2.10 API used to always showdups, so that's the default atm.
      def searchGenerator(self, fields, criteria, showdups=True, keys=False, 
                                               searchtags=True, searchrpmdb=True):
@@ -187092,7 +187096,7 @@ index 99039e0..4a491a6 100644
          sql_fields = []
          for f in fields:
              sql_fields.append(RPM_TO_SQLITE.get(f, f))
-@@ -2661,6 +3113,14 @@ class YumBase(depsolve.Depsolve):
+@@ -2661,6 +3117,14 @@ class YumBase(depsolve.Depsolve):
                      yield (po, vs)
  
      def searchPackageTags(self, criteria):
@@ -187107,7 +187111,7 @@ index 99039e0..4a491a6 100644
          results = {} # name = [(criteria, taglist)]
          for c in criteria:
              c = c.lower()
-@@ -2677,11 +3137,16 @@ class YumBase(depsolve.Depsolve):
+@@ -2677,11 +3141,16 @@ class YumBase(depsolve.Depsolve):
          return results
          
      def searchPackages(self, fields, criteria, callback=None):
@@ -187129,7 +187133,7 @@ index 99039e0..4a491a6 100644
          warnings.warn(_('searchPackages() will go away in a future version of Yum.\
                        Use searchGenerator() instead. \n'),
                  Errors.YumFutureDeprecationWarning, stacklevel=2)           
-@@ -2700,13 +3165,23 @@ class YumBase(depsolve.Depsolve):
+@@ -2700,13 +3169,23 @@ class YumBase(depsolve.Depsolve):
      
      def searchPackageProvides(self, args, callback=None,
                                callback_has_matchfor=False):
@@ -187157,7 +187161,7 @@ index 99039e0..4a491a6 100644
              else:
                  isglob = True
                  canBeFile = misc.re_filename(arg)
-@@ -2723,7 +3198,7 @@ class YumBase(depsolve.Depsolve):
+@@ -2723,7 +3202,7 @@ class YumBase(depsolve.Depsolve):
                  where = self.returnPackagesByDep(arg)
              else:
                  usedDepString = False
@@ -187166,7 +187170,7 @@ index 99039e0..4a491a6 100644
              self.verbose_logger.log(logginglevels.DEBUG_1,
                 P_('Searching %d package', 'Searching %d packages', len(where)), len(where))
              
-@@ -2817,25 +3292,160 @@ class YumBase(depsolve.Depsolve):
+@@ -2817,25 +3296,160 @@ class YumBase(depsolve.Depsolve):
              
          return matches
  
@@ -187339,7 +187343,7 @@ index 99039e0..4a491a6 100644
                  if uservisible:
                      if grp.user_visible:
                          installed.append(grp)
-@@ -2847,34 +3457,98 @@ class YumBase(depsolve.Depsolve):
+@@ -2847,34 +3461,98 @@ class YumBase(depsolve.Depsolve):
                          available.append(grp)
                  else:
                      available.append(grp)
@@ -187448,7 +187452,7 @@ index 99039e0..4a491a6 100644
          thesegroups = self.comps.return_groups(grpid)
          if not thesegroups:
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
-@@ -2898,13 +3572,58 @@ class YumBase(depsolve.Depsolve):
+@@ -2898,13 +3576,58 @@ class YumBase(depsolve.Depsolve):
                              self.tsInfo.remove(txmbr.po.pkgtup)
          
          
@@ -187514,7 +187518,7 @@ index 99039e0..4a491a6 100644
          """
  
          if not self.comps.has_group(grpid):
-@@ -2920,6 +3639,9 @@ class YumBase(depsolve.Depsolve):
+@@ -2920,6 +3643,9 @@ class YumBase(depsolve.Depsolve):
          if group_package_types:
              package_types = group_package_types
  
@@ -187524,7 +187528,7 @@ index 99039e0..4a491a6 100644
          for thisgroup in thesegroups:
              if thisgroup.selected:
                  continue
-@@ -2934,12 +3656,49 @@ class YumBase(depsolve.Depsolve):
+@@ -2934,12 +3660,49 @@ class YumBase(depsolve.Depsolve):
              if 'optional' in package_types:
                  pkgs.extend(thisgroup.optional_packages)
  
@@ -187575,7 +187579,7 @@ index 99039e0..4a491a6 100644
                  except Errors.InstallError, e:
                      self.verbose_logger.debug(_('No package named %s available to be installed'),
                          pkg)
-@@ -2953,7 +3712,9 @@ class YumBase(depsolve.Depsolve):
+@@ -2953,7 +3716,9 @@ class YumBase(depsolve.Depsolve):
                  group_conditionals = enable_group_conditionals
  
              count_cond_test = 0
@@ -187586,7 +187590,7 @@ index 99039e0..4a491a6 100644
                  for condreq, cond in thisgroup.conditional_packages.iteritems():
                      if self.isPackageInstalled(cond):
                          try:
-@@ -2990,17 +3751,23 @@ class YumBase(depsolve.Depsolve):
+@@ -2990,17 +3755,23 @@ class YumBase(depsolve.Depsolve):
                          if cond not in self.tsInfo.conditionals:
                              self.tsInfo.conditionals[cond] = []
                          self.tsInfo.conditionals[cond].extend(pkgs)
@@ -187617,7 +187621,7 @@ index 99039e0..4a491a6 100644
          
          if not self.comps.has_group(grpid):
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
-@@ -3008,7 +3775,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3008,7 +3779,8 @@ class YumBase(depsolve.Depsolve):
          thesegroups = self.comps.return_groups(grpid)
          if not thesegroups:
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
@@ -187627,7 +187631,7 @@ index 99039e0..4a491a6 100644
          for thisgroup in thesegroups:
              thisgroup.selected = False
              
-@@ -3034,13 +3802,102 @@ class YumBase(depsolve.Depsolve):
+@@ -3034,13 +3806,102 @@ class YumBase(depsolve.Depsolve):
                          for pkg in self.tsInfo.conditionals.get(txmbr.name, []):
                              self.tsInfo.remove(pkg.pkgtup)
          
@@ -187736,7 +187740,7 @@ index 99039e0..4a491a6 100644
          # look it up in the self.localPackages first:
          for po in self.localPackages:
              if po.pkgtup == pkgtup:
-@@ -3049,7 +3906,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3049,7 +3910,7 @@ class YumBase(depsolve.Depsolve):
          pkgs = self.pkgSack.searchPkgTuple(pkgtup)
  
          if len(pkgs) == 0:
@@ -187745,7 +187749,7 @@ index 99039e0..4a491a6 100644
              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)
-@@ -3065,13 +3922,21 @@ class YumBase(depsolve.Depsolve):
+@@ -3065,13 +3926,21 @@ class YumBase(depsolve.Depsolve):
          return result
  
      def getInstalledPackageObject(self, pkgtup):
@@ -187772,7 +187776,7 @@ index 99039e0..4a491a6 100644
              raise Errors.RpmDBError, _('Package tuple %s could not be found in rpmdb') % str(pkgtup)
  
          # Dito. FIXME from getPackageObject() for len() > 1 ... :)
-@@ -3079,9 +3944,11 @@ class YumBase(depsolve.Depsolve):
+@@ -3079,9 +3948,11 @@ class YumBase(depsolve.Depsolve):
          return po
          
      def gpgKeyCheck(self):
@@ -187786,7 +187790,7 @@ index 99039e0..4a491a6 100644
          gpgkeyschecked = self.conf.cachedir + '/.gpgkeyschecked.yum'
          if os.path.exists(gpgkeyschecked):
              return 1
-@@ -3106,9 +3973,13 @@ class YumBase(depsolve.Depsolve):
+@@ -3106,9 +3977,13 @@ class YumBase(depsolve.Depsolve):
              return 1
  
      def returnPackagesByDep(self, depstring):
@@ -187802,7 +187806,7 @@ index 99039e0..4a491a6 100644
          if not depstring:
              return []
  
-@@ -3135,9 +4006,16 @@ class YumBase(depsolve.Depsolve):
+@@ -3135,9 +4010,16 @@ class YumBase(depsolve.Depsolve):
          return self.pkgSack.getProvides(depname, depflags, depver).keys()
  
      def returnPackageByDep(self, depstring):
@@ -187822,7 +187826,7 @@ index 99039e0..4a491a6 100644
          # we get all sorts of randomness here
          errstring = depstring
          if type(depstring) not in types.StringTypes:
-@@ -3149,16 +4027,22 @@ class YumBase(depsolve.Depsolve):
+@@ -3149,16 +4031,22 @@ class YumBase(depsolve.Depsolve):
              raise Errors.YumBaseError, _('No Package found for %s') % errstring
          
          ps = ListPackageSack(pkglist)
@@ -187849,7 +187853,7 @@ index 99039e0..4a491a6 100644
          if not depstring:
              return []
  
-@@ -3184,12 +4068,47 @@ class YumBase(depsolve.Depsolve):
+@@ -3184,12 +4072,47 @@ class YumBase(depsolve.Depsolve):
  
          return self.rpmdb.getProvides(depname, depflags, depver).keys()
  
@@ -187899,7 +187903,7 @@ index 99039e0..4a491a6 100644
          
          
          if len(pkglist) == 0:
-@@ -3198,14 +4117,23 @@ class YumBase(depsolve.Depsolve):
+@@ -3198,14 +4121,23 @@ class YumBase(depsolve.Depsolve):
          if len(pkglist) == 1:
              return pkglist[0]
  
@@ -187929,7 +187933,7 @@ index 99039e0..4a491a6 100644
          returnlist = []
          compatArchList = self.arch.get_arch_list(arch)
          multiLib = []
-@@ -3222,9 +4150,9 @@ class YumBase(depsolve.Depsolve):
+@@ -3222,9 +4154,9 @@ class YumBase(depsolve.Depsolve):
                  singleLib.append(po)
                  
          # we now have three lists.  find the best package(s) of each
@@ -187942,7 +187946,7 @@ index 99039e0..4a491a6 100644
  
          if single_name and multi and single and multi.name != single.name:
              # Sinlge _must_ match multi, if we want a single package name
-@@ -3238,7 +4166,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3238,7 +4170,7 @@ class YumBase(depsolve.Depsolve):
          # if there's a noarch and it's newer than the multilib, we want
          # just the noarch.  otherwise, we want multi + single
          elif multi:
@@ -187951,7 +187955,7 @@ index 99039e0..4a491a6 100644
              if best.arch == "noarch":
                  returnlist.append(no)
              else:
-@@ -3246,7 +4174,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3246,7 +4178,7 @@ class YumBase(depsolve.Depsolve):
                  if single: returnlist.append(single)
          # similar for the non-multilib case
          elif single:
@@ -187960,7 +187964,7 @@ index 99039e0..4a491a6 100644
              if best.arch == "noarch":
                  returnlist.append(no)
              else:
-@@ -3350,28 +4278,58 @@ class YumBase(depsolve.Depsolve):
+@@ -3350,28 +4282,58 @@ class YumBase(depsolve.Depsolve):
              done = True
  
              slow = next_func(slow)
@@ -188024,7 +188028,7 @@ index 99039e0..4a491a6 100644
          try:
              txmbrs = self.groupRemove(group_string)
          except yum.Errors.GroupsError:
-@@ -3387,6 +4345,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3387,6 +4349,8 @@ class YumBase(depsolve.Depsolve):
          assert pattern[0] == '@'
          grpid = pattern[1:]
  
@@ -188033,7 +188037,7 @@ index 99039e0..4a491a6 100644
          thesegroups = self.comps.return_groups(grpid)
          if not thesegroups:
              raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid)
-@@ -3398,7 +4358,11 @@ class YumBase(depsolve.Depsolve):
+@@ -3398,7 +4362,11 @@ class YumBase(depsolve.Depsolve):
      def _minus_deselect(self, pattern):
          """ Remove things from the transaction, like kickstart. """
          assert pattern[0] == '-'
@@ -188046,7 +188050,7 @@ index 99039e0..4a491a6 100644
  
          if pat and pat[0] == '@':
              pat = pat[1:]
-@@ -3437,14 +4401,87 @@ class YumBase(depsolve.Depsolve):
+@@ -3437,14 +4405,87 @@ class YumBase(depsolve.Depsolve):
              if flag not in self.tsInfo.probFilterFlags:
                  self.tsInfo.probFilterFlags.append(flag)
  
@@ -188140,7 +188144,7 @@ index 99039e0..4a491a6 100644
          pkgs = []
          was_pattern = False
          if po:
-@@ -3464,9 +4501,14 @@ class YumBase(depsolve.Depsolve):
+@@ -3464,9 +4505,14 @@ class YumBase(depsolve.Depsolve):
                  if kwargs['pattern'] and kwargs['pattern'][0] == '@':
                      return self._at_groupinstall(kwargs['pattern'])
  
@@ -188155,7 +188159,7 @@ index 99039e0..4a491a6 100644
                                                        ignore_case=False)
                  pkgs.extend(mypkgs)
                  # if we have anything left unmatched, let's take a look for it
-@@ -3477,20 +4519,12 @@ class YumBase(depsolve.Depsolve):
+@@ -3477,20 +4523,12 @@ class YumBase(depsolve.Depsolve):
                      self.verbose_logger.debug(_('Checking for virtual provide or file-provide for %s'), 
                          arg)
  
@@ -188182,7 +188186,7 @@ index 99039e0..4a491a6 100644
              else:
                  nevra_dict = self._nevra_kwarg_parse(kwargs)
  
-@@ -3499,6 +4533,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3499,6 +4537,8 @@ class YumBase(depsolve.Depsolve):
                       ver=nevra_dict['version'], rel=nevra_dict['release'])
                  self._add_not_found_a(pkgs, nevra_dict)
                  
@@ -188191,7 +188195,7 @@ index 99039e0..4a491a6 100644
              if pkgs:
                  # if was_pattern or nevra-dict['arch'] is none, take the list
                  # of arches based on our multilib_compat config and 
-@@ -3577,17 +4613,21 @@ class YumBase(depsolve.Depsolve):
+@@ -3577,17 +4617,21 @@ class YumBase(depsolve.Depsolve):
                      continue
              
              # make sure this shouldn't be passed to update:
@@ -188217,7 +188221,7 @@ index 99039e0..4a491a6 100644
                  obsoleting_pkg = self._test_loop(po, self._pkg2obspkg)
              if obsoleting_pkg is not None:
                  # this is not a definitive check but it'll make sure we don't
-@@ -3600,23 +4640,23 @@ class YumBase(depsolve.Depsolve):
+@@ -3600,23 +4644,23 @@ class YumBase(depsolve.Depsolve):
                      already_obs = pkgs[0]
  
                  if already_obs:
@@ -188248,7 +188252,7 @@ index 99039e0..4a491a6 100644
                      continue
  
              # make sure we don't have a name.arch of this already installed
-@@ -3630,8 +4670,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3630,8 +4674,8 @@ class YumBase(depsolve.Depsolve):
                          found = True
                          break
                  if not found:
@@ -188259,7 +188263,7 @@ index 99039e0..4a491a6 100644
                      tx_return.extend(txmbrs)
                      continue
  
-@@ -3719,19 +4759,47 @@ class YumBase(depsolve.Depsolve):
+@@ -3719,19 +4763,47 @@ class YumBase(depsolve.Depsolve):
          return txmbr
  
      def update(self, po=None, requiringPo=None, update_to=False, **kwargs):
@@ -188314,7 +188318,7 @@ index 99039e0..4a491a6 100644
          tx_return = []
          if not po and not kwargs: # update everything (the easy case)
              self.verbose_logger.log(logginglevels.DEBUG_2, _('Updating Everything'))
-@@ -3765,7 +4833,14 @@ class YumBase(depsolve.Depsolve):
+@@ -3765,7 +4837,14 @@ class YumBase(depsolve.Depsolve):
                      if new is None:
                          continue
                      tx_return.extend(self.update(po=new))
@@ -188330,7 +188334,7 @@ index 99039e0..4a491a6 100644
              return tx_return
  
          # complications
-@@ -3787,13 +4862,16 @@ class YumBase(depsolve.Depsolve):
+@@ -3787,13 +4866,16 @@ class YumBase(depsolve.Depsolve):
                  return self._minus_deselect(kwargs['pattern'])
  
              if kwargs['pattern'] and kwargs['pattern'][0] == '@':
@@ -188349,7 +188353,7 @@ index 99039e0..4a491a6 100644
  
              if not instpkgs and not availpkgs:
                  depmatches = []
-@@ -3805,6 +4883,8 @@ class YumBase(depsolve.Depsolve):
+@@ -3805,6 +4887,8 @@ class YumBase(depsolve.Depsolve):
                  except yum.Errors.YumBaseError, e:
                      self.logger.critical(_('%s') % e)
  
@@ -188358,7 +188362,7 @@ index 99039e0..4a491a6 100644
                  if update_to:
                      availpkgs.extend(depmatches)
                  else:
-@@ -3816,9 +4896,12 @@ class YumBase(depsolve.Depsolve):
+@@ -3816,9 +4900,12 @@ class YumBase(depsolve.Depsolve):
              try:
                  if update_to:
                      m = []
@@ -188372,7 +188376,7 @@ index 99039e0..4a491a6 100644
                      m = self.pkgSack.returnNewestByNameArch(patterns=pats)
              except Errors.PackageSackError:
                  m = []
-@@ -3843,7 +4926,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3843,7 +4930,7 @@ class YumBase(depsolve.Depsolve):
                      availpkgs = self._compare_providers(availpkgs, requiringPo)
                      availpkgs = map(lambda x: x[0], availpkgs)
                  elif not availpkgs:
@@ -188381,7 +188385,7 @@ index 99039e0..4a491a6 100644
         
          # for any thing specified
          # get the list of available pkgs matching it (or take the po)
-@@ -3879,6 +4962,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3879,6 +4966,7 @@ class YumBase(depsolve.Depsolve):
                      if obsoleting_pkg is None:
                          continue
                      obs_pkgs.append(obsoleting_pkg)
@@ -188389,7 +188393,7 @@ index 99039e0..4a491a6 100644
                  for obsoleting_pkg in packagesNewestByName(obs_pkgs):
                      tx_return.extend(self.install(po=obsoleting_pkg))
              for available_pkg in availpkgs:
-@@ -3920,11 +5004,29 @@ class YumBase(depsolve.Depsolve):
+@@ -3920,11 +5008,29 @@ class YumBase(depsolve.Depsolve):
                      tx_return.append(txmbr)
                          
          for available_pkg in availpkgs:
@@ -188419,7 +188423,7 @@ index 99039e0..4a491a6 100644
                  self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is obsoleted: %s'), available_pkg)
                  tx_return.extend(self.update(po=obsoleting_pkg))
                  continue
-@@ -3985,11 +5087,18 @@ class YumBase(depsolve.Depsolve):
+@@ -3985,11 +5091,18 @@ class YumBase(depsolve.Depsolve):
          return tx_return
          
      def remove(self, po=None, **kwargs):
@@ -188443,7 +188447,7 @@ index 99039e0..4a491a6 100644
          if not po and not kwargs:
              raise Errors.RemoveError, 'Nothing specified to remove'
          
-@@ -4008,6 +5117,10 @@ class YumBase(depsolve.Depsolve):
+@@ -4008,6 +5121,10 @@ class YumBase(depsolve.Depsolve):
                      return self._at_groupremove(kwargs['pattern'])
  
                  (e,m,u) = self.rpmdb.matchPackageNames([kwargs['pattern']])
@@ -188454,7 +188458,7 @@ index 99039e0..4a491a6 100644
                  pkgs.extend(e)
                  pkgs.extend(m)
                  if u:
-@@ -4018,6 +5131,10 @@ class YumBase(depsolve.Depsolve):
+@@ -4018,6 +5135,10 @@ class YumBase(depsolve.Depsolve):
                      except yum.Errors.YumBaseError, e:
                          self.logger.critical(_('%s') % e)
                      
@@ -188465,7 +188469,7 @@ index 99039e0..4a491a6 100644
                      if not depmatches:
                          arg = to_unicode(arg)
                          self.logger.critical(_('No Match for argument: %s') % to_unicode(arg))
-@@ -4055,17 +5172,19 @@ class YumBase(depsolve.Depsolve):
+@@ -4055,17 +5176,19 @@ class YumBase(depsolve.Depsolve):
          return tx_return
  
      def installLocal(self, pkg, po=None, updateonly=False):
@@ -188495,7 +188499,7 @@ index 99039e0..4a491a6 100644
          # read in the package into a YumLocalPackage Object
          # append it to self.localPackages
          # check if it can be installed or updated based on nevra versus rpmdb
-@@ -4183,16 +5302,15 @@ class YumBase(depsolve.Depsolve):
+@@ -4183,16 +5306,15 @@ class YumBase(depsolve.Depsolve):
          return tx_return
  
      def reinstallLocal(self, pkg, po=None):
@@ -188520,7 +188524,7 @@ index 99039e0..4a491a6 100644
          if not po:
              try:
                  po = YumUrlPackage(self, ts=self.rpmdb.readOnlyTS(), url=pkg,
-@@ -4215,13 +5333,29 @@ class YumBase(depsolve.Depsolve):
+@@ -4215,13 +5337,29 @@ class YumBase(depsolve.Depsolve):
          return self.reinstall(po=po)
  
      def reinstall(self, po=None, **kwargs):
@@ -188553,7 +188557,7 @@ index 99039e0..4a491a6 100644
          tx_mbrs = []
          if po: # The po, is the "available" po ... we want the installed po
              tx_mbrs.extend(self.remove(pkgtup=po.pkgtup))
-@@ -4240,10 +5374,11 @@ class YumBase(depsolve.Depsolve):
+@@ -4240,10 +5378,11 @@ class YumBase(depsolve.Depsolve):
              # pkgs that are obsolete.
              old_conf_obs = self.conf.obsoletes
              self.conf.obsoletes = False
@@ -188567,7 +188571,7 @@ index 99039e0..4a491a6 100644
              self.conf.obsoletes = old_conf_obs
              if len(members) == 0:
                  self.tsInfo.remove(item.pkgtup)
-@@ -4259,16 +5394,15 @@ class YumBase(depsolve.Depsolve):
+@@ -4259,16 +5398,15 @@ class YumBase(depsolve.Depsolve):
          return tx_mbrs
          
      def downgradeLocal(self, pkg, po=None):
@@ -188592,7 +188596,7 @@ index 99039e0..4a491a6 100644
          if not po:
              try:
                  po = YumUrlPackage(self, ts=self.rpmdb.readOnlyTS(), url=pkg,
-@@ -4309,13 +5443,19 @@ class YumBase(depsolve.Depsolve):
+@@ -4309,13 +5447,19 @@ class YumBase(depsolve.Depsolve):
          return False
          
      def downgrade(self, po=None, **kwargs):
@@ -188619,7 +188623,7 @@ index 99039e0..4a491a6 100644
          if not po and not kwargs:
              raise Errors.DowngradeError, 'Nothing specified to downgrade'
  
-@@ -4397,6 +5537,10 @@ class YumBase(depsolve.Depsolve):
+@@ -4397,6 +5541,10 @@ class YumBase(depsolve.Depsolve):
          # installed version. Indexed fromn the latest installed pkgtup.
          downgrade_apkgs = {}
          for pkg in sorted(apkgs):
@@ -188630,7 +188634,7 @@ index 99039e0..4a491a6 100644
              na  = (pkg.name, pkg.arch)
  
              # Here we allow downgrades from .i386 => .noarch, or .i586 => .i386
-@@ -4421,6 +5565,9 @@ class YumBase(depsolve.Depsolve):
+@@ -4421,6 +5569,9 @@ class YumBase(depsolve.Depsolve):
                  warned_nas.add(na)
                  continue
  
@@ -188640,7 +188644,7 @@ index 99039e0..4a491a6 100644
              if pkg.verGE(lipkg):
                  if na not in warned_nas:
                      msg = _('Only Upgrade available on package: %s') % pkg
-@@ -4457,7 +5604,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4457,7 +5608,7 @@ class YumBase(depsolve.Depsolve):
          if e and v and r:
              evr = '%s:%s-%s' % (e, v, r)
          elif v and r:
@@ -188649,7 +188653,7 @@ index 99039e0..4a491a6 100644
          elif e and v:
              evr = '%s:%s' % (e, v)
          elif v: # e and r etc. is just too weird to print
-@@ -4500,12 +5647,24 @@ class YumBase(depsolve.Depsolve):
+@@ -4500,12 +5651,24 @@ class YumBase(depsolve.Depsolve):
  
          return returndict
  
@@ -188677,7 +188681,7 @@ index 99039e0..4a491a6 100644
          old_conf_obs = self.conf.obsoletes
          self.conf.obsoletes = False
          done = False
-@@ -4515,19 +5674,46 @@ class YumBase(depsolve.Depsolve):
+@@ -4515,19 +5678,46 @@ class YumBase(depsolve.Depsolve):
                      done = True
          for pkg in transaction.trans_data:
              if pkg.state == 'Downgrade':
@@ -188724,7 +188728,7 @@ index 99039e0..4a491a6 100644
                  if self.install(pkgtup=pkg.pkgtup):
                      done = True
          for pkg in transaction.trans_data:
-@@ -4538,8 +5724,14 @@ class YumBase(depsolve.Depsolve):
+@@ -4538,8 +5728,14 @@ class YumBase(depsolve.Depsolve):
          return done
  
      def history_undo(self, transaction):
@@ -188741,7 +188745,7 @@ index 99039e0..4a491a6 100644
          # NOTE: This is somewhat basic atm. ... for instance we don't check
          #       that we are going from the old new version. However it's still
          #       better than the RHN rollback code, and people pay for that :).
-@@ -4616,7 +5808,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4616,7 +5812,7 @@ class YumBase(depsolve.Depsolve):
  
          except urlgrabber.grabber.URLGrabError, e:
              raise Errors.YumBaseError(_('GPG key retrieval failed: ') +
@@ -188750,7 +188754,7 @@ index 99039e0..4a491a6 100644
                                        
          # check for a .asc file accompanying it - that's our gpg sig on the key
          # suck it down and do the check
-@@ -4649,7 +5841,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4649,7 +5845,7 @@ class YumBase(depsolve.Depsolve):
              keys_info = misc.getgpgkeyinfo(rawkey, multiple=True)
          except ValueError, e:
              raise Errors.YumBaseError(_('Invalid GPG Key from %s: %s') % 
@@ -188759,7 +188763,7 @@ index 99039e0..4a491a6 100644
          keys = []
          for keyinfo in keys_info:
              thiskey = {}
-@@ -4674,39 +5866,49 @@ class YumBase(depsolve.Depsolve):
+@@ -4674,39 +5870,49 @@ class YumBase(depsolve.Depsolve):
              if pkgs:
                  pkgs = sorted(pkgs)[-1]
                  msg = (_('Importing %s key 0x%s:\n'
@@ -188827,7 +188831,7 @@ index 99039e0..4a491a6 100644
          user_cb_fail = False
          for keyurl in keyurls:
              keys = self._retrievePublicKey(keyurl, repo)
-@@ -4725,7 +5927,9 @@ class YumBase(depsolve.Depsolve):
+@@ -4725,7 +5931,9 @@ class YumBase(depsolve.Depsolve):
                      # Try installing/updating GPG key
                      self._getKeyImportMessage(info, keyurl)
                      rc = False
@@ -188838,7 +188842,7 @@ index 99039e0..4a491a6 100644
                          rc = True
                          
                      # grab the .sig/.asc for the keyurl, if it exists
-@@ -4751,8 +5955,8 @@ class YumBase(depsolve.Depsolve):
+@@ -4751,8 +5959,8 @@ class YumBase(depsolve.Depsolve):
                  ts = self.rpmdb.readOnlyTS()
                  result = ts.pgpImportPubkey(misc.procgpgkey(info['raw_key']))
                  if result != 0:
@@ -188849,7 +188853,7 @@ index 99039e0..4a491a6 100644
                  self.logger.info(_('Key imported successfully'))
                  key_installed = True
  
-@@ -4760,18 +5964,20 @@ class YumBase(depsolve.Depsolve):
+@@ -4760,18 +5968,20 @@ class YumBase(depsolve.Depsolve):
              raise Errors.YumBaseError, _("Didn't install any keys")
  
          if not key_installed:
@@ -188875,7 +188879,7 @@ index 99039e0..4a491a6 100644
      
      def _getAnyKeyForRepo(self, repo, destdir, keyurl_list, is_cakey=False, callback=None):
          """
-@@ -4788,6 +5994,18 @@ class YumBase(depsolve.Depsolve):
+@@ -4788,6 +5998,18 @@ class YumBase(depsolve.Depsolve):
          """
  
          key_installed = False
@@ -188894,7 +188898,7 @@ index 99039e0..4a491a6 100644
          user_cb_fail = False
          for keyurl in keyurl_list:
              keys = self._retrievePublicKey(keyurl, repo, getSig=not is_cakey)
-@@ -4819,8 +6037,11 @@ class YumBase(depsolve.Depsolve):
+@@ -4819,8 +6041,11 @@ class YumBase(depsolve.Depsolve):
                  if not key_installed:
                      self._getKeyImportMessage(info, keyurl, keytype)
                      rc = False
@@ -188907,7 +188911,7 @@ index 99039e0..4a491a6 100644
                      elif callback:
                          rc = callback({"repo": repo, "userid": info['userid'],
                                          "hexkeyid": info['hexkeyid'], "keyurl": keyurl,
-@@ -4835,7 +6056,8 @@ class YumBase(depsolve.Depsolve):
+@@ -4835,7 +6060,8 @@ class YumBase(depsolve.Depsolve):
                  # Import the key
                  result = misc.import_key_to_pubring(info['raw_key'], info['hexkeyid'], gpgdir=destdir)
                  if not result:
@@ -188917,7 +188921,7 @@ index 99039e0..4a491a6 100644
                  self.logger.info(_('Key imported successfully'))
                  key_installed = True
                  # write out the key id to imported_cakeys in the repos basedir
-@@ -4851,36 +6073,35 @@ class YumBase(depsolve.Depsolve):
+@@ -4851,36 +6077,35 @@ class YumBase(depsolve.Depsolve):
                              pass
  
          if not key_installed and user_cb_fail:
@@ -188970,7 +188974,7 @@ index 99039e0..4a491a6 100644
          self._getAnyKeyForRepo(repo, repo.gpgcadir, repo.gpgcakey, is_cakey=True, callback=callback)
  
      def _limit_installonly_pkgs(self):
-@@ -4889,7 +6110,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4889,7 +6114,7 @@ class YumBase(depsolve.Depsolve):
              New in 3.2.24: Obey yumdb_info.installonly data. """
  
          def _sort_and_filter_installonly(pkgs):
@@ -188979,7 +188983,7 @@ index 99039e0..4a491a6 100644
                  using the yumdb. """
              ret_beg = []
              ret_mid = []
-@@ -4926,23 +6147,30 @@ class YumBase(depsolve.Depsolve):
+@@ -4926,23 +6151,30 @@ class YumBase(depsolve.Depsolve):
          # so self.rpmdb.ts should be valid.
          ts = self.rpmdb.readOnlyTS()
          (cur_kernel_v, cur_kernel_r) = misc.get_running_kernel_version_release(ts)
@@ -189018,7 +189022,7 @@ index 99039e0..4a491a6 100644
              for po in installed:
                  if (po.version, po.release) == (cur_kernel_v, cur_kernel_r): 
                      # don't remove running
-@@ -4959,19 +6187,22 @@ class YumBase(depsolve.Depsolve):
+@@ -4959,19 +6191,22 @@ class YumBase(depsolve.Depsolve):
              txmbr.depends_on.append(rel)
  
      def processTransaction(self, callback=None,rpmTestDisplay=None, rpmDisplay=None):
@@ -189054,7 +189058,7 @@ index 99039e0..4a491a6 100644
          
          if not callback:
              callback = callbacks.ProcessTransNoOutputCallback()
-@@ -5062,8 +6293,8 @@ class YumBase(depsolve.Depsolve):
+@@ -5062,8 +6297,8 @@ class YumBase(depsolve.Depsolve):
                  raise Errors.YumRPMCheckError, retmsgs
              retmsgs = [_('ERROR with transaction check vs depsolve:')]
              retmsgs.extend(msgs) 
@@ -189065,7 +189069,7 @@ index 99039e0..4a491a6 100644
              raise Errors.YumRPMCheckError,retmsgs
          
          tsConf = {}
-@@ -5114,13 +6345,19 @@ class YumBase(depsolve.Depsolve):
+@@ -5114,13 +6349,19 @@ class YumBase(depsolve.Depsolve):
          return results
  
      def add_enable_repo(self, repoid, baseurls=[], mirrorlist=None, **kwargs):
@@ -189092,7 +189096,7 @@ index 99039e0..4a491a6 100644
          # out of place fixme - maybe we should make this the default repo addition
          # routine and use it from getReposFromConfigFile(), etc.
          newrepo = yumRepo.YumRepository(repoid)
-@@ -5167,9 +6404,15 @@ class YumBase(depsolve.Depsolve):
+@@ -5167,9 +6408,15 @@ class YumBase(depsolve.Depsolve):
  
      def setCacheDir(self, force=False, tmpdir=None, reuse=True,
                      suffix='/$basearch/$releasever'):
@@ -189111,7 +189115,7 @@ index 99039e0..4a491a6 100644
          if not force and os.geteuid() == 0:
              return True # We are root, not forced, so happy with the global dir.
          if tmpdir is None:
-@@ -5179,7 +6422,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5179,7 +6426,7 @@ class YumBase(depsolve.Depsolve):
          try:
              cachedir = misc.getCacheDir(tmpdir, reuse)
          except (IOError, OSError), e:
@@ -189120,7 +189124,7 @@ index 99039e0..4a491a6 100644
              cachedir = None
              
          if cachedir is None:
-@@ -5190,6 +6433,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5190,6 +6437,7 @@ class YumBase(depsolve.Depsolve):
              self.prerepoconf.cachedir = cachedir
          else:
              self.repos.setCacheDir(cachedir)
@@ -189128,7 +189132,7 @@ index 99039e0..4a491a6 100644
          self.conf.cachedir = cachedir
          return True # We got a new cache dir
  
-@@ -5220,13 +6464,24 @@ class YumBase(depsolve.Depsolve):
+@@ -5220,13 +6468,24 @@ class YumBase(depsolve.Depsolve):
          self.history.write_addon_data('config-repos', myrepos)
          
      def verify_plugins_cb(self, verify_package):
@@ -189156,7 +189160,7 @@ index 99039e0..4a491a6 100644
          if self.tsInfo._unresolvedMembers:
              if auto:
                  self.logger.critical(_("Dependencies not solved. Will not save unresolved transaction."))
-@@ -5234,7 +6489,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5234,7 +6493,7 @@ class YumBase(depsolve.Depsolve):
              raise Errors.YumBaseError(_("Dependencies not solved. Will not save unresolved transaction."))
          
          if not filename:
@@ -189165,7 +189169,7 @@ index 99039e0..4a491a6 100644
              fd,filename = tempfile.mkstemp(suffix='.yumtx', prefix=prefix)
              f = os.fdopen(fd, 'w')
          else:
-@@ -5244,13 +6499,17 @@ class YumBase(depsolve.Depsolve):
+@@ -5244,13 +6503,17 @@ class YumBase(depsolve.Depsolve):
          
          msg = "%s\n" % self.rpmdb.simpleVersion(main_only=True)[0]
          msg += "%s\n" % self.ts.getTsFlags()
@@ -189186,7 +189190,7 @@ index 99039e0..4a491a6 100644
          msg += "%s\n" % len(self.tsInfo.getMembers())
          for txmbr in self.tsInfo.getMembers():
              msg += txmbr._dump()
-@@ -5260,42 +6519,84 @@ class YumBase(depsolve.Depsolve):
+@@ -5260,42 +6523,84 @@ class YumBase(depsolve.Depsolve):
          except (IOError, OSError), e:
              self._ts_save_file = None
              if auto:
@@ -189283,7 +189287,7 @@ index 99039e0..4a491a6 100644
              if ignorerpm:
                  msg += _(" ignoring, as requested.")
                  self.logger.critical(_(msg))
-@@ -5318,8 +6619,17 @@ class YumBase(depsolve.Depsolve):
+@@ -5318,8 +6623,17 @@ class YumBase(depsolve.Depsolve):
          numrepos = int(data[2].strip())
          repos = []
          rindex=3+numrepos
@@ -189302,7 +189306,7 @@ index 99039e0..4a491a6 100644
  
          # pkgs/txmbrs
          numpkgs = int(data[rindex].strip())
-@@ -5329,6 +6639,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5329,6 +6643,7 @@ class YumBase(depsolve.Depsolve):
          pkgcount = 0
          pkgprob = False
          curpkg = None
@@ -189310,7 +189314,7 @@ index 99039e0..4a491a6 100644
          for l in data[pkgstart:]:
              l = l.rstrip()
              # our main txmbrs
-@@ -5356,6 +6667,7 @@ class YumBase(depsolve.Depsolve):
+@@ -5356,6 +6671,7 @@ class YumBase(depsolve.Depsolve):
                      if not ignoremissing:
                          raise Errors.YumBaseError(msg)
                      else:
@@ -189318,7 +189322,7 @@ index 99039e0..4a491a6 100644
                          self.logger.critical(msg)
                  else:
                      pkgcount += 1
-@@ -5432,12 +6744,18 @@ class YumBase(depsolve.Depsolve):
+@@ -5432,12 +6748,18 @@ class YumBase(depsolve.Depsolve):
          if pkgprob:
              msg = _("Transaction members, relations are missing or ts has been modified,")
              if ignoremissing:
@@ -189337,7 +189341,7 @@ index 99039e0..4a491a6 100644
          return self.tsInfo.getMembers()
  
      def _remove_old_deps(self):
-@@ -5470,18 +6788,6 @@ class YumBase(depsolve.Depsolve):
+@@ -5470,18 +6792,6 @@ class YumBase(depsolve.Depsolve):
                      if requiring == required: # if they are self-requiring skip them
                          continue
                          
@@ -189356,7 +189360,7 @@ index 99039e0..4a491a6 100644
                      #for tbi_pkg in self.tsInfo.getMembersWithState(output_states=TS_INSTALL_STATES):
                      #   for reqtuple in tbi_pkg.po.requires:
                      #        if required.provides_for(reqtuple):
-@@ -5533,7 +6839,24 @@ class YumBase(depsolve.Depsolve):
+@@ -5533,7 +6843,24 @@ class YumBase(depsolve.Depsolve):
                      # Debugging output
                      self.verbose_logger.log(logginglevels.DEBUG_2, _("%s has revdep %s which was user-installed."), pkg, curpkg)
                      ok_to_remove[pkg] = False
@@ -189381,7 +189385,7 @@ index 99039e0..4a491a6 100644
                  visited[curpkg] = True
              all_leaves_visited = True
              leaves = curpkg.requiring_packages()
-@@ -5547,4 +6870,3 @@ class YumBase(depsolve.Depsolve):
+@@ -5547,4 +6874,3 @@ class YumBase(depsolve.Depsolve):
          # Debugging output
          self.verbose_logger.log(logginglevels.DEBUG_2, _("%s has no user-installed revdeps."), pkg)
          return False
@@ -191577,10 +191581,10 @@ index 6d744c0..500a0b9 100644
          self.conflict = conflict # what the conflict was between them
 diff --git a/yum/drpm.py b/yum/drpm.py
 new file mode 100644
-index 0000000..8008618
+index 0000000..41dab0e
 --- /dev/null
 +++ b/yum/drpm.py
-@@ -0,0 +1,219 @@
+@@ -0,0 +1,307 @@
 +#  Integrated delta rpm support
 +#  Copyright 2013 Zdenek Pavlas
 +
@@ -191619,6 +191623,9 @@ index 0000000..8008618
 +        self.repo = rpm.repo
 +        self.basepath = rpm.basepath
 +        self.pkgtup = rpm.pkgtup
++        (self.name, self.arch, self.epoch,
++         self.version, self.release) = self.pkgtup
++        self._hash = None
 +
 +        # set up drpm attributes
 +        self.size = size
@@ -191630,6 +191637,24 @@ index 0000000..8008618
 +    def __str__(self):
 +        return 'Delta RPM of %s' % self.rpm
 +
++    def __cmp__(self, other):
++        if other is None:
++            return 1
++
++        #  Not a PackageObject(), so do this ourselves the bad way:
++        return (cmp(self.name, other.name) or
++                cmp(self.epoch, other.epoch) or
++                cmp(self.version, other.version) or
++                cmp(self.release, other.release) or
++                cmp(self.arch, other.arch))
++
++    def __hash__(self): # C&P from PackageObject...
++        if self._hash is None:
++            mystr = '%s - %s:%s-%s-%s.%s' % (self.repo.id, self.epoch, self.name,
++                                         self.version, self.release, self.arch)
++            self._hash = hash(mystr)
++        return self._hash
++
 +    def localPkg(self):
 +        return self.localpath
 +
@@ -191671,6 +191696,7 @@ index 0000000..8008618
 +    def __init__(self, ayum, pkgs):
 +        self.verbose_logger = ayum.verbose_logger
 +        self.jobs = {}
++        self._future_jobs = []
 +        self.limit = ayum.conf.deltarpm
 +        if self.limit < 0:
 +            nprocs = _num_cpus_online()
@@ -191771,17 +191797,39 @@ index 0000000..8008618
 +                        pkgs[index] = DeltaPackage(po, size, remote, csum, oldrpm)
 +                el.clear()
 +
-+    def wait(self, limit = 1):
++    def wait(self, num=None):
++        """ Wait for "num" number of jobs to finish, or all of them. Blocks. """
++        if num is None:
++            num = len(self.jobs)
++
 +        # wait for some jobs, run callbacks
-+        while len(self.jobs) >= limit:
-+            pid, code = os.wait()
++        while num > 0:
++            if not self.jobs: # This is probably broken logic, which is bad.
++                return
++            num -= self._wait(block=True)
++
++    def _wait(self, block=False):
++        num = 0
++
++        while self.jobs:
++            if block:
++                pid, code = os.wait()
++            else:
++                pid, code = os.waitpid(-1, os.WNOHANG)
++                if not pid:
++                    break
++
 +            # urlgrabber spawns child jobs, too.  But they exit synchronously,
 +            # so we should never see an unknown pid here.
 +            assert pid in self.jobs
 +            callback = self.jobs.pop(pid)
 +            callback(code)
++            num += 1
++        return num
 +
 +    def rebuild(self, po, adderror):
++        """ Turn a drpm into an rpm, by adding it to the queue and trying to
++            service the queue. """
 +        # this runs when worker finishes
 +        def callback(code):
 +            if code != 0:
@@ -191793,11 +191841,55 @@ index 0000000..8008618
 +            os.unlink(po.localpath)
 +            po.localpath = po.rpm.localpath # for --downloadonly
 +
-+        # spawn a worker process
-+        self.wait(self.limit)
 +        args = ()
 +        if po.oldrpm: args += '-r', po.oldrpm
 +        args += po.localpath, po.rpm.localpath
++
++        self.queue(args, callback)
++        self.dequeue_max()
++
++    def queue(self, args, callback):
++        """ Queue a delta rebuild up. """
++        self._future_jobs.append((args, callback))
++
++    def dequeue_all(self):
++        """ De-Queue all delta rebuilds and spawn the rebuild processes. """
++
++        while self._future_jobs:
++            self.dequeue()
++
++    def dequeue_max(self):
++        """ De-Queue all delta rebuilds we can and spawn the rebuild
++            processes. """
++
++        if not self._future_jobs:
++            # Just trim the zombies...
++            self._wait()
++            return
++
++        while self._future_jobs:
++            if not self.dequeue(block=False):
++                break
++
++    def dequeue(self, block=True):
++        """ Try to De-Queue a delta rebuild and spawn the rebuild process. """
++        # Do this here, just to keep the zombies at bay...
++        self._wait()
++
++        if not self._future_jobs:
++            return False
++
++        if self.limit <= len(self.jobs):
++            if not block:
++                return False
++            self.wait((self.limit - len(self.jobs)) + 1)
++
++        args, callback = self._future_jobs.pop(0)
++        self._spawn(args, callback)
++
++        return True
++
++    def _spawn(self, args, callback):
 +        pid = os.spawnl(os.P_NOWAIT, APPLYDELTA, APPLYDELTA, *args)
 +        self.jobs[pid] = callback
 diff --git a/yum/failover.py b/yum/failover.py
diff --git a/yum.spec b/yum.spec
index 5c0f9f1..d6c1f4f 100644
--- a/yum.spec
+++ b/yum.spec
@@ -29,7 +29,7 @@
 Summary: RPM package installer/updater/manager
 Name: yum
 Version: 3.4.3
-Release: 72%{?dist}
+Release: 73%{?dist}
 License: GPLv2+
 Group: System Environment/Base
 Source0: http://yum.baseurl.org/download/3.4/%{name}-%{version}.tar.gz
@@ -385,6 +385,11 @@ exit 0
 %endif
 
 %changelog
+* Thu Mar  7 2013 James Antill <james at fedoraproject.org> - 3.4.3-73
+- update to latest HEAD.
+- Queue for drpm rebuilding.
+- Sort drpms.
+
 * Wed Mar  6 2013 James Antill <james at fedoraproject.org> - 3.4.3-72
 - update to latest HEAD.
 - Translation updates.


More information about the scm-commits mailing list