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