diff --git a/yum-HEAD.patch b/yum-HEAD.patch index de0e1fc..441a370 100644 --- a/yum-HEAD.patch +++ b/yum-HEAD.patch @@ -150733,7 +150733,7 @@ index abd203f..65c62a9 100644 - 3.4.1 - umask bug fix. diff --git a/yum/__init__.py b/yum/__init__.py -index 99039e0..4650639 100644 +index 99039e0..090882c 100644 --- a/yum/__init__.py +++ b/yum/__init__.py @@ -46,8 +46,13 @@ import operator @@ -151185,7 +151185,15 @@ index 99039e0..4650639 100644 warnings.warn(_('doGroupSetup() will go away in a future version of Yum.\n'), Errors.YumFutureDeprecationWarning, stacklevel=2) -@@ -829,7 +938,7 @@ class YumBase(depsolve.Depsolve): +@@ -822,14 +931,13 @@ class YumBase(depsolve.Depsolve): + groupfile = repo.getGroups() + # open it up as a file object so iterparse can cope with our compressed file + if groupfile: +- groupfile = misc.repo_gen_decompress(groupfile, 'groups.xml', +- cached=repo.cache) ++ groupfile = misc.repo_gen_decompress(groupfile, 'groups.xml') + # Do we want a RepoError here? + try: self._comps.add(groupfile) except (Errors.GroupsError,Errors.CompsException), e: @@ -151194,7 +151202,7 @@ index 99039e0..4650639 100644 self.logger.critical(msg) else: repo.groups_added = True -@@ -837,7 +946,10 @@ class YumBase(depsolve.Depsolve): +@@ -837,7 +945,10 @@ class YumBase(depsolve.Depsolve): if self._comps.compscount == 0: raise Errors.GroupsError, _('No Groups Available in any repository') @@ -151206,7 +151214,14 @@ index 99039e0..4650639 100644 self.verbose_logger.debug('group time: %0.3f' % (time.time() - group_st)) return self._comps -@@ -868,7 +980,7 @@ class YumBase(depsolve.Depsolve): +@@ -862,13 +973,11 @@ class YumBase(depsolve.Depsolve): + # fetch the sqlite tagdb + try: + tag_md = repo.retrieveMD('pkgtags') +- tag_sqlite = misc.repo_gen_decompress(tag_md, +- 'pkgtags.sqlite', +- cached=repo.cache) ++ tag_sqlite = misc.repo_gen_decompress(tag_md, 'pkgtags.sqlite') # feed it into _tags.add() self._tags.add(repo.id, tag_sqlite) except (Errors.RepoError, Errors.PkgTagsError), e: @@ -151215,7 +151230,7 @@ index 99039e0..4650639 100644 self.logger.critical(msg) -@@ -881,9 +993,18 @@ class YumBase(depsolve.Depsolve): +@@ -881,9 +990,18 @@ class YumBase(depsolve.Depsolve): if self._history is None: pdb_path = self.conf.persistdir + "/history" self._history = yum.history.YumHistory(root=self.conf.installroot, @@ -151235,7 +151250,7 @@ index 99039e0..4650639 100644 # properties so they auto-create themselves with defaults repos = property(fget=lambda self: self._getRepos(), fset=lambda self, value: setattr(self, "_repos", value), -@@ -921,6 +1042,11 @@ class YumBase(depsolve.Depsolve): +@@ -921,6 +1039,11 @@ class YumBase(depsolve.Depsolve): fdel=lambda self: setattr(self, "_history", None), doc="Yum History Object") @@ -151247,7 +151262,7 @@ index 99039e0..4650639 100644 pkgtags = property(fget=lambda self: self._getTags(), fset=lambda self, value: setattr(self, "_tags",value), fdel=lambda self: setattr(self, "_tags", None), -@@ -928,9 +1054,10 @@ class YumBase(depsolve.Depsolve): +@@ -928,9 +1051,10 @@ class YumBase(depsolve.Depsolve): def doSackFilelistPopulate(self): @@ -151261,7 +151276,7 @@ index 99039e0..4650639 100644 necessary = False # I can't think of a nice way of doing this, we have to have the sack here -@@ -951,8 +1078,12 @@ class YumBase(depsolve.Depsolve): +@@ -951,8 +1075,12 @@ class YumBase(depsolve.Depsolve): self.repos.populateSack(mdtype='filelists') def yumUtilsMsg(self, func, prog): @@ -151276,7 +151291,7 @@ index 99039e0..4650639 100644 if self.rpmdb.contains(name="yum-utils"): return -@@ -964,8 +1095,17 @@ class YumBase(depsolve.Depsolve): +@@ -964,8 +1092,17 @@ class YumBase(depsolve.Depsolve): (hibeg, prog, hiend)) def buildTransaction(self, unfinished_transactions_check=True): @@ -151296,7 +151311,7 @@ index 99039e0..4650639 100644 if (unfinished_transactions_check and misc.find_unfinished_transactions(yumlibpath=self.conf.persistdir)): msg = _('There are unfinished transactions remaining. You might ' \ -@@ -1004,7 +1144,7 @@ class YumBase(depsolve.Depsolve): +@@ -1004,7 +1141,7 @@ class YumBase(depsolve.Depsolve): # If transaction was changed by postresolve plugins then we should run skipbroken again (rescode, restring) = self._doSkipBroken(rescode, restring, clear_skipped=False ) @@ -151305,7 +151320,7 @@ index 99039e0..4650639 100644 self.tsInfo.pkgSack.dropCachedData() # FIXME: This is horrible, see below and yummain. Maybe create a real -@@ -1242,13 +1382,15 @@ class YumBase(depsolve.Depsolve): +@@ -1242,13 +1379,15 @@ class YumBase(depsolve.Depsolve): if None in pkgtup: return None return pkgtup @@ -151325,7 +151340,7 @@ index 99039e0..4650639 100644 if pkgtup is None: return self._not_found_i[pkgtup] = YumNotFoundPackage(pkgtup) -@@ -1454,8 +1596,14 @@ class YumBase(depsolve.Depsolve): +@@ -1454,8 +1593,14 @@ class YumBase(depsolve.Depsolve): return probs def runTransaction(self, cb): @@ -151341,7 +151356,7 @@ index 99039e0..4650639 100644 self.plugins.run('pretrans') # We may want to put this other places, eventually, but for now it's -@@ -1516,10 +1664,23 @@ class YumBase(depsolve.Depsolve): +@@ -1516,10 +1661,23 @@ class YumBase(depsolve.Depsolve): pass self._ts_save_file = None @@ -151365,7 +151380,7 @@ index 99039e0..4650639 100644 # make resultobject - just a plain yumgenericholder object resultobject = misc.GenericHolder() -@@ -1567,13 +1728,24 @@ class YumBase(depsolve.Depsolve): +@@ -1567,13 +1725,24 @@ class YumBase(depsolve.Depsolve): self.plugins.run('posttrans') # sync up what just happened versus what is in the rpmdb if not self.ts.isTsFlagSet(rpm.RPMTRANS_FLAG_TEST): @@ -151395,7 +151410,7 @@ index 99039e0..4650639 100644 # check to see that the rpmdb and the tsInfo roughly matches # push package object metadata outside of rpmdb into yumdb # delete old yumdb metadata entries -@@ -1584,9 +1756,16 @@ class YumBase(depsolve.Depsolve): +@@ -1584,9 +1753,16 @@ class YumBase(depsolve.Depsolve): # that there is not also an install of this pkg in the tsInfo (reinstall) # for any kind of install add from_repo to the yumdb, and the cmdline # and the install reason @@ -151412,7 +151427,7 @@ index 99039e0..4650639 100644 for txmbr in self.tsInfo: if txmbr.output_state in TS_INSTALL_STATES: if not self.rpmdb.contains(po=txmbr.po): -@@ -1596,7 +1775,9 @@ class YumBase(depsolve.Depsolve): +@@ -1596,7 +1772,9 @@ class YumBase(depsolve.Depsolve): ' but is not!' % txmbr.po)) # Note: Get Panu to do te.Failed() so we don't have to txmbr.output_state = TS_FAILED @@ -151422,7 +151437,7 @@ index 99039e0..4650639 100644 po = self.getInstalledPackageObject(txmbr.pkgtup) rpo = txmbr.po po.yumdb_info.from_repo = rpo.repoid -@@ -1630,6 +1811,10 @@ class YumBase(depsolve.Depsolve): +@@ -1630,6 +1808,10 @@ class YumBase(depsolve.Depsolve): if md: po.yumdb_info.from_repo_timestamp = str(md.timestamp) @@ -151433,7 +151448,7 @@ index 99039e0..4650639 100644 loginuid = misc.getloginuid() if txmbr.updates or txmbr.downgrades or txmbr.reinstall: if txmbr.updates: -@@ -1640,11 +1825,16 @@ class YumBase(depsolve.Depsolve): +@@ -1640,11 +1822,16 @@ class YumBase(depsolve.Depsolve): opo = po if 'installed_by' in opo.yumdb_info: po.yumdb_info.installed_by = opo.yumdb_info.installed_by @@ -151450,7 +151465,7 @@ index 99039e0..4650639 100644 # Remove old ones after installing new ones, so we can copy values. for txmbr in self.tsInfo: if txmbr.output_state in TS_INSTALL_STATES: -@@ -1662,10 +1852,13 @@ class YumBase(depsolve.Depsolve): +@@ -1662,10 +1849,13 @@ class YumBase(depsolve.Depsolve): ' but is not!' % txmbr.po)) # Note: Get Panu to do te.Failed() so we don't have to txmbr.output_state = TS_FAILED @@ -151464,7 +151479,7 @@ index 99039e0..4650639 100644 self.verbose_logger.log(logginglevels.DEBUG_2, 'What is this? %s' % txmbr.po) self.plugins.run('postverifytrans') -@@ -1680,10 +1873,11 @@ class YumBase(depsolve.Depsolve): +@@ -1680,10 +1870,11 @@ class YumBase(depsolve.Depsolve): self.verbose_logger.debug('VerifyTransaction time: %0.3f' % (time.time() - vt_st)) def costExcludePackages(self): @@ -151480,7 +151495,7 @@ index 99039e0..4650639 100644 # if all the repo.costs are equal then don't bother running things costs = {} for r in self.repos.listEnabled(): -@@ -1705,10 +1899,12 @@ class YumBase(depsolve.Depsolve): +@@ -1705,10 +1896,12 @@ class YumBase(depsolve.Depsolve): done = True def excludePackages(self, repo=None): @@ -151496,7 +151511,7 @@ index 99039e0..4650639 100644 if "all" in self.conf.disable_excludes: return -@@ -1735,9 +1931,11 @@ class YumBase(depsolve.Depsolve): +@@ -1735,9 +1928,11 @@ class YumBase(depsolve.Depsolve): self.pkgSack.addPackageExcluder(repoid, exid,'exclude.match', match) def includePackages(self, repo): @@ -151511,7 +151526,7 @@ index 99039e0..4650639 100644 includelist = repo.getIncludePkgList() if len(includelist) == 0: -@@ -1757,8 +1955,11 @@ class YumBase(depsolve.Depsolve): +@@ -1757,8 +1952,11 @@ class YumBase(depsolve.Depsolve): self.pkgSack.addPackageExcluder(repo.id, exid, 'exclude.marked') def doLock(self, lockfile = YUM_PID_FILE): @@ -151525,7 +151540,7 @@ index 99039e0..4650639 100644 if self.conf.uid != 0: # If we are a user, assume we are using the root cache ... so don't # bother locking. -@@ -1774,38 +1975,26 @@ class YumBase(depsolve.Depsolve): +@@ -1774,38 +1972,26 @@ class YumBase(depsolve.Depsolve): mypid=str(os.getpid()) while not self._lock(lockfile, mypid, 0644): @@ -151579,7 +151594,7 @@ index 99039e0..4650639 100644 # if we're not root then we don't lock - just return nicely # Note that we can get here from __del__, so if we haven't created # YumBase.conf we don't want to do so here as creating stuff inside -@@ -1830,31 +2019,69 @@ class YumBase(depsolve.Depsolve): +@@ -1830,31 +2016,69 @@ class YumBase(depsolve.Depsolve): self._unlock(lockfile) self._lockfile = None @@ -151659,7 +151674,7 @@ index 99039e0..4650639 100644 failed = False if type(fo) is types.InstanceType: -@@ -1894,9 +2121,16 @@ class YumBase(depsolve.Depsolve): +@@ -1894,9 +2118,16 @@ class YumBase(depsolve.Depsolve): def verifyChecksum(self, fo, checksumType, csum): @@ -151679,7 +151694,7 @@ index 99039e0..4650639 100644 try: filesum = misc.checksum(checksumType, fo) except Errors.MiscError, e: -@@ -1908,6 +2142,17 @@ class YumBase(depsolve.Depsolve): +@@ -1908,6 +2139,17 @@ class YumBase(depsolve.Depsolve): return 0 def downloadPkgs(self, pkglist, callback=None, callback_total=None): @@ -151697,7 +151712,7 @@ index 99039e0..4650639 100644 def mediasort(apo, bpo): # FIXME: we should probably also use the mediaid; else we # could conceivably ping-pong between different disc1's -@@ -1979,8 +2224,9 @@ class YumBase(depsolve.Depsolve): +@@ -1979,8 +2221,9 @@ class YumBase(depsolve.Depsolve): urlgrabber.progress.text_meter_total_size(remote_size) beg_download = time.time() i = 0 @@ -151708,7 +151723,7 @@ index 99039e0..4650639 100644 for po in remote_pkgs: # Recheck if the file is there, works around a couple of weird # edge cases. -@@ -1992,52 +2238,47 @@ class YumBase(depsolve.Depsolve): +@@ -1992,52 +2235,47 @@ class YumBase(depsolve.Depsolve): remote_size -= po.size if hasattr(urlgrabber.progress, 'text_meter_total_size'): urlgrabber.progress.text_meter_total_size(remote_size, @@ -151787,7 +151802,7 @@ index 99039e0..4650639 100644 if hasattr(urlgrabber.progress, 'text_meter_total_size'): urlgrabber.progress.text_meter_total_size(0) if callback_total is not None and not errors: -@@ -2052,7 +2293,22 @@ class YumBase(depsolve.Depsolve): +@@ -2052,7 +2290,22 @@ class YumBase(depsolve.Depsolve): return errors def verifyHeader(self, fo, po, raiseError): @@ -151811,7 +151826,7 @@ index 99039e0..4650639 100644 if type(fo) is types.InstanceType: fo = fo.filename -@@ -2076,9 +2332,12 @@ class YumBase(depsolve.Depsolve): +@@ -2076,9 +2329,12 @@ class YumBase(depsolve.Depsolve): return 1 def downloadHeader(self, po): @@ -151826,7 +151841,7 @@ index 99039e0..4650639 100644 if hasattr(po, 'pkgtype') and po.pkgtype == 'local': return -@@ -2122,15 +2381,17 @@ class YumBase(depsolve.Depsolve): +@@ -2122,15 +2378,17 @@ class YumBase(depsolve.Depsolve): return def sigCheckPkg(self, po): @@ -151852,7 +151867,7 @@ index 99039e0..4650639 100644 if self._override_sigchecks: check = False hasgpgkey = 0 -@@ -2181,6 +2442,9 @@ class YumBase(depsolve.Depsolve): +@@ -2181,6 +2439,9 @@ class YumBase(depsolve.Depsolve): return result, msg def cleanUsedHeadersPackages(self): @@ -151862,7 +151877,7 @@ index 99039e0..4650639 100644 filelist = [] for txmbr in self.tsInfo: if txmbr.po.state not in TS_INSTALL_STATES: -@@ -2218,27 +2482,42 @@ class YumBase(depsolve.Depsolve): +@@ -2218,27 +2479,42 @@ class YumBase(depsolve.Depsolve): _('%s removed'), fn) def cleanHeaders(self): @@ -151907,7 +151922,7 @@ index 99039e0..4650639 100644 cachedir = self.conf.persistdir + "/rpmdb-indexes/" if not os.path.exists(cachedir): filelist = [] -@@ -2272,8 +2551,29 @@ class YumBase(depsolve.Depsolve): +@@ -2272,8 +2548,29 @@ class YumBase(depsolve.Depsolve): def doPackageLists(self, pkgnarrow='all', patterns=None, showdups=None, ignore_case=False): @@ -151939,7 +151954,7 @@ index 99039e0..4650639 100644 if showdups is None: showdups = self.conf.showdupesfromrepos ygh = misc.GenericHolder(iter=pkgnarrow) -@@ -2323,10 +2623,22 @@ class YumBase(depsolve.Depsolve): +@@ -2323,10 +2620,22 @@ class YumBase(depsolve.Depsolve): key = (pkg.name, pkg.arch) if pkg.pkgtup in dinst: reinstall_available.append(pkg) @@ -151965,7 +151980,7 @@ index 99039e0..4650639 100644 # produce the updates list of tuples elif pkgnarrow == 'updates': -@@ -2461,14 +2773,13 @@ class YumBase(depsolve.Depsolve): +@@ -2461,14 +2770,13 @@ class YumBase(depsolve.Depsolve): def findDeps(self, pkgs): @@ -151985,7 +152000,7 @@ index 99039e0..4650639 100644 results = {} for pkg in pkgs: -@@ -2495,10 +2806,22 @@ class YumBase(depsolve.Depsolve): +@@ -2495,10 +2803,22 @@ class YumBase(depsolve.Depsolve): # pre 3.2.10 API used to always showdups, so that's the default atm. def searchGenerator(self, fields, criteria, showdups=True, keys=False, searchtags=True, searchrpmdb=True): @@ -152012,7 +152027,7 @@ index 99039e0..4650639 100644 sql_fields = [] for f in fields: sql_fields.append(RPM_TO_SQLITE.get(f, f)) -@@ -2661,6 +2984,14 @@ class YumBase(depsolve.Depsolve): +@@ -2661,6 +2981,14 @@ class YumBase(depsolve.Depsolve): yield (po, vs) def searchPackageTags(self, criteria): @@ -152027,7 +152042,7 @@ index 99039e0..4650639 100644 results = {} # name = [(criteria, taglist)] for c in criteria: c = c.lower() -@@ -2677,11 +3008,16 @@ class YumBase(depsolve.Depsolve): +@@ -2677,11 +3005,16 @@ class YumBase(depsolve.Depsolve): return results def searchPackages(self, fields, criteria, callback=None): @@ -152049,7 +152064,7 @@ index 99039e0..4650639 100644 warnings.warn(_('searchPackages() will go away in a future version of Yum.\ Use searchGenerator() instead. \n'), Errors.YumFutureDeprecationWarning, stacklevel=2) -@@ -2700,13 +3036,23 @@ class YumBase(depsolve.Depsolve): +@@ -2700,13 +3033,23 @@ class YumBase(depsolve.Depsolve): def searchPackageProvides(self, args, callback=None, callback_has_matchfor=False): @@ -152077,7 +152092,7 @@ index 99039e0..4650639 100644 else: isglob = True canBeFile = misc.re_filename(arg) -@@ -2723,7 +3069,7 @@ class YumBase(depsolve.Depsolve): +@@ -2723,7 +3066,7 @@ class YumBase(depsolve.Depsolve): where = self.returnPackagesByDep(arg) else: usedDepString = False @@ -152086,7 +152101,7 @@ index 99039e0..4650639 100644 self.verbose_logger.log(logginglevels.DEBUG_1, P_('Searching %d package', 'Searching %d packages', len(where)), len(where)) -@@ -2817,25 +3163,93 @@ class YumBase(depsolve.Depsolve): +@@ -2817,25 +3160,93 @@ class YumBase(depsolve.Depsolve): return matches @@ -152191,7 +152206,7 @@ index 99039e0..4650639 100644 if uservisible: if grp.user_visible: installed.append(grp) -@@ -2848,12 +3262,29 @@ class YumBase(depsolve.Depsolve): +@@ -2848,12 +3259,29 @@ class YumBase(depsolve.Depsolve): else: available.append(grp) @@ -152224,7 +152239,7 @@ index 99039e0..4650639 100644 txmbrs_used = [] thesegroups = self.comps.return_groups(grpid) -@@ -2861,20 +3292,28 @@ class YumBase(depsolve.Depsolve): +@@ -2861,20 +3289,28 @@ class YumBase(depsolve.Depsolve): raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid) for thisgroup in thesegroups: @@ -152255,7 +152270,7 @@ index 99039e0..4650639 100644 thesegroups = self.comps.return_groups(grpid) if not thesegroups: raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid) -@@ -2898,13 +3337,18 @@ class YumBase(depsolve.Depsolve): +@@ -2898,13 +3334,18 @@ class YumBase(depsolve.Depsolve): self.tsInfo.remove(txmbr.po.pkgtup) @@ -152281,7 +152296,7 @@ index 99039e0..4650639 100644 """ if not self.comps.has_group(grpid): -@@ -2934,12 +3378,47 @@ class YumBase(depsolve.Depsolve): +@@ -2934,12 +3375,47 @@ class YumBase(depsolve.Depsolve): if 'optional' in package_types: pkgs.extend(thisgroup.optional_packages) @@ -152330,7 +152345,7 @@ index 99039e0..4650639 100644 except Errors.InstallError, e: self.verbose_logger.debug(_('No package named %s available to be installed'), pkg) -@@ -2953,6 +3432,7 @@ class YumBase(depsolve.Depsolve): +@@ -2953,6 +3429,7 @@ class YumBase(depsolve.Depsolve): group_conditionals = enable_group_conditionals count_cond_test = 0 @@ -152338,7 +152353,7 @@ index 99039e0..4650639 100644 if group_conditionals: for condreq, cond in thisgroup.conditional_packages.iteritems(): if self.isPackageInstalled(cond): -@@ -2997,10 +3477,14 @@ class YumBase(depsolve.Depsolve): +@@ -2997,10 +3474,14 @@ class YumBase(depsolve.Depsolve): return txmbrs_used def deselectGroup(self, grpid, force=False): @@ -152357,7 +152372,7 @@ index 99039e0..4650639 100644 if not self.comps.has_group(grpid): raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid) -@@ -3035,12 +3519,21 @@ class YumBase(depsolve.Depsolve): +@@ -3035,12 +3516,21 @@ class YumBase(depsolve.Depsolve): self.tsInfo.remove(pkg.pkgtup) def getPackageObject(self, pkgtup, allow_missing=False): @@ -152385,7 +152400,7 @@ index 99039e0..4650639 100644 # look it up in the self.localPackages first: for po in self.localPackages: if po.pkgtup == pkgtup: -@@ -3049,7 +3542,7 @@ class YumBase(depsolve.Depsolve): +@@ -3049,7 +3539,7 @@ class YumBase(depsolve.Depsolve): pkgs = self.pkgSack.searchPkgTuple(pkgtup) if len(pkgs) == 0: @@ -152394,7 +152409,7 @@ index 99039e0..4650639 100644 if allow_missing: # This can happen due to excludes after .up has return None # happened. raise Errors.DepError, _('Package tuple %s could not be found in packagesack') % str(pkgtup) -@@ -3065,13 +3558,21 @@ class YumBase(depsolve.Depsolve): +@@ -3065,13 +3555,21 @@ class YumBase(depsolve.Depsolve): return result def getInstalledPackageObject(self, pkgtup): @@ -152421,7 +152436,7 @@ index 99039e0..4650639 100644 raise Errors.RpmDBError, _('Package tuple %s could not be found in rpmdb') % str(pkgtup) # Dito. FIXME from getPackageObject() for len() > 1 ... :) -@@ -3079,9 +3580,11 @@ class YumBase(depsolve.Depsolve): +@@ -3079,9 +3577,11 @@ class YumBase(depsolve.Depsolve): return po def gpgKeyCheck(self): @@ -152435,7 +152450,7 @@ index 99039e0..4650639 100644 gpgkeyschecked = self.conf.cachedir + '/.gpgkeyschecked.yum' if os.path.exists(gpgkeyschecked): return 1 -@@ -3106,9 +3609,13 @@ class YumBase(depsolve.Depsolve): +@@ -3106,9 +3606,13 @@ class YumBase(depsolve.Depsolve): return 1 def returnPackagesByDep(self, depstring): @@ -152451,7 +152466,7 @@ index 99039e0..4650639 100644 if not depstring: return [] -@@ -3135,9 +3642,16 @@ class YumBase(depsolve.Depsolve): +@@ -3135,9 +3639,16 @@ class YumBase(depsolve.Depsolve): return self.pkgSack.getProvides(depname, depflags, depver).keys() def returnPackageByDep(self, depstring): @@ -152471,7 +152486,7 @@ index 99039e0..4650639 100644 # we get all sorts of randomness here errstring = depstring if type(depstring) not in types.StringTypes: -@@ -3149,16 +3663,22 @@ class YumBase(depsolve.Depsolve): +@@ -3149,16 +3660,22 @@ class YumBase(depsolve.Depsolve): raise Errors.YumBaseError, _('No Package found for %s') % errstring ps = ListPackageSack(pkglist) @@ -152498,7 +152513,7 @@ index 99039e0..4650639 100644 if not depstring: return [] -@@ -3184,12 +3704,47 @@ class YumBase(depsolve.Depsolve): +@@ -3184,12 +3701,47 @@ class YumBase(depsolve.Depsolve): return self.rpmdb.getProvides(depname, depflags, depver).keys() @@ -152548,7 +152563,7 @@ index 99039e0..4650639 100644 if len(pkglist) == 0: -@@ -3198,14 +3753,23 @@ class YumBase(depsolve.Depsolve): +@@ -3198,14 +3750,23 @@ class YumBase(depsolve.Depsolve): if len(pkglist) == 1: return pkglist[0] @@ -152578,7 +152593,7 @@ index 99039e0..4650639 100644 returnlist = [] compatArchList = self.arch.get_arch_list(arch) multiLib = [] -@@ -3222,9 +3786,9 @@ class YumBase(depsolve.Depsolve): +@@ -3222,9 +3783,9 @@ class YumBase(depsolve.Depsolve): singleLib.append(po) # we now have three lists. find the best package(s) of each @@ -152591,7 +152606,7 @@ index 99039e0..4650639 100644 if single_name and multi and single and multi.name != single.name: # Sinlge _must_ match multi, if we want a single package name -@@ -3238,7 +3802,7 @@ class YumBase(depsolve.Depsolve): +@@ -3238,7 +3799,7 @@ class YumBase(depsolve.Depsolve): # if there's a noarch and it's newer than the multilib, we want # just the noarch. otherwise, we want multi + single elif multi: @@ -152600,7 +152615,7 @@ index 99039e0..4650639 100644 if best.arch == "noarch": returnlist.append(no) else: -@@ -3246,7 +3810,7 @@ class YumBase(depsolve.Depsolve): +@@ -3246,7 +3807,7 @@ class YumBase(depsolve.Depsolve): if single: returnlist.append(single) # similar for the non-multilib case elif single: @@ -152609,7 +152624,7 @@ index 99039e0..4650639 100644 if best.arch == "noarch": returnlist.append(no) else: -@@ -3350,23 +3914,27 @@ class YumBase(depsolve.Depsolve): +@@ -3350,23 +3911,27 @@ class YumBase(depsolve.Depsolve): done = True slow = next_func(slow) @@ -152642,7 +152657,7 @@ index 99039e0..4650639 100644 def _at_groupremove(self, pattern): " Do groupremove via. leading @ on the cmd line, for remove." assert pattern[0] == '@' -@@ -3398,7 +3966,7 @@ class YumBase(depsolve.Depsolve): +@@ -3398,7 +3963,7 @@ class YumBase(depsolve.Depsolve): def _minus_deselect(self, pattern): """ Remove things from the transaction, like kickstart. """ assert pattern[0] == '-' @@ -152651,7 +152666,7 @@ index 99039e0..4650639 100644 if pat and pat[0] == '@': pat = pat[1:] -@@ -3437,14 +4005,61 @@ class YumBase(depsolve.Depsolve): +@@ -3437,14 +4002,61 @@ class YumBase(depsolve.Depsolve): if flag not in self.tsInfo.probFilterFlags: self.tsInfo.probFilterFlags.append(flag) @@ -152719,7 +152734,7 @@ index 99039e0..4650639 100644 pkgs = [] was_pattern = False if po: -@@ -3477,20 +4092,12 @@ class YumBase(depsolve.Depsolve): +@@ -3477,20 +4089,12 @@ class YumBase(depsolve.Depsolve): self.verbose_logger.debug(_('Checking for virtual provide or file-provide for %s'), arg) @@ -152746,7 +152761,7 @@ index 99039e0..4650639 100644 else: nevra_dict = self._nevra_kwarg_parse(kwargs) -@@ -3577,8 +4184,8 @@ class YumBase(depsolve.Depsolve): +@@ -3577,8 +4181,8 @@ class YumBase(depsolve.Depsolve): continue # make sure this shouldn't be passed to update: @@ -152757,7 +152772,7 @@ index 99039e0..4650639 100644 txmbrs = self.update(po=po) tx_return.extend(txmbrs) continue -@@ -3587,7 +4194,7 @@ class YumBase(depsolve.Depsolve): +@@ -3587,7 +4191,7 @@ class YumBase(depsolve.Depsolve): # something else in the repo. Unless there is a obsoletion loop, # at which point ignore everything. obsoleting_pkg = None @@ -152766,7 +152781,7 @@ index 99039e0..4650639 100644 obsoleting_pkg = self._test_loop(po, self._pkg2obspkg) if obsoleting_pkg is not None: # this is not a definitive check but it'll make sure we don't -@@ -3600,23 +4207,23 @@ class YumBase(depsolve.Depsolve): +@@ -3600,23 +4204,23 @@ class YumBase(depsolve.Depsolve): already_obs = pkgs[0] if already_obs: @@ -152797,7 +152812,7 @@ index 99039e0..4650639 100644 continue # make sure we don't have a name.arch of this already installed -@@ -3630,7 +4237,7 @@ class YumBase(depsolve.Depsolve): +@@ -3630,7 +4234,7 @@ class YumBase(depsolve.Depsolve): found = True break if not found: @@ -152806,7 +152821,7 @@ index 99039e0..4650639 100644 txmbrs = self.update(po=po) tx_return.extend(txmbrs) continue -@@ -3719,14 +4326,33 @@ class YumBase(depsolve.Depsolve): +@@ -3719,14 +4323,33 @@ class YumBase(depsolve.Depsolve): return txmbr def update(self, po=None, requiringPo=None, update_to=False, **kwargs): @@ -152847,7 +152862,7 @@ index 99039e0..4650639 100644 # check for args - if no po nor kwargs, do them all # if po, do it, ignore all else # if no po do kwargs -@@ -3765,7 +4391,12 @@ class YumBase(depsolve.Depsolve): +@@ -3765,7 +4388,12 @@ class YumBase(depsolve.Depsolve): if new is None: continue tx_return.extend(self.update(po=new)) @@ -152861,7 +152876,7 @@ index 99039e0..4650639 100644 return tx_return # complications -@@ -3787,7 +4418,7 @@ class YumBase(depsolve.Depsolve): +@@ -3787,7 +4415,7 @@ class YumBase(depsolve.Depsolve): return self._minus_deselect(kwargs['pattern']) if kwargs['pattern'] and kwargs['pattern'][0] == '@': @@ -152870,7 +152885,7 @@ index 99039e0..4650639 100644 arg = kwargs['pattern'] if not update_to: -@@ -3920,6 +4551,18 @@ class YumBase(depsolve.Depsolve): +@@ -3920,6 +4548,18 @@ class YumBase(depsolve.Depsolve): tx_return.append(txmbr) for available_pkg in availpkgs: @@ -152889,7 +152904,7 @@ index 99039e0..4650639 100644 # Make sure we're not installing a package which is obsoleted by # something else in the repo. Unless there is a obsoletion loop, # at which point ignore everything. -@@ -3985,11 +4628,18 @@ class YumBase(depsolve.Depsolve): +@@ -3985,11 +4625,18 @@ class YumBase(depsolve.Depsolve): return tx_return def remove(self, po=None, **kwargs): @@ -152913,7 +152928,7 @@ index 99039e0..4650639 100644 if not po and not kwargs: raise Errors.RemoveError, 'Nothing specified to remove' -@@ -4055,17 +4705,19 @@ class YumBase(depsolve.Depsolve): +@@ -4055,17 +4702,19 @@ class YumBase(depsolve.Depsolve): return tx_return def installLocal(self, pkg, po=None, updateonly=False): @@ -152943,7 +152958,7 @@ index 99039e0..4650639 100644 # read in the package into a YumLocalPackage Object # append it to self.localPackages # check if it can be installed or updated based on nevra versus rpmdb -@@ -4183,16 +4835,15 @@ class YumBase(depsolve.Depsolve): +@@ -4183,16 +4832,15 @@ class YumBase(depsolve.Depsolve): return tx_return def reinstallLocal(self, pkg, po=None): @@ -152968,7 +152983,7 @@ index 99039e0..4650639 100644 if not po: try: po = YumUrlPackage(self, ts=self.rpmdb.readOnlyTS(), url=pkg, -@@ -4215,9 +4866,19 @@ class YumBase(depsolve.Depsolve): +@@ -4215,9 +4863,19 @@ class YumBase(depsolve.Depsolve): return self.reinstall(po=po) def reinstall(self, po=None, **kwargs): @@ -152991,7 +153006,7 @@ index 99039e0..4650639 100644 self._add_prob_flags(rpm.RPMPROB_FILTER_REPLACEPKG, rpm.RPMPROB_FILTER_REPLACENEWFILES, rpm.RPMPROB_FILTER_REPLACEOLDFILES) -@@ -4259,16 +4920,15 @@ class YumBase(depsolve.Depsolve): +@@ -4259,16 +4917,15 @@ class YumBase(depsolve.Depsolve): return tx_mbrs def downgradeLocal(self, pkg, po=None): @@ -153016,7 +153031,7 @@ index 99039e0..4650639 100644 if not po: try: po = YumUrlPackage(self, ts=self.rpmdb.readOnlyTS(), url=pkg, -@@ -4309,13 +4969,19 @@ class YumBase(depsolve.Depsolve): +@@ -4309,13 +4966,19 @@ class YumBase(depsolve.Depsolve): return False def downgrade(self, po=None, **kwargs): @@ -153043,7 +153058,7 @@ index 99039e0..4650639 100644 if not po and not kwargs: raise Errors.DowngradeError, 'Nothing specified to downgrade' -@@ -4421,6 +5087,9 @@ class YumBase(depsolve.Depsolve): +@@ -4421,6 +5084,9 @@ class YumBase(depsolve.Depsolve): warned_nas.add(na) continue @@ -153053,7 +153068,7 @@ index 99039e0..4650639 100644 if pkg.verGE(lipkg): if na not in warned_nas: msg = _('Only Upgrade available on package: %s') % pkg -@@ -4457,7 +5126,7 @@ class YumBase(depsolve.Depsolve): +@@ -4457,7 +5123,7 @@ class YumBase(depsolve.Depsolve): if e and v and r: evr = '%s:%s-%s' % (e, v, r) elif v and r: @@ -153062,7 +153077,7 @@ index 99039e0..4650639 100644 elif e and v: evr = '%s:%s' % (e, v) elif v: # e and r etc. is just too weird to print -@@ -4500,12 +5169,24 @@ class YumBase(depsolve.Depsolve): +@@ -4500,12 +5166,24 @@ class YumBase(depsolve.Depsolve): return returndict @@ -153090,7 +153105,7 @@ index 99039e0..4650639 100644 old_conf_obs = self.conf.obsoletes self.conf.obsoletes = False done = False -@@ -4515,19 +5196,46 @@ class YumBase(depsolve.Depsolve): +@@ -4515,19 +5193,46 @@ class YumBase(depsolve.Depsolve): done = True for pkg in transaction.trans_data: if pkg.state == 'Downgrade': @@ -153137,7 +153152,7 @@ index 99039e0..4650639 100644 if self.install(pkgtup=pkg.pkgtup): done = True for pkg in transaction.trans_data: -@@ -4538,8 +5246,14 @@ class YumBase(depsolve.Depsolve): +@@ -4538,8 +5243,14 @@ class YumBase(depsolve.Depsolve): return done def history_undo(self, transaction): @@ -153154,7 +153169,7 @@ index 99039e0..4650639 100644 # NOTE: This is somewhat basic atm. ... for instance we don't check # that we are going from the old new version. However it's still # better than the RHN rollback code, and people pay for that :). -@@ -4616,7 +5330,7 @@ class YumBase(depsolve.Depsolve): +@@ -4616,7 +5327,7 @@ class YumBase(depsolve.Depsolve): except urlgrabber.grabber.URLGrabError, e: raise Errors.YumBaseError(_('GPG key retrieval failed: ') + @@ -153163,7 +153178,7 @@ index 99039e0..4650639 100644 # check for a .asc file accompanying it - that's our gpg sig on the key # suck it down and do the check -@@ -4649,7 +5363,7 @@ class YumBase(depsolve.Depsolve): +@@ -4649,7 +5360,7 @@ class YumBase(depsolve.Depsolve): keys_info = misc.getgpgkeyinfo(rawkey, multiple=True) except ValueError, e: raise Errors.YumBaseError(_('Invalid GPG Key from %s: %s') % @@ -153172,7 +153187,7 @@ index 99039e0..4650639 100644 keys = [] for keyinfo in keys_info: thiskey = {} -@@ -4674,39 +5388,49 @@ class YumBase(depsolve.Depsolve): +@@ -4674,39 +5385,49 @@ class YumBase(depsolve.Depsolve): if pkgs: pkgs = sorted(pkgs)[-1] msg = (_('Importing %s key 0x%s:\n' @@ -153240,7 +153255,7 @@ index 99039e0..4650639 100644 user_cb_fail = False for keyurl in keyurls: keys = self._retrievePublicKey(keyurl, repo) -@@ -4725,7 +5449,9 @@ class YumBase(depsolve.Depsolve): +@@ -4725,7 +5446,9 @@ class YumBase(depsolve.Depsolve): # Try installing/updating GPG key self._getKeyImportMessage(info, keyurl) rc = False @@ -153251,7 +153266,7 @@ index 99039e0..4650639 100644 rc = True # grab the .sig/.asc for the keyurl, if it exists -@@ -4751,8 +5477,8 @@ class YumBase(depsolve.Depsolve): +@@ -4751,8 +5474,8 @@ class YumBase(depsolve.Depsolve): ts = self.rpmdb.readOnlyTS() result = ts.pgpImportPubkey(misc.procgpgkey(info['raw_key'])) if result != 0: @@ -153262,7 +153277,7 @@ index 99039e0..4650639 100644 self.logger.info(_('Key imported successfully')) key_installed = True -@@ -4760,18 +5486,20 @@ class YumBase(depsolve.Depsolve): +@@ -4760,18 +5483,20 @@ class YumBase(depsolve.Depsolve): raise Errors.YumBaseError, _("Didn't install any keys") if not key_installed: @@ -153288,7 +153303,7 @@ index 99039e0..4650639 100644 def _getAnyKeyForRepo(self, repo, destdir, keyurl_list, is_cakey=False, callback=None): """ -@@ -4788,6 +5516,18 @@ class YumBase(depsolve.Depsolve): +@@ -4788,6 +5513,18 @@ class YumBase(depsolve.Depsolve): """ key_installed = False @@ -153307,7 +153322,7 @@ index 99039e0..4650639 100644 user_cb_fail = False for keyurl in keyurl_list: keys = self._retrievePublicKey(keyurl, repo, getSig=not is_cakey) -@@ -4819,8 +5559,11 @@ class YumBase(depsolve.Depsolve): +@@ -4819,8 +5556,11 @@ class YumBase(depsolve.Depsolve): if not key_installed: self._getKeyImportMessage(info, keyurl, keytype) rc = False @@ -153320,7 +153335,7 @@ index 99039e0..4650639 100644 elif callback: rc = callback({"repo": repo, "userid": info['userid'], "hexkeyid": info['hexkeyid'], "keyurl": keyurl, -@@ -4835,7 +5578,8 @@ class YumBase(depsolve.Depsolve): +@@ -4835,7 +5575,8 @@ class YumBase(depsolve.Depsolve): # Import the key result = misc.import_key_to_pubring(info['raw_key'], info['hexkeyid'], gpgdir=destdir) if not result: @@ -153330,7 +153345,7 @@ index 99039e0..4650639 100644 self.logger.info(_('Key imported successfully')) key_installed = True # write out the key id to imported_cakeys in the repos basedir -@@ -4851,36 +5595,35 @@ class YumBase(depsolve.Depsolve): +@@ -4851,36 +5592,35 @@ class YumBase(depsolve.Depsolve): pass if not key_installed and user_cb_fail: @@ -153383,7 +153398,7 @@ index 99039e0..4650639 100644 self._getAnyKeyForRepo(repo, repo.gpgcadir, repo.gpgcakey, is_cakey=True, callback=callback) def _limit_installonly_pkgs(self): -@@ -4927,6 +5670,7 @@ class YumBase(depsolve.Depsolve): +@@ -4927,6 +5667,7 @@ class YumBase(depsolve.Depsolve): ts = self.rpmdb.readOnlyTS() (cur_kernel_v, cur_kernel_r) = misc.get_running_kernel_version_release(ts) install_only_names = set(self.conf.installonlypkgs) @@ -153391,7 +153406,7 @@ index 99039e0..4650639 100644 for m in self.tsInfo.getMembers(): if m.ts_state not in ('i', 'u'): continue -@@ -4937,12 +5681,21 @@ class YumBase(depsolve.Depsolve): +@@ -4937,12 +5678,21 @@ class YumBase(depsolve.Depsolve): if not po_names.intersection(install_only_names): continue @@ -153417,7 +153432,7 @@ index 99039e0..4650639 100644 for po in installed: if (po.version, po.release) == (cur_kernel_v, cur_kernel_r): # don't remove running -@@ -4959,19 +5712,22 @@ class YumBase(depsolve.Depsolve): +@@ -4959,19 +5709,22 @@ class YumBase(depsolve.Depsolve): txmbr.depends_on.append(rel) def processTransaction(self, callback=None,rpmTestDisplay=None, rpmDisplay=None): @@ -153453,7 +153468,7 @@ index 99039e0..4650639 100644 if not callback: callback = callbacks.ProcessTransNoOutputCallback() -@@ -5114,13 +5870,19 @@ class YumBase(depsolve.Depsolve): +@@ -5114,13 +5867,19 @@ class YumBase(depsolve.Depsolve): return results def add_enable_repo(self, repoid, baseurls=[], mirrorlist=None, **kwargs): @@ -153480,7 +153495,7 @@ index 99039e0..4650639 100644 # out of place fixme - maybe we should make this the default repo addition # routine and use it from getReposFromConfigFile(), etc. newrepo = yumRepo.YumRepository(repoid) -@@ -5167,9 +5929,15 @@ class YumBase(depsolve.Depsolve): +@@ -5167,9 +5926,15 @@ class YumBase(depsolve.Depsolve): def setCacheDir(self, force=False, tmpdir=None, reuse=True, suffix='/$basearch/$releasever'): @@ -153499,7 +153514,7 @@ index 99039e0..4650639 100644 if not force and os.geteuid() == 0: return True # We are root, not forced, so happy with the global dir. if tmpdir is None: -@@ -5179,7 +5947,7 @@ class YumBase(depsolve.Depsolve): +@@ -5179,7 +5944,7 @@ class YumBase(depsolve.Depsolve): try: cachedir = misc.getCacheDir(tmpdir, reuse) except (IOError, OSError), e: @@ -153508,7 +153523,7 @@ index 99039e0..4650639 100644 cachedir = None if cachedir is None: -@@ -5190,6 +5958,7 @@ class YumBase(depsolve.Depsolve): +@@ -5190,6 +5955,7 @@ class YumBase(depsolve.Depsolve): self.prerepoconf.cachedir = cachedir else: self.repos.setCacheDir(cachedir) @@ -153516,7 +153531,7 @@ index 99039e0..4650639 100644 self.conf.cachedir = cachedir return True # We got a new cache dir -@@ -5220,13 +5989,24 @@ class YumBase(depsolve.Depsolve): +@@ -5220,13 +5986,24 @@ class YumBase(depsolve.Depsolve): self.history.write_addon_data('config-repos', myrepos) def verify_plugins_cb(self, verify_package): @@ -153544,7 +153559,7 @@ index 99039e0..4650639 100644 if self.tsInfo._unresolvedMembers: if auto: self.logger.critical(_("Dependencies not solved. Will not save unresolved transaction.")) -@@ -5234,7 +6014,7 @@ class YumBase(depsolve.Depsolve): +@@ -5234,7 +6011,7 @@ class YumBase(depsolve.Depsolve): raise Errors.YumBaseError(_("Dependencies not solved. Will not save unresolved transaction.")) if not filename: @@ -153553,7 +153568,7 @@ index 99039e0..4650639 100644 fd,filename = tempfile.mkstemp(suffix='.yumtx', prefix=prefix) f = os.fdopen(fd, 'w') else: -@@ -5244,13 +6024,17 @@ class YumBase(depsolve.Depsolve): +@@ -5244,13 +6021,17 @@ class YumBase(depsolve.Depsolve): msg = "%s\n" % self.rpmdb.simpleVersion(main_only=True)[0] msg += "%s\n" % self.ts.getTsFlags() @@ -153574,7 +153589,7 @@ index 99039e0..4650639 100644 msg += "%s\n" % len(self.tsInfo.getMembers()) for txmbr in self.tsInfo.getMembers(): msg += txmbr._dump() -@@ -5260,13 +6044,25 @@ class YumBase(depsolve.Depsolve): +@@ -5260,13 +6041,25 @@ class YumBase(depsolve.Depsolve): except (IOError, OSError), e: self._ts_save_file = None if auto: @@ -153606,7 +153621,7 @@ index 99039e0..4650639 100644 # check rpmversion - if not match throw a fit # check repoversions (and repos)- if not match throw a fit # load each txmbr - if pkgs being updated don't exist, bail w/error -@@ -5276,26 +6072,45 @@ class YumBase(depsolve.Depsolve): +@@ -5276,26 +6069,45 @@ class YumBase(depsolve.Depsolve): try: data = open(filename, 'r').readlines() except (IOError, OSError), e: @@ -153654,7 +153669,7 @@ index 99039e0..4650639 100644 if ignorerpm: msg += _(" ignoring, as requested.") self.logger.critical(_(msg)) -@@ -5318,8 +6133,17 @@ class YumBase(depsolve.Depsolve): +@@ -5318,8 +6130,17 @@ class YumBase(depsolve.Depsolve): numrepos = int(data[2].strip()) repos = [] rindex=3+numrepos @@ -153673,7 +153688,7 @@ index 99039e0..4650639 100644 # pkgs/txmbrs numpkgs = int(data[rindex].strip()) -@@ -5329,6 +6153,7 @@ class YumBase(depsolve.Depsolve): +@@ -5329,6 +6150,7 @@ class YumBase(depsolve.Depsolve): pkgcount = 0 pkgprob = False curpkg = None @@ -153681,7 +153696,7 @@ index 99039e0..4650639 100644 for l in data[pkgstart:]: l = l.rstrip() # our main txmbrs -@@ -5438,6 +6263,11 @@ class YumBase(depsolve.Depsolve): +@@ -5438,6 +6260,11 @@ class YumBase(depsolve.Depsolve): msg += _(" aborting.") raise Errors.YumBaseError(msg) @@ -153693,7 +153708,7 @@ index 99039e0..4650639 100644 return self.tsInfo.getMembers() def _remove_old_deps(self): -@@ -5470,18 +6300,6 @@ class YumBase(depsolve.Depsolve): +@@ -5470,18 +6297,6 @@ class YumBase(depsolve.Depsolve): if requiring == required: # if they are self-requiring skip them continue @@ -153712,7 +153727,7 @@ index 99039e0..4650639 100644 #for tbi_pkg in self.tsInfo.getMembersWithState(output_states=TS_INSTALL_STATES): # for reqtuple in tbi_pkg.po.requires: # if required.provides_for(reqtuple): -@@ -5533,7 +6351,24 @@ class YumBase(depsolve.Depsolve): +@@ -5533,7 +6348,24 @@ class YumBase(depsolve.Depsolve): # Debugging output self.verbose_logger.log(logginglevels.DEBUG_2, _("%s has revdep %s which was user-installed."), pkg, curpkg) ok_to_remove[pkg] = False @@ -153737,7 +153752,7 @@ index 99039e0..4650639 100644 visited[curpkg] = True all_leaves_visited = True leaves = curpkg.requiring_packages() -@@ -5547,4 +6382,3 @@ class YumBase(depsolve.Depsolve): +@@ -5547,4 +6379,3 @@ class YumBase(depsolve.Depsolve): # Debugging output self.verbose_logger.log(logginglevels.DEBUG_2, _("%s has no user-installed revdeps."), pkg) return False @@ -156165,7 +156180,7 @@ index aaa4f25..51895fd 100755 continue diff --git a/yum/misc.py b/yum/misc.py -index 2f6ddfe..59aff5d 100644 +index 2f6ddfe..968b5eb 100644 --- a/yum/misc.py +++ b/yum/misc.py @@ -8,6 +8,7 @@ import os @@ -156245,7 +156260,7 @@ index 2f6ddfe..59aff5d 100644 def get_my_lang_code(): -@@ -1105,17 +1129,26 @@ def decompress(filename, dest=None, fn_only=False, check_timestamps=False): +@@ -1105,17 +1129,28 @@ def decompress(filename, dest=None, fn_only=False, check_timestamps=False): out = filename.replace('.xz', '') else: @@ -156262,7 +156277,9 @@ index 2f6ddfe..59aff5d 100644 + fi = stat_f(filename) + fo = stat_f(out) + if fi and fo: -+ if fo.st_mtime == fi.st_mtime: ++ # Eliminate sub second precision in mtime before comparision, ++ # see http://bugs.python.org/issue14127 ++ if int(fo.st_mtime) == int(fi.st_mtime): return out + if fn_only: + # out exists but not valid @@ -156302,10 +156319,29 @@ index 4af563a..47832fc 100644 self.obsoletes = {} #obs[obsoletename] = [pkg1, pkg2, pkg3] #the package lists are packages that obsolete the key name diff --git a/yum/packages.py b/yum/packages.py -index 5ef9951..da31971 100644 +index 5ef9951..f67169f 100644 --- a/yum/packages.py +++ b/yum/packages.py -@@ -243,34 +243,87 @@ class PackageObject(object): +@@ -106,14 +106,16 @@ def buildPkgRefDict(pkgs, casematch=True): + return pkgdict + + def parsePackages(pkgs, usercommands, casematch=0, +- unique='repo-epoch-name-version-release-arch'): ++ unique='repo-epoch-name-version-release-arch', ++ pkgdict=None): + """matches up the user request versus a pkg list: + for installs/updates available pkgs should be the 'others list' + for removes it should be the installed list of pkgs + takes an optional casematch option to determine if case should be matched + exactly. Defaults to not matching.""" + +- pkgdict = buildPkgRefDict(pkgs, bool(casematch)) ++ if pkgdict is None: ++ pkgdict = buildPkgRefDict(pkgs, bool(casematch)) + exactmatch = [] + matched = [] + unmatched = [] +@@ -243,34 +245,87 @@ class PackageObject(object): def _ui_envra(self): if self.epoch == '0': @@ -156413,7 +156449,7 @@ index 5ef9951..da31971 100644 def __str__(self): return self.ui_envra -@@ -481,15 +534,14 @@ class RpmBase(object): +@@ -481,15 +536,14 @@ class RpmBase(object): if prcotuple in self._prco_lookup[prcotype]: return 1 @@ -156437,7 +156473,7 @@ index 5ef9951..da31971 100644 return 0 -@@ -611,15 +663,18 @@ class RpmBase(object): +@@ -611,15 +665,18 @@ class RpmBase(object): dirlist = property(fget=lambda self: self.returnFileEntries(ftype='dir')) ghostlist = property(fget=lambda self: self.returnFileEntries(ftype='ghost')) requires = property(fget=lambda self: self.returnPrco('requires')) @@ -156456,7 +156492,7 @@ index 5ef9951..da31971 100644 conflicts_print = property(fget=lambda self: self.returnPrco('conflicts', True)) obsoletes_print = property(fget=lambda self: self.returnPrco('obsoletes', True)) changelog = property(fget=lambda self: self.returnChangelog()) -@@ -1083,7 +1138,7 @@ class YumAvailablePackage(PackageObject, RpmBase): +@@ -1083,7 +1140,7 @@ class YumAvailablePackage(PackageObject, RpmBase): misc.to_unicode(misc.to_xml(self.summary)), misc.to_unicode(misc.to_xml(self.description)), packager, url, self.filetime, @@ -156465,7 +156501,7 @@ index 5ef9951..da31971 100644 msg += self._return_remote_location() return msg -@@ -1133,7 +1188,7 @@ class YumAvailablePackage(PackageObject, RpmBase): +@@ -1133,7 +1190,7 @@ class YumAvailablePackage(PackageObject, RpmBase): msg = "" mylist = getattr(self, pcotype) if mylist: msg = "\n \n" % pcotype @@ -156474,7 +156510,7 @@ index 5ef9951..da31971 100644 pcostring = ''' %s\n""" % misc.to_xml(fn) return msg -@@ -1194,8 +1249,8 @@ class YumAvailablePackage(PackageObject, RpmBase): +@@ -1194,8 +1251,8 @@ class YumAvailablePackage(PackageObject, RpmBase): continue newlist.append(i) mylist = newlist @@ -156500,7 +156536,7 @@ index 5ef9951..da31971 100644 if name.startswith('rpmlib('): continue # this drops out requires that the pkg provides for itself. -@@ -1217,13 +1272,16 @@ class YumAvailablePackage(PackageObject, RpmBase): +@@ -1217,13 +1274,16 @@ class YumAvailablePackage(PackageObject, RpmBase): prcostring += ''' ver="%s"''' % misc.to_xml(v, attrib=True) if r: prcostring += ''' rel="%s"''' % misc.to_xml(r, attrib=True) @@ -156519,7 +156555,7 @@ index 5ef9951..da31971 100644 return msg def _dump_changelog(self, clog_limit): -@@ -1272,6 +1330,13 @@ class YumAvailablePackage(PackageObject, RpmBase): +@@ -1272,6 +1332,13 @@ class YumAvailablePackage(PackageObject, RpmBase): return misc.to_utf8(msg) @@ -156533,7 +156569,7 @@ index 5ef9951..da31971 100644 # This is a tweak on YumAvailablePackage() and is a base class for packages # which are actual rpms. -@@ -1299,7 +1364,8 @@ class YumHeaderPackage(YumAvailablePackage): +@@ -1299,7 +1366,8 @@ class YumHeaderPackage(YumAvailablePackage): self.pkgid = self.hdr[rpm.RPMTAG_SHA1HEADER] if not self.pkgid: self.pkgid = "%s.%s" %(self.hdr['name'], self.hdr['buildtime']) @@ -156543,7 +156579,7 @@ index 5ef9951..da31971 100644 self.__mode_cache = {} self.__prcoPopulated = False -@@ -1353,6 +1419,12 @@ class YumHeaderPackage(YumAvailablePackage): +@@ -1353,6 +1421,12 @@ class YumHeaderPackage(YumAvailablePackage): continue lst = hdr[getattr(rpm, 'RPMTAG_%sFLAGS' % tag)] @@ -156556,7 +156592,7 @@ index 5ef9951..da31971 100644 flag = map(rpmUtils.miscutils.flagToString, lst) flag = map(misc.share_data, flag) -@@ -1363,6 +1435,10 @@ class YumHeaderPackage(YumAvailablePackage): +@@ -1363,6 +1437,10 @@ class YumHeaderPackage(YumAvailablePackage): prcotype = tag2prco[tag] self.prco[prcotype] = map(misc.share_data, zip(name,flag,vers)) @@ -156567,7 +156603,7 @@ index 5ef9951..da31971 100644 def tagByName(self, tag): warnings.warn("tagByName() will go away in a furture version of Yum.\n", -@@ -1447,7 +1523,7 @@ class YumHeaderPackage(YumAvailablePackage): +@@ -1447,7 +1525,7 @@ class YumHeaderPackage(YumAvailablePackage): raise NotImplementedError() def _size(self): @@ -157162,7 +157198,7 @@ index bfc49b7..9ddcae6 100644 b = parsever(b) diff --git a/yum/repos.py b/yum/repos.py -index 3793bad..4b1d52e 100644 +index 3793bad..3cbbe25 100644 --- a/yum/repos.py +++ b/yum/repos.py @@ -22,6 +22,7 @@ import misc @@ -157173,7 +157209,7 @@ index 3793bad..4b1d52e 100644 from weakref import proxy as weakref -@@ -67,6 +68,38 @@ class RepoStorage: +@@ -67,6 +68,40 @@ class RepoStorage: self._cache_enabled_repos = [] self.quick_enable_disable = {} @@ -157187,13 +157223,15 @@ index 3793bad..4b1d52e 100644 + + repos = [] + for repo in self.listEnabled(): ++ if repo.cache: ++ continue + if repo._async and repo._commonLoadRepoXML(repo): + mdtypes = repo._mdpolicy2mdtypes() + downloading = repo._commonRetrieveDataMD_list(mdtypes) + repos.append((repo, downloading, [False])) + + # with sizes first, then without sizes.. -+ for no_size in (False, True): ++ for no_size in (False, True): + for repo, downloading, error in repos: + def failfunc(obj, error=error): + error[0] = True @@ -157212,7 +157250,7 @@ index 3793bad..4b1d52e 100644 def doSetup(self, thisrepo = None): self.ayum.plugins.run('prereposetup') -@@ -89,6 +122,7 @@ class RepoStorage: +@@ -89,6 +124,7 @@ class RepoStorage: self.disableRepo(repo.id) self._setup = True @@ -157220,7 +157258,7 @@ index 3793bad..4b1d52e 100644 self.ayum.plugins.run('postreposetup') def __str__(self): -@@ -223,8 +257,9 @@ class RepoStorage: +@@ -223,8 +259,9 @@ class RepoStorage: self._cachedir = cachedir for repo in self.repos.values(): @@ -157232,13 +157270,15 @@ index 3793bad..4b1d52e 100644 def setProgressBar(self, obj): -@@ -288,6 +323,14 @@ class RepoStorage: +@@ -288,6 +325,16 @@ class RepoStorage: else: data = [ mdtype ] + if hasattr(urlgrabber.grabber, 'parallel_wait'): + # download all metadata in parallel + for repo in myrepos: ++ if repo.cache: ++ continue + if repo._async: + sack = repo.getPackageSack() + sack._retrieve_async(repo, data) @@ -157561,7 +157601,7 @@ index 2cb1acb..7da6a08 100644 self._md[item] = val diff --git a/yum/yumRepo.py b/yum/yumRepo.py -index e5e9ece..57a1a29 100644 +index e5e9ece..1cb4ae2 100644 --- a/yum/yumRepo.py +++ b/yum/yumRepo.py @@ -20,10 +20,12 @@ import time @@ -157647,7 +157687,7 @@ index e5e9ece..57a1a29 100644 + # Use generated dir. and handle compression types metadata + # parser doesn't understand. + gen = mymdtype + '.xml' -+ ret = misc.repo_gen_decompress(xml, gen, cached=repo.cache) ++ ret = misc.repo_gen_decompress(xml, gen) + if not ret: + raise URLGrabError(-1, 'Decompress DB failed') + xml = ret @@ -157655,7 +157695,7 @@ index e5e9ece..57a1a29 100644 xmldata = repo.repoXML.getData(mymdtype) (ctype, csum) = xmldata.checksum dobj = repo_cache_function(xml, csum) -@@ -193,6 +244,25 @@ class YumPackageSack(packageSack.PackageSack): +@@ -193,6 +244,24 @@ class YumPackageSack(packageSack.PackageSack): # get rid of all this stuff we don't need now del repo.cacheHandler @@ -157672,8 +157712,7 @@ index e5e9ece..57a1a29 100644 + check_can_fail=fast, fast=fast): + return None + -+ ret = misc.repo_gen_decompress(compressed_fn, db_un_fn, -+ cached=repo.cache) ++ ret = misc.repo_gen_decompress(compressed_fn, db_un_fn) + if ret: + return self._check_uncompressed_db_fn(repo, mdtype, ret) + return None @@ -157681,7 +157720,7 @@ index e5e9ece..57a1a29 100644 def _check_uncompressed_db(self, repo, mdtype): """return file name of uncompressed db is good, None if not""" mydbdata = repo.repoXML.getData(mdtype) -@@ -201,9 +271,11 @@ class YumPackageSack(packageSack.PackageSack): +@@ -201,9 +270,11 @@ class YumPackageSack(packageSack.PackageSack): compressed_fn = repo.cachedir + '/' + fname db_un_fn = misc.decompress(compressed_fn, fn_only=True) @@ -157694,7 +157733,7 @@ index e5e9ece..57a1a29 100644 if os.path.exists(db_un_fn): if skip_old_DBMD_check and repo._using_old_MD: return db_un_fn -@@ -285,6 +357,7 @@ class YumRepository(Repository, config.RepoConf): +@@ -285,6 +356,7 @@ class YumRepository(Repository, config.RepoConf): self._grabfunc = None self._grab = None @@ -157702,7 +157741,7 @@ index e5e9ece..57a1a29 100644 def __cmp__(self, other): """ Sort yum repos. by cost, and then by alphanumeric on their id. """ -@@ -431,25 +504,18 @@ class YumRepository(Repository, config.RepoConf): +@@ -431,25 +503,18 @@ class YumRepository(Repository, config.RepoConf): self._proxy_dict = {} # zap it proxy_string = None empty = (None, '_none_', '') @@ -157736,7 +157775,7 @@ index e5e9ece..57a1a29 100644 if proxy_string is not None: self._proxy_dict['http'] = proxy_string -@@ -488,8 +554,20 @@ class YumRepository(Repository, config.RepoConf): +@@ -488,8 +553,20 @@ class YumRepository(Repository, config.RepoConf): copy_local=self.copy_local, reget='simple', **ugopts) @@ -157758,7 +157797,7 @@ index e5e9ece..57a1a29 100644 failure_callback=self.mirror_failure_obj) def _default_grabopts(self, cache=True): -@@ -499,6 +577,7 @@ class YumRepository(Repository, config.RepoConf): +@@ -499,6 +576,7 @@ class YumRepository(Repository, config.RepoConf): 'throttle': self.throttle, 'proxies': self.proxy_dict, 'timeout': self.timeout, @@ -157766,7 +157805,17 @@ index e5e9ece..57a1a29 100644 'http_headers': tuple(self.__headersListFromDict(cache=cache)), 'ssl_verify_peer': self.sslverify, 'ssl_verify_host': self.sslverify, -@@ -751,7 +830,7 @@ class YumRepository(Repository, config.RepoConf): +@@ -531,9 +609,6 @@ class YumRepository(Repository, config.RepoConf): + if os.path.exists(dpath) and os.path.isdir(dpath): + return + +- if self.cache: +- raise Errors.RepoError, "Cannot access repository dir %s" % dpath +- + try: + os.makedirs(dpath, mode=0755) + except OSError, e: +@@ -751,7 +826,7 @@ class YumRepository(Repository, config.RepoConf): def _getFile(self, url=None, relative=None, local=None, start=None, end=None, copy_local=None, checkfunc=None, text=None, reget='simple', @@ -157775,7 +157824,7 @@ index e5e9ece..57a1a29 100644 """retrieve file from the mirrorgroup for the repo relative to local, optionally get range from start to end, also optionally retrieve from a specific baseurl""" -@@ -796,6 +875,16 @@ class YumRepository(Repository, config.RepoConf): +@@ -796,6 +871,16 @@ class YumRepository(Repository, config.RepoConf): except Errors.MediaError, e: verbose_logger.log(logginglevels.DEBUG_2, "Error getting package from media; falling back to url %s" %(e,)) @@ -157792,7 +157841,7 @@ index e5e9ece..57a1a29 100644 if url and scheme != "media": ugopts = self._default_grabopts(cache=cache) ug = URLGrabber(progress_obj = self.callback, -@@ -835,7 +924,8 @@ class YumRepository(Repository, config.RepoConf): +@@ -835,7 +920,8 @@ class YumRepository(Repository, config.RepoConf): reget = reget, checkfunc=checkfunc, http_headers=headers, @@ -157802,7 +157851,7 @@ index e5e9ece..57a1a29 100644 ) except URLGrabError, e: errstr = "failure: %s from %s: %s" % (relative, self.id, e) -@@ -847,7 +937,7 @@ class YumRepository(Repository, config.RepoConf): +@@ -847,7 +933,7 @@ class YumRepository(Repository, config.RepoConf): return result __get = _getFile @@ -157811,7 +157860,7 @@ index e5e9ece..57a1a29 100644 remote = package.relativepath local = package.localPkg() basepath = package.basepath -@@ -864,6 +954,7 @@ class YumRepository(Repository, config.RepoConf): +@@ -864,6 +950,7 @@ class YumRepository(Repository, config.RepoConf): text=text, cache=cache, size=package.size, @@ -157819,7 +157868,7 @@ index e5e9ece..57a1a29 100644 ) def getHeader(self, package, checkfunc = None, reget = 'simple', -@@ -1020,7 +1111,7 @@ class YumRepository(Repository, config.RepoConf): +@@ -1020,7 +1107,7 @@ class YumRepository(Repository, config.RepoConf): if grab_can_fail: return None raise Errors.RepoError, 'Error downloading file %s: %s' % (local, e) @@ -157828,7 +157877,7 @@ index e5e9ece..57a1a29 100644 misc.unlink_f(tfname) if grab_can_fail: return None -@@ -1260,6 +1351,9 @@ class YumRepository(Repository, config.RepoConf): +@@ -1260,6 +1347,9 @@ class YumRepository(Repository, config.RepoConf): return True def _check_db_version(self, mdtype, repoXML=None): @@ -157838,7 +157887,7 @@ index e5e9ece..57a1a29 100644 if repoXML is None: repoXML = self.repoXML if mdtype in repoXML.repoData: -@@ -1277,11 +1371,11 @@ class YumRepository(Repository, config.RepoConf): +@@ -1277,11 +1367,11 @@ class YumRepository(Repository, config.RepoConf): return None if not file_check: @@ -157853,7 +157902,7 @@ index e5e9ece..57a1a29 100644 if not os.path.exists(local): local = misc.decompress(local, fn_only=True) compressed = True -@@ -1302,6 +1396,17 @@ class YumRepository(Repository, config.RepoConf): +@@ -1302,6 +1392,17 @@ class YumRepository(Repository, config.RepoConf): into the delete list, this means metadata can change filename without us leaking it. """ @@ -157871,7 +157920,7 @@ index e5e9ece..57a1a29 100644 def _mdtype_eq(omdtype, odata, nmdtype, ndata): """ Check if two returns from _get_mdtype_data() are equal. """ if ndata is None: -@@ -1333,8 +1438,7 @@ class YumRepository(Repository, config.RepoConf): +@@ -1333,8 +1434,7 @@ class YumRepository(Repository, config.RepoConf): # Inited twice atm. ... sue me self._oldRepoMDData['new_MD_files'] = [] @@ -157881,7 +157930,7 @@ index e5e9ece..57a1a29 100644 for mdtype in all_mdtypes: (nmdtype, ndata) = self._get_mdtype_data(mdtype) -@@ -1371,43 +1475,16 @@ class YumRepository(Repository, config.RepoConf): +@@ -1371,43 +1471,16 @@ class YumRepository(Repository, config.RepoConf): # No old repomd data, but we might still have uncompressed MD if self._groupCheckDataMDValid(ndata, nmdtype, mdtype): continue @@ -157896,7 +157945,9 @@ index e5e9ece..57a1a29 100644 - if len(downloading_with_size) == 1: - downloading_no_size.extend(downloading_with_size) - downloading_with_size = [] -- ++ def _commonRetrieveDataMD_done(self, downloading): ++ """ Uncompress the downloaded metadata """ + - remote_size = 0 - local_size = 0 - for (ndata, nmdtype) in downloading_with_size: # Get total size... @@ -157913,9 +157964,7 @@ index e5e9ece..57a1a29 100644 - if not self._retrieveMD(nmdtype, retrieve_can_fail=True): - self._revertOldRepoXML() - return False -+ def _commonRetrieveDataMD_done(self, downloading): -+ """ Uncompress the downloaded metadata """ - +- - for (ndata, nmdtype) in downloading_with_size + downloading_no_size: + for (ndata, nmdtype) in downloading: local = self._get_mdtype_fname(ndata, False) @@ -157930,7 +157979,7 @@ index e5e9ece..57a1a29 100644 def _groupLoadRepoXML(self, text=None, mdtypes=None): """ Retrieve the new repomd.xml from the repository, then check it -@@ -1421,7 +1498,7 @@ class YumRepository(Repository, config.RepoConf): +@@ -1421,7 +1494,7 @@ class YumRepository(Repository, config.RepoConf): self._commonRetrieveDataMD(mdtypes) def _mdpolicy2mdtypes(self): @@ -157939,7 +157988,7 @@ index e5e9ece..57a1a29 100644 'group:primary' : ['primary'], 'group:small' : ["primary", "updateinfo"], 'group:main' : ["primary", "group", "filelists", -@@ -1436,6 +1513,7 @@ class YumRepository(Repository, config.RepoConf): +@@ -1436,6 +1509,7 @@ class YumRepository(Repository, config.RepoConf): if not mdtypes or 'group:all' in mdtypes: mdtypes = None else: @@ -157947,7 +157996,7 @@ index e5e9ece..57a1a29 100644 mdtypes = sorted(list(mdtypes)) return mdtypes -@@ -1451,12 +1529,7 @@ class YumRepository(Repository, config.RepoConf): +@@ -1451,12 +1525,7 @@ class YumRepository(Repository, config.RepoConf): def _getRepoXML(self): if self._repoXML: return self._repoXML @@ -157961,7 +158010,7 @@ index e5e9ece..57a1a29 100644 return self._repoXML -@@ -1514,7 +1587,7 @@ class YumRepository(Repository, config.RepoConf): +@@ -1514,7 +1583,7 @@ class YumRepository(Repository, config.RepoConf): return self._checkMD(fn, mdtype, openchecksum) def _checkMD(self, fn, mdtype, openchecksum=False, @@ -157970,7 +158019,7 @@ index e5e9ece..57a1a29 100644 """ Internal function, use .checkMD() from outside yum. """ thisdata = data # So the argument name is nicer -@@ -1537,6 +1610,18 @@ class YumRepository(Repository, config.RepoConf): +@@ -1537,6 +1606,18 @@ class YumRepository(Repository, config.RepoConf): if size is not None: size = int(size) @@ -157989,7 +158038,7 @@ index e5e9ece..57a1a29 100644 try: # get the local checksum l_csum = self._checksum(r_ctype, file, datasize=size) except Errors.RepoError, e: -@@ -1551,15 +1636,13 @@ class YumRepository(Repository, config.RepoConf): +@@ -1551,15 +1632,13 @@ class YumRepository(Repository, config.RepoConf): return None raise URLGrabError(-1, 'Metadata file does not match checksum') @@ -158006,9 +158055,29 @@ index e5e9ece..57a1a29 100644 """ Internal function, use .retrieveMD() from outside yum. """ # Note that this can raise Errors.RepoMDError if mdtype doesn't exist # for this repo. -@@ -1597,7 +1680,9 @@ class YumRepository(Repository, config.RepoConf): - return local # it's the same return the local one +@@ -1575,6 +1654,12 @@ class YumRepository(Repository, config.RepoConf): + # got it, move along + return local ++ if (os.path.exists(local) or ++ self._preload_md_from_system_cache(os.path.basename(local))): ++ if self._checkMD(local, mdtype, check_can_fail=True): ++ self.retrieved[mdtype] = 1 ++ return local # it's the same return the local one ++ + if self.cache == 1: + if os.path.exists(local): + try: +@@ -1590,14 +1675,10 @@ class YumRepository(Repository, config.RepoConf): + "Caching enabled but no local cache of %s from %s" % (local, + self) + +- if (os.path.exists(local) or +- self._preload_md_from_system_cache(os.path.basename(local))): +- if self._checkMD(local, mdtype, check_can_fail=True): +- self.retrieved[mdtype] = 1 +- return local # it's the same return the local one +- try: - checkfunc = (self.checkMD, (mdtype,), {}) + def checkfunc(obj): @@ -158017,7 +158086,7 @@ index e5e9ece..57a1a29 100644 text = "%s/%s" % (self.id, mdtype) if thisdata.size is None: reget = None -@@ -1613,8 +1698,9 @@ class YumRepository(Repository, config.RepoConf): +@@ -1613,8 +1694,9 @@ class YumRepository(Repository, config.RepoConf): checkfunc=checkfunc, text=text, cache=self.http_caching == 'all', @@ -158029,7 +158098,7 @@ index e5e9ece..57a1a29 100644 if retrieve_can_fail: return None raise -@@ -1624,7 +1710,6 @@ class YumRepository(Repository, config.RepoConf): +@@ -1624,7 +1706,6 @@ class YumRepository(Repository, config.RepoConf): raise Errors.RepoError, \ "Could not retrieve %s matching remote checksum from %s" % (local, self) else: diff --git a/yum.spec b/yum.spec index aac80d8..8ba36c5 100644 --- a/yum.spec +++ b/yum.spec @@ -18,7 +18,7 @@ Summary: RPM package installer/updater/manager Name: yum Version: 3.4.3 -Release: 27%{?dist} +Release: 28%{?dist} License: GPLv2+ Group: System Environment/Base Source0: http://yum.baseurl.org/download/3.4/%{name}-%{version}.tar.gz @@ -313,6 +313,12 @@ exit 0 %endif %changelog +* Thu Jun 14 2012 Zdenek Pavlas - 3.4.3-28 +- update to latest HEAD. +- No async downloading when --cacheonly. BZ 830523 +- misc.decompress(): compare mtime without sub second precision. BZ 831918 +- preload_from_sys to user dir with --cacheonly, BZ 830523 + * Fri Jun 8 2012 James Antill - 3.4.3-27 - update to latest HEAD. - Fix for ppc64p7 detection.