From d558477ebefe7f44f76e0bf2260ce932e9f04900 Mon Sep 17 00:00:00 2001 From: James Antill Date: Jun 03 2013 15:24:39 +0000 Subject: update to latest HEAD. - Workaround anaconda passing None as group name. BZ 959710. - Fix second part of igrp as grp problems. BZ 955236. - Add a fuzzy matcher for numbers in format_missing_requires. BZ 718245. - Hide the "downloadonly" option when nothing to download. - Add the "minrate" option. BZ 964298 --- diff --git a/yum-HEAD.patch b/yum-HEAD.patch index 84dd86e..6d2adae 100644 --- a/yum-HEAD.patch +++ b/yum-HEAD.patch @@ -99,7 +99,7 @@ index 2f6154e..2e5a052 100644 diff --git a/cli.py b/cli.py old mode 100644 new mode 100755 -index 6056d38..8c61ffd +index 6056d38..ba98058 --- a/cli.py +++ b/cli.py @@ -25,7 +25,7 @@ import sys @@ -381,7 +381,7 @@ index 6056d38..8c61ffd # at this point we know the args are valid - we don't know their meaning # but we know we're not being sent garbage -@@ -435,14 +511,30 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -435,14 +511,39 @@ class YumBaseCli(yum.YumBase, output.YumOutput): try: self._getTs(needTsRemove) except yum.Errors.YumBaseError, e: @@ -408,15 +408,24 @@ index 6056d38..8c61ffd + occurred in the pre-transaction checks + """ + def _downloadonly_userconfirm(self): ++ # Note that we shouldn't just remove the 'd' option, or the options ++ # yum accepts will be different which is bad. So always accept it, ++ # but change the prompt. ++ dl_only = extra={'downloadonly' : ++ (u'd', _('d'), _('download'), ++ _('downloadonly'))} ++ if not stuff_to_download: ++ ret = self.userconfirm(extra=dl_only) ++ if ret == 'downloadonly': ++ ret = None ++ return ret + return self.userconfirm(prompt=_('Is this ok [y/d/N]: '), -+ extra={'downloadonly' : -+ (u'd', _('d'), _('download'), -+ _('downloadonly'))}) ++ extra=dl_only) + # just make sure there's not, well, nothing to do if len(self.tsInfo) == 0: self.verbose_logger.info(_('Trying to run the transaction but nothing to do. Exiting.')) -@@ -453,7 +545,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -453,7 +554,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput): lsts = self.listTransaction() if self.verbose_logger.isEnabledFor(yum.logginglevels.INFO_1): self.verbose_logger.log(yum.logginglevels.INFO_1, lsts) @@ -425,7 +434,7 @@ index 6056d38..8c61ffd # If we are in quiet, and assumeyes isn't on we want to output # at least the transaction list anyway. self.logger.warn(lsts) -@@ -463,7 +555,6 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -463,7 +564,6 @@ class YumBaseCli(yum.YumBase, output.YumOutput): rmpkgs = [] stuff_to_download = False install_only = True @@ -433,7 +442,7 @@ index 6056d38..8c61ffd for txmbr in self.tsInfo.getMembers(): if txmbr.ts_state not in ('i', 'u'): install_only = False -@@ -471,7 +562,6 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -471,7 +571,6 @@ class YumBaseCli(yum.YumBase, output.YumOutput): if po: rmpkgs.append(po) else: @@ -441,7 +450,7 @@ index 6056d38..8c61ffd stuff_to_download = True po = txmbr.po if po: -@@ -489,19 +579,40 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -489,19 +588,40 @@ class YumBaseCli(yum.YumBase, output.YumOutput): else: self.reportDownloadSize(downloadpkgs, install_only) @@ -487,7 +496,7 @@ index 6056d38..8c61ffd for key in problems: errors = yum.misc.unique(problems[key]) for error in errors: -@@ -520,8 +631,9 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -520,8 +640,9 @@ class YumBaseCli(yum.YumBase, output.YumOutput): rcd_st = time.time() self.verbose_logger.log(yum.logginglevels.INFO_2, @@ -498,7 +507,7 @@ index 6056d38..8c61ffd if msgs: rpmlib_only = True for msg in msgs: -@@ -532,21 +644,23 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -532,21 +653,23 @@ class YumBaseCli(yum.YumBase, output.YumOutput): print _("ERROR You need to update rpm to handle:") else: print _('ERROR with transaction check vs depsolve:') @@ -527,7 +536,7 @@ index 6056d38..8c61ffd self.ts.order() # order the transaction self.ts.clean() # release memory not needed beyond this point -@@ -556,16 +670,16 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -556,16 +679,16 @@ class YumBaseCli(yum.YumBase, output.YumOutput): del testcb if len(tserrors) > 0: @@ -547,7 +556,7 @@ index 6056d38..8c61ffd # unset the sigquit handler signal.signal(signal.SIGQUIT, signal.SIG_DFL) -@@ -595,7 +709,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -595,7 +718,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput): if self.conf.debuglevel < 2: cb.display.output = False @@ -556,7 +565,7 @@ index 6056d38..8c61ffd resultobject = self.runTransaction(cb=cb) self.verbose_logger.debug('Transaction time: %0.3f' % (time.time() - ts_st)) -@@ -609,12 +723,14 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -609,12 +732,14 @@ class YumBaseCli(yum.YumBase, output.YumOutput): return resultobject.return_code def gpgsigcheck(self, pkgs): @@ -576,7 +585,7 @@ index 6056d38..8c61ffd for po in pkgs: result, errmsg = self.sigCheckPkg(po) -@@ -623,7 +739,8 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -623,7 +748,8 @@ class YumBaseCli(yum.YumBase, output.YumOutput): continue elif result == 1: @@ -586,7 +595,7 @@ index 6056d38..8c61ffd raise yum.Errors.YumBaseError, \ _('Refusing to automatically import keys when running ' \ 'unattended.\nUse "-y" to override.') -@@ -691,12 +808,62 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -691,12 +817,62 @@ class YumBaseCli(yum.YumBase, output.YumOutput): ", ".join(matches)) self.verbose_logger.log(yum.logginglevels.INFO_2, msg) @@ -655,7 +664,7 @@ index 6056d38..8c61ffd # get the list of available packages # iterate over the user's list # add packages to Transaction holding class if they match. -@@ -710,11 +877,36 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -710,11 +886,36 @@ class YumBaseCli(yum.YumBase, output.YumOutput): for arg in userlist: if (arg.endswith('.rpm') and (yum.misc.re_remote_url(arg) or os.path.exists(arg))): @@ -694,7 +703,7 @@ index 6056d38..8c61ffd except yum.Errors.InstallError: self.verbose_logger.log(yum.logginglevels.INFO_2, _('No package %s%s%s available.'), -@@ -723,6 +915,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -723,6 +924,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput): self._maybeYouMeant(arg) else: done = True @@ -702,7 +711,7 @@ index 6056d38..8c61ffd if len(self.tsInfo) > oldcount: change = len(self.tsInfo) - oldcount return 2, [P_('%d package to install', '%d packages to install', change) % change] -@@ -732,9 +925,27 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -732,9 +934,27 @@ class YumBaseCli(yum.YumBase, output.YumOutput): return 0, [_('Nothing to do')] def updatePkgs(self, userlist, quiet=0, update_to=False): @@ -733,7 +742,7 @@ index 6056d38..8c61ffd # if there is no userlist, then do global update below # this is probably 90% of the calls # if there is a userlist then it's for updating pkgs, not obsoleting -@@ -745,34 +956,46 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -745,34 +965,46 @@ class YumBaseCli(yum.YumBase, output.YumOutput): else: # go through the userlist - look for items that are local rpms. If we find them @@ -797,7 +806,7 @@ index 6056d38..8c61ffd level = 'diff' if userlist and userlist[0] in ('full', 'diff', 'different'): -@@ -831,6 +1054,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -831,6 +1063,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput): continue nayi = napkg.yumdb_info @@ -805,7 +814,7 @@ index 6056d38..8c61ffd for apkg in self.pkgSack.searchPkgTuple(napkg.pkgtup): if ('checksum_type' in nayi and 'checksum_data' in nayi and -@@ -861,19 +1085,58 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -861,19 +1094,58 @@ class YumBaseCli(yum.YumBase, output.YumOutput): dupdates.extend(self.downgrade(name=n, epoch=e, ver=v, rel=r)) if dupdates: @@ -872,7 +881,7 @@ index 6056d38..8c61ffd if not rms: self._checkMaybeYouMeant(arg, always_output=False, rpmdb_only=True) all_rms.extend(rms) -@@ -884,12 +1147,24 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -884,12 +1156,24 @@ class YumBaseCli(yum.YumBase, output.YumOutput): return 0, [_('No Packages marked for removal')] def downgradePkgs(self, userlist): @@ -900,7 +909,7 @@ index 6056d38..8c61ffd for arg in userlist: if (arg.endswith('.rpm') and (yum.misc.re_remote_url(arg) or os.path.exists(arg))): -@@ -905,26 +1180,44 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -905,26 +1189,44 @@ class YumBaseCli(yum.YumBase, output.YumOutput): self.term.MODE['bold'], arg, self.term.MODE['normal']) self._maybeYouMeant(arg) @@ -949,7 +958,7 @@ index 6056d38..8c61ffd except yum.Errors.ReinstallRemoveError: self._checkMaybeYouMeant(arg, always_output=False) except yum.Errors.ReinstallInstallError, e: -@@ -940,22 +1233,38 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -940,22 +1242,38 @@ class YumBaseCli(yum.YumBase, output.YumOutput): except yum.Errors.ReinstallError, e: assert False, "Shouldn't happen, but just in case" self.verbose_logger.log(yum.logginglevels.INFO_2, e) @@ -992,7 +1001,7 @@ index 6056d38..8c61ffd installing = False for pkg in filelist: -@@ -971,23 +1280,29 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -971,23 +1289,29 @@ class YumBaseCli(yum.YumBase, output.YumOutput): return 2, [_('Package(s) to install')] return 0, [_('Nothing to do')] @@ -1038,7 +1047,7 @@ index 6056d38..8c61ffd pkgnarrow = 'all' done_hidden_available = False -@@ -1003,7 +1318,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -1003,7 +1327,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput): pkgnarrow = extcmds.pop(0) ypl = self.doPackageLists(pkgnarrow=pkgnarrow, patterns=extcmds, @@ -1047,7 +1056,7 @@ index 6056d38..8c61ffd if self.conf.showdupesfromrepos: ypl.available += ypl.reinstall_available -@@ -1017,8 +1332,25 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -1017,8 +1341,25 @@ class YumBaseCli(yum.YumBase, output.YumOutput): return ypl def search(self, args): @@ -1075,7 +1084,7 @@ index 6056d38..8c61ffd # call the yum module search function with lists of tags to search # and what to search for -@@ -1053,7 +1385,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -1053,7 +1394,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput): print "" else: mkeys = set(keys) @@ -1084,7 +1093,7 @@ index 6056d38..8c61ffd okeys = keys pos.add(po) akeys.update(keys) -@@ -1104,13 +1436,24 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -1104,13 +1445,24 @@ class YumBaseCli(yum.YumBase, output.YumOutput): self.logger.warning(_('Warning: No matches found for: %s'), arg) if not akeys: @@ -1112,7 +1121,7 @@ index 6056d38..8c61ffd pkgs = [] for arg in args: if (arg.endswith('.rpm') and (yum.misc.re_remote_url(arg) or -@@ -1118,10 +1461,12 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -1118,10 +1470,12 @@ class YumBaseCli(yum.YumBase, output.YumOutput): thispkg = yum.packages.YumUrlPackage(self, self.ts, arg) pkgs.append(thispkg) elif self.conf.showdupesfromrepos: @@ -1127,7 +1136,7 @@ index 6056d38..8c61ffd except yum.Errors.PackageSackError: pass -@@ -1131,10 +1476,19 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -1131,10 +1485,19 @@ class YumBaseCli(yum.YumBase, output.YumOutput): return 0, [] def provides(self, args): @@ -1151,7 +1160,7 @@ index 6056d38..8c61ffd old_sdup = self.conf.showdupesfromrepos # For output, as searchPackageProvides() is always in showdups mode self.conf.showdupesfromrepos = True -@@ -1147,6 +1501,8 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -1147,6 +1510,8 @@ class YumBaseCli(yum.YumBase, output.YumOutput): paths = set(sys.path + os.environ['PATH'].split(':')) nargs = [] for arg in args: @@ -1160,7 +1169,7 @@ index 6056d38..8c61ffd if yum.misc.re_filename(arg) or yum.misc.re_glob(arg): continue for path in paths: -@@ -1158,25 +1514,82 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -1158,25 +1523,82 @@ class YumBaseCli(yum.YumBase, output.YumOutput): self.conf.showdupesfromrepos = old_sdup if len(matching) == 0: @@ -1249,7 +1258,7 @@ index 6056d38..8c61ffd hdrcode = pkgcode = xmlcode = dbcode = expccode = 0 pkgresults = hdrresults = xmlresults = dbresults = expcresults = [] msg = self.fmtKeyValFill(_('Cleaning repos: '), -@@ -1184,7 +1597,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -1184,7 +1606,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput): self.verbose_logger.log(yum.logginglevels.INFO_2, msg) if 'all' in userlist: self.verbose_logger.log(yum.logginglevels.INFO_2, @@ -1258,7 +1267,7 @@ index 6056d38..8c61ffd pkgcode, pkgresults = self.cleanPackages() hdrcode, hdrresults = self.cleanHeaders() xmlcode, xmlresults = self.cleanMetadata() -@@ -1200,10 +1613,10 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -1200,10 +1622,10 @@ class YumBaseCli(yum.YumBase, output.YumOutput): return code, [] if 'headers' in userlist: @@ -1271,7 +1280,7 @@ index 6056d38..8c61ffd pkgcode, pkgresults = self.cleanPackages() if 'metadata' in userlist: self.logger.debug(_('Cleaning up xml metadata')) -@@ -1228,138 +1641,265 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -1228,138 +1650,265 @@ class YumBaseCli(yum.YumBase, output.YumOutput): return code, [] def returnGroupLists(self, userlist): @@ -1619,7 +1628,7 @@ index 6056d38..8c61ffd continue if not pkgs_used: -@@ -1368,17 +1908,61 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -1368,17 +1917,61 @@ class YumBaseCli(yum.YumBase, output.YumOutput): return 2, [P_('%d package to Install', '%d packages to Install', len(pkgs_used)) % len(pkgs_used)] def removeGroups(self, grouplist): @@ -1689,7 +1698,7 @@ index 6056d38..8c61ffd if not pkgs_used: return 0, [_('No packages to remove from groups')] -@@ -1389,7 +1973,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -1389,7 +1982,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput): def _promptWanted(self): # shortcut for the always-off/always-on options @@ -1698,7 +1707,7 @@ index 6056d38..8c61ffd return False if self.conf.alwaysprompt: return True -@@ -1397,10 +1981,9 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -1397,10 +1990,9 @@ class YumBaseCli(yum.YumBase, output.YumOutput): # prompt if: # package was added to fill a dependency # package is being removed @@ -1710,7 +1719,7 @@ index 6056d38..8c61ffd txmbr.name not in self.extcmds: return True -@@ -1408,11 +1991,11 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -1408,11 +2000,11 @@ class YumBaseCli(yum.YumBase, output.YumOutput): return False def usage(self): @@ -1724,7 +1733,7 @@ index 6056d38..8c61ffd sys.stdout.write(self.optparser.get_usage()) def _installable(self, pkg, ematch=False): -@@ -1468,9 +2051,9 @@ class YumBaseCli(yum.YumBase, output.YumOutput): +@@ -1468,9 +2060,9 @@ class YumBaseCli(yum.YumBase, output.YumOutput): return False class YumOptionParser(OptionParser): @@ -1736,7 +1745,7 @@ index 6056d38..8c61ffd def __init__(self,base, **kwargs): # check if this is called with a utils=True/False parameter -@@ -1488,13 +2071,23 @@ class YumOptionParser(OptionParser): +@@ -1488,13 +2080,23 @@ class YumOptionParser(OptionParser): self._addYumBasicOptions() def error(self, msg): @@ -1762,7 +1771,7 @@ index 6056d38..8c61ffd try: args = _filtercmdline( ('--noplugins','--version','-q', '-v', "--quiet", "--verbose"), -@@ -1521,7 +2114,15 @@ class YumOptionParser(OptionParser): +@@ -1521,7 +2123,15 @@ class YumOptionParser(OptionParser): return ret def setupYumConfig(self, args=None): @@ -1779,7 +1788,7 @@ index 6056d38..8c61ffd if not args: (opts, cmds) = self.parse_args() else: -@@ -1533,16 +2134,30 @@ class YumOptionParser(OptionParser): +@@ -1533,16 +2143,30 @@ class YumOptionParser(OptionParser): try: # config file is parsed and moving us forward # set some things in it. @@ -1816,7 +1825,7 @@ index 6056d38..8c61ffd self.base.conf.cache = 1 if opts.obsoletes: -@@ -1610,10 +2225,6 @@ class YumOptionParser(OptionParser): +@@ -1610,10 +2234,6 @@ class YumOptionParser(OptionParser): self.base.usage() sys.exit(1) @@ -1827,7 +1836,7 @@ index 6056d38..8c61ffd # Disable all gpg key checking, if requested. if opts.nogpgcheck: # Altering the normal configs. doesn't work too well, esp. with -@@ -1623,7 +2234,7 @@ class YumOptionParser(OptionParser): +@@ -1623,7 +2243,7 @@ class YumOptionParser(OptionParser): repo._override_sigchecks = True except ValueError, e: @@ -1836,7 +1845,7 @@ index 6056d38..8c61ffd self.base.usage() sys.exit(1) -@@ -1640,10 +2251,18 @@ class YumOptionParser(OptionParser): +@@ -1640,10 +2260,18 @@ class YumOptionParser(OptionParser): sys.exit(1) def getRoot(self,opts): @@ -1856,7 +1865,7 @@ index 6056d38..8c61ffd if os.access(opts.installroot+'/'+opts.conffile, os.R_OK): opts.conffile = opts.installroot+'/'+opts.conffile elif opts.conffile == '/etc/yum/yum.conf': -@@ -1701,6 +2320,9 @@ class YumOptionParser(OptionParser): +@@ -1701,6 +2329,9 @@ class YumOptionParser(OptionParser): group.add_option("--showduplicates", dest="showdupesfromrepos", action="store_true", help=_("show duplicates, in repos, in list/search commands")) @@ -1866,7 +1875,7 @@ index 6056d38..8c61ffd group.add_option("-e", "--errorlevel", dest="errorlevel", default=None, help=_("error output level"), type='int', metavar='[error level]') -@@ -1713,6 +2335,10 @@ class YumOptionParser(OptionParser): +@@ -1713,6 +2344,10 @@ class YumOptionParser(OptionParser): help=_("verbose operation")) group.add_option("-y", "--assumeyes", dest="assumeyes", action="store_true", help=_("answer yes for all questions")) @@ -1877,7 +1886,7 @@ index 6056d38..8c61ffd group.add_option("--version", action="store_true", help=_("show Yum version and exit")) group.add_option("--installroot", help=_("set install root"), -@@ -1748,9 +2374,29 @@ class YumOptionParser(OptionParser): +@@ -1748,9 +2383,29 @@ class YumOptionParser(OptionParser): help=_("control whether color is used")) group.add_option("", "--releasever", dest="releasever", default=None, help=_("set value of $releasever in yum config and repo files")) @@ -3265,7 +3274,7 @@ index 1a8202a..76bbdd5 100644 List the packages installed on the system that are obsoleted by packages in any yum repository listed in the config file. diff --git a/docs/yum.conf.5 b/docs/yum.conf.5 -index 515aa73..66129bd 100644 +index 515aa73..eccfa38 100644 --- a/docs/yum.conf.5 +++ b/docs/yum.conf.5 @@ -114,15 +114,27 @@ are causing problems from the transaction. @@ -3398,7 +3407,20 @@ index 515aa73..66129bd 100644 .IP \fBtsflags\fR -@@ -300,6 +364,40 @@ with the \fBthrottle\fR option (above). If \fBthrottle\fR is a percentage and +@@ -292,6 +356,12 @@ the maximum available bandwidth. + Set to `0' to disable bandwidth throttling. This is the default. + + .IP ++\fBminrate \fR ++This sets the low speed threshold in bytes per second. If the server ++is sending data slower than this for at least `timeout' seconds, Yum ++aborts the connection. The default is `1000'. ++ ++.IP + \fBbandwidth \fR + Use to specify the maximum available network bandwidth in bytes/second. Used + with the \fBthrottle\fR option (above). If \fBthrottle\fR is a percentage and +@@ -300,6 +370,40 @@ with the \fBthrottle\fR option (above). If \fBthrottle\fR is a percentage and ignored. Default is `0' (no bandwidth throttling). .IP @@ -3439,7 +3461,7 @@ index 515aa73..66129bd 100644 \fBsslcacert \fR Path to the directory containing the databases of the certificate authorities yum should use to verify SSL certificates. Defaults to none - uses system -@@ -331,6 +429,15 @@ Path to the SSL client key yum should use to connect to repos/remote sites +@@ -331,6 +435,15 @@ Path to the SSL client key yum should use to connect to repos/remote sites Defaults to none. .IP @@ -3455,7 +3477,7 @@ index 515aa73..66129bd 100644 \fBhistory_record \fR Boolean - should yum record history entries for transactions. This takes some disk space, and some extra time in the transactions. But it allows how to know a -@@ -438,6 +545,31 @@ It's also possible to use the word "never", meaning that the metadata will +@@ -438,6 +551,31 @@ It's also possible to use the word "never", meaning that the metadata will never expire. Note that when using a metalink file the metalink must always be newer than the metadata for the repository, due to the validation, so this timeout also applies to the metalink file. @@ -3487,7 +3509,7 @@ index 515aa73..66129bd 100644 .IP \fBmirrorlist_expire \fR -@@ -480,6 +612,19 @@ not listed above is the other metadata, which contains the changelog information +@@ -480,6 +618,19 @@ not listed above is the other metadata, which contains the changelog information which is used by yum-changelog. This is what "yum makecache" uses. .IP @@ -3498,7 +3520,7 @@ index 515aa73..66129bd 100644 +faster, once they are downloaded. However these files tend to be bigger, and +thus. take longer to download. + -+`sqlite' - Download the .XML files, which yum will do anyway as a fallback on ++`xml' - Download the .XML files, which yum will do anyway as a fallback on +the other options. These files tend to be smaller, but they require +parsing/converting locally after download and some aditional checks are +performed on them each time they are used. @@ -3507,7 +3529,35 @@ index 515aa73..66129bd 100644 \fBmultilib_policy \fR Can be set to 'all' or 'best'. All means install all possible arches for any package you want to install. Therefore yum install foo will install foo.i386 and foo.x86_64 on x86_64, -@@ -587,14 +732,65 @@ be downloaded. The updates list is what is printed when you run "yum update", +@@ -523,6 +674,13 @@ Default is `normal'. + See color_list_installed_older for possible values. + + .IP ++\fBcolor_list_installed_running_kernel \fR ++The colorization/highlighting for kernel packages in list/info installed which ++is the same version as the running kernel. ++Default is `bold,underline. ++See color_list_installed_older for possible values. ++ ++.IP + \fBcolor_list_installed_extra \fR + The colorization/highlighting for packages in list/info installed which has + no available package with the same name and arch. +@@ -558,6 +716,13 @@ Default is `bold,underline,green. + See color_list_installed_older for possible values. + + .IP ++\fBcolor_list_available_running_kernel \fR ++The colorization/highlighting for kernel packages in list/info available which ++is the same version as the running kernel. ++Default is `bold,underline. ++See color_list_installed_older for possible values. ++ ++.IP + \fBcolor_search_match \fR + The colorization/highlighting for text matches in search. + Default is `bold'. +@@ -587,14 +752,65 @@ be downloaded. The updates list is what is printed when you run "yum update", Default is `normal'. See color_list_installed_older for possible values. @@ -3529,15 +3579,15 @@ index 515aa73..66129bd 100644 +\fBupgrade_requirements_on_install \fR +When installing/reinstalling/upgrading packages go through each package's +installed dependencies and check for an update. - Boolean (1, 0, True, False, yes,no) Defaults to False - ++Boolean (1, 0, True, False, yes,no) Defaults to False ++ +.IP +\fBrecheck_installed_requires \fR +When upgrading a package do we recheck any requirements that existed in the old +package. Turning this on shouldn't do anything but slow yum depsolving down, +however using rpm --nodeps etc. can break the rpmdb and then this will help. -+Boolean (1, 0, True, False, yes,no) Defaults to False -+ + Boolean (1, 0, True, False, yes,no) Defaults to False + +.IP +\fBreset_nice \fR +If set to true then yum will try to reset the nice value to zero, before @@ -3573,7 +3623,7 @@ index 515aa73..66129bd 100644 .SH "[repository] OPTIONS" -@@ -702,12 +898,18 @@ key will be automatically imported without user confirmation. +@@ -702,12 +918,18 @@ key will be automatically imported without user confirmation. Same as the [main] \fBexclude\fR option but only for this repository. Substitution variables, described below, are honored here. @@ -3596,7 +3646,7 @@ index 515aa73..66129bd 100644 .IP \fBenablegroups\fR -@@ -755,6 +957,16 @@ repository. +@@ -755,6 +977,16 @@ repository. Overrides the \fBbandwidth\fR option from the [main] section for this repository. @@ -3613,7 +3663,7 @@ index 515aa73..66129bd 100644 .IP \fBsslcacert \fR -@@ -776,6 +988,10 @@ repository. +@@ -776,6 +1008,10 @@ repository. Overrides the \fBsslclientkey\fR option from the [main] section for this repository. @@ -3624,7 +3674,7 @@ index 515aa73..66129bd 100644 .IP \fBmetadata_expire \fR -@@ -783,6 +999,11 @@ Overrides the \fBmetadata_expire\fR option from the [main] section for this +@@ -783,6 +1019,11 @@ Overrides the \fBmetadata_expire\fR option from the [main] section for this repository. .IP @@ -3636,17 +3686,17 @@ index 515aa73..66129bd 100644 \fBmirrorlist_expire \fR Overrides the \fBmirrorlist_expire\fR option from the [main] section for this repository. -@@ -824,7 +1045,16 @@ as greater/less than any other. defaults to 1000 +@@ -824,7 +1065,16 @@ as greater/less than any other. defaults to 1000 If set to True yum will continue running if this repository cannot be contacted for any reason. This should be set carefully as all repos are consulted for any given command. Defaults to False. + -+.IP + .IP +\fBasync \fR +If set to True Yum will download packages and metadata from this repo in +parallel, if possible. Defaults to True. + - .IP ++.IP +\fBui_repoid_vars \fR +Overrides the \fBui_repoid_vars\fR option from the [main] section for this +repository. @@ -4534,7 +4584,7 @@ index f1e06e8..b319963 100644 complete -F _yum -o filenames yum yummain.py diff --git a/output.py b/output.py -index b6aa277..6b9e9e2 100755 +index b6aa277..38449bb 100755 --- a/output.py +++ b/output.py @@ -1,6 +1,6 @@ @@ -5646,16 +5696,16 @@ index b6aa277..6b9e9e2 100755 def interrupt_callback(self, cbobj): - '''Handle CTRL-C's during downloads +- +- If a CTRL-C occurs a URLGrabError will be raised to push the download +- onto the next mirror. +- +- If two CTRL-C's occur in quick succession then yum will exit. + '''Handle CTRL-C's during downloads. If a CTRL-C occurs a + URLGrabError will be raised to push the download onto the next + mirror. If two CTRL-C's occur in quick succession then yum + will exit. -- If a CTRL-C occurs a URLGrabError will be raised to push the download -- onto the next mirror. -- -- If two CTRL-C's occur in quick succession then yum will exit. -- - @param cbobj: urlgrabber callback obj + :param cbobj: :class:`urlgrabber.grabber.CallbackObject` ''' @@ -5692,10 +5742,10 @@ index b6aa277..6b9e9e2 100755 - """ Shows the user a list of data about the history. """ + """Output a list of information about the history of yum + transactions. -+ + + :param extcmds: list of extra command line arguments + :return: (exit_code, [errors]) - ++ + exit_code is:: + + 0 = we're done, exit @@ -6063,7 +6113,26 @@ index b6aa277..6b9e9e2 100755 needname, needflags, needversion = reqTup yb = self.ayum -@@ -2225,46 +2948,106 @@ class DepSolveProgressCallBack: +@@ -2164,6 +2887,18 @@ class DepSolveProgressCallBack: + done = True + msg += _('\n %s') % yum.misc.prco_tuple_to_string(pkgtup) + if not done: ++ nneedname = needname.translate(None, "0123456789") ++ if nneedname != needname: ++ # Sometimes things change numbers, so compare without. ++ # Eg. libXYZ.so.0() libXYZ.so.1() ++ for pkgtup in pkg.provides: ++ name = pkgtup[0] ++ name = name.translate(None, "0123456789") ++ if name == nneedname: ++ done = True ++ pkgtup = yum.misc.prco_tuple_to_string(pkgtup) ++ msg += _('\n ~%s') % pkgtup ++ if not done: + msg += _('\n Not found') + return msg + +@@ -2225,46 +2960,106 @@ class DepSolveProgressCallBack: return msg def procConflict(self, name, confname): @@ -6175,7 +6244,7 @@ index b6aa277..6b9e9e2 100755 def _pkgname_ui(ayum, pkgname, ts_states=None): """ Get more information on a simple pkgname, if we can. We need to search -@@ -2316,10 +3099,7 @@ def _pkgname_ui(ayum, pkgname, ts_states=None): +@@ -2316,10 +3111,7 @@ def _pkgname_ui(ayum, pkgname, ts_states=None): return pkgname class YumCliRPMCallBack(RPMBaseCallback): @@ -6187,7 +6256,7 @@ index b6aa277..6b9e9e2 100755 width = property(lambda x: _term_width()) -@@ -2337,21 +3117,34 @@ class YumCliRPMCallBack(RPMBaseCallback): +@@ -2337,21 +3129,34 @@ class YumCliRPMCallBack(RPMBaseCallback): # Installing things have pkg objects passed to the events, so only need to # lookup for erased/obsoleted. def pkgname_ui(self, pkgname, ts_states=('e', 'od', 'ud', None)): @@ -6232,7 +6301,7 @@ index b6aa277..6b9e9e2 100755 if type(package) not in types.StringTypes: pkgname = str(package) -@@ -2363,9 +3156,25 @@ class YumCliRPMCallBack(RPMBaseCallback): +@@ -2363,9 +3168,25 @@ class YumCliRPMCallBack(RPMBaseCallback): percent = 0 else: percent = (te_current*100L)/te_total @@ -6259,7 +6328,7 @@ index b6aa277..6b9e9e2 100755 pkgname=pkgname, wid1=wid1) msg = fmt % (utf8_width_fill(process, wid1, wid1), utf8_width_fill(pkgname, wid2, wid2)) -@@ -2377,6 +3186,11 @@ class YumCliRPMCallBack(RPMBaseCallback): +@@ -2377,6 +3198,11 @@ class YumCliRPMCallBack(RPMBaseCallback): print " " def scriptout(self, package, msgs): @@ -6271,7 +6340,7 @@ index b6aa277..6b9e9e2 100755 if msgs: sys.stdout.write(to_unicode(msgs)) sys.stdout.flush() -@@ -2396,7 +3210,7 @@ class YumCliRPMCallBack(RPMBaseCallback): +@@ -2396,7 +3222,7 @@ class YumCliRPMCallBack(RPMBaseCallback): pnl = utf8_width(pkgname) overhead = (2 * l) + 2 # Length of done, above @@ -6280,7 +6349,7 @@ index b6aa277..6b9e9e2 100755 overhead += 1 # Space between pn and done overhead += 2 # Ends for progress overhead += 1 # Space for end -@@ -2429,8 +3243,30 @@ class YumCliRPMCallBack(RPMBaseCallback): +@@ -2429,8 +3255,30 @@ class YumCliRPMCallBack(RPMBaseCallback): wid2 = pnl return fmt, wid1, wid2 @@ -186192,7 +186261,7 @@ index c1af4ad..70de539 100644 pass diff --git a/yum/__init__.py b/yum/__init__.py -index 99039e0..8afde56 100644 +index 99039e0..a4b14c0 100644 --- a/yum/__init__.py +++ b/yum/__init__.py @@ -21,6 +21,7 @@ The Yum RPM software updater. @@ -188055,7 +188124,7 @@ index 99039e0..8afde56 100644 self.verbose_logger.log(logginglevels.DEBUG_1, P_('Searching %d package', 'Searching %d packages', len(where)), len(where)) -@@ -2817,25 +3340,160 @@ class YumBase(depsolve.Depsolve): +@@ -2817,25 +3340,168 @@ class YumBase(depsolve.Depsolve): return matches @@ -188078,7 +188147,11 @@ index 99039e0..8afde56 100644 + if group.groupid in self.igroups.groups: + pkg_names = self.igroups.groups[group.groupid].pkg_names + -+ for pkg_name in set(group.packages + list(pkg_names)): ++ all_pkg_names = set(list(pkg_names)) ++ if hasattr(group, 'packages'): # If a comps. group, add remote pkgs. ++ all_pkg_names.update(group.packages) ++ ++ for pkg_name in all_pkg_names: + ipkgs = self.rpmdb.searchNames([pkg_name]) + if pkg_name not in pkg_names and not ipkgs: + ret[pkg_name] = 'available' @@ -188113,7 +188186,11 @@ index 99039e0..8afde56 100644 + grp_names = self.igroups.environments[evgroup.environmentid] + grp_names = grp_names.grp_names + -+ for grp_name in set(evgroup.allgroups + list(grp_names)): ++ all_grp_names = set(list(grp_names)) ++ if hasattr(evgroup, 'allgroups'): # If a comps. evgroup, add remote grps ++ all_grp_names.update(evgroup.allgroups) ++ ++ for grp_name in all_grp_names: + igrp = self.igroups.groups.get(grp_name) + if grp_name not in grp_names and not igrp: + ret[grp_name] = 'available' @@ -188228,7 +188305,7 @@ index 99039e0..8afde56 100644 if uservisible: if grp.user_visible: installed.append(grp) -@@ -2847,34 +3505,98 @@ class YumBase(depsolve.Depsolve): +@@ -2847,34 +3513,98 @@ class YumBase(depsolve.Depsolve): available.append(grp) else: available.append(grp) @@ -188338,7 +188415,7 @@ index 99039e0..8afde56 100644 thesegroups = self.comps.return_groups(grpid) if not thesegroups: raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid) -@@ -2898,13 +3620,58 @@ class YumBase(depsolve.Depsolve): +@@ -2898,13 +3628,58 @@ class YumBase(depsolve.Depsolve): self.tsInfo.remove(txmbr.po.pkgtup) @@ -188404,7 +188481,7 @@ index 99039e0..8afde56 100644 """ if not self.comps.has_group(grpid): -@@ -2920,6 +3687,9 @@ class YumBase(depsolve.Depsolve): +@@ -2920,6 +3695,9 @@ class YumBase(depsolve.Depsolve): if group_package_types: package_types = group_package_types @@ -188414,7 +188491,7 @@ index 99039e0..8afde56 100644 for thisgroup in thesegroups: if thisgroup.selected: continue -@@ -2934,12 +3704,51 @@ class YumBase(depsolve.Depsolve): +@@ -2934,12 +3712,51 @@ class YumBase(depsolve.Depsolve): if 'optional' in package_types: pkgs.extend(thisgroup.optional_packages) @@ -188467,7 +188544,7 @@ index 99039e0..8afde56 100644 except Errors.InstallError, e: self.verbose_logger.debug(_('No package named %s available to be installed'), pkg) -@@ -2953,7 +3762,9 @@ class YumBase(depsolve.Depsolve): +@@ -2953,7 +3770,9 @@ class YumBase(depsolve.Depsolve): group_conditionals = enable_group_conditionals count_cond_test = 0 @@ -188478,7 +188555,7 @@ index 99039e0..8afde56 100644 for condreq, cond in thisgroup.conditional_packages.iteritems(): if self.isPackageInstalled(cond): try: -@@ -2990,17 +3801,23 @@ class YumBase(depsolve.Depsolve): +@@ -2990,17 +3809,23 @@ class YumBase(depsolve.Depsolve): if cond not in self.tsInfo.conditionals: self.tsInfo.conditionals[cond] = [] self.tsInfo.conditionals[cond].extend(pkgs) @@ -188509,7 +188586,7 @@ index 99039e0..8afde56 100644 if not self.comps.has_group(grpid): raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid) -@@ -3008,7 +3825,8 @@ class YumBase(depsolve.Depsolve): +@@ -3008,7 +3833,8 @@ class YumBase(depsolve.Depsolve): thesegroups = self.comps.return_groups(grpid) if not thesegroups: raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid) @@ -188519,7 +188596,7 @@ index 99039e0..8afde56 100644 for thisgroup in thesegroups: thisgroup.selected = False -@@ -3034,13 +3852,102 @@ class YumBase(depsolve.Depsolve): +@@ -3034,13 +3860,102 @@ class YumBase(depsolve.Depsolve): for pkg in self.tsInfo.conditionals.get(txmbr.name, []): self.tsInfo.remove(pkg.pkgtup) @@ -188628,7 +188705,7 @@ index 99039e0..8afde56 100644 # look it up in the self.localPackages first: for po in self.localPackages: if po.pkgtup == pkgtup: -@@ -3049,7 +3956,7 @@ class YumBase(depsolve.Depsolve): +@@ -3049,7 +3964,7 @@ class YumBase(depsolve.Depsolve): pkgs = self.pkgSack.searchPkgTuple(pkgtup) if len(pkgs) == 0: @@ -188637,7 +188714,7 @@ index 99039e0..8afde56 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 +3972,21 @@ class YumBase(depsolve.Depsolve): +@@ -3065,13 +3980,21 @@ class YumBase(depsolve.Depsolve): return result def getInstalledPackageObject(self, pkgtup): @@ -188664,7 +188741,7 @@ index 99039e0..8afde56 100644 raise Errors.RpmDBError, _('Package tuple %s could not be found in rpmdb') % str(pkgtup) # Dito. FIXME from getPackageObject() for len() > 1 ... :) -@@ -3079,9 +3994,11 @@ class YumBase(depsolve.Depsolve): +@@ -3079,9 +4002,11 @@ class YumBase(depsolve.Depsolve): return po def gpgKeyCheck(self): @@ -188678,7 +188755,7 @@ index 99039e0..8afde56 100644 gpgkeyschecked = self.conf.cachedir + '/.gpgkeyschecked.yum' if os.path.exists(gpgkeyschecked): return 1 -@@ -3106,9 +4023,13 @@ class YumBase(depsolve.Depsolve): +@@ -3106,9 +4031,13 @@ class YumBase(depsolve.Depsolve): return 1 def returnPackagesByDep(self, depstring): @@ -188694,7 +188771,7 @@ index 99039e0..8afde56 100644 if not depstring: return [] -@@ -3132,12 +4053,23 @@ class YumBase(depsolve.Depsolve): +@@ -3132,12 +4061,23 @@ class YumBase(depsolve.Depsolve): raise Errors.YumBaseError, _('Invalid version flag from: %s') % str(depstring) depflags = SYMBOLFLAGS[flagsymbol] @@ -188721,7 +188798,7 @@ index 99039e0..8afde56 100644 # we get all sorts of randomness here errstring = depstring if type(depstring) not in types.StringTypes: -@@ -3149,16 +4081,22 @@ class YumBase(depsolve.Depsolve): +@@ -3149,16 +4089,22 @@ class YumBase(depsolve.Depsolve): raise Errors.YumBaseError, _('No Package found for %s') % errstring ps = ListPackageSack(pkglist) @@ -188748,7 +188825,7 @@ index 99039e0..8afde56 100644 if not depstring: return [] -@@ -3182,14 +4120,53 @@ class YumBase(depsolve.Depsolve): +@@ -3182,14 +4128,53 @@ class YumBase(depsolve.Depsolve): raise Errors.YumBaseError, _('Invalid version flag from: %s') % str(depstring) depflags = SYMBOLFLAGS[flagsymbol] @@ -188804,7 +188881,7 @@ index 99039e0..8afde56 100644 if len(pkglist) == 0: -@@ -3198,14 +4175,23 @@ class YumBase(depsolve.Depsolve): +@@ -3198,14 +4183,23 @@ class YumBase(depsolve.Depsolve): if len(pkglist) == 1: return pkglist[0] @@ -188834,7 +188911,7 @@ index 99039e0..8afde56 100644 returnlist = [] compatArchList = self.arch.get_arch_list(arch) multiLib = [] -@@ -3222,9 +4208,9 @@ class YumBase(depsolve.Depsolve): +@@ -3222,9 +4216,9 @@ class YumBase(depsolve.Depsolve): singleLib.append(po) # we now have three lists. find the best package(s) of each @@ -188847,7 +188924,7 @@ index 99039e0..8afde56 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 +4224,7 @@ class YumBase(depsolve.Depsolve): +@@ -3238,7 +4232,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: @@ -188856,7 +188933,7 @@ index 99039e0..8afde56 100644 if best.arch == "noarch": returnlist.append(no) else: -@@ -3246,7 +4232,7 @@ class YumBase(depsolve.Depsolve): +@@ -3246,7 +4240,7 @@ class YumBase(depsolve.Depsolve): if single: returnlist.append(single) # similar for the non-multilib case elif single: @@ -188865,7 +188942,7 @@ index 99039e0..8afde56 100644 if best.arch == "noarch": returnlist.append(no) else: -@@ -3350,28 +4336,58 @@ class YumBase(depsolve.Depsolve): +@@ -3350,28 +4344,58 @@ class YumBase(depsolve.Depsolve): done = True slow = next_func(slow) @@ -188929,7 +189006,7 @@ index 99039e0..8afde56 100644 try: txmbrs = self.groupRemove(group_string) except yum.Errors.GroupsError: -@@ -3387,6 +4403,8 @@ class YumBase(depsolve.Depsolve): +@@ -3387,6 +4411,8 @@ class YumBase(depsolve.Depsolve): assert pattern[0] == '@' grpid = pattern[1:] @@ -188938,7 +189015,7 @@ index 99039e0..8afde56 100644 thesegroups = self.comps.return_groups(grpid) if not thesegroups: raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid) -@@ -3398,7 +4416,11 @@ class YumBase(depsolve.Depsolve): +@@ -3398,7 +4424,11 @@ class YumBase(depsolve.Depsolve): def _minus_deselect(self, pattern): """ Remove things from the transaction, like kickstart. """ assert pattern[0] == '-' @@ -188951,7 +189028,7 @@ index 99039e0..8afde56 100644 if pat and pat[0] == '@': pat = pat[1:] -@@ -3437,14 +4459,87 @@ class YumBase(depsolve.Depsolve): +@@ -3437,14 +4467,87 @@ class YumBase(depsolve.Depsolve): if flag not in self.tsInfo.probFilterFlags: self.tsInfo.probFilterFlags.append(flag) @@ -189045,7 +189122,7 @@ index 99039e0..8afde56 100644 pkgs = [] was_pattern = False if po: -@@ -3464,9 +4559,14 @@ class YumBase(depsolve.Depsolve): +@@ -3464,9 +4567,14 @@ class YumBase(depsolve.Depsolve): if kwargs['pattern'] and kwargs['pattern'][0] == '@': return self._at_groupinstall(kwargs['pattern']) @@ -189060,7 +189137,7 @@ index 99039e0..8afde56 100644 ignore_case=False) pkgs.extend(mypkgs) # if we have anything left unmatched, let's take a look for it -@@ -3477,20 +4577,12 @@ class YumBase(depsolve.Depsolve): +@@ -3477,20 +4585,12 @@ class YumBase(depsolve.Depsolve): self.verbose_logger.debug(_('Checking for virtual provide or file-provide for %s'), arg) @@ -189087,7 +189164,7 @@ index 99039e0..8afde56 100644 else: nevra_dict = self._nevra_kwarg_parse(kwargs) -@@ -3499,6 +4591,8 @@ class YumBase(depsolve.Depsolve): +@@ -3499,6 +4599,8 @@ class YumBase(depsolve.Depsolve): ver=nevra_dict['version'], rel=nevra_dict['release']) self._add_not_found_a(pkgs, nevra_dict) @@ -189096,7 +189173,7 @@ index 99039e0..8afde56 100644 if pkgs: # if was_pattern or nevra-dict['arch'] is none, take the list # of arches based on our multilib_compat config and -@@ -3577,17 +4671,21 @@ class YumBase(depsolve.Depsolve): +@@ -3577,17 +4679,21 @@ class YumBase(depsolve.Depsolve): continue # make sure this shouldn't be passed to update: @@ -189122,7 +189199,7 @@ index 99039e0..8afde56 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 +4698,23 @@ class YumBase(depsolve.Depsolve): +@@ -3600,23 +4706,23 @@ class YumBase(depsolve.Depsolve): already_obs = pkgs[0] if already_obs: @@ -189153,7 +189230,7 @@ index 99039e0..8afde56 100644 continue # make sure we don't have a name.arch of this already installed -@@ -3630,8 +4728,8 @@ class YumBase(depsolve.Depsolve): +@@ -3630,8 +4736,8 @@ class YumBase(depsolve.Depsolve): found = True break if not found: @@ -189164,7 +189241,7 @@ index 99039e0..8afde56 100644 tx_return.extend(txmbrs) continue -@@ -3719,19 +4817,47 @@ class YumBase(depsolve.Depsolve): +@@ -3719,19 +4825,47 @@ class YumBase(depsolve.Depsolve): return txmbr def update(self, po=None, requiringPo=None, update_to=False, **kwargs): @@ -189219,7 +189296,7 @@ index 99039e0..8afde56 100644 tx_return = [] if not po and not kwargs: # update everything (the easy case) self.verbose_logger.log(logginglevels.DEBUG_2, _('Updating Everything')) -@@ -3765,7 +4891,14 @@ class YumBase(depsolve.Depsolve): +@@ -3765,7 +4899,14 @@ class YumBase(depsolve.Depsolve): if new is None: continue tx_return.extend(self.update(po=new)) @@ -189235,7 +189312,7 @@ index 99039e0..8afde56 100644 return tx_return # complications -@@ -3787,13 +4920,16 @@ class YumBase(depsolve.Depsolve): +@@ -3787,13 +4928,16 @@ class YumBase(depsolve.Depsolve): return self._minus_deselect(kwargs['pattern']) if kwargs['pattern'] and kwargs['pattern'][0] == '@': @@ -189254,7 +189331,7 @@ index 99039e0..8afde56 100644 if not instpkgs and not availpkgs: depmatches = [] -@@ -3805,6 +4941,8 @@ class YumBase(depsolve.Depsolve): +@@ -3805,6 +4949,8 @@ class YumBase(depsolve.Depsolve): except yum.Errors.YumBaseError, e: self.logger.critical(_('%s') % e) @@ -189263,7 +189340,7 @@ index 99039e0..8afde56 100644 if update_to: availpkgs.extend(depmatches) else: -@@ -3816,9 +4954,12 @@ class YumBase(depsolve.Depsolve): +@@ -3816,9 +4962,12 @@ class YumBase(depsolve.Depsolve): try: if update_to: m = [] @@ -189277,7 +189354,7 @@ index 99039e0..8afde56 100644 m = self.pkgSack.returnNewestByNameArch(patterns=pats) except Errors.PackageSackError: m = [] -@@ -3843,7 +4984,7 @@ class YumBase(depsolve.Depsolve): +@@ -3843,7 +4992,7 @@ class YumBase(depsolve.Depsolve): availpkgs = self._compare_providers(availpkgs, requiringPo) availpkgs = map(lambda x: x[0], availpkgs) elif not availpkgs: @@ -189286,7 +189363,7 @@ index 99039e0..8afde56 100644 # for any thing specified # get the list of available pkgs matching it (or take the po) -@@ -3879,6 +5020,7 @@ class YumBase(depsolve.Depsolve): +@@ -3879,6 +5028,7 @@ class YumBase(depsolve.Depsolve): if obsoleting_pkg is None: continue obs_pkgs.append(obsoleting_pkg) @@ -189294,7 +189371,7 @@ index 99039e0..8afde56 100644 for obsoleting_pkg in packagesNewestByName(obs_pkgs): tx_return.extend(self.install(po=obsoleting_pkg)) for available_pkg in availpkgs: -@@ -3920,11 +5062,29 @@ class YumBase(depsolve.Depsolve): +@@ -3920,11 +5070,29 @@ class YumBase(depsolve.Depsolve): tx_return.append(txmbr) for available_pkg in availpkgs: @@ -189324,7 +189401,7 @@ index 99039e0..8afde56 100644 self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is obsoleted: %s'), available_pkg) tx_return.extend(self.update(po=obsoleting_pkg)) continue -@@ -3985,11 +5145,18 @@ class YumBase(depsolve.Depsolve): +@@ -3985,11 +5153,18 @@ class YumBase(depsolve.Depsolve): return tx_return def remove(self, po=None, **kwargs): @@ -189348,7 +189425,7 @@ index 99039e0..8afde56 100644 if not po and not kwargs: raise Errors.RemoveError, 'Nothing specified to remove' -@@ -4008,6 +5175,10 @@ class YumBase(depsolve.Depsolve): +@@ -4008,6 +5183,10 @@ class YumBase(depsolve.Depsolve): return self._at_groupremove(kwargs['pattern']) (e,m,u) = self.rpmdb.matchPackageNames([kwargs['pattern']]) @@ -189359,7 +189436,7 @@ index 99039e0..8afde56 100644 pkgs.extend(e) pkgs.extend(m) if u: -@@ -4018,6 +5189,10 @@ class YumBase(depsolve.Depsolve): +@@ -4018,6 +5197,10 @@ class YumBase(depsolve.Depsolve): except yum.Errors.YumBaseError, e: self.logger.critical(_('%s') % e) @@ -189370,7 +189447,7 @@ index 99039e0..8afde56 100644 if not depmatches: arg = to_unicode(arg) self.logger.critical(_('No Match for argument: %s') % to_unicode(arg)) -@@ -4055,17 +5230,19 @@ class YumBase(depsolve.Depsolve): +@@ -4055,17 +5238,19 @@ class YumBase(depsolve.Depsolve): return tx_return def installLocal(self, pkg, po=None, updateonly=False): @@ -189400,7 +189477,7 @@ index 99039e0..8afde56 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 +5360,15 @@ class YumBase(depsolve.Depsolve): +@@ -4183,16 +5368,15 @@ class YumBase(depsolve.Depsolve): return tx_return def reinstallLocal(self, pkg, po=None): @@ -189425,7 +189502,7 @@ index 99039e0..8afde56 100644 if not po: try: po = YumUrlPackage(self, ts=self.rpmdb.readOnlyTS(), url=pkg, -@@ -4215,13 +5391,29 @@ class YumBase(depsolve.Depsolve): +@@ -4215,13 +5399,29 @@ class YumBase(depsolve.Depsolve): return self.reinstall(po=po) def reinstall(self, po=None, **kwargs): @@ -189458,7 +189535,7 @@ index 99039e0..8afde56 100644 tx_mbrs = [] if po: # The po, is the "available" po ... we want the installed po tx_mbrs.extend(self.remove(pkgtup=po.pkgtup)) -@@ -4240,10 +5432,11 @@ class YumBase(depsolve.Depsolve): +@@ -4240,10 +5440,11 @@ class YumBase(depsolve.Depsolve): # pkgs that are obsolete. old_conf_obs = self.conf.obsoletes self.conf.obsoletes = False @@ -189472,7 +189549,7 @@ index 99039e0..8afde56 100644 self.conf.obsoletes = old_conf_obs if len(members) == 0: self.tsInfo.remove(item.pkgtup) -@@ -4259,16 +5452,15 @@ class YumBase(depsolve.Depsolve): +@@ -4259,16 +5460,15 @@ class YumBase(depsolve.Depsolve): return tx_mbrs def downgradeLocal(self, pkg, po=None): @@ -189497,7 +189574,7 @@ index 99039e0..8afde56 100644 if not po: try: po = YumUrlPackage(self, ts=self.rpmdb.readOnlyTS(), url=pkg, -@@ -4309,13 +5501,19 @@ class YumBase(depsolve.Depsolve): +@@ -4309,13 +5509,19 @@ class YumBase(depsolve.Depsolve): return False def downgrade(self, po=None, **kwargs): @@ -189524,7 +189601,7 @@ index 99039e0..8afde56 100644 if not po and not kwargs: raise Errors.DowngradeError, 'Nothing specified to downgrade' -@@ -4397,6 +5595,10 @@ class YumBase(depsolve.Depsolve): +@@ -4397,6 +5603,10 @@ class YumBase(depsolve.Depsolve): # installed version. Indexed fromn the latest installed pkgtup. downgrade_apkgs = {} for pkg in sorted(apkgs): @@ -189535,7 +189612,7 @@ index 99039e0..8afde56 100644 na = (pkg.name, pkg.arch) # Here we allow downgrades from .i386 => .noarch, or .i586 => .i386 -@@ -4421,6 +5623,9 @@ class YumBase(depsolve.Depsolve): +@@ -4421,6 +5631,9 @@ class YumBase(depsolve.Depsolve): warned_nas.add(na) continue @@ -189545,7 +189622,7 @@ index 99039e0..8afde56 100644 if pkg.verGE(lipkg): if na not in warned_nas: msg = _('Only Upgrade available on package: %s') % pkg -@@ -4457,7 +5662,7 @@ class YumBase(depsolve.Depsolve): +@@ -4457,7 +5670,7 @@ class YumBase(depsolve.Depsolve): if e and v and r: evr = '%s:%s-%s' % (e, v, r) elif v and r: @@ -189554,7 +189631,7 @@ index 99039e0..8afde56 100644 elif e and v: evr = '%s:%s' % (e, v) elif v: # e and r etc. is just too weird to print -@@ -4500,12 +5705,24 @@ class YumBase(depsolve.Depsolve): +@@ -4500,12 +5713,24 @@ class YumBase(depsolve.Depsolve): return returndict @@ -189582,7 +189659,7 @@ index 99039e0..8afde56 100644 old_conf_obs = self.conf.obsoletes self.conf.obsoletes = False done = False -@@ -4515,19 +5732,46 @@ class YumBase(depsolve.Depsolve): +@@ -4515,19 +5740,46 @@ class YumBase(depsolve.Depsolve): done = True for pkg in transaction.trans_data: if pkg.state == 'Downgrade': @@ -189629,7 +189706,7 @@ index 99039e0..8afde56 100644 if self.install(pkgtup=pkg.pkgtup): done = True for pkg in transaction.trans_data: -@@ -4538,8 +5782,14 @@ class YumBase(depsolve.Depsolve): +@@ -4538,8 +5790,14 @@ class YumBase(depsolve.Depsolve): return done def history_undo(self, transaction): @@ -189646,7 +189723,7 @@ index 99039e0..8afde56 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 +5866,7 @@ class YumBase(depsolve.Depsolve): +@@ -4616,7 +5874,7 @@ class YumBase(depsolve.Depsolve): except urlgrabber.grabber.URLGrabError, e: raise Errors.YumBaseError(_('GPG key retrieval failed: ') + @@ -189655,7 +189732,7 @@ index 99039e0..8afde56 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 +5899,7 @@ class YumBase(depsolve.Depsolve): +@@ -4649,7 +5907,7 @@ class YumBase(depsolve.Depsolve): keys_info = misc.getgpgkeyinfo(rawkey, multiple=True) except ValueError, e: raise Errors.YumBaseError(_('Invalid GPG Key from %s: %s') % @@ -189664,7 +189741,7 @@ index 99039e0..8afde56 100644 keys = [] for keyinfo in keys_info: thiskey = {} -@@ -4674,39 +5924,49 @@ class YumBase(depsolve.Depsolve): +@@ -4674,39 +5932,49 @@ class YumBase(depsolve.Depsolve): if pkgs: pkgs = sorted(pkgs)[-1] msg = (_('Importing %s key 0x%s:\n' @@ -189732,7 +189809,7 @@ index 99039e0..8afde56 100644 user_cb_fail = False for keyurl in keyurls: keys = self._retrievePublicKey(keyurl, repo) -@@ -4725,7 +5985,9 @@ class YumBase(depsolve.Depsolve): +@@ -4725,7 +5993,9 @@ class YumBase(depsolve.Depsolve): # Try installing/updating GPG key self._getKeyImportMessage(info, keyurl) rc = False @@ -189743,7 +189820,7 @@ index 99039e0..8afde56 100644 rc = True # grab the .sig/.asc for the keyurl, if it exists -@@ -4751,8 +6013,8 @@ class YumBase(depsolve.Depsolve): +@@ -4751,8 +6021,8 @@ class YumBase(depsolve.Depsolve): ts = self.rpmdb.readOnlyTS() result = ts.pgpImportPubkey(misc.procgpgkey(info['raw_key'])) if result != 0: @@ -189754,7 +189831,7 @@ index 99039e0..8afde56 100644 self.logger.info(_('Key imported successfully')) key_installed = True -@@ -4760,18 +6022,20 @@ class YumBase(depsolve.Depsolve): +@@ -4760,18 +6030,20 @@ class YumBase(depsolve.Depsolve): raise Errors.YumBaseError, _("Didn't install any keys") if not key_installed: @@ -189780,7 +189857,7 @@ index 99039e0..8afde56 100644 def _getAnyKeyForRepo(self, repo, destdir, keyurl_list, is_cakey=False, callback=None): """ -@@ -4788,6 +6052,18 @@ class YumBase(depsolve.Depsolve): +@@ -4788,6 +6060,18 @@ class YumBase(depsolve.Depsolve): """ key_installed = False @@ -189799,7 +189876,7 @@ index 99039e0..8afde56 100644 user_cb_fail = False for keyurl in keyurl_list: keys = self._retrievePublicKey(keyurl, repo, getSig=not is_cakey) -@@ -4819,8 +6095,11 @@ class YumBase(depsolve.Depsolve): +@@ -4819,8 +6103,11 @@ class YumBase(depsolve.Depsolve): if not key_installed: self._getKeyImportMessage(info, keyurl, keytype) rc = False @@ -189812,7 +189889,7 @@ index 99039e0..8afde56 100644 elif callback: rc = callback({"repo": repo, "userid": info['userid'], "hexkeyid": info['hexkeyid'], "keyurl": keyurl, -@@ -4835,7 +6114,8 @@ class YumBase(depsolve.Depsolve): +@@ -4835,7 +6122,8 @@ class YumBase(depsolve.Depsolve): # Import the key result = misc.import_key_to_pubring(info['raw_key'], info['hexkeyid'], gpgdir=destdir) if not result: @@ -189822,7 +189899,7 @@ index 99039e0..8afde56 100644 self.logger.info(_('Key imported successfully')) key_installed = True # write out the key id to imported_cakeys in the repos basedir -@@ -4851,36 +6131,35 @@ class YumBase(depsolve.Depsolve): +@@ -4851,36 +6139,35 @@ class YumBase(depsolve.Depsolve): pass if not key_installed and user_cb_fail: @@ -189875,7 +189952,7 @@ index 99039e0..8afde56 100644 self._getAnyKeyForRepo(repo, repo.gpgcadir, repo.gpgcakey, is_cakey=True, callback=callback) def _limit_installonly_pkgs(self): -@@ -4889,7 +6168,7 @@ class YumBase(depsolve.Depsolve): +@@ -4889,7 +6176,7 @@ class YumBase(depsolve.Depsolve): New in 3.2.24: Obey yumdb_info.installonly data. """ def _sort_and_filter_installonly(pkgs): @@ -189884,7 +189961,7 @@ index 99039e0..8afde56 100644 using the yumdb. """ ret_beg = [] ret_mid = [] -@@ -4926,23 +6205,30 @@ class YumBase(depsolve.Depsolve): +@@ -4926,23 +6213,30 @@ class YumBase(depsolve.Depsolve): # so self.rpmdb.ts should be valid. ts = self.rpmdb.readOnlyTS() (cur_kernel_v, cur_kernel_r) = misc.get_running_kernel_version_release(ts) @@ -189923,7 +190000,7 @@ index 99039e0..8afde56 100644 for po in installed: if (po.version, po.release) == (cur_kernel_v, cur_kernel_r): # don't remove running -@@ -4959,19 +6245,22 @@ class YumBase(depsolve.Depsolve): +@@ -4959,19 +6253,22 @@ class YumBase(depsolve.Depsolve): txmbr.depends_on.append(rel) def processTransaction(self, callback=None,rpmTestDisplay=None, rpmDisplay=None): @@ -189959,7 +190036,7 @@ index 99039e0..8afde56 100644 if not callback: callback = callbacks.ProcessTransNoOutputCallback() -@@ -5062,8 +6351,8 @@ class YumBase(depsolve.Depsolve): +@@ -5062,8 +6359,8 @@ class YumBase(depsolve.Depsolve): raise Errors.YumRPMCheckError, retmsgs retmsgs = [_('ERROR with transaction check vs depsolve:')] retmsgs.extend(msgs) @@ -189970,7 +190047,7 @@ index 99039e0..8afde56 100644 raise Errors.YumRPMCheckError,retmsgs tsConf = {} -@@ -5114,13 +6403,19 @@ class YumBase(depsolve.Depsolve): +@@ -5114,13 +6411,19 @@ class YumBase(depsolve.Depsolve): return results def add_enable_repo(self, repoid, baseurls=[], mirrorlist=None, **kwargs): @@ -189997,7 +190074,7 @@ index 99039e0..8afde56 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 +6462,15 @@ class YumBase(depsolve.Depsolve): +@@ -5167,9 +6470,15 @@ class YumBase(depsolve.Depsolve): def setCacheDir(self, force=False, tmpdir=None, reuse=True, suffix='/$basearch/$releasever'): @@ -190016,7 +190093,7 @@ index 99039e0..8afde56 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 +6480,7 @@ class YumBase(depsolve.Depsolve): +@@ -5179,7 +6488,7 @@ class YumBase(depsolve.Depsolve): try: cachedir = misc.getCacheDir(tmpdir, reuse) except (IOError, OSError), e: @@ -190025,7 +190102,7 @@ index 99039e0..8afde56 100644 cachedir = None if cachedir is None: -@@ -5190,6 +6491,8 @@ class YumBase(depsolve.Depsolve): +@@ -5190,6 +6499,8 @@ class YumBase(depsolve.Depsolve): self.prerepoconf.cachedir = cachedir else: self.repos.setCacheDir(cachedir) @@ -190034,7 +190111,7 @@ index 99039e0..8afde56 100644 self.conf.cachedir = cachedir return True # We got a new cache dir -@@ -5220,13 +6523,24 @@ class YumBase(depsolve.Depsolve): +@@ -5220,13 +6531,24 @@ class YumBase(depsolve.Depsolve): self.history.write_addon_data('config-repos', myrepos) def verify_plugins_cb(self, verify_package): @@ -190062,7 +190139,7 @@ index 99039e0..8afde56 100644 if self.tsInfo._unresolvedMembers: if auto: self.logger.critical(_("Dependencies not solved. Will not save unresolved transaction.")) -@@ -5234,7 +6548,7 @@ class YumBase(depsolve.Depsolve): +@@ -5234,7 +6556,7 @@ class YumBase(depsolve.Depsolve): raise Errors.YumBaseError(_("Dependencies not solved. Will not save unresolved transaction.")) if not filename: @@ -190071,7 +190148,7 @@ index 99039e0..8afde56 100644 fd,filename = tempfile.mkstemp(suffix='.yumtx', prefix=prefix) f = os.fdopen(fd, 'w') else: -@@ -5244,13 +6558,17 @@ class YumBase(depsolve.Depsolve): +@@ -5244,13 +6566,17 @@ class YumBase(depsolve.Depsolve): msg = "%s\n" % self.rpmdb.simpleVersion(main_only=True)[0] msg += "%s\n" % self.ts.getTsFlags() @@ -190092,7 +190169,7 @@ index 99039e0..8afde56 100644 msg += "%s\n" % len(self.tsInfo.getMembers()) for txmbr in self.tsInfo.getMembers(): msg += txmbr._dump() -@@ -5260,42 +6578,84 @@ class YumBase(depsolve.Depsolve): +@@ -5260,42 +6586,84 @@ class YumBase(depsolve.Depsolve): except (IOError, OSError), e: self._ts_save_file = None if auto: @@ -190189,7 +190266,7 @@ index 99039e0..8afde56 100644 if ignorerpm: msg += _(" ignoring, as requested.") self.logger.critical(_(msg)) -@@ -5318,8 +6678,17 @@ class YumBase(depsolve.Depsolve): +@@ -5318,8 +6686,17 @@ class YumBase(depsolve.Depsolve): numrepos = int(data[2].strip()) repos = [] rindex=3+numrepos @@ -190208,7 +190285,7 @@ index 99039e0..8afde56 100644 # pkgs/txmbrs numpkgs = int(data[rindex].strip()) -@@ -5329,6 +6698,7 @@ class YumBase(depsolve.Depsolve): +@@ -5329,6 +6706,7 @@ class YumBase(depsolve.Depsolve): pkgcount = 0 pkgprob = False curpkg = None @@ -190216,7 +190293,7 @@ index 99039e0..8afde56 100644 for l in data[pkgstart:]: l = l.rstrip() # our main txmbrs -@@ -5356,6 +6726,7 @@ class YumBase(depsolve.Depsolve): +@@ -5356,6 +6734,7 @@ class YumBase(depsolve.Depsolve): if not ignoremissing: raise Errors.YumBaseError(msg) else: @@ -190224,7 +190301,7 @@ index 99039e0..8afde56 100644 self.logger.critical(msg) else: pkgcount += 1 -@@ -5432,12 +6803,18 @@ class YumBase(depsolve.Depsolve): +@@ -5432,12 +6811,18 @@ class YumBase(depsolve.Depsolve): if pkgprob: msg = _("Transaction members, relations are missing or ts has been modified,") if ignoremissing: @@ -190243,7 +190320,7 @@ index 99039e0..8afde56 100644 return self.tsInfo.getMembers() def _remove_old_deps(self): -@@ -5470,18 +6847,6 @@ class YumBase(depsolve.Depsolve): +@@ -5470,18 +6855,6 @@ class YumBase(depsolve.Depsolve): if requiring == required: # if they are self-requiring skip them continue @@ -190262,7 +190339,7 @@ index 99039e0..8afde56 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 +6898,24 @@ class YumBase(depsolve.Depsolve): +@@ -5533,7 +6906,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 @@ -190287,7 +190364,7 @@ index 99039e0..8afde56 100644 visited[curpkg] = True all_leaves_visited = True leaves = curpkg.requiring_packages() -@@ -5547,4 +6929,3 @@ class YumBase(depsolve.Depsolve): +@@ -5547,4 +6937,3 @@ class YumBase(depsolve.Depsolve): # Debugging output self.verbose_logger.log(logginglevels.DEBUG_2, _("%s has no user-installed revdeps."), pkg) return False @@ -190440,7 +190517,7 @@ index 7ad25ce..a9a8e53 100644 pass diff --git a/yum/comps.py b/yum/comps.py -index 65f6d5e..aa13b9a 100755 +index 65f6d5e..af79a55 100755 --- a/yum/comps.py +++ b/yum/comps.py @@ -16,14 +16,14 @@ @@ -190743,7 +190820,17 @@ index 65f6d5e..aa13b9a 100755 def has_group(self, grpid): exists = self.return_groups(grpid) -@@ -447,6 +669,57 @@ class Comps(object): +@@ -416,6 +638,9 @@ class Comps(object): + """return all groups which match either by glob or exact match""" + returns = {} + ++ if not group_pattern: ++ return [] ++ + for item in group_pattern.split(','): + item = item.strip() + if item in self._groups: +@@ -447,6 +672,60 @@ class Comps(object): return returns.values() @@ -190767,6 +190854,9 @@ index 65f6d5e..aa13b9a 100755 + """return all environments which match either by glob or exact match""" + returns = {} + ++ if not env_pattern: ++ return [] ++ + for item in env_pattern.split(','): + item = item.strip() + if item in self._environments: @@ -190801,7 +190891,7 @@ index 65f6d5e..aa13b9a 100755 # This is close to returnPackages() etc. API ... need to std. these names # the above return_groups uses different, but equal, API. def return_categories(self, pattern, ignore_case=True): -@@ -490,6 +763,13 @@ class Comps(object): +@@ -490,6 +769,13 @@ class Comps(object): else: self._groups[group.groupid] = group @@ -190815,7 +190905,7 @@ index 65f6d5e..aa13b9a 100755 def add_category(self, category): if category.categoryid in self._categories: thatcat = self._categories[category.categoryid] -@@ -497,6 +777,9 @@ class Comps(object): +@@ -497,6 +783,9 @@ class Comps(object): else: self._categories[category.categoryid] = category @@ -190825,7 +190915,7 @@ index 65f6d5e..aa13b9a 100755 def add(self, srcfile = None): if not srcfile: raise CompsException -@@ -520,9 +803,14 @@ class Comps(object): +@@ -520,9 +809,14 @@ class Comps(object): if elem.tag == "group": group = Group(elem) self.add_group(group) @@ -190840,7 +190930,7 @@ index 65f6d5e..aa13b9a 100755 except SyntaxError, e: raise CompsException, "comps file is empty/damaged" -@@ -557,13 +845,32 @@ class Comps(object): +@@ -557,13 +851,32 @@ class Comps(object): if pkgname in inst_pkg_names: group.installed = True break @@ -190874,7 +190964,7 @@ index 65f6d5e..aa13b9a 100755 return "" msg = """ -@@ -575,7 +882,9 @@ class Comps(object): +@@ -575,7 +888,9 @@ class Comps(object): msg += g.xml() for c in self.get_categories(): msg += c.xml() @@ -190885,7 +190975,7 @@ index 65f6d5e..aa13b9a 100755 msg += """\n\n""" return msg -@@ -590,16 +899,34 @@ def main(): +@@ -590,16 +905,34 @@ def main(): for srcfile in sys.argv[1:]: p.add(srcfile) @@ -190925,7 +191015,7 @@ index 65f6d5e..aa13b9a 100755 print >> sys.stderr, "newcomps.py: No such file:\'%s\'" % sys.argv[1] sys.exit(1) diff --git a/yum/config.py b/yum/config.py -index d09511f..ec7ba80 100644 +index d09511f..967a4c8 100644 --- a/yum/config.py +++ b/yum/config.py @@ -45,15 +45,18 @@ from misc import get_uuid, read_in_items_from_dot_dir @@ -191656,7 +191746,7 @@ index d09511f..ec7ba80 100644 alwaysprompt = BoolOption(True) exactarch = BoolOption(True) tolerant = BoolOption(True) -@@ -677,18 +775,32 @@ class YumConf(StartupConf): +@@ -677,18 +775,33 @@ class YumConf(StartupConf): obsoletes = BoolOption(True) showdupesfromrepos = BoolOption(False) enabled = BoolOption(True) @@ -191671,6 +191761,7 @@ index d09511f..ec7ba80 100644 timeout = FloatOption(30.0) # FIXME: Should use variation of SecondsOption ++ minrate = IntOption(0) bandwidth = BytesOption(0) throttle = ThrottleOption(0) + ip_resolve = CaselessSelectionOption( @@ -191689,7 +191780,7 @@ index d09511f..ec7ba80 100644 # Time in seconds (1 day). NOTE: This isn't used when using metalinks mirrorlist_expire = SecondsOption(60 * 60 * 24) # XXX rpm_check_debug is unused, left around for API compatibility for now -@@ -698,12 +810,14 @@ class YumConf(StartupConf): +@@ -698,12 +811,14 @@ class YumConf(StartupConf): # Note that "instant" is the old behaviour, but group:primary is very # similar but better :). mdpolicy = ListOption(['group:primary']) @@ -191706,7 +191797,7 @@ index d09511f..ec7ba80 100644 color = SelectionOption('auto', ('auto', 'never', 'always'), mapper={'on' : 'always', 'yes' : 'always', -@@ -715,22 +829,27 @@ class YumConf(StartupConf): +@@ -715,22 +830,27 @@ class YumConf(StartupConf): color_list_installed_newer = Option('bold,yellow') color_list_installed_reinstall = Option('normal') color_list_installed_extra = Option('bold,red') @@ -191734,7 +191825,7 @@ index d09511f..ec7ba80 100644 history_record = BoolOption(True) history_record_packages = ListOption(['yum', 'rpm']) -@@ -744,18 +863,29 @@ class YumConf(StartupConf): +@@ -744,18 +864,29 @@ class YumConf(StartupConf): loadts_ignoremissing = BoolOption(False) loadts_ignorerpm = BoolOption(False) @@ -191764,7 +191855,7 @@ index d09511f..ec7ba80 100644 output = '[main]\n' # we exclude all vars which start with _ or are in this list: excluded_vars = ('cfg', 'uid', 'yumvar', 'progress_obj', 'failure_obj', -@@ -778,14 +908,12 @@ class YumConf(StartupConf): +@@ -778,14 +909,12 @@ class YumConf(StartupConf): return output class RepoConf(BaseConfig): @@ -191782,7 +191873,11 @@ index d09511f..ec7ba80 100644 ck = self.__cached_keys if not isinstance(self, RepoConf): ck = set() -@@ -823,39 +951,48 @@ class RepoConf(BaseConfig): +@@ -820,42 +949,52 @@ class RepoConf(BaseConfig): + keepalive = Inherit(YumConf.keepalive) + enablegroups = Inherit(YumConf.enablegroups) + ++ minrate = Inherit(YumConf.minrate) bandwidth = Inherit(YumConf.bandwidth) throttle = Inherit(YumConf.throttle) timeout = Inherit(YumConf.timeout) @@ -191842,7 +191937,7 @@ index d09511f..ec7ba80 100644 # ' xemacs syntax hack -@@ -876,20 +1013,24 @@ def readStartupConfig(configfile, root): +@@ -876,20 +1015,24 @@ def readStartupConfig(configfile, root): raise Errors.ConfigError("All plugin search paths must be absolute") # Stuff this here to avoid later re-parsing startupconf._parser = parser @@ -191873,7 +191968,7 @@ index d09511f..ec7ba80 100644 # ' xemacs syntax hack -@@ -956,6 +1097,12 @@ def readMainConfig(startupconf): +@@ -956,6 +1099,12 @@ def readMainConfig(startupconf): return yumconf def readVersionGroupsConfig(configfile="/etc/yum/version-groups.conf"): @@ -191886,7 +191981,7 @@ index d09511f..ec7ba80 100644 parser = ConfigParser() confpp_obj = ConfigPreProcessor(configfile) try: -@@ -970,17 +1117,16 @@ def readVersionGroupsConfig(configfile="/etc/yum/version-groups.conf"): +@@ -970,17 +1119,16 @@ def readVersionGroupsConfig(configfile="/etc/yum/version-groups.conf"): def getOption(conf, section, name, option): @@ -191914,7 +192009,7 @@ index d09511f..ec7ba80 100644 try: val = conf.get(section, name) except (NoSectionError, NoOptionError): -@@ -1028,25 +1174,28 @@ def _getsysver(installroot, distroverpkg): +@@ -1028,25 +1176,28 @@ def _getsysver(installroot, distroverpkg): if idx.count() == 0: releasever = '$releasever' else: @@ -191954,7 +192049,7 @@ index d09511f..ec7ba80 100644 # b/c repoids can have $values in them we need to map both ways to figure # out which one is which section_id = repo.id -@@ -1054,6 +1203,19 @@ def writeRawRepoFile(repo,only=None): +@@ -1054,6 +1205,19 @@ def writeRawRepoFile(repo,only=None): for sect in ini._sections.keys(): if varReplace(sect, repo.yumvar) == repo.id: section_id = sect @@ -191974,7 +192069,7 @@ index d09511f..ec7ba80 100644 # Updated the ConfigParser with the changed values cfgOptions = repo.cfg.options(repo.id) -@@ -1069,7 +1231,7 @@ def writeRawRepoFile(repo,only=None): +@@ -1069,7 +1233,7 @@ def writeRawRepoFile(repo,only=None): # If the value is the same, but just interpreted ... when we don't want # to keep the interpreted values. if (name in ini[section_id] and @@ -193562,10 +193657,10 @@ index 9889bf6..76a258d 100755 Setup the yum translation domain and make _() and P_() translation wrappers diff --git a/yum/igroups.py b/yum/igroups.py new file mode 100644 -index 0000000..17f1b56 +index 0000000..cbb070f --- /dev/null +++ b/yum/igroups.py -@@ -0,0 +1,279 @@ +@@ -0,0 +1,285 @@ +#! /usr/bin/python -tt +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by @@ -193784,6 +193879,9 @@ index 0000000..17f1b56 + def return_groups(self, group_pattern, case_sensitive=False): + returns = {} + ++ if not group_pattern: ++ return [] ++ + for item in group_pattern.split(','): + item = item.strip() + if item in self.groups: @@ -193825,6 +193923,9 @@ index 0000000..17f1b56 + def return_environments(self, evgroup_pattern, case_sensitive=False): + returns = {} + ++ if not evgroup_pattern: ++ return [] ++ + for item in evgroup_pattern.split(','): + item = item.strip() + if item in self.environments: @@ -196977,7 +197078,7 @@ index 0000000..1cc207f + return txmbrs + diff --git a/yum/yumRepo.py b/yum/yumRepo.py -index e5e9ece..41d180e 100644 +index e5e9ece..ef6d9c6 100644 --- a/yum/yumRepo.py +++ b/yum/yumRepo.py @@ -20,10 +20,12 @@ import time @@ -197383,15 +197484,16 @@ index e5e9ece..41d180e 100644 def _default_grabopts(self, cache=True): opts = { 'keepalive': self.keepalive, -@@ -499,6 +657,7 @@ class YumRepository(Repository, config.RepoConf): +@@ -499,6 +657,8 @@ class YumRepository(Repository, config.RepoConf): 'throttle': self.throttle, 'proxies': self.proxy_dict, 'timeout': self.timeout, ++ 'minrate': self.minrate, + 'ip_resolve': self.ip_resolve, 'http_headers': tuple(self.__headersListFromDict(cache=cache)), 'ssl_verify_peer': self.sslverify, 'ssl_verify_host': self.sslverify, -@@ -561,7 +720,7 @@ class YumRepository(Repository, config.RepoConf): +@@ -561,7 +721,7 @@ class YumRepository(Repository, config.RepoConf): cookie = self.cachedir + '/' + self.metadata_cookie_fn self.setAttribute('_dir_setup_metadata_cookie', cookie) @@ -197400,7 +197502,7 @@ index e5e9ece..41d180e 100644 self._dirSetupMkdir_p(dir) # persistdir is really root-only but try the make anyway and just -@@ -714,15 +873,15 @@ class YumRepository(Repository, config.RepoConf): +@@ -714,15 +874,15 @@ class YumRepository(Repository, config.RepoConf): local = self.metalink_filename + '.tmp' if not self._metalinkCurrent(): url = misc.to_utf8(self.metalink) @@ -197420,7 +197522,7 @@ index e5e9ece..41d180e 100644 raise Errors.RepoError, msg # Now, we have an old usable metalink, so we can't move to # a newer repomd.xml ... or checksums won't match. -@@ -749,9 +908,22 @@ class YumRepository(Repository, config.RepoConf): +@@ -749,9 +909,22 @@ class YumRepository(Repository, config.RepoConf): value), fdel=lambda self: setattr(self, "_metalink", None)) @@ -197444,7 +197546,7 @@ index e5e9ece..41d180e 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""" -@@ -768,7 +940,7 @@ class YumRepository(Repository, config.RepoConf): +@@ -768,7 +941,7 @@ class YumRepository(Repository, config.RepoConf): if local is None or relative is None: raise Errors.RepoError, \ @@ -197453,7 +197555,7 @@ index e5e9ece..41d180e 100644 if self.cache == 1: if os.path.exists(local): # FIXME - we should figure out a way -@@ -778,7 +950,7 @@ class YumRepository(Repository, config.RepoConf): +@@ -778,7 +951,7 @@ class YumRepository(Repository, config.RepoConf): raise Errors.RepoError, \ "Caching enabled but no local cache of %s from %s" % (local, @@ -197462,7 +197564,7 @@ index e5e9ece..41d180e 100644 if url: (scheme, netloc, path, query, fragid) = urlparse.urlsplit(url) -@@ -796,6 +968,16 @@ class YumRepository(Repository, config.RepoConf): +@@ -796,6 +969,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,)) @@ -197479,7 +197581,7 @@ index e5e9ece..41d180e 100644 if url and scheme != "media": ugopts = self._default_grabopts(cache=cache) ug = URLGrabber(progress_obj = self.callback, -@@ -815,14 +997,9 @@ class YumRepository(Repository, config.RepoConf): +@@ -815,14 +998,9 @@ class YumRepository(Repository, config.RepoConf): range=(start, end), ) except URLGrabError, e: @@ -197497,7 +197599,7 @@ index e5e9ece..41d180e 100644 else: -@@ -835,19 +1012,19 @@ class YumRepository(Repository, config.RepoConf): +@@ -835,19 +1013,19 @@ class YumRepository(Repository, config.RepoConf): reget = reget, checkfunc=checkfunc, http_headers=headers, @@ -197524,7 +197626,7 @@ index e5e9ece..41d180e 100644 remote = package.relativepath local = package.localPkg() basepath = package.basepath -@@ -857,15 +1034,30 @@ class YumRepository(Repository, config.RepoConf): +@@ -857,15 +1035,30 @@ class YumRepository(Repository, config.RepoConf): return local misc.unlink_f(local) @@ -197556,7 +197658,7 @@ index e5e9ece..41d180e 100644 def getHeader(self, package, checkfunc = None, reget = 'simple', cache = True): -@@ -933,7 +1125,7 @@ class YumRepository(Repository, config.RepoConf): +@@ -933,7 +1126,7 @@ class YumRepository(Repository, config.RepoConf): self._metadataCurrent = False return self._metadataCurrent @@ -197565,7 +197667,7 @@ index e5e9ece..41d180e 100644 """check if any file is older than a certain amount of time. Used for the cachecookie and the mirrorlist return True if w/i the expiration time limit -@@ -943,6 +1135,24 @@ class YumRepository(Repository, config.RepoConf): +@@ -943,6 +1136,24 @@ class YumRepository(Repository, config.RepoConf): file. If any of them are newer then invalidate the cache """ @@ -197590,7 +197692,7 @@ index e5e9ece..41d180e 100644 # -1 is special and should never get refreshed if expiration_time == -1 and os.path.exists(myfile): return True -@@ -991,7 +1201,7 @@ class YumRepository(Repository, config.RepoConf): +@@ -991,7 +1202,7 @@ class YumRepository(Repository, config.RepoConf): def _cachingRepoXML(self, local): """ Should we cache the current repomd.xml """ if self.cache and not os.path.exists(local): @@ -197599,7 +197701,7 @@ index e5e9ece..41d180e 100644 if self.cache or self.metadataCurrent(): return True return False -@@ -1020,7 +1230,7 @@ class YumRepository(Repository, config.RepoConf): +@@ -1020,7 +1231,7 @@ class YumRepository(Repository, config.RepoConf): if grab_can_fail: return None raise Errors.RepoError, 'Error downloading file %s: %s' % (local, e) @@ -197608,7 +197710,7 @@ index e5e9ece..41d180e 100644 misc.unlink_f(tfname) if grab_can_fail: return None -@@ -1047,7 +1257,7 @@ class YumRepository(Repository, config.RepoConf): +@@ -1047,7 +1258,7 @@ class YumRepository(Repository, config.RepoConf): parse_can_fail = 'old_repo_XML' in self._oldRepoMDData if parse_can_fail: return None @@ -197617,7 +197719,7 @@ index e5e9ece..41d180e 100644 def _saveOldRepoXML(self, local): """ If we have an older repomd.xml file available, save it out. """ -@@ -1074,7 +1284,7 @@ class YumRepository(Repository, config.RepoConf): +@@ -1074,7 +1285,7 @@ class YumRepository(Repository, config.RepoConf): # We still want the old data, so we don't download twice. So we # pretend everything is good until the revert. if not self.timestamp_check: @@ -197626,7 +197728,7 @@ index e5e9ece..41d180e 100644 if 'old_repo_XML' not in self._oldRepoMDData: self._oldRepoMDData = {} -@@ -1250,7 +1460,6 @@ class YumRepository(Repository, config.RepoConf): +@@ -1250,7 +1461,6 @@ class YumRepository(Repository, config.RepoConf): self._revertOldRepoXML() return False @@ -197634,7 +197736,7 @@ index e5e9ece..41d180e 100644 if caching: return False # Skip any work. -@@ -1260,6 +1469,9 @@ class YumRepository(Repository, config.RepoConf): +@@ -1260,6 +1470,9 @@ class YumRepository(Repository, config.RepoConf): return True def _check_db_version(self, mdtype, repoXML=None): @@ -197644,7 +197746,7 @@ index e5e9ece..41d180e 100644 if repoXML is None: repoXML = self.repoXML if mdtype in repoXML.repoData: -@@ -1277,11 +1489,11 @@ class YumRepository(Repository, config.RepoConf): +@@ -1277,11 +1490,11 @@ class YumRepository(Repository, config.RepoConf): return None if not file_check: @@ -197659,7 +197761,7 @@ index e5e9ece..41d180e 100644 if not os.path.exists(local): local = misc.decompress(local, fn_only=True) compressed = True -@@ -1302,6 +1514,17 @@ class YumRepository(Repository, config.RepoConf): +@@ -1302,6 +1515,17 @@ class YumRepository(Repository, config.RepoConf): into the delete list, this means metadata can change filename without us leaking it. """ @@ -197677,7 +197779,7 @@ index e5e9ece..41d180e 100644 def _mdtype_eq(omdtype, odata, nmdtype, ndata): """ Check if two returns from _get_mdtype_data() are equal. """ if ndata is None: -@@ -1321,6 +1544,14 @@ class YumRepository(Repository, config.RepoConf): +@@ -1321,6 +1545,14 @@ class YumRepository(Repository, config.RepoConf): return True all_mdtypes = self.retrieved.keys() @@ -197692,7 +197794,7 @@ index e5e9ece..41d180e 100644 if mdtypes is None: mdtypes = all_mdtypes -@@ -1333,8 +1564,7 @@ class YumRepository(Repository, config.RepoConf): +@@ -1333,8 +1565,7 @@ class YumRepository(Repository, config.RepoConf): # Inited twice atm. ... sue me self._oldRepoMDData['new_MD_files'] = [] @@ -197702,7 +197804,7 @@ index e5e9ece..41d180e 100644 for mdtype in all_mdtypes: (nmdtype, ndata) = self._get_mdtype_data(mdtype) -@@ -1371,43 +1601,16 @@ class YumRepository(Repository, config.RepoConf): +@@ -1371,43 +1602,16 @@ class YumRepository(Repository, config.RepoConf): # No old repomd data, but we might still have uncompressed MD if self._groupCheckDataMDValid(ndata, nmdtype, mdtype): continue @@ -197751,7 +197853,7 @@ index e5e9ece..41d180e 100644 def _groupLoadRepoXML(self, text=None, mdtypes=None): """ Retrieve the new repomd.xml from the repository, then check it -@@ -1421,7 +1624,7 @@ class YumRepository(Repository, config.RepoConf): +@@ -1421,7 +1625,7 @@ class YumRepository(Repository, config.RepoConf): self._commonRetrieveDataMD(mdtypes) def _mdpolicy2mdtypes(self): @@ -197760,7 +197862,7 @@ index e5e9ece..41d180e 100644 'group:primary' : ['primary'], 'group:small' : ["primary", "updateinfo"], 'group:main' : ["primary", "group", "filelists", -@@ -1436,6 +1639,7 @@ class YumRepository(Repository, config.RepoConf): +@@ -1436,6 +1640,7 @@ class YumRepository(Repository, config.RepoConf): if not mdtypes or 'group:all' in mdtypes: mdtypes = None else: @@ -197768,7 +197870,7 @@ index e5e9ece..41d180e 100644 mdtypes = sorted(list(mdtypes)) return mdtypes -@@ -1446,17 +1650,12 @@ class YumRepository(Repository, config.RepoConf): +@@ -1446,17 +1651,12 @@ class YumRepository(Repository, config.RepoConf): except KeyboardInterrupt: self._revertOldRepoXML() # Undo metadata cookie? raise @@ -197788,7 +197890,7 @@ index e5e9ece..41d180e 100644 return self._repoXML -@@ -1480,7 +1679,7 @@ class YumRepository(Repository, config.RepoConf): +@@ -1480,7 +1680,7 @@ class YumRepository(Repository, config.RepoConf): result = self._getFile(relative='repodata/repomd.xml.asc', copy_local=1, local = sigfile, @@ -197797,7 +197899,7 @@ index e5e9ece..41d180e 100644 reget=None, checkfunc=None, cache=self.http_caching == 'all', -@@ -1508,6 +1707,18 @@ class YumRepository(Repository, config.RepoConf): +@@ -1508,6 +1708,18 @@ class YumRepository(Repository, config.RepoConf): raise URLGrabError(-1, 'repomd.xml does not match metalink for %s' % self) @@ -197816,7 +197918,7 @@ index e5e9ece..41d180e 100644 def checkMD(self, fn, mdtype, openchecksum=False): """check the metadata type against its checksum""" -@@ -1537,6 +1748,16 @@ class YumRepository(Repository, config.RepoConf): +@@ -1537,6 +1749,16 @@ class YumRepository(Repository, config.RepoConf): if size is not None: size = int(size) @@ -197833,7 +197935,7 @@ index e5e9ece..41d180e 100644 try: # get the local checksum l_csum = self._checksum(r_ctype, file, datasize=size) except Errors.RepoError, e: -@@ -1545,21 +1766,20 @@ class YumRepository(Repository, config.RepoConf): +@@ -1545,21 +1767,20 @@ class YumRepository(Repository, config.RepoConf): raise URLGrabError(-3, 'Error performing checksum') if l_csum == r_csum: @@ -197857,7 +197959,7 @@ index e5e9ece..41d180e 100644 """ Internal function, use .retrieveMD() from outside yum. """ # Note that this can raise Errors.RepoMDError if mdtype doesn't exist # for this repo. -@@ -1580,15 +1800,19 @@ class YumRepository(Repository, config.RepoConf): +@@ -1580,15 +1801,19 @@ class YumRepository(Repository, config.RepoConf): try: self.checkMD(local, mdtype) except URLGrabError, e: @@ -197878,7 +197980,7 @@ index e5e9ece..41d180e 100644 if (os.path.exists(local) or self._preload_md_from_system_cache(os.path.basename(local))): -@@ -1597,15 +1821,22 @@ class YumRepository(Repository, config.RepoConf): +@@ -1597,15 +1822,22 @@ class YumRepository(Repository, config.RepoConf): return local # it's the same return the local one try: @@ -197906,7 +198008,7 @@ index e5e9ece..41d180e 100644 local = self._getFile(relative=remote, local=local, copy_local=1, -@@ -1613,8 +1844,9 @@ class YumRepository(Repository, config.RepoConf): +@@ -1613,8 +1845,9 @@ class YumRepository(Repository, config.RepoConf): checkfunc=checkfunc, text=text, cache=self.http_caching == 'all', @@ -197918,7 +198020,7 @@ index e5e9ece..41d180e 100644 if retrieve_can_fail: return None raise -@@ -1622,9 +1854,8 @@ class YumRepository(Repository, config.RepoConf): +@@ -1622,9 +1855,8 @@ class YumRepository(Repository, config.RepoConf): if retrieve_can_fail: return None raise Errors.RepoError, \ @@ -197929,7 +198031,7 @@ index e5e9ece..41d180e 100644 return local -@@ -1646,13 +1877,21 @@ class YumRepository(Repository, config.RepoConf): +@@ -1646,13 +1878,21 @@ class YumRepository(Repository, config.RepoConf): def getGroups(self): """gets groups and returns group file path for the repository, if there @@ -197954,7 +198056,7 @@ index e5e9ece..41d180e 100644 self._callbacks_changed = True def setFailureObj(self, failure_obj): -@@ -1681,7 +1920,7 @@ class YumRepository(Repository, config.RepoConf): +@@ -1681,7 +1921,7 @@ class YumRepository(Repository, config.RepoConf): print "Could not read mirrorlist %s, error was \n%s" %(url, e) content = [] for line in content: @@ -197963,7 +198065,7 @@ index e5e9ece..41d180e 100644 continue mirror = line.rstrip() # no more trailing \n's mirror = mirror.replace('$ARCH', '$BASEARCH') -@@ -1701,7 +1940,8 @@ class YumRepository(Repository, config.RepoConf): +@@ -1701,7 +1941,8 @@ class YumRepository(Repository, config.RepoConf): fo = None cacheok = False @@ -197973,7 +198075,7 @@ index e5e9ece..41d180e 100644 cacheok = True fo = open(self.mirrorlist_file, 'r') url = 'file://' + self.mirrorlist_file # just to keep self._readMirrorList(fo,url) happy -@@ -1713,7 +1953,7 @@ class YumRepository(Repository, config.RepoConf): +@@ -1713,7 +1954,7 @@ class YumRepository(Repository, config.RepoConf): ugopts = self._default_grabopts() try: fo = urlgrabber.grabber.urlopen(url, **ugopts) @@ -197982,7 +198084,7 @@ index e5e9ece..41d180e 100644 print "Could not retrieve mirrorlist %s error was\n%s: %s" % (url, e.args[0], misc.to_unicode(e.args[1])) fo = None -@@ -1740,7 +1980,11 @@ class YumRepository(Repository, config.RepoConf): +@@ -1740,7 +1981,11 @@ class YumRepository(Repository, config.RepoConf): if os.path.exists(destfn): if os.stat(fn)[stat.ST_CTIME] <= os.stat(destfn)[stat.ST_CTIME]: return False @@ -197995,7 +198097,7 @@ index e5e9ece..41d180e 100644 return True def _preload_file_from_system_cache(self, filename, subdir='', -@@ -1877,7 +2121,7 @@ def getMirrorList(mirrorlist, pdict = None): +@@ -1877,7 +2122,7 @@ def getMirrorList(mirrorlist, pdict = None): try: fo = urlresolver.urlopen(url, proxies=pdict) diff --git a/yum.spec b/yum.spec index 857b203..447cecb 100644 --- a/yum.spec +++ b/yum.spec @@ -41,7 +41,7 @@ BuildRequires: bash-completion Summary: RPM package installer/updater/manager Name: yum Version: 3.4.3 -Release: 92%{?dist} +Release: 93%{?dist} License: GPLv2+ Group: System Environment/Base Source0: http://yum.baseurl.org/download/3.4/%{name}-%{version}.tar.gz @@ -402,6 +402,14 @@ exit 0 %endif %changelog +* Mon Jun 3 2013 James Antill - 3.4.3-93 +- update to latest HEAD. +- Workaround anaconda passing None as group name. BZ 959710. +- Fix second part of igrp as grp problems. BZ 955236. +- Add a fuzzy matcher for numbers in format_missing_requires. BZ 718245. +- Hide the "downloadonly" option when nothing to download. +- Add the "minrate" option. BZ 964298 + * Tue May 21 2013 James Antill - 3.4.3-92 - update to latest HEAD. - returnPackagesByDep() API fix (really old break).