rpms/yum/devel yum-HEAD.patch,1.57,1.58 yum.spec,1.318,1.319

Seth Vidal skvidal at fedoraproject.org
Wed Jun 2 17:19:38 UTC 2010


Author: skvidal

Update of /cvs/pkgs/rpms/yum/devel
In directory cvs01.phx2.fedoraproject.org:/tmp/cvs-serv21307

Modified Files:
	yum-HEAD.patch yum.spec 
Log Message:
latest yum head



yum-HEAD.patch:
 Makefile                     |    2 
 cli.py                       |  140 +++
 docs/yum.8                   |   53 +
 docs/yum.conf.5              |   45 +
 etc/Makefile                 |    2 
 etc/yum.bash                 |   19 
 output.py                    |  120 ++
 po/fi.po                     |  205 ++---
 po/pt_BR.po                  | 1723 +++++++++++++++++++++++++------------------
 po/ru.po                     |  783 ++++++++++---------
 po/sv.po                     | 1449 ++++++++++++++++++++----------------
 rpmUtils/miscutils.py        |   55 -
 rpmUtils/oldUtils.py         |    2 
 rpmUtils/transaction.py      |    7 
 rpmUtils/updates.py          |   53 -
 test/depsolvetests.py        |   15 
 test/simpleobsoletestests.py |   23 
 test/simpleupdatetests.py    |   45 +
 test/testbase.py             |   13 
 test/yum-leak-test.py        |   96 ++
 test/yum-pylintrc            |    3 
 utils.py                     |   28 
 yum-updatesd.py              |    8 
 yum.spec                     |   26 
 yum/__init__.py              |  369 +++++++--
 yum/comps.py                 |   21 
 yum/config.py                |   79 +
 yum/depsolve.py              |  130 ++-
 yum/history.py               |  316 +++++++
 yum/logginglevels.py         |   44 -
 yum/mdparser.py              |    2 
 yum/misc.py                  |  108 ++
 yum/packageSack.py           |   69 +
 yum/packages.py              |  139 ++-
 yum/pgpmsg.py                |   19 
 yum/pkgtag_db.py             |    4 
 yum/repoMDObject.py          |   94 ++
 yum/repos.py                 |    2 
 yum/rpmsack.py               |  202 ++++-
 yum/sqlitesack.py            |   96 ++
 yum/transactioninfo.py       |   52 +
 yum/update_md.py             |   20 
 yum/yumRepo.py               |   57 -
 yumcommands.py               |   35 
 yummain.py                   |   10 
 45 files changed, 4501 insertions(+), 2282 deletions(-)

Index: yum-HEAD.patch
===================================================================
RCS file: /cvs/pkgs/rpms/yum/devel/yum-HEAD.patch,v
retrieving revision 1.57
retrieving revision 1.58
diff -u -p -r1.57 -r1.58
--- yum-HEAD.patch	26 May 2010 21:03:23 -0000	1.57
+++ yum-HEAD.patch	2 Jun 2010 17:19:32 -0000	1.58
@@ -543,7 +543,7 @@ index 5dfdb64..0fcba24 100644
  complete -F _yum -o filenames yum yummain.py
  
 diff --git a/output.py b/output.py
-index b09730a..7a3cfb0 100755
+index b09730a..de04b83 100755
 --- a/output.py
 +++ b/output.py
 @@ -927,6 +927,26 @@ class YumOutput:
@@ -573,7 +573,19 @@ index b09730a..7a3cfb0 100755
              
      def listTransaction(self):
          """returns a string rep of the  transaction in an easy-to-read way."""
-@@ -1310,6 +1330,13 @@ to exit.
+@@ -1232,8 +1252,9 @@ to exit.
+         return count, "".join(list(actions))
+ 
+     def _pwd_ui_username(self, uid, limit=None):
+-        # loginuid is set to -1 on init.
+-        if uid is None or uid == 0xFFFFFFFF:
++        # loginuid is set to      -1 (0xFFFF_FFFF) on init, in newer kernels.
++        # loginuid is set to INT_MAX (0x7FFF_FFFF) on init, in older kernels.
++        if uid is None or uid in (0xFFFFFFFF, 0x7FFFFFFF):
+             loginid = _("<unset>")
+             name = _("System") + " " + loginid
+             if limit is not None and len(name) > limit:
+@@ -1310,6 +1331,13 @@ to exit.
                  rmark = lmark = '*'
              elif old.return_code:
                  rmark = lmark = '#'
@@ -587,7 +599,7 @@ index b09730a..7a3cfb0 100755
              if old.altered_lt_rpmdb:
                  rmark = '<'
              if old.altered_gt_rpmdb:
-@@ -1413,6 +1440,29 @@ to exit.
+@@ -1413,6 +1441,29 @@ to exit.
      def _historyInfoCmd(self, old, pats=[]):
          name = self._pwd_ui_username(old.loginuid)
  
@@ -617,7 +629,7 @@ index b09730a..7a3cfb0 100755
          print _("Transaction ID :"), old.tid
          begtm = time.ctime(old.beg_timestamp)
          print _("Begin time     :"), begtm
-@@ -1448,6 +1498,9 @@ to exit.
+@@ -1448,6 +1499,9 @@ to exit.
              print _("Return-Code    :"), _("Failure:"), old.return_code
          else:
              print _("Return-Code    :"), _("Success")
@@ -627,7 +639,7 @@ index b09730a..7a3cfb0 100755
          print _("Transaction performed with:")
          for hpkg in old.trans_with:
              prefix = " " * 4
-@@ -1462,11 +1515,25 @@ to exit.
+@@ -1462,11 +1516,25 @@ to exit.
                  state  = _('Updated')
              elif ipkgs[0] < hpkg:
                  state  = _('Downgraded')
@@ -655,7 +667,7 @@ index b09730a..7a3cfb0 100755
          if old.output:
              print _("Scriptlet output:")
              num = 0
-@@ -1587,7 +1654,7 @@ to exit.
+@@ -1587,7 +1655,7 @@ to exit.
                  count, uiacts = self._history_uiactions(hpkgs)
                  uperiod = _period2user[period]
                  # Should probably use columns here, esp. for uiacts?
@@ -664,7 +676,7 @@ index b09730a..7a3cfb0 100755
                               utf8_width_fill(uperiod, 19, 19),
                               utf8_width_fill(uiacts, 16, 16), count)
  
-@@ -1639,6 +1706,10 @@ class DepSolveProgressCallBack:
+@@ -1639,6 +1707,10 @@ class DepSolveProgressCallBack:
              _('--> Processing Dependency: %s for package: %s'), formatted_req,
              po)
      
@@ -675,7 +687,7 @@ index b09730a..7a3cfb0 100755
      def unresolved(self, msg):
          self.verbose_logger.log(logginglevels.INFO_2, _('--> Unresolved Dependency: %s'),
              msg)
-@@ -1660,24 +1731,52 @@ class DepSolveProgressCallBack:
+@@ -1660,24 +1732,52 @@ class DepSolveProgressCallBack:
          if not yb:
              return msg
          
@@ -734,7 +746,7 @@ index b09730a..7a3cfb0 100755
      
      def procConflict(self, name, confname):
 diff --git a/po/fi.po b/po/fi.po
-index 4347eba..4240973 100644
+index 4347eba..71c926d 100644
 --- a/po/fi.po
 +++ b/po/fi.po
 @@ -6,8 +6,8 @@ msgid ""
@@ -744,7 +756,7 @@ index 4347eba..4240973 100644
 -"POT-Creation-Date: 2010-02-10 10:43-0500\n"
 -"PO-Revision-Date: 2010-02-11 21:50+0200\n"
 +"POT-Creation-Date: 2010-02-11 10:54-0500\n"
-+"PO-Revision-Date: 2010-03-24 14:36+0200\n"
++"PO-Revision-Date: 2010-05-27 21:23+0300\n"
  "Last-Translator: Ville-Pekka Vainio <vpivaini at cs.helsinki.fi>\n"
  "Language-Team: Finnish <laatu at lokalisointi.org>\n"
  "MIME-Version: 1.0\n"
@@ -767,6 +779,15 @@ index 4347eba..4240973 100644
  msgid "ERROR with rpm_check_debug vs depsolve:"
  msgstr "VIRHE rpm_check_debugin ja riippuvuuksien tarkistuksen välillä:"
  
+@@ -250,7 +250,7 @@ msgstr "Vanhennettavat paketit"
+ #: ../cli.py:717
+ #, python-format
+ msgid " (from %s)"
+-msgstr " (versiosta %s)"
++msgstr " (asennuslähteestä %s)"
+ 
+ #: ../cli.py:719
+ #, python-format
 @@ -339,7 +339,7 @@ msgstr "Saatavilla olevat ryhmät:"
  msgid "Done"
  msgstr "Valmis"
@@ -10441,7 +10462,7 @@ index 59a2df1..48b836b 100644
 -#~ "getInstalledPackageObject() kommer att försvinna, använd self.rpmdb."
 -#~ "searchPkgTuple().\n"
 diff --git a/rpmUtils/miscutils.py b/rpmUtils/miscutils.py
-index a925027..8e46541 100644
+index a925027..b1631ae 100644
 --- a/rpmUtils/miscutils.py
 +++ b/rpmUtils/miscutils.py
 @@ -170,45 +170,45 @@ def rangeCompare(reqtuple, provtuple):
@@ -10528,7 +10549,7 @@ index a925027..8e46541 100644
      s = name
      
 -    if flags:
-+    if flags and type(flags) == type(0): # Flag must be set and a int
++    if flags and (type(flags) == type(0) or type(flags) == type(0L)): # Flag must be set and a int (or a long, now)
          if flags & (rpm.RPMSENSE_LESS | rpm.RPMSENSE_GREATER |
                      rpm.RPMSENSE_EQUAL):
              s = s + " "
@@ -11041,7 +11062,7 @@ index dd3db57..fa3e57c 100644
  
  [REPORTS]
 diff --git a/utils.py b/utils.py
-index dd6b642..1bb4569 100644
+index dd6b642..b5b38bd 100644
 --- a/utils.py
 +++ b/utils.py
 @@ -105,7 +105,7 @@ def show_lock_owner(pid, logger):
@@ -11064,7 +11085,23 @@ index dd6b642..1bb4569 100644
          
          
      def getOptionParser(self):
-@@ -162,6 +166,14 @@ class YumUtilBase(YumBaseCli):
+@@ -150,9 +154,12 @@ class YumUtilBase(YumBaseCli):
+                 if "%s" %(e.msg,) != lockerr:
+                     lockerr = "%s" %(e.msg,)
+                     self.logger.critical(lockerr)
+-                self.logger.critical("Another app is currently holding the yum lock; waiting for it to exit...")  
+-                show_lock_owner(e.pid, self.logger)
+-                time.sleep(2)
++                if not self.conf.exit_on_lock:
++                    self.logger.critical("Another app is currently holding the yum lock; waiting for it to exit...")  
++                    show_lock_owner(e.pid, self.logger)
++                    time.sleep(2)
++                else:
++                    raise Errors.YumBaseError, _("Another app is currently holding the yum lock; exiting as configured by exit_on_lock")
+             else:
+                 break
+         
+@@ -162,6 +169,14 @@ class YumUtilBase(YumBaseCli):
      def doUtilConfigSetup(self,args = sys.argv[1:],pluginsTypes=(plugins.TYPE_CORE,)):
          # Parse only command line options that affect basic yum setup
          opts = self._parser.firstParse(args)
@@ -11079,7 +11116,7 @@ index dd6b642..1bb4569 100644
          # Just print out the version if that's what the user wanted
          if opts.version:
              self._printUtilVersion()
-@@ -189,6 +201,11 @@ class YumUtilBase(YumBaseCli):
+@@ -189,6 +204,11 @@ class YumUtilBase(YumBaseCli):
                  pc.enabled_plugins = self._parser._splitArg(opts.enableplugins)
              self.conf
  
@@ -11183,9 +11220,18 @@ index 29870e5..3b8b3f8 100644
  %{_mandir}/man*/yum-shell*
  
 diff --git a/yum/__init__.py b/yum/__init__.py
-index ea73549..8a2fbf4 100644
+index ea73549..aa522f8 100644
 --- a/yum/__init__.py
 +++ b/yum/__init__.py
+@@ -30,7 +30,7 @@ import fnmatch
+ import logging
+ import logging.config
+ import operator
+-import gzip
++
+ 
+ import yum.i18n
+ _ = yum.i18n._
 @@ -41,7 +41,8 @@ from config import ParsingError, ConfigParser
  import Errors
  import rpmsack
@@ -11253,6 +11299,19 @@ index ea73549..8a2fbf4 100644
              self.verbose_logger.debug('rpmdb time: %0.3f' % (time.time() - rpmdb_st))
          return self._rpmdb
  
+@@ -706,9 +716,9 @@ class YumBase(depsolve.Depsolve):
+             self.verbose_logger.log(logginglevels.DEBUG_4,
+                 _('Adding group file from repository: %s'), repo)
+             groupfile = repo.getGroups()
+-            # open it up as a file object so iterparse can cope with our gz file
+-            if groupfile is not None and groupfile.endswith('.gz'):
+-                groupfile = gzip.open(groupfile)
++            # open it up as a file object so iterparse can cope with our compressed file
++            if groupfile:
++                groupfile = misc.decompress(groupfile)
+                 
+             try:
+                 self._comps.add(groupfile)
 @@ -878,6 +888,45 @@ class YumBase(depsolve.Depsolve):
  
          if self.tsInfo.pkgSack is not None: # rm Transactions don't have pkgSack
@@ -11375,7 +11434,7 @@ index ea73549..8a2fbf4 100644
 +                if prob.duplicate.pkgtup in ignore_pkgtups:
 +                    continue
 +                probs.append(prob)
-+
+ 
 +        if chkcmd.intersection(set(('all', 'obsoleted'))):
 +            for prob in self.rpmdb.check_obsoleted():
 +                if prob.pkg.pkgtup in ignore_pkgtups:
@@ -11389,7 +11448,7 @@ index ea73549..8a2fbf4 100644
 +                if prob.pkg.pkgtup in ignore_pkgtups:
 +                    continue
 +                probs.append(prob)
- 
++
 +        header(len(probs))
          for prob in sorted(probs):
              out(prob)
@@ -11558,7 +11617,25 @@ index ea73549..8a2fbf4 100644
                              self.tsInfo.conditionals[cond] = []
                          self.tsInfo.conditionals[cond].extend(pkgs)
          return txmbrs_used
-@@ -2643,7 +2744,9 @@ class YumBase(depsolve.Depsolve):
+@@ -2573,7 +2674,7 @@ class YumBase(depsolve.Depsolve):
+                         for pkg in self.tsInfo.conditionals.get(txmbr.name, []):
+                             self.tsInfo.remove(pkg.pkgtup)
+         
+-    def getPackageObject(self, pkgtup):
++    def getPackageObject(self, pkgtup, allow_missing=False):
+         """retrieves a packageObject from a pkgtuple - if we need
+            to pick and choose which one is best we better call out
+            to some method from here to pick the best pkgobj if there are
+@@ -2588,6 +2689,8 @@ class YumBase(depsolve.Depsolve):
+         pkgs = self.pkgSack.searchPkgTuple(pkgtup)
+ 
+         if len(pkgs) == 0:
++            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)
+             
+         if len(pkgs) > 1: # boy it'd be nice to do something smarter here FIXME
+@@ -2643,7 +2746,9 @@ class YumBase(depsolve.Depsolve):
      def returnPackagesByDep(self, depstring):
          """Pass in a generic [build]require string and this function will 
             pass back the packages it finds providing that dep."""
@@ -11569,7 +11646,7 @@ index ea73549..8a2fbf4 100644
          results = self.pkgSack.searchProvides(depstring)
          return results
          
-@@ -2673,6 +2776,9 @@ class YumBase(depsolve.Depsolve):
+@@ -2673,6 +2778,9 @@ class YumBase(depsolve.Depsolve):
          """Pass in a generic [build]require string and this function will 
             pass back the installed packages it finds providing that dep."""
          
@@ -11579,11 +11656,13 @@ index ea73549..8a2fbf4 100644
          # parse the string out
          #  either it is 'dep (some operator) e:v-r'
          #  or /file/dep
-@@ -2781,7 +2887,49 @@ class YumBase(depsolve.Depsolve):
+@@ -2781,9 +2889,53 @@ class YumBase(depsolve.Depsolve):
              we should install instead. Or None if there isn't one. """
          thispkgobsdict = self.up.checkForObsolete([po.pkgtup])
          if po.pkgtup in thispkgobsdict:
 -            obsoleting = thispkgobsdict[po.pkgtup][0]
+-            obsoleting_pkg = self.getPackageObject(obsoleting)
+-            return obsoleting_pkg
 +            obsoleting  = thispkgobsdict[po.pkgtup]
 +            oobsoleting = []
 +            # We want to keep the arch. of the obsoleted pkg. if possible.
@@ -11626,11 +11705,15 @@ index ea73549..8a2fbf4 100644
 +                    ret = _sort_arch_i(self.arch.bestarch, a1, a2)
 +                    return ret
 +                obsoleting.sort(_sort_arch)
-+            obsoleting = obsoleting[0]
-             obsoleting_pkg = self.getPackageObject(obsoleting)
-             return obsoleting_pkg
++            for pkgtup in obsoleting:
++                pkg = self.getPackageObject(pkgtup, allow_missing=True)
++                if pkg is not None:
++                    return pkg
++            return None
          return None
-@@ -2846,6 +2994,17 @@ class YumBase(depsolve.Depsolve):
+ 
+     def _test_loop(self, node, next_func):
+@@ -2846,6 +2998,17 @@ class YumBase(depsolve.Depsolve):
              pkgnames.update(thisgroup.packages)
          return self.pkgSack.searchNames(pkgnames)
  
@@ -11648,7 +11731,7 @@ index ea73549..8a2fbf4 100644
      def _find_obsoletees(self, po):
          """ Return the pkgs. that are obsoleted by the po we pass in. """
          if not isinstance(po, YumLocalPackage):
-@@ -2854,11 +3013,9 @@ class YumBase(depsolve.Depsolve):
+@@ -2854,11 +3017,9 @@ class YumBase(depsolve.Depsolve):
                      installed_pkg =  self.getInstalledPackageObject(inst_tup)
                      yield installed_pkg
          else:
@@ -11662,7 +11745,7 @@ index ea73549..8a2fbf4 100644
                          yield pkg
  
      def _add_prob_flags(self, *flags):
-@@ -2888,7 +3045,10 @@ class YumBase(depsolve.Depsolve):
+@@ -2888,7 +3049,10 @@ class YumBase(depsolve.Depsolve):
                  raise Errors.InstallError, _('Nothing specified to install')
  
              if 'pattern' in kwargs:
@@ -11674,7 +11757,7 @@ index ea73549..8a2fbf4 100644
                      return self._at_groupinstall(kwargs['pattern'])
  
                  was_pattern = True
-@@ -2957,7 +3117,7 @@ class YumBase(depsolve.Depsolve):
+@@ -2957,7 +3121,7 @@ class YumBase(depsolve.Depsolve):
  
                  pkgbyname = {}
                  for pkg in pkgs:
@@ -11683,7 +11766,7 @@ index ea73549..8a2fbf4 100644
                          pkgbyname[pkg.name] = [ pkg ]
                      else:
                          pkgbyname[pkg.name].append(pkg)
-@@ -3017,18 +3177,23 @@ class YumBase(depsolve.Depsolve):
+@@ -3017,18 +3181,23 @@ class YumBase(depsolve.Depsolve):
                  # pull in foo.i586 when foo.x86_64 already obsoletes the pkg and
                  # is already installed
                  already_obs = None
@@ -11713,7 +11796,19 @@ index ea73549..8a2fbf4 100644
                      tx_return.extend(self.install(po=obsoleting_pkg))
                  continue
              
-@@ -3173,7 +3338,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3160,7 +3329,10 @@ class YumBase(depsolve.Depsolve):
+                 obsoletes = []
+ 
+             for (obsoleting, installed) in obsoletes:
+-                obsoleting_pkg = self.getPackageObject(obsoleting)
++                obsoleting_pkg = self.getPackageObject(obsoleting,
++                                                       allow_missing=True)
++                if obsoleting_pkg is None:
++                    continue
+                 topkg = self._test_loop(obsoleting_pkg, self._pkg2obspkg)
+                 if topkg is not None:
+                     obsoleting_pkg = topkg
+@@ -3173,10 +3345,13 @@ class YumBase(depsolve.Depsolve):
                  
              for (new, old) in updates:
                  if self.tsInfo.isObsoleted(pkgtup=old):
@@ -11721,8 +11816,15 @@ index ea73549..8a2fbf4 100644
 +                    self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already obsoleted: %s.%s %s:%s-%s') %
                          old)
                  else:
-                     tx_return.extend(self.update(po=self.getPackageObject(new)))
-@@ -3195,7 +3360,10 @@ class YumBase(depsolve.Depsolve):
+-                    tx_return.extend(self.update(po=self.getPackageObject(new)))
++                    new = self.getPackageObject(new, allow_missing=True)
++                    if new is None:
++                        continue
++                    tx_return.extend(self.update(po=new))
+             
+             return tx_return
+ 
+@@ -3195,7 +3370,10 @@ class YumBase(depsolve.Depsolve):
                  
                  
          elif 'pattern' in kwargs:
@@ -11734,21 +11836,22 @@ index ea73549..8a2fbf4 100644
                  return self._at_groupinstall(kwargs['pattern'])
  
              (e, m, u) = self.rpmdb.matchPackageNames([kwargs['pattern']])
-@@ -3268,7 +3436,12 @@ class YumBase(depsolve.Depsolve):
+@@ -3268,7 +3446,13 @@ class YumBase(depsolve.Depsolve):
                  obs_tups = self.up.obsoleted_dict.get(installed_pkg.pkgtup, [])
                  # This is done so we don't have to returnObsoletes(newest=True)
                  # It's a minor UI problem for RHEL, but might as well dtrt.
 -                obs_pkgs = [self.getPackageObject(tup) for tup in obs_tups]
 +                obs_pkgs = []
 +                for pkgtup in obs_tups:
-+                    opkgs = self.pkgSack.searchPkgTuple(pkgtup)
-+                    if not opkgs: #  Could have been be excluded after
-+                        continue  # obsoleted_dict was setup.
-+                    obs_pkgs.append(opkgs[0])
++                    obsoleting_pkg = self.getPackageObject(pkgtup,
++                                                           allow_missing=True)
++                    if obsoleting_pkg is None:
++                        continue
++                    obs_pkgs.append(obsoleting_pkg)
                  for obsoleting_pkg in packagesNewestByName(obs_pkgs):
                      tx_return.extend(self.install(po=obsoleting_pkg))
              for available_pkg in availpkgs:
-@@ -3279,7 +3452,7 @@ class YumBase(depsolve.Depsolve):
+@@ -3279,16 +3463,18 @@ class YumBase(depsolve.Depsolve):
                          txmbr.setAsDep(requiringPo)
                      tx_return.append(txmbr)
                      if self.tsInfo.isObsoleted(obsoleted):
@@ -11757,16 +11860,20 @@ index ea73549..8a2fbf4 100644
                      else:
                          txmbr = self.tsInfo.addObsoleted(obsoleted_pkg, available_pkg)
                          tx_return.append(txmbr)
-@@ -3288,7 +3461,7 @@ class YumBase(depsolve.Depsolve):
+ 
+         for installed_pkg in instpkgs:
              for updating in self.up.updatesdict.get(installed_pkg.pkgtup, []):
-                 po = self.getPackageObject(updating)
+-                po = self.getPackageObject(updating)
++                po = self.getPackageObject(updating, allow_missing=True)
++                if po is None:
++                    continue
                  if self.tsInfo.isObsoleted(installed_pkg.pkgtup):
 -                    self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already obsoleted: %s.%s %s:%s-%s'), 
 +                    self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already obsoleted: %s.%s %s:%s-%s') %
                                              installed_pkg.pkgtup)                                               
                  # at this point we are going to mark the pkg to be installed, make sure
                  # it doesn't obsolete anything. If it does, mark that in the tsInfo, too
-@@ -3315,11 +3488,11 @@ class YumBase(depsolve.Depsolve):
+@@ -3315,11 +3501,11 @@ class YumBase(depsolve.Depsolve):
                  continue
              for updated in self.up.updating_dict.get(available_pkg.pkgtup, []):
                  if self.tsInfo.isObsoleted(updated):
@@ -11780,7 +11887,7 @@ index ea73549..8a2fbf4 100644
                                              updated)
                  
                  else:
-@@ -3341,11 +3514,11 @@ class YumBase(depsolve.Depsolve):
+@@ -3341,11 +3527,11 @@ class YumBase(depsolve.Depsolve):
  
              for ipkg in pot_updated:
                  if self.tsInfo.isObsoleted(ipkg.pkgtup):
@@ -11794,7 +11901,7 @@ index ea73549..8a2fbf4 100644
                                              ipkg.pkgtup)
                  elif ipkg.verLT(available_pkg):
                      txmbr = self._add_up_txmbr(requiringPo, available_pkg, ipkg)
-@@ -3376,7 +3549,10 @@ class YumBase(depsolve.Depsolve):
+@@ -3376,7 +3562,10 @@ class YumBase(depsolve.Depsolve):
              pkgs = [po]  
          else:
              if 'pattern' in kwargs:
@@ -11806,7 +11913,7 @@ index ea73549..8a2fbf4 100644
                      return self._at_groupremove(kwargs['pattern'])
  
                  (e,m,u) = self.rpmdb.matchPackageNames([kwargs['pattern']])
-@@ -3670,7 +3846,10 @@ class YumBase(depsolve.Depsolve):
+@@ -3670,7 +3859,10 @@ class YumBase(depsolve.Depsolve):
          if po:
              apkgs = [po]
          elif 'pattern' in kwargs:
@@ -11818,7 +11925,7 @@ index ea73549..8a2fbf4 100644
                  apkgs = self._at_groupdowngrade(kwargs['pattern'])
                  doing_group_pkgs = True # Don't warn. about some things
              else:
-@@ -4312,9 +4491,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4312,9 +4504,7 @@ class YumBase(depsolve.Depsolve):
          newrepo = yumRepo.YumRepository(repoid)
          newrepo.name = repoid
          newrepo.basecachedir = self.conf.cachedir
@@ -11829,7 +11936,7 @@ index ea73549..8a2fbf4 100644
          
          if baseurls:
              replaced = []
-@@ -4351,13 +4528,17 @@ class YumBase(depsolve.Depsolve):
+@@ -4351,13 +4541,17 @@ class YumBase(depsolve.Depsolve):
          self.repos.enableRepo(newrepo.id)
          return newrepo
  
@@ -11848,7 +11955,7 @@ index ea73549..8a2fbf4 100644
          try:
              cachedir = misc.getCacheDir(tmpdir, reuse)
          except (IOError, OSError), e:
-@@ -4369,7 +4550,6 @@ class YumBase(depsolve.Depsolve):
+@@ -4369,7 +4563,6 @@ class YumBase(depsolve.Depsolve):
  
          cachedir += varReplace(suffix, self.conf.yumvar)
          self.repos.setCacheDir(cachedir)
@@ -11856,7 +11963,7 @@ index ea73549..8a2fbf4 100644
          self.conf.cachedir = cachedir
          return True # We got a new cache dir
  
-@@ -4380,7 +4560,7 @@ class YumBase(depsolve.Depsolve):
+@@ -4380,7 +4573,7 @@ class YumBase(depsolve.Depsolve):
          
          if pkg1.name != pkg2.name:
              return False
@@ -11945,7 +12052,7 @@ index bbc1ac9..bf070fa 100755
                          break
          
 diff --git a/yum/config.py b/yum/config.py
-index ad8db7e..949751a 100644
+index ad8db7e..11347a6 100644
 --- a/yum/config.py
 +++ b/yum/config.py
 @@ -40,7 +40,7 @@ if not _use_iniparse:
@@ -12062,17 +12169,18 @@ index ad8db7e..949751a 100644
      group_package_types = ListOption(['mandatory', 'default'])
      
      timeout = FloatOption(30.0) # FIXME: Should use variation of SecondsOption
-@@ -712,6 +733,9 @@ class YumConf(StartupConf):
+@@ -712,6 +733,10 @@ class YumConf(StartupConf):
  
      rpmverbosity = Option('info')
  
 +    protected_packages = ListOption("yum, glob:/etc/yum/protected.d/*.conf",
 +                                    parse_default=True)
-+
++    exit_on_lock = BoolOption(False)
++    
      _reposlist = []
  
      def dump(self):
-@@ -728,7 +752,7 @@ class YumConf(StartupConf):
+@@ -728,7 +753,7 @@ class YumConf(StartupConf):
              if isinstance(getattr(self, attr), types.MethodType):
                  continue
              res = getattr(self, attr)
@@ -12081,7 +12189,7 @@ index ad8db7e..949751a 100644
                  res = ''
              if type(res) == types.ListType:
                  res = ',\n   '.join(res)
-@@ -855,13 +879,15 @@ def readMainConfig(startupconf):
+@@ -855,13 +880,15 @@ def readMainConfig(startupconf):
      yumvars['arch'] = startupconf.arch
      yumvars['releasever'] = startupconf.releasever
      yumvars['uuid'] = startupconf.uuid
@@ -12098,7 +12206,7 @@ index ad8db7e..949751a 100644
          path = getattr(yumconf, option)
          ir_path = yumconf.installroot + path
          ir_path = ir_path.replace('//', '/') # os.path.normpath won't fix this and
-@@ -869,6 +895,27 @@ def readMainConfig(startupconf):
+@@ -869,6 +896,27 @@ def readMainConfig(startupconf):
          ir_path = varReplace(ir_path, yumvars)
          setattr(yumconf, option, ir_path)
      
@@ -12126,7 +12234,7 @@ index ad8db7e..949751a 100644
      # Add in some extra attributes which aren't actually configuration values 
      yumconf.yumvar = yumvars
      yumconf.uid = 0
-@@ -953,6 +1000,9 @@ def _getsysver(installroot, distroverpkg):
+@@ -953,6 +1001,9 @@ def _getsysver(installroot, distroverpkg):
              else:
                  raise Errors.YumBaseError("Error: " + str(e))
          raise Errors.YumBaseError("Error: " + str(e))
@@ -12137,7 +12245,7 @@ index ad8db7e..949751a 100644
      # then the user needs a beating
      if idx.count() == 0:
 diff --git a/yum/depsolve.py b/yum/depsolve.py
-index 11c9f29..60b4e2f 100644
+index 11c9f29..8c260a7 100644
 --- a/yum/depsolve.py
 +++ b/yum/depsolve.py
 @@ -27,6 +27,7 @@ import rpmUtils.miscutils
@@ -12279,7 +12387,18 @@ index 11c9f29..60b4e2f 100644
                  for hit in hits:
                      # See if the update solves the problem...
                      found = False
-@@ -1186,8 +1219,7 @@ class Depsolve(object):
+@@ -1135,6 +1168,10 @@ class Depsolve(object):
+                     # something else in the transaction. :(
+                     # there are many ways I hate this - this is but one
+                     ipkgresults[pkg] = 5
++                elif newest.verEQ(pkg):
++                    #  We get here from bestPackagesFromList(), give a giant
++                    # bump to stuff that is already installed.
++                    ipkgresults[pkg] = 1000
+             else:
+                 # just b/c they're not installed pkgs doesn't mean they should
+                 # be ignored entirely. Just not preferred
+@@ -1186,8 +1223,7 @@ class Depsolve(object):
                      pkgresults[po] -= 1024
  
                  obsoleted = False
@@ -12289,7 +12408,7 @@ index 11c9f29..60b4e2f 100644
                      obsoleted = True
                      pkgresults[po] -= 1024
                                  
-@@ -1209,6 +1241,7 @@ class Depsolve(object):
+@@ -1209,6 +1245,7 @@ class Depsolve(object):
                      if res == po:
                          pkgresults[po] += 5
  
@@ -12297,7 +12416,7 @@ index 11c9f29..60b4e2f 100644
              if _common_sourcerpm(po, reqpo):
                  self.verbose_logger.log(logginglevels.DEBUG_4,
                      _('common sourcerpm %s and %s' % (po, reqpo)))
-@@ -1225,6 +1258,53 @@ class Depsolve(object):
+@@ -1225,6 +1262,53 @@ class Depsolve(object):
                  
                      pkgresults[po] += cpl*2
                  
@@ -12919,10 +13038,24 @@ index 2753dad..194d5d1 100644
              
              elif name == 'format': 
 diff --git a/yum/misc.py b/yum/misc.py
-index 66b0653..ebce8e1 100644
+index 66b0653..7793807 100644
 --- a/yum/misc.py
 +++ b/yum/misc.py
-@@ -98,17 +98,16 @@ def re_filename(s):
+@@ -19,6 +19,13 @@ import pwd
+ import fnmatch
+ import bz2
+ import gzip
++_available_compression = ['gz', 'bz2']
++try:
++    import lzma
++    _available_compression.append('xz')
++except ImportError:
++    lzma = None
++
+ from rpmUtils.miscutils import stringToVersion, flagToString
+ from stat import *
+ try:
+@@ -98,17 +105,16 @@ def re_filename(s):
  def re_primary_filename(filename):
      """ Tests if a filename string, can be matched against just primary.
          Note that this can produce false negatives (but not false
@@ -12944,11 +13077,101 @@ index 66b0653..ebce8e1 100644
      if 'bin/' in dirname:
          return True
      if dirname.startswith('/etc/'):
-@@ -1006,4 +1005,27 @@ def decompress(filename):
+@@ -676,10 +682,22 @@ def refineSearchPattern(arg):
+         restring = re.escape(arg)
+         
+     return restring
++
++
++def _decompress_chunked(source, dest, ztype):
++
++    if ztype not in _available_compression:
++        msg = "%s compression not available" % ztype
++        raise Errors.MiscError, msg
++    
++    if ztype == 'bz2':
++        s_fn = bz2.BZ2File(source, 'r')
++    elif ztype == 'xz':
++        s_fn = lzma.LZMAFile(source, 'r')
++    elif ztype == 'gz':
++        s_fn = gzip.GzipFile(source, 'r')
++    
      
+-def bunzipFile(source,dest):
+-    """ Extract the bzipped contents of source to dest. """
+-    s_fn = bz2.BZ2File(source, 'r')
+     destination = open(dest, 'w')
+ 
+     while True:
+@@ -698,7 +716,11 @@ def bunzipFile(source,dest):
+     
+     destination.close()
+     s_fn.close()
+-
++    
++def bunzipFile(source,dest):
++    """ Extract the bzipped contents of source to dest. """
++    _decompress_chunked(source, dest, ztype='bz2')
++    
+ def get_running_kernel_pkgtup(ts):
+     """This takes the output of uname and figures out the pkgtup of the running
+        kernel (name, arch, epoch, version, release)."""
+@@ -983,27 +1005,63 @@ def get_uuid(savepath):
+         
+         return myid
+         
+-def decompress(filename):
++def decompress(filename, dest=None, fn_only=False):
+     """take a filename and decompress it into the same relative location.
+        if the file is not compressed just return the file"""
+-    out = filename
++    
++    out = dest
++    if not dest:
++        out = filename
++        
+     if filename.endswith('.gz'):
+-        out = filename.replace('.gz', '')
+-        decom = gzip.open(filename)
+-        fo = open(out, 'w')
+-        fo.write(decom.read())
+-        fo.flush()
+-        fo.close()
+-        decom.close() 
+-    elif filename.endswith('.bz') or filename.endswith('.bz2'):
+-        if filename.endswith('.bz'):
+-            out = filename.replace('.bz','')
+-        else:
+-            out = filename.replace('.bz2', '')
+-        bunzipFile(filename, out)
++        ztype='gz'
++        if not dest: 
++            out = filename.replace('.gz', '')
+ 
+-    #add magical lzma/xz trick here
++    elif filename.endswith('.bz') or filename.endswith('.bz2'):
++        ztype='bz2'
++        if not dest:
++            if filename.endswith('.bz'):
++                out = filename.replace('.bz','')
++            else:
++                out = filename.replace('.bz2', '')
+     
++    elif filename.endswith('.xz'):
++        ztype='xz'
++        if not dest:
++            out = filename.replace('.xz', '')
++        
++    else:
++        out = filename # returning the same file since it is not compressed
++        ztype = None
++    
++    if ztype and not fn_only:
++        _decompress_chunked(filename, out, ztype)
++        
      return out
      
--    
+     
 +def read_in_items_from_dot_dir(thisglob, line_as_list=True):
 +    """takes a glob of a dir (like /etc/foo.d/*.foo)
 +       returns a list of all the lines in all the files matching
@@ -13692,7 +13915,7 @@ index cd477ba..7e9c417 100644
              thisrepo.close()
              del self.repos[repoid]
 diff --git a/yum/rpmsack.py b/yum/rpmsack.py
-index 8289cd2..a0c65c8 100644
+index 8289cd2..c0b53ba 100644
 --- a/yum/rpmsack.py
 +++ b/yum/rpmsack.py
 @@ -114,6 +114,23 @@ class RPMDBProblemDuplicate(RPMDBProblem):
@@ -13719,13 +13942,14 @@ index 8289cd2..a0c65c8 100644
  class RPMDBPackageSack(PackageSackBase):
      '''
      Represent rpmdb as a packagesack
-@@ -142,16 +159,22 @@ class RPMDBPackageSack(PackageSackBase):
+@@ -142,16 +159,23 @@ class RPMDBPackageSack(PackageSackBase):
          self.root = root
          self._idx2pkg = {}
          self._name2pkg = {}
 +        self._pkgnames_loaded = set()
          self._tup2pkg = {}
          self._completely_loaded = False
++        self._pkgname_fails = set()
 +        self._pkgmatch_fails = set()
 +        self._provmatch_fails = set()
          self._simple_pkgtup_list = []
@@ -13744,7 +13968,7 @@ index 8289cd2..a0c65c8 100644
          self._have_cached_rpmdbv_data = None
          self._cached_conflicts_data = None
          # Store the result of what happens, if a transaction completes.
-@@ -161,6 +184,7 @@ class RPMDBPackageSack(PackageSackBase):
+@@ -161,6 +185,7 @@ class RPMDBPackageSack(PackageSackBase):
          self.auto_close = False # this forces a self.ts.close() after
                                       # most operations so it doesn't leave
                                       # any lingering locks.
@@ -13752,7 +13976,7 @@ index 8289cd2..a0c65c8 100644
  
          self._cache = {
              'provides' : { },
-@@ -187,8 +211,11 @@ class RPMDBPackageSack(PackageSackBase):
+@@ -187,8 +212,12 @@ class RPMDBPackageSack(PackageSackBase):
      def dropCachedData(self):
          self._idx2pkg = {}
          self._name2pkg = {}
@@ -13760,11 +13984,12 @@ index 8289cd2..a0c65c8 100644
          self._tup2pkg = {}
          self._completely_loaded = False
 +        self._pkgmatch_fails = set()
++        self._pkgname_fails = set()
 +        self._provmatch_fails = set()
          self._simple_pkgtup_list = []
          self._get_pro_cache = {}
          self._get_req_cache = {}
-@@ -204,11 +231,16 @@ class RPMDBPackageSack(PackageSackBase):
+@@ -204,11 +233,16 @@ class RPMDBPackageSack(PackageSackBase):
              }
          self._have_cached_rpmdbv_data = None
          self._cached_conflicts_data = None
@@ -13783,7 +14008,7 @@ index 8289cd2..a0c65c8 100644
  
      def readOnlyTS(self):
          if not self.ts:
-@@ -241,14 +273,12 @@ class RPMDBPackageSack(PackageSackBase):
+@@ -241,14 +275,12 @@ class RPMDBPackageSack(PackageSackBase):
              if hdr['name'] == 'gpg-pubkey':
                  continue
              pkg = self._makePackageObject(hdr, mi.instance())
@@ -13800,7 +14025,7 @@ index 8289cd2..a0c65c8 100644
          
          if self.auto_close:
              self.ts.close()
-@@ -266,8 +296,7 @@ class RPMDBPackageSack(PackageSackBase):
+@@ -266,8 +298,7 @@ class RPMDBPackageSack(PackageSackBase):
              if hdr['name'] == 'gpg-pubkey':
                  continue
              pkg = self._makePackageObject(hdr, mi.instance())
@@ -13810,7 +14035,7 @@ index 8289cd2..a0c65c8 100644
          del mi
  
          result = result.values()
-@@ -299,8 +328,8 @@ class RPMDBPackageSack(PackageSackBase):
+@@ -299,8 +330,8 @@ class RPMDBPackageSack(PackageSackBase):
              if not glob:
                  if po.checkPrco(prcotype, (n, f, (e,v,r))):
                      result[po.pkgid] = po
@@ -13821,7 +14046,7 @@ index 8289cd2..a0c65c8 100644
          del mi
  
  
-@@ -319,7 +348,12 @@ class RPMDBPackageSack(PackageSackBase):
+@@ -319,7 +350,12 @@ class RPMDBPackageSack(PackageSackBase):
          return result
  
      def searchProvides(self, name):
@@ -13835,7 +14060,7 @@ index 8289cd2..a0c65c8 100644
  
      def searchRequires(self, name):
          return self.searchPrco(name, 'requires')
-@@ -369,6 +403,7 @@ class RPMDBPackageSack(PackageSackBase):
+@@ -369,6 +405,7 @@ class RPMDBPackageSack(PackageSackBase):
          for pat in patterns:
              if not pat:
                  continue
@@ -13843,7 +14068,7 @@ index 8289cd2..a0c65c8 100644
              qpat = pat[0]
              if qpat in ('?', '*'):
                  qpat = None
-@@ -381,6 +416,7 @@ class RPMDBPackageSack(PackageSackBase):
+@@ -381,6 +418,7 @@ class RPMDBPackageSack(PackageSackBase):
          return ret
      @staticmethod
      def _match_repattern(repatterns, hdr, ignore_case):
@@ -13851,10 +14076,29 @@ index 8289cd2..a0c65c8 100644
          if repatterns is None:
              return True
  
-@@ -417,6 +453,20 @@ class RPMDBPackageSack(PackageSackBase):
+@@ -417,6 +455,39 @@ class RPMDBPackageSack(PackageSackBase):
          """Returns a list of packages. Note that the packages are
             always filtered to those matching the patterns/case. repoid is
             ignored, and is just here for compatibility with non-rpmdb sacks. """
++
++        #  See if we can load the "patterns" via. dbMatch('name', ...) because
++        # that's basically instant and walking the entire rpmdb isn't.
++        if not self._completely_loaded and patterns and not ignore_case:
++            for pat in patterns:
++                if '?' in pat or '*' in pat:
++                    break
++            else:
++                ret = []
++                for pat in patterns:
++                    #  We aren't wasting anything here, because the next bit
++                    # will pick up any loads :)
++                    pkgs = self.searchNames([pat])
++                    if not pkgs:
++                        break
++                    ret.extend(pkgs)
++                else:
++                    return ret
++
 +        ret = []
 +        if patterns and not ignore_case:
 +            tpats = []
@@ -13872,7 +14116,7 @@ index 8289cd2..a0c65c8 100644
          if not self._completely_loaded:
              rpats = self._compile_patterns(patterns, ignore_case)
              for hdr, idx in self._all_packages():
-@@ -430,7 +480,15 @@ class RPMDBPackageSack(PackageSackBase):
+@@ -430,7 +501,15 @@ class RPMDBPackageSack(PackageSackBase):
              pkgobjlist = [pkg for pkg in pkgobjlist if pkg.name != 'gpg-pubkey']
          if patterns:
              pkgobjlist = parsePackages(pkgobjlist, patterns, not ignore_case)
@@ -13889,7 +14133,7 @@ index 8289cd2..a0c65c8 100644
          return pkgobjlist
  
      def _uncached_returnConflictPackages(self):
-@@ -460,6 +518,27 @@ class RPMDBPackageSack(PackageSackBase):
+@@ -460,6 +539,27 @@ class RPMDBPackageSack(PackageSackBase):
          rpmdbv = self.simpleVersion(main_only=True)[0]
          self._write_conflicts_new(pkgs, rpmdbv)
  
@@ -13917,7 +14161,7 @@ index 8289cd2..a0c65c8 100644
      def _read_conflicts(self):
          if not self.__cache_rpmdb__:
              return None
-@@ -492,6 +571,7 @@ class RPMDBPackageSack(PackageSackBase):
+@@ -492,6 +592,7 @@ class RPMDBPackageSack(PackageSackBase):
              if fo.readline() != '': # Should be EOF
                  return None
          except ValueError:
@@ -13925,7 +14169,7 @@ index 8289cd2..a0c65c8 100644
              return None
  
          self._cached_conflicts_data = ret
-@@ -605,6 +685,7 @@ class RPMDBPackageSack(PackageSackBase):
+@@ -605,6 +706,7 @@ class RPMDBPackageSack(PackageSackBase):
              if fo.readline() != '': # Should be EOF
                  return None, None
          except ValueError:
@@ -13933,7 +14177,7 @@ index 8289cd2..a0c65c8 100644
              return None, None
  
          return iFR, iFP
-@@ -742,11 +823,16 @@ class RPMDBPackageSack(PackageSackBase):
+@@ -742,11 +844,16 @@ class RPMDBPackageSack(PackageSackBase):
              if fo.readline() != '': # Should be EOF
                  return
          except ValueError:
@@ -13951,7 +14195,7 @@ index 8289cd2..a0c65c8 100644
              (T, D) = checksum_data[pkgtup]
              if ('checksum_type' in pkg.yumdb_info._read_cached_data or
                  'checksum_data' in pkg.yumdb_info._read_cached_data):
-@@ -806,6 +892,19 @@ class RPMDBPackageSack(PackageSackBase):
+@@ -806,6 +913,19 @@ class RPMDBPackageSack(PackageSackBase):
          if not self.__cache_rpmdb__:
              return
  
@@ -13971,17 +14215,17 @@ index 8289cd2..a0c65c8 100644
          rpmdbvfname = self._cachedir + "/version"
          if not os.access(self._cachedir, os.W_OK):
              if os.path.exists(self._cachedir):
-@@ -953,6 +1052,9 @@ class RPMDBPackageSack(PackageSackBase):
+@@ -953,6 +1073,9 @@ class RPMDBPackageSack(PackageSackBase):
  
      def _search(self, name=None, epoch=None, ver=None, rel=None, arch=None):
          '''List of matching packages, to zero or more of NEVRA.'''
-+        if name is not None and name in self._pkgmatch_fails:
++        if name is not None and name in self._pkgname_fails:
 +            return []
 +
          pkgtup = (name, arch, epoch, ver, rel)
          if pkgtup in self._tup2pkg:
              return [self._tup2pkg[pkgtup]]
-@@ -960,9 +1062,11 @@ class RPMDBPackageSack(PackageSackBase):
+@@ -960,9 +1083,11 @@ class RPMDBPackageSack(PackageSackBase):
          loc = locals()
          ret = []
  
@@ -13990,11 +14234,11 @@ index 8289cd2..a0c65c8 100644
              if name is not None:
                  pkgs = self._name2pkg.get(name, [])
 +                if not pkgs:
-+                    self._pkgmatch_fails.add(name)
++                    self._pkgname_fails.add(name)
              else:
                  pkgs = self.returnPkgs()
              for po in pkgs:
-@@ -982,10 +1086,16 @@ class RPMDBPackageSack(PackageSackBase):
+@@ -982,10 +1107,16 @@ class RPMDBPackageSack(PackageSackBase):
              mi = ts.dbMatch()
              self._completely_loaded = True
  
@@ -14011,17 +14255,17 @@ index 8289cd2..a0c65c8 100644
              for tag in ('arch', 'rel', 'ver', 'epoch'):
                  if loc[tag] is not None and loc[tag] != getattr(po, tag):
                      break
-@@ -995,6 +1105,9 @@ class RPMDBPackageSack(PackageSackBase):
+@@ -995,6 +1126,9 @@ class RPMDBPackageSack(PackageSackBase):
          if self.auto_close:
              self.ts.close()
  
 +        if not done and name is not None:
-+            self._pkgmatch_fails.add(name)
++            self._pkgname_fails.add(name)
 +
          return ret
  
      def _makePackageObject(self, hdr, index):
-@@ -1004,6 +1117,10 @@ class RPMDBPackageSack(PackageSackBase):
+@@ -1004,6 +1138,10 @@ class RPMDBPackageSack(PackageSackBase):
          self._idx2pkg[index] = po
          self._name2pkg.setdefault(po.name, []).append(po)
          self._tup2pkg[po.pkgtup] = po
@@ -14032,7 +14276,7 @@ index 8289cd2..a0c65c8 100644
          return po
          
      def _hdr2pkgTuple(self, hdr):
-@@ -1249,6 +1366,30 @@ class RPMDBPackageSack(PackageSackBase):
+@@ -1249,6 +1387,30 @@ class RPMDBPackageSack(PackageSackBase):
              problems.append(RPMDBProblemDuplicate(pkg, duplicate=last))
          return problems
  
@@ -14063,7 +14307,7 @@ index 8289cd2..a0c65c8 100644
  
  def _sanitize(path):
      return path.replace('/', '').replace('~', '')
-@@ -1380,7 +1521,7 @@ class RPMDBAdditionalDataPackage(object):
+@@ -1380,7 +1542,7 @@ class RPMDBAdditionalDataPackage(object):
              try:
                  os.unlink(fn)
              except (IOError, OSError):
@@ -14072,7 +14316,7 @@ index 8289cd2..a0c65c8 100644
      
      def __getattr__(self, attr):
          return self._read(attr)
-@@ -1397,6 +1538,12 @@ class RPMDBAdditionalDataPackage(object):
+@@ -1397,6 +1559,12 @@ class RPMDBAdditionalDataPackage(object):
          else:
              object.__delattr__(self, attr)
  
@@ -14443,10 +14687,24 @@ index e7b60de..d574b80 100644
          """adds a package as an install but in mode 'u' to the ts
             takes a packages object and returns a TransactionMember Object"""
 diff --git a/yum/update_md.py b/yum/update_md.py
-index 54d4cd7..90c5582 100644
+index 54d4cd7..cf8136a 100644
 --- a/yum/update_md.py
 +++ b/yum/update_md.py
-@@ -73,10 +73,10 @@ class UpdateNotice(object):
+@@ -22,12 +22,11 @@ Update metadata (updateinfo.xml) parsing.
+ """
+ 
+ import sys
+-import gzip
+ 
+ from yum.i18n import utf8_text_wrap, to_utf8
+ from yum.yumRepo import YumRepository
+ from yum.packages import FakeRepository
+-from yum.misc import to_xml
++from yum.misc import to_xml, decompress
+ import Errors
+ 
+ import rpmUtils.miscutils
+@@ -73,10 +72,10 @@ class UpdateNotice(object):
  
      def __getitem__(self, item):
          """ Allows scriptable metadata access (ie: un['update_id']). """
@@ -14459,7 +14717,7 @@ index 54d4cd7..90c5582 100644
  
      def __str__(self):
          head = """
-@@ -328,20 +328,22 @@ class UpdateMetadata(object):
+@@ -328,20 +327,22 @@ class UpdateMetadata(object):
          """
          if type(nvr) in (type([]), type(())):
              nvr = '-'.join(nvr)
@@ -14484,11 +14742,39 @@ index 54d4cd7..90c5582 100644
          """
          oldpkgtup = pkgtup
          name = oldpkgtup[0]
+@@ -380,14 +381,17 @@ class UpdateMetadata(object):
+         if not obj:
+             raise UpdateNoticeException
+         if type(obj) in (type(''), type(u'')):
+-            infile = obj.endswith('.gz') and gzip.open(obj) or open(obj, 'rt')
++            unfile = decompress(obj)
++            infile = open(unfile, 'rt')
++
+         elif isinstance(obj, YumRepository):
+             if obj.id not in self._repos:
+                 self._repos.append(obj.id)
+                 md = obj.retrieveMD(mdtype)
+                 if not md:
+                     raise UpdateNoticeException()
+-                infile = gzip.open(md)
++                unfile = decompress(md)
++                infile = open(unfile, 'rt')
+         elif isinstance(obj, FakeRepository):
+             raise Errors.RepoMDError, "No updateinfo for local pkg"
+         else:   # obj is a file object
 diff --git a/yum/yumRepo.py b/yum/yumRepo.py
-index 8d7617e..3a695d8 100644
+index 8d7617e..ac6c7c0 100644
 --- a/yum/yumRepo.py
 +++ b/yum/yumRepo.py
-@@ -78,7 +78,7 @@ class YumPackageSack(packageSack.PackageSack):
+@@ -19,7 +19,6 @@ import time
+ import types
+ import urlparse
+ urlparse.uses_fragment.append("media")
+-import gzip
+ 
+ import Errors
+ from urlgrabber.grabber import URLGrabber
+@@ -78,7 +77,7 @@ class YumPackageSack(packageSack.PackageSack):
          self.added = {}
  
      def addDict(self, repo, datatype, dataobj, callback=None):
@@ -14497,7 +14783,7 @@ index 8d7617e..3a695d8 100644
              if datatype in self.added[repo]:
                  return
  
-@@ -94,14 +94,14 @@ class YumPackageSack(packageSack.PackageSack):
+@@ -94,14 +93,14 @@ class YumPackageSack(packageSack.PackageSack):
                  self._addToDictAsList(self.pkgsByID, pkgid, po)
                  self.addPackage(po)
  
@@ -14514,7 +14800,7 @@ index 8d7617e..3a695d8 100644
                  if 'metadata' not in self.added[repo]:
                      raise Errors.RepoError, '%s md for %s imported before primary' \
                             % (datatype, repo.id)
-@@ -110,7 +110,7 @@ class YumPackageSack(packageSack.PackageSack):
+@@ -110,7 +109,7 @@ class YumPackageSack(packageSack.PackageSack):
                  current += 1
                  if callback: callback.progressbar(current, total, repo)
                  pkgdict = dataobj[pkgid]
@@ -14523,7 +14809,7 @@ index 8d7617e..3a695d8 100644
                      for po in self.pkgsByID[pkgid]:
                          po.importFromDict(pkgdict)
  
-@@ -134,7 +134,7 @@ class YumPackageSack(packageSack.PackageSack):
+@@ -134,7 +133,7 @@ class YumPackageSack(packageSack.PackageSack):
                  callback=callback,
                  )
          for item in data:
@@ -14532,7 +14818,38 @@ index 8d7617e..3a695d8 100644
                  if item in self.added[repo]:
                      continue
  
-@@ -385,7 +385,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -163,7 +162,7 @@ class YumPackageSack(packageSack.PackageSack):
+ 
+             if self._check_db_version(repo, mydbtype):
+                 # see if we have the uncompressed db and check it's checksum vs the openchecksum
+-                # if not download the bz2 file
++                # if not download the compressed file
+                 # decompress it
+                 # unlink it
+ 
+@@ -171,9 +170,8 @@ class YumPackageSack(packageSack.PackageSack):
+                 if not db_un_fn:
+                     db_fn = repo._retrieveMD(mydbtype)
+                     if db_fn:
+-                        db_un_fn = db_fn.replace('.bz2', '')
+                         if not repo.cache:
+-                            misc.bunzipFile(db_fn, db_un_fn)
++                            db_un_fn = misc.decompress(db_fn)
+                             misc.unlink_f(db_fn)
+                             db_un_fn = self._check_uncompressed_db(repo, mydbtype)
+ 
+@@ -199,8 +197,8 @@ class YumPackageSack(packageSack.PackageSack):
+         mydbdata = repo.repoXML.getData(mdtype)
+         (r_base, remote) = mydbdata.location
+         fname = os.path.basename(remote)
+-        bz2_fn = repo.cachedir + '/' + fname
+-        db_un_fn = bz2_fn.replace('.bz2', '')
++        compressed_fn = repo.cachedir + '/' + fname
++        db_un_fn = misc.decompress(compressed_fn, fn_only=True)
+ 
+         result = None
+ 
+@@ -385,7 +383,7 @@ class YumRepository(Repository, config.RepoConf):
              if isinstance(getattr(self, attr), types.MethodType):
                  continue
              res = getattr(self, attr)
@@ -14541,7 +14858,7 @@ index 8d7617e..3a695d8 100644
                  res = ''
              if type(res) == types.ListType:
                  res = ',\n   '.join(res)
-@@ -1082,9 +1082,7 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1082,16 +1080,14 @@ class YumRepository(Repository, config.RepoConf):
              self._check_db_version(mdtype + '_db', repoXML=repoXML)):
              mdtype += '_db'
  
@@ -14552,7 +14869,45 @@ index 8d7617e..3a695d8 100644
  
      def _get_mdtype_fname(self, data, compressed=False):
          (r_base, remote) = data.location
-@@ -1524,9 +1522,9 @@ class YumRepository(Repository, config.RepoConf):
+         local = self.cachedir + '/' + os.path.basename(remote)
+ 
+         if compressed: # DB file, we need the uncompressed version
+-            local = local.replace('.bz2', '')
++            local = misc.decompress(local, fn_only=True)
+         return local
+ 
+     def _groupCheckDataMDNewer(self):
+@@ -1246,7 +1242,7 @@ class YumRepository(Repository, config.RepoConf):
+             compressed = False
+             local = self._get_mdtype_fname(data, False)
+             if not os.path.exists(local):
+-                local = local.replace('.bz2', '')
++                local = misc.decompress(local, fn_only=True)
+                 compressed = True
+         #  If we can, make a copy of the system-wide-cache version of this file,
+         # note that we often don't get here. So we also do this in
+@@ -1353,10 +1349,9 @@ class YumRepository(Repository, config.RepoConf):
+ 
+         for (ndata, nmdtype) in downloading_with_size + downloading_no_size:
+             local = self._get_mdtype_fname(ndata, False)
+-            if nmdtype.endswith("_db"): # Uncompress any .sqlite.bz2 files
++            if nmdtype.endswith("_db"): # Uncompress any compressed files
+                 dl_local = local
+-                local = local.replace('.bz2', '')
+-                misc.bunzipFile(dl_local, local)
++                local = misc.decompress(dl_local)
+                 misc.unlink_f(dl_local)
+             self._oldRepoMDData['new_MD_files'].append(local)
+ 
+@@ -1518,15 +1513,17 @@ class YumRepository(Repository, config.RepoConf):
+         """ Internal function, use .retrieveMD() from outside yum. """
+         #  Note that this can raise Errors.RepoMDError if mdtype doesn't exist
+         # for this repo.
++        # FIXME - maybe retrieveMD should call decompress() after we've checked
++        # the checksum by default? since we're never acting on compressed MD
+         thisdata = self.repoXML.getData(mdtype)
+ 
+         (r_base, remote) = thisdata.location
          fname = os.path.basename(remote)
          local = self.cachedir + '/' + fname
  
@@ -14565,7 +14920,7 @@ index 8d7617e..3a695d8 100644
  
          if self.cache == 1:
              if os.path.exists(local):
-@@ -1552,9 +1550,17 @@ class YumRepository(Repository, config.RepoConf):
+@@ -1552,9 +1549,17 @@ class YumRepository(Repository, config.RepoConf):
          try:
              checkfunc = (self.checkMD, (mdtype,), {})
              text = "%s/%s" % (self.id, mdtype)
@@ -14583,6 +14938,19 @@ index 8d7617e..3a695d8 100644
                                    checkfunc=checkfunc, 
                                    text=text,
                                    cache=self.http_caching == 'all',
+@@ -1762,9 +1767,9 @@ class YumRepository(Repository, config.RepoConf):
+ 
+         grpfile = self.getGroups()
+ 
+-        # open it up as a file object so iterparse can cope with our gz file
+-        if grpfile is not None and grpfile.endswith('.gz'):
+-            grpfile = gzip.open(grpfile)
++        # open it up as a file object so iterparse can cope with our compressed file
++        if grpfile is not None:
++            grpfile = misc.decompress(grpfile)
+         try:
+             c = comps.Comps()
+             c.add(grpfile)
 diff --git a/yumcommands.py b/yumcommands.py
 index 35bd97c..dcf72db 100644
 --- a/yumcommands.py
@@ -14662,3 +15030,24 @@ index 35bd97c..dcf72db 100644
              rc = 1
          return rc, ['%s %s' % (basecmd, chkcmd)]
  
+diff --git a/yummain.py b/yummain.py
+index 305e0c7..95c7462 100755
+--- a/yummain.py
++++ b/yummain.py
+@@ -99,9 +99,13 @@ def main(args):
+             if "%s" %(e.msg,) != lockerr:
+                 lockerr = "%s" %(e.msg,)
+                 logger.critical(lockerr)
+-            logger.critical(_("Another app is currently holding the yum lock; waiting for it to exit..."))
+-            show_lock_owner(e.pid, logger)
+-            time.sleep(2)
++            if not base.conf.exit_on_lock:
++                logger.critical(_("Another app is currently holding the yum lock; waiting for it to exit..."))
++                show_lock_owner(e.pid, logger)
++                time.sleep(2)
++            else:
++                logger.critical(_("Another app is currently holding the yum lock; exiting as configured by exit_on_lock"))
++                return 1
+         else:
+             break
+ 


Index: yum.spec
===================================================================
RCS file: /cvs/pkgs/rpms/yum/devel/yum.spec,v
retrieving revision 1.318
retrieving revision 1.319
diff -u -p -r1.318 -r1.319
--- yum.spec	26 May 2010 21:03:26 -0000	1.318
+++ yum.spec	2 Jun 2010 17:19:37 -0000	1.319
@@ -3,7 +3,7 @@
 Summary: RPM installer/updater
 Name: yum
 Version: 3.2.27
-Release: 13%{?dist}
+Release: 14%{?dist}
 License: GPLv2+
 Group: System Environment/Base
 Source0: http://yum.baseurl.org/download/3.2/%{name}-%{version}.tar.gz
@@ -132,6 +132,17 @@ rm -rf $RPM_BUILD_ROOT
 %dir /usr/lib/yum-plugins
 
 %changelog
+* Wed Jun  2 2010 Seth Vidal <skvidal at fedoraproject.org> - 3.2.27-14
+- merge in latest yum head:
+- change decompressors to support lzma, if python module is available
+- finnish translation fixes
+- pyint vs pylong fix for formatRequire() so we stop spitting back the wrong requires strings to mock on newish rpm
+- add exit_on_lock option
+- Deal with RHEL-5 loginuid damage
+- Fix pkgs. that are excluded after being put in yb.up ... BZ#597853
+- Opt. for rpmdb.returnPackages(patterns=...). Drops about 30%% from remove time.
+- Fix "remove name-version", really minor API bug before last patch
+
 * Wed May 26 2010 Seth Vidal <skvidal at fedoraproject.org> - 3.2.27-13
 - minor cleanups for yum-utils with --setopt
 - translation updates



More information about the scm-commits mailing list