diff --git a/yum-HEAD.patch b/yum-HEAD.patch index 0ad3ec7..f4dcdae 100644 --- a/yum-HEAD.patch +++ b/yum-HEAD.patch @@ -3378,7 +3378,7 @@ index 1a8202a..1885e15 100644 http://yum.baseurl.org/wiki/Faq yum search yum diff --git a/docs/yum.conf.5 b/docs/yum.conf.5 -index 515aa73..8a7de80 100644 +index 515aa73..90da81f 100644 --- a/docs/yum.conf.5 +++ b/docs/yum.conf.5 @@ -64,7 +64,7 @@ options are: 'critical', 'emergency', 'error', 'warn' and 'debug'. @@ -3807,7 +3807,18 @@ index 515aa73..8a7de80 100644 .SH "[repository] OPTIONS" -@@ -702,12 +948,18 @@ key will be automatically imported without user confirmation. +@@ -668,6 +914,10 @@ value of mirrorlist is copied to metalink (if metalink is not set). + Either `1' or `0'. This tells yum whether or not use this repository. + + .IP ++\fBkeepcache\fR ++Overrides the \fBkeepcache\fR option from the [main] section for this repository. ++ ++.IP + \fBgpgcheck\fR + Either `1' or `0'. This tells yum whether or not it should perform a GPG + signature check on the packages gotten from this repository. +@@ -702,12 +952,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. @@ -3830,7 +3841,7 @@ index 515aa73..8a7de80 100644 .IP \fBenablegroups\fR -@@ -755,6 +1007,16 @@ repository. +@@ -755,6 +1011,16 @@ repository. Overrides the \fBbandwidth\fR option from the [main] section for this repository. @@ -3847,7 +3858,7 @@ index 515aa73..8a7de80 100644 .IP \fBsslcacert \fR -@@ -776,6 +1038,10 @@ repository. +@@ -776,6 +1042,10 @@ repository. Overrides the \fBsslclientkey\fR option from the [main] section for this repository. @@ -3858,7 +3869,7 @@ index 515aa73..8a7de80 100644 .IP \fBmetadata_expire \fR -@@ -783,6 +1049,11 @@ Overrides the \fBmetadata_expire\fR option from the [main] section for this +@@ -783,6 +1053,11 @@ Overrides the \fBmetadata_expire\fR option from the [main] section for this repository. .IP @@ -3870,7 +3881,7 @@ index 515aa73..8a7de80 100644 \fBmirrorlist_expire \fR Overrides the \fBmirrorlist_expire\fR option from the [main] section for this repository. -@@ -824,7 +1095,16 @@ as greater/less than any other. defaults to 1000 +@@ -824,7 +1099,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. @@ -3887,6 +3898,17 @@ index 515aa73..8a7de80 100644 .SH "URL INCLUDE SYNTAX" .LP +@@ -861,8 +1145,8 @@ package. + + .IP + \fB$arch\fR +-This will be replaced with your architecture as listed by os.uname()[4] in +-Python. ++This will be replaced with the architecture or your system ++as detected by yum. + + .IP + \fB$basearch\fR diff --git a/etc/0yum.cron b/etc/0yum.cron deleted file mode 100755 index 0cfaa4b..0000000 @@ -4185,10 +4207,10 @@ index 63c5ec0..0000000 -exit $RETVAL diff --git a/etc/yum-cron-hourly.conf b/etc/yum-cron-hourly.conf new file mode 100644 -index 0000000..3d4392d +index 0000000..2d52349 --- /dev/null +++ b/etc/yum-cron-hourly.conf -@@ -0,0 +1,70 @@ +@@ -0,0 +1,79 @@ +[commands] +# What kind of update to use: +# default = yum upgrade @@ -4255,10 +4277,19 @@ index 0000000..3d4392d +group_package_types = mandatory, default + +[base] -+# override yum options of the same name -+# skip_broken = True ++# This section overrides yum.conf + ++# Use this to filter Yum core messages ++# -4: critical ++# -3: critical+errors ++# -2: critical+errors+warnings (default) ++debuglevel = -2 ++ ++# skip_broken = True +mdpolicy = group:main ++ ++# Uncomment to auto-import new gpg keys (dangerous) ++# assumeyes = True diff --git a/etc/yum-cron.conf b/etc/yum-cron.conf new file mode 100644 index 0000000..649c326 @@ -186627,7 +186658,7 @@ index c1af4ad..70de539 100644 pass diff --git a/yum/__init__.py b/yum/__init__.py -index 99039e0..a43f493 100644 +index 99039e0..f542fe6 100644 --- a/yum/__init__.py +++ b/yum/__init__.py @@ -21,6 +21,7 @@ The Yum RPM software updater. @@ -187338,7 +187369,7 @@ index 99039e0..a43f493 100644 if self.rpmdb.contains(name="yum-utils"): return -@@ -964,12 +1156,24 @@ class YumBase(depsolve.Depsolve): +@@ -964,12 +1156,25 @@ class YumBase(depsolve.Depsolve): (hibeg, prog, hiend)) def buildTransaction(self, unfinished_transactions_check=True): @@ -187360,13 +187391,14 @@ index 99039e0..a43f493 100644 msg = _('There are unfinished transactions remaining. You might ' \ - 'consider running yum-complete-transaction first to finish them.' ) + 'consider running yum-complete-transaction, or' \ -+ ' "yum history redo last", first to finish them. If that' \ -+ ' doesn\'t work you\'ll have to try removing/installing' \ ++ ' "yum-complete-transaction --cleanup-only" and' \ ++ ' "yum history redo last", first to finish them. If those' \ ++ ' don\'t work you\'ll have to try removing/installing' \ + ' packages by hand (maybe package-cleanup can help).') self.logger.critical(msg) self.yumUtilsMsg(self.logger.critical, "yum-complete-transaction") time.sleep(3) -@@ -1004,7 +1208,7 @@ class YumBase(depsolve.Depsolve): +@@ -1004,7 +1209,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 ) @@ -187375,7 +187407,7 @@ index 99039e0..a43f493 100644 self.tsInfo.pkgSack.dropCachedData() # FIXME: This is horrible, see below and yummain. Maybe create a real -@@ -1044,6 +1248,39 @@ class YumBase(depsolve.Depsolve): +@@ -1044,6 +1249,39 @@ class YumBase(depsolve.Depsolve): if first.verEQ(other): continue msg = _('Protected multilib versions: %s != %s') @@ -187415,7 +187447,7 @@ index 99039e0..a43f493 100644 xrestring.append(msg % (first, other)) if xrestring: rescode = 1 -@@ -1227,7 +1464,7 @@ class YumBase(depsolve.Depsolve): +@@ -1227,7 +1465,7 @@ class YumBase(depsolve.Depsolve): self.verbose_logger.info(msg) self.skipped_packages.extend(skipped_list) # make the skipped packages public else: @@ -187424,7 +187456,7 @@ index 99039e0..a43f493 100644 self.verbose_logger.info("Skip-broken could not solve problems") return 1, orig_restring return rescode, restring -@@ -1242,13 +1479,15 @@ class YumBase(depsolve.Depsolve): +@@ -1242,13 +1480,15 @@ class YumBase(depsolve.Depsolve): if None in pkgtup: return None return pkgtup @@ -187444,7 +187476,7 @@ index 99039e0..a43f493 100644 if pkgtup is None: return self._not_found_i[pkgtup] = YumNotFoundPackage(pkgtup) -@@ -1267,7 +1506,7 @@ class YumBase(depsolve.Depsolve): +@@ -1267,7 +1507,7 @@ class YumBase(depsolve.Depsolve): for pkg in txmbr.obsoleted_by: # check if the obsoleting txmbr is in the transaction # else remove the obsoleted txmbr @@ -187453,7 +187485,7 @@ index 99039e0..a43f493 100644 if not self.tsInfo.exists(pkg.pkgtup): self.verbose_logger.debug('SKIPBROKEN: Remove extra obsoleted %s (%s)' % (txmbr.po,pkg) ) self.tsInfo.remove(txmbr.po.pkgtup) -@@ -1282,7 +1521,7 @@ class YumBase(depsolve.Depsolve): +@@ -1282,7 +1522,7 @@ class YumBase(depsolve.Depsolve): for pkg in txmbr.updated_by: # check if the updating txmbr is in the transaction # else remove the updated txmbr @@ -187462,7 +187494,7 @@ index 99039e0..a43f493 100644 if not self.tsInfo.exists(pkg.pkgtup): self.verbose_logger.debug('SKIPBROKEN: Remove extra updated %s (%s)' % (txmbr.po,pkg) ) self.tsInfo.remove(txmbr.po.pkgtup) -@@ -1379,9 +1618,19 @@ class YumBase(depsolve.Depsolve): +@@ -1379,9 +1619,19 @@ class YumBase(depsolve.Depsolve): def _getDepsToRemove(self,po, deptree, toRemove): for dep in deptree.get(po, []): # Loop trough all deps of po @@ -187482,7 +187514,7 @@ index 99039e0..a43f493 100644 toRemove.add(dep) self._getDepsToRemove(dep, deptree, toRemove) -@@ -1454,7 +1703,46 @@ class YumBase(depsolve.Depsolve): +@@ -1454,7 +1704,46 @@ class YumBase(depsolve.Depsolve): return probs def runTransaction(self, cb): @@ -187530,7 +187562,7 @@ index 99039e0..a43f493 100644 self.plugins.run('pretrans') -@@ -1516,10 +1804,23 @@ class YumBase(depsolve.Depsolve): +@@ -1516,10 +1805,23 @@ class YumBase(depsolve.Depsolve): pass self._ts_save_file = None @@ -187554,6 +187586,16 @@ index 99039e0..a43f493 100644 # make resultobject - just a plain yumgenericholder object resultobject = misc.GenericHolder() +@@ -1544,8 +1846,7 @@ class YumBase(depsolve.Depsolve): + errors=errors) + + +- if (not self.conf.keepcache and +- not self.ts.isTsFlagSet(rpm.RPMTRANS_FLAG_TEST)): ++ if not self.ts.isTsFlagSet(rpm.RPMTRANS_FLAG_TEST): + self.cleanUsedHeadersPackages() + + for i in ('ts_all_fn', 'ts_done_fn'): @@ -1567,13 +1868,35 @@ class YumBase(depsolve.Depsolve): self.plugins.run('posttrans') # sync up what just happened versus what is in the rpmdb @@ -188274,7 +188316,16 @@ index 99039e0..a43f493 100644 filelist = [] for txmbr in self.tsInfo: if txmbr.po.state not in TS_INSTALL_STATES: -@@ -2218,27 +2715,42 @@ class YumBase(depsolve.Depsolve): +@@ -2189,6 +2686,8 @@ class YumBase(depsolve.Depsolve): + continue + if txmbr.po.repoid not in self.repos.repos: + continue ++ if txmbr.po.repo.keepcache: ++ continue + + # make sure it's not a local file + repo = self.repos.repos[txmbr.po.repoid] +@@ -2218,27 +2717,42 @@ class YumBase(depsolve.Depsolve): _('%s removed'), fn) def cleanHeaders(self): @@ -188319,7 +188370,7 @@ index 99039e0..a43f493 100644 cachedir = self.conf.persistdir + "/rpmdb-indexes/" if not os.path.exists(cachedir): filelist = [] -@@ -2271,9 +2783,31 @@ class YumBase(depsolve.Depsolve): +@@ -2271,9 +2785,31 @@ class YumBase(depsolve.Depsolve): return 0, [msg] def doPackageLists(self, pkgnarrow='all', patterns=None, showdups=None, @@ -188354,7 +188405,7 @@ index 99039e0..a43f493 100644 if showdups is None: showdups = self.conf.showdupesfromrepos ygh = misc.GenericHolder(iter=pkgnarrow) -@@ -2295,6 +2829,8 @@ class YumBase(depsolve.Depsolve): +@@ -2295,6 +2831,8 @@ class YumBase(depsolve.Depsolve): ndinst = {} # Newest versions by name.arch for po in self.rpmdb.returnPackages(patterns=patterns, ignore_case=ic): @@ -188363,7 +188414,7 @@ index 99039e0..a43f493 100644 dinst[po.pkgtup] = po if showdups: continue -@@ -2304,8 +2840,13 @@ class YumBase(depsolve.Depsolve): +@@ -2304,8 +2842,13 @@ class YumBase(depsolve.Depsolve): installed = dinst.values() if showdups: @@ -188378,7 +188429,7 @@ index 99039e0..a43f493 100644 else: try: avail = self.pkgSack.returnNewestByNameArch(patterns=patterns, -@@ -2323,16 +2864,30 @@ class YumBase(depsolve.Depsolve): +@@ -2323,16 +2866,30 @@ class YumBase(depsolve.Depsolve): key = (pkg.name, pkg.arch) if pkg.pkgtup in dinst: reinstall_available.append(pkg) @@ -188412,7 +188463,7 @@ index 99039e0..a43f493 100644 if len(matches) > 1: updates.append(matches[0]) self.verbose_logger.log(logginglevels.DEBUG_1, -@@ -2352,13 +2907,19 @@ class YumBase(depsolve.Depsolve): +@@ -2352,13 +2909,19 @@ class YumBase(depsolve.Depsolve): elif pkgnarrow == 'installed': installed = self.rpmdb.returnPackages(patterns=patterns, ignore_case=ic) @@ -188433,7 +188484,7 @@ index 99039e0..a43f493 100644 else: try: avail = self.pkgSack.returnNewestByNameArch(patterns=patterns, -@@ -2392,9 +2953,21 @@ class YumBase(depsolve.Depsolve): +@@ -2392,9 +2955,21 @@ class YumBase(depsolve.Depsolve): avail = set(avail) for po in self.rpmdb.returnPackages(patterns=patterns, ignore_case=ic): @@ -188455,7 +188506,7 @@ index 99039e0..a43f493 100644 # obsoleting packages (and what they obsolete) elif pkgnarrow == 'obsoletes': self.conf.obsoletes = 1 -@@ -2402,6 +2975,7 @@ class YumBase(depsolve.Depsolve): +@@ -2402,6 +2977,7 @@ class YumBase(depsolve.Depsolve): for (pkgtup, instTup) in self.up.getObsoletesTuples(): (n,a,e,v,r) = pkgtup pkgs = self.pkgSack.searchNevra(name=n, arch=a, ver=v, rel=r, epoch=e) @@ -188463,7 +188514,7 @@ index 99039e0..a43f493 100644 instpo = self.getInstalledPackageObject(instTup) for po in pkgs: obsoletes.append(po) -@@ -2433,7 +3007,12 @@ class YumBase(depsolve.Depsolve): +@@ -2433,7 +3009,12 @@ class YumBase(depsolve.Depsolve): recentlimit = now-(self.conf.recent*86400) if showdups: avail = self.pkgSack.returnPackages(patterns=patterns, @@ -188477,7 +188528,7 @@ index 99039e0..a43f493 100644 else: try: avail = self.pkgSack.returnNewestByNameArch(patterns=patterns, -@@ -2461,14 +3040,13 @@ class YumBase(depsolve.Depsolve): +@@ -2461,14 +3042,13 @@ class YumBase(depsolve.Depsolve): def findDeps(self, pkgs): @@ -188497,7 +188548,7 @@ index 99039e0..a43f493 100644 results = {} for pkg in pkgs: -@@ -2495,10 +3073,22 @@ class YumBase(depsolve.Depsolve): +@@ -2495,10 +3075,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): @@ -188524,7 +188575,7 @@ index 99039e0..a43f493 100644 sql_fields = [] for f in fields: sql_fields.append(RPM_TO_SQLITE.get(f, f)) -@@ -2614,7 +3204,7 @@ class YumBase(depsolve.Depsolve): +@@ -2614,7 +3206,7 @@ class YumBase(depsolve.Depsolve): # ...but without showdups we want to output _just_ #3, which requires # we find the newest EVR po for the best "matching value". Without keys # it's the same, except we just want the newest EVR. @@ -188533,7 +188584,7 @@ index 99039e0..a43f493 100644 # either, so it's pretty thankless. HTH. HAND. # By default just sort using package sorting sort_func = operator.itemgetter(0) -@@ -2661,6 +3251,14 @@ class YumBase(depsolve.Depsolve): +@@ -2661,6 +3253,14 @@ class YumBase(depsolve.Depsolve): yield (po, vs) def searchPackageTags(self, criteria): @@ -188548,7 +188599,7 @@ index 99039e0..a43f493 100644 results = {} # name = [(criteria, taglist)] for c in criteria: c = c.lower() -@@ -2677,11 +3275,16 @@ class YumBase(depsolve.Depsolve): +@@ -2677,11 +3277,16 @@ class YumBase(depsolve.Depsolve): return results def searchPackages(self, fields, criteria, callback=None): @@ -188570,7 +188621,7 @@ index 99039e0..a43f493 100644 warnings.warn(_('searchPackages() will go away in a future version of Yum.\ Use searchGenerator() instead. \n'), Errors.YumFutureDeprecationWarning, stacklevel=2) -@@ -2700,13 +3303,23 @@ class YumBase(depsolve.Depsolve): +@@ -2700,13 +3305,23 @@ class YumBase(depsolve.Depsolve): def searchPackageProvides(self, args, callback=None, callback_has_matchfor=False): @@ -188598,7 +188649,7 @@ index 99039e0..a43f493 100644 else: isglob = True canBeFile = misc.re_filename(arg) -@@ -2723,7 +3336,7 @@ class YumBase(depsolve.Depsolve): +@@ -2723,7 +3338,7 @@ class YumBase(depsolve.Depsolve): where = self.returnPackagesByDep(arg) else: usedDepString = False @@ -188607,7 +188658,7 @@ index 99039e0..a43f493 100644 self.verbose_logger.log(logginglevels.DEBUG_1, P_('Searching %d package', 'Searching %d packages', len(where)), len(where)) -@@ -2817,25 +3430,168 @@ class YumBase(depsolve.Depsolve): +@@ -2817,25 +3432,168 @@ class YumBase(depsolve.Depsolve): return matches @@ -188788,13 +188839,11 @@ index 99039e0..a43f493 100644 if uservisible: if grp.user_visible: installed.append(grp) -@@ -2847,34 +3603,91 @@ class YumBase(depsolve.Depsolve): +@@ -2847,34 +3605,91 @@ class YumBase(depsolve.Depsolve): available.append(grp) else: available.append(grp) - -- return sorted(installed), sorted(available) -- + + for evgrp in evgrps: + if ievgrps is None: @@ -188838,8 +188887,9 @@ index 99039e0..a43f493 100644 + if return_evgrps: + return (sorted(installed), sorted(available), + sorted(einstalled), sorted(eavailable)) -+ return sorted(installed), sorted(available) + return sorted(installed), sorted(available) +- def groupRemove(self, grpid): - """mark all the packages in this group to be removed""" - @@ -188890,7 +188940,7 @@ index 99039e0..a43f493 100644 thesegroups = self.comps.return_groups(grpid) if not thesegroups: raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid) -@@ -2898,13 +3711,51 @@ class YumBase(depsolve.Depsolve): +@@ -2898,13 +3713,51 @@ class YumBase(depsolve.Depsolve): self.tsInfo.remove(txmbr.po.pkgtup) @@ -188949,7 +188999,7 @@ index 99039e0..a43f493 100644 """ if not self.comps.has_group(grpid): -@@ -2920,12 +3771,18 @@ class YumBase(depsolve.Depsolve): +@@ -2920,12 +3773,18 @@ class YumBase(depsolve.Depsolve): if group_package_types: package_types = group_package_types @@ -188968,7 +189018,7 @@ index 99039e0..a43f493 100644 pkgs = [] if 'mandatory' in package_types: pkgs.extend(thisgroup.mandatory_packages) -@@ -2934,12 +3791,52 @@ class YumBase(depsolve.Depsolve): +@@ -2934,12 +3793,52 @@ class YumBase(depsolve.Depsolve): if 'optional' in package_types: pkgs.extend(thisgroup.optional_packages) @@ -189022,7 +189072,7 @@ index 99039e0..a43f493 100644 except Errors.InstallError, e: self.verbose_logger.debug(_('No package named %s available to be installed'), pkg) -@@ -2953,7 +3850,9 @@ class YumBase(depsolve.Depsolve): +@@ -2953,7 +3852,9 @@ class YumBase(depsolve.Depsolve): group_conditionals = enable_group_conditionals count_cond_test = 0 @@ -189033,7 +189083,7 @@ index 99039e0..a43f493 100644 for condreq, cond in thisgroup.conditional_packages.iteritems(): if self.isPackageInstalled(cond): try: -@@ -2990,17 +3889,23 @@ class YumBase(depsolve.Depsolve): +@@ -2990,17 +3891,23 @@ class YumBase(depsolve.Depsolve): if cond not in self.tsInfo.conditionals: self.tsInfo.conditionals[cond] = [] self.tsInfo.conditionals[cond].extend(pkgs) @@ -189064,7 +189114,7 @@ index 99039e0..a43f493 100644 if not self.comps.has_group(grpid): raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid) -@@ -3008,7 +3913,8 @@ class YumBase(depsolve.Depsolve): +@@ -3008,7 +3915,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) @@ -189074,7 +189124,7 @@ index 99039e0..a43f493 100644 for thisgroup in thesegroups: thisgroup.selected = False -@@ -3034,13 +3940,102 @@ class YumBase(depsolve.Depsolve): +@@ -3034,13 +3942,102 @@ class YumBase(depsolve.Depsolve): for pkg in self.tsInfo.conditionals.get(txmbr.name, []): self.tsInfo.remove(pkg.pkgtup) @@ -189183,7 +189233,7 @@ index 99039e0..a43f493 100644 # look it up in the self.localPackages first: for po in self.localPackages: if po.pkgtup == pkgtup: -@@ -3049,7 +4044,7 @@ class YumBase(depsolve.Depsolve): +@@ -3049,7 +4046,7 @@ class YumBase(depsolve.Depsolve): pkgs = self.pkgSack.searchPkgTuple(pkgtup) if len(pkgs) == 0: @@ -189192,7 +189242,7 @@ index 99039e0..a43f493 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 +4060,21 @@ class YumBase(depsolve.Depsolve): +@@ -3065,13 +4062,21 @@ class YumBase(depsolve.Depsolve): return result def getInstalledPackageObject(self, pkgtup): @@ -189219,7 +189269,7 @@ index 99039e0..a43f493 100644 raise Errors.RpmDBError, _('Package tuple %s could not be found in rpmdb') % str(pkgtup) # Dito. FIXME from getPackageObject() for len() > 1 ... :) -@@ -3079,9 +4082,11 @@ class YumBase(depsolve.Depsolve): +@@ -3079,9 +4084,11 @@ class YumBase(depsolve.Depsolve): return po def gpgKeyCheck(self): @@ -189233,7 +189283,7 @@ index 99039e0..a43f493 100644 gpgkeyschecked = self.conf.cachedir + '/.gpgkeyschecked.yum' if os.path.exists(gpgkeyschecked): return 1 -@@ -3106,9 +4111,13 @@ class YumBase(depsolve.Depsolve): +@@ -3106,9 +4113,13 @@ class YumBase(depsolve.Depsolve): return 1 def returnPackagesByDep(self, depstring): @@ -189249,7 +189299,7 @@ index 99039e0..a43f493 100644 if not depstring: return [] -@@ -3132,12 +4141,23 @@ class YumBase(depsolve.Depsolve): +@@ -3132,12 +4143,23 @@ class YumBase(depsolve.Depsolve): raise Errors.YumBaseError, _('Invalid version flag from: %s') % str(depstring) depflags = SYMBOLFLAGS[flagsymbol] @@ -189276,7 +189326,7 @@ index 99039e0..a43f493 100644 # we get all sorts of randomness here errstring = depstring if type(depstring) not in types.StringTypes: -@@ -3149,16 +4169,22 @@ class YumBase(depsolve.Depsolve): +@@ -3149,16 +4171,22 @@ class YumBase(depsolve.Depsolve): raise Errors.YumBaseError, _('No Package found for %s') % errstring ps = ListPackageSack(pkglist) @@ -189303,7 +189353,7 @@ index 99039e0..a43f493 100644 if not depstring: return [] -@@ -3182,14 +4208,53 @@ class YumBase(depsolve.Depsolve): +@@ -3182,14 +4210,53 @@ class YumBase(depsolve.Depsolve): raise Errors.YumBaseError, _('Invalid version flag from: %s') % str(depstring) depflags = SYMBOLFLAGS[flagsymbol] @@ -189359,7 +189409,7 @@ index 99039e0..a43f493 100644 if len(pkglist) == 0: -@@ -3198,14 +4263,23 @@ class YumBase(depsolve.Depsolve): +@@ -3198,14 +4265,23 @@ class YumBase(depsolve.Depsolve): if len(pkglist) == 1: return pkglist[0] @@ -189389,7 +189439,7 @@ index 99039e0..a43f493 100644 returnlist = [] compatArchList = self.arch.get_arch_list(arch) multiLib = [] -@@ -3222,9 +4296,9 @@ class YumBase(depsolve.Depsolve): +@@ -3222,9 +4298,9 @@ class YumBase(depsolve.Depsolve): singleLib.append(po) # we now have three lists. find the best package(s) of each @@ -189402,7 +189452,7 @@ index 99039e0..a43f493 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 +4312,7 @@ class YumBase(depsolve.Depsolve): +@@ -3238,7 +4314,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: @@ -189411,7 +189461,7 @@ index 99039e0..a43f493 100644 if best.arch == "noarch": returnlist.append(no) else: -@@ -3246,7 +4320,7 @@ class YumBase(depsolve.Depsolve): +@@ -3246,7 +4322,7 @@ class YumBase(depsolve.Depsolve): if single: returnlist.append(single) # similar for the non-multilib case elif single: @@ -189420,7 +189470,7 @@ index 99039e0..a43f493 100644 if best.arch == "noarch": returnlist.append(no) else: -@@ -3350,28 +4424,65 @@ class YumBase(depsolve.Depsolve): +@@ -3350,28 +4426,65 @@ class YumBase(depsolve.Depsolve): done = True slow = next_func(slow) @@ -189492,7 +189542,7 @@ index 99039e0..a43f493 100644 try: txmbrs = self.groupRemove(group_string) except yum.Errors.GroupsError: -@@ -3387,6 +4498,8 @@ class YumBase(depsolve.Depsolve): +@@ -3387,6 +4500,8 @@ class YumBase(depsolve.Depsolve): assert pattern[0] == '@' grpid = pattern[1:] @@ -189501,7 +189551,7 @@ index 99039e0..a43f493 100644 thesegroups = self.comps.return_groups(grpid) if not thesegroups: raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid) -@@ -3398,7 +4511,11 @@ class YumBase(depsolve.Depsolve): +@@ -3398,7 +4513,11 @@ class YumBase(depsolve.Depsolve): def _minus_deselect(self, pattern): """ Remove things from the transaction, like kickstart. """ assert pattern[0] == '-' @@ -189514,7 +189564,7 @@ index 99039e0..a43f493 100644 if pat and pat[0] == '@': pat = pat[1:] -@@ -3437,14 +4554,87 @@ class YumBase(depsolve.Depsolve): +@@ -3437,14 +4556,87 @@ class YumBase(depsolve.Depsolve): if flag not in self.tsInfo.probFilterFlags: self.tsInfo.probFilterFlags.append(flag) @@ -189608,7 +189658,7 @@ index 99039e0..a43f493 100644 pkgs = [] was_pattern = False if po: -@@ -3464,9 +4654,14 @@ class YumBase(depsolve.Depsolve): +@@ -3464,9 +4656,14 @@ class YumBase(depsolve.Depsolve): if kwargs['pattern'] and kwargs['pattern'][0] == '@': return self._at_groupinstall(kwargs['pattern']) @@ -189623,7 +189673,7 @@ index 99039e0..a43f493 100644 ignore_case=False) pkgs.extend(mypkgs) # if we have anything left unmatched, let's take a look for it -@@ -3477,20 +4672,12 @@ class YumBase(depsolve.Depsolve): +@@ -3477,20 +4674,12 @@ class YumBase(depsolve.Depsolve): self.verbose_logger.debug(_('Checking for virtual provide or file-provide for %s'), arg) @@ -189650,7 +189700,7 @@ index 99039e0..a43f493 100644 else: nevra_dict = self._nevra_kwarg_parse(kwargs) -@@ -3499,6 +4686,8 @@ class YumBase(depsolve.Depsolve): +@@ -3499,6 +4688,8 @@ class YumBase(depsolve.Depsolve): ver=nevra_dict['version'], rel=nevra_dict['release']) self._add_not_found_a(pkgs, nevra_dict) @@ -189659,7 +189709,7 @@ index 99039e0..a43f493 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 +4766,21 @@ class YumBase(depsolve.Depsolve): +@@ -3577,17 +4768,21 @@ class YumBase(depsolve.Depsolve): continue # make sure this shouldn't be passed to update: @@ -189685,7 +189735,7 @@ index 99039e0..a43f493 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 +4793,23 @@ class YumBase(depsolve.Depsolve): +@@ -3600,23 +4795,23 @@ class YumBase(depsolve.Depsolve): already_obs = pkgs[0] if already_obs: @@ -189716,7 +189766,7 @@ index 99039e0..a43f493 100644 continue # make sure we don't have a name.arch of this already installed -@@ -3630,8 +4823,8 @@ class YumBase(depsolve.Depsolve): +@@ -3630,8 +4825,8 @@ class YumBase(depsolve.Depsolve): found = True break if not found: @@ -189727,7 +189777,7 @@ index 99039e0..a43f493 100644 tx_return.extend(txmbrs) continue -@@ -3719,19 +4912,47 @@ class YumBase(depsolve.Depsolve): +@@ -3719,19 +4914,47 @@ class YumBase(depsolve.Depsolve): return txmbr def update(self, po=None, requiringPo=None, update_to=False, **kwargs): @@ -189782,7 +189832,7 @@ index 99039e0..a43f493 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 +4986,14 @@ class YumBase(depsolve.Depsolve): +@@ -3765,7 +4988,14 @@ class YumBase(depsolve.Depsolve): if new is None: continue tx_return.extend(self.update(po=new)) @@ -189798,7 +189848,7 @@ index 99039e0..a43f493 100644 return tx_return # complications -@@ -3787,13 +5015,16 @@ class YumBase(depsolve.Depsolve): +@@ -3787,13 +5017,16 @@ class YumBase(depsolve.Depsolve): return self._minus_deselect(kwargs['pattern']) if kwargs['pattern'] and kwargs['pattern'][0] == '@': @@ -189817,7 +189867,7 @@ index 99039e0..a43f493 100644 if not instpkgs and not availpkgs: depmatches = [] -@@ -3805,6 +5036,8 @@ class YumBase(depsolve.Depsolve): +@@ -3805,6 +5038,8 @@ class YumBase(depsolve.Depsolve): except yum.Errors.YumBaseError, e: self.logger.critical(_('%s') % e) @@ -189826,7 +189876,7 @@ index 99039e0..a43f493 100644 if update_to: availpkgs.extend(depmatches) else: -@@ -3816,9 +5049,12 @@ class YumBase(depsolve.Depsolve): +@@ -3816,9 +5051,12 @@ class YumBase(depsolve.Depsolve): try: if update_to: m = [] @@ -189840,7 +189890,7 @@ index 99039e0..a43f493 100644 m = self.pkgSack.returnNewestByNameArch(patterns=pats) except Errors.PackageSackError: m = [] -@@ -3843,7 +5079,7 @@ class YumBase(depsolve.Depsolve): +@@ -3843,7 +5081,7 @@ class YumBase(depsolve.Depsolve): availpkgs = self._compare_providers(availpkgs, requiringPo) availpkgs = map(lambda x: x[0], availpkgs) elif not availpkgs: @@ -189849,7 +189899,7 @@ index 99039e0..a43f493 100644 # for any thing specified # get the list of available pkgs matching it (or take the po) -@@ -3879,6 +5115,7 @@ class YumBase(depsolve.Depsolve): +@@ -3879,6 +5117,7 @@ class YumBase(depsolve.Depsolve): if obsoleting_pkg is None: continue obs_pkgs.append(obsoleting_pkg) @@ -189857,7 +189907,7 @@ index 99039e0..a43f493 100644 for obsoleting_pkg in packagesNewestByName(obs_pkgs): tx_return.extend(self.install(po=obsoleting_pkg)) for available_pkg in availpkgs: -@@ -3920,11 +5157,29 @@ class YumBase(depsolve.Depsolve): +@@ -3920,11 +5159,29 @@ class YumBase(depsolve.Depsolve): tx_return.append(txmbr) for available_pkg in availpkgs: @@ -189887,7 +189937,7 @@ index 99039e0..a43f493 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 +5240,18 @@ class YumBase(depsolve.Depsolve): +@@ -3985,11 +5242,18 @@ class YumBase(depsolve.Depsolve): return tx_return def remove(self, po=None, **kwargs): @@ -189911,7 +189961,7 @@ index 99039e0..a43f493 100644 if not po and not kwargs: raise Errors.RemoveError, 'Nothing specified to remove' -@@ -4008,6 +5270,10 @@ class YumBase(depsolve.Depsolve): +@@ -4008,6 +5272,10 @@ class YumBase(depsolve.Depsolve): return self._at_groupremove(kwargs['pattern']) (e,m,u) = self.rpmdb.matchPackageNames([kwargs['pattern']]) @@ -189922,7 +189972,7 @@ index 99039e0..a43f493 100644 pkgs.extend(e) pkgs.extend(m) if u: -@@ -4018,6 +5284,10 @@ class YumBase(depsolve.Depsolve): +@@ -4018,6 +5286,10 @@ class YumBase(depsolve.Depsolve): except yum.Errors.YumBaseError, e: self.logger.critical(_('%s') % e) @@ -189933,7 +189983,7 @@ index 99039e0..a43f493 100644 if not depmatches: arg = to_unicode(arg) self.logger.critical(_('No Match for argument: %s') % to_unicode(arg)) -@@ -4055,17 +5325,19 @@ class YumBase(depsolve.Depsolve): +@@ -4055,17 +5327,19 @@ class YumBase(depsolve.Depsolve): return tx_return def installLocal(self, pkg, po=None, updateonly=False): @@ -189963,7 +190013,7 @@ index 99039e0..a43f493 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 +5455,15 @@ class YumBase(depsolve.Depsolve): +@@ -4183,16 +5457,15 @@ class YumBase(depsolve.Depsolve): return tx_return def reinstallLocal(self, pkg, po=None): @@ -189988,7 +190038,7 @@ index 99039e0..a43f493 100644 if not po: try: po = YumUrlPackage(self, ts=self.rpmdb.readOnlyTS(), url=pkg, -@@ -4215,13 +5486,29 @@ class YumBase(depsolve.Depsolve): +@@ -4215,13 +5488,29 @@ class YumBase(depsolve.Depsolve): return self.reinstall(po=po) def reinstall(self, po=None, **kwargs): @@ -190021,7 +190071,7 @@ index 99039e0..a43f493 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 +5527,11 @@ class YumBase(depsolve.Depsolve): +@@ -4240,10 +5529,11 @@ class YumBase(depsolve.Depsolve): # pkgs that are obsolete. old_conf_obs = self.conf.obsoletes self.conf.obsoletes = False @@ -190035,7 +190085,7 @@ index 99039e0..a43f493 100644 self.conf.obsoletes = old_conf_obs if len(members) == 0: self.tsInfo.remove(item.pkgtup) -@@ -4259,16 +5547,15 @@ class YumBase(depsolve.Depsolve): +@@ -4259,16 +5549,15 @@ class YumBase(depsolve.Depsolve): return tx_mbrs def downgradeLocal(self, pkg, po=None): @@ -190060,7 +190110,7 @@ index 99039e0..a43f493 100644 if not po: try: po = YumUrlPackage(self, ts=self.rpmdb.readOnlyTS(), url=pkg, -@@ -4309,13 +5596,19 @@ class YumBase(depsolve.Depsolve): +@@ -4309,13 +5598,19 @@ class YumBase(depsolve.Depsolve): return False def downgrade(self, po=None, **kwargs): @@ -190087,7 +190137,7 @@ index 99039e0..a43f493 100644 if not po and not kwargs: raise Errors.DowngradeError, 'Nothing specified to downgrade' -@@ -4397,6 +5690,10 @@ class YumBase(depsolve.Depsolve): +@@ -4397,6 +5692,10 @@ class YumBase(depsolve.Depsolve): # installed version. Indexed fromn the latest installed pkgtup. downgrade_apkgs = {} for pkg in sorted(apkgs): @@ -190098,7 +190148,7 @@ index 99039e0..a43f493 100644 na = (pkg.name, pkg.arch) # Here we allow downgrades from .i386 => .noarch, or .i586 => .i386 -@@ -4421,6 +5718,9 @@ class YumBase(depsolve.Depsolve): +@@ -4421,6 +5720,9 @@ class YumBase(depsolve.Depsolve): warned_nas.add(na) continue @@ -190108,7 +190158,7 @@ index 99039e0..a43f493 100644 if pkg.verGE(lipkg): if na not in warned_nas: msg = _('Only Upgrade available on package: %s') % pkg -@@ -4457,7 +5757,7 @@ class YumBase(depsolve.Depsolve): +@@ -4457,7 +5759,7 @@ class YumBase(depsolve.Depsolve): if e and v and r: evr = '%s:%s-%s' % (e, v, r) elif v and r: @@ -190117,7 +190167,7 @@ index 99039e0..a43f493 100644 elif e and v: evr = '%s:%s' % (e, v) elif v: # e and r etc. is just too weird to print -@@ -4500,12 +5800,24 @@ class YumBase(depsolve.Depsolve): +@@ -4500,12 +5802,24 @@ class YumBase(depsolve.Depsolve): return returndict @@ -190145,7 +190195,7 @@ index 99039e0..a43f493 100644 old_conf_obs = self.conf.obsoletes self.conf.obsoletes = False done = False -@@ -4515,19 +5827,46 @@ class YumBase(depsolve.Depsolve): +@@ -4515,19 +5829,46 @@ class YumBase(depsolve.Depsolve): done = True for pkg in transaction.trans_data: if pkg.state == 'Downgrade': @@ -190192,7 +190242,7 @@ index 99039e0..a43f493 100644 if self.install(pkgtup=pkg.pkgtup): done = True for pkg in transaction.trans_data: -@@ -4538,8 +5877,14 @@ class YumBase(depsolve.Depsolve): +@@ -4538,8 +5879,14 @@ class YumBase(depsolve.Depsolve): return done def history_undo(self, transaction): @@ -190209,7 +190259,7 @@ index 99039e0..a43f493 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 +5961,7 @@ class YumBase(depsolve.Depsolve): +@@ -4616,7 +5963,7 @@ class YumBase(depsolve.Depsolve): except urlgrabber.grabber.URLGrabError, e: raise Errors.YumBaseError(_('GPG key retrieval failed: ') + @@ -190218,7 +190268,7 @@ index 99039e0..a43f493 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 +5994,7 @@ class YumBase(depsolve.Depsolve): +@@ -4649,7 +5996,7 @@ class YumBase(depsolve.Depsolve): keys_info = misc.getgpgkeyinfo(rawkey, multiple=True) except ValueError, e: raise Errors.YumBaseError(_('Invalid GPG Key from %s: %s') % @@ -190227,7 +190277,7 @@ index 99039e0..a43f493 100644 keys = [] for keyinfo in keys_info: thiskey = {} -@@ -4674,39 +6019,49 @@ class YumBase(depsolve.Depsolve): +@@ -4674,39 +6021,49 @@ class YumBase(depsolve.Depsolve): if pkgs: pkgs = sorted(pkgs)[-1] msg = (_('Importing %s key 0x%s:\n' @@ -190295,7 +190345,7 @@ index 99039e0..a43f493 100644 user_cb_fail = False for keyurl in keyurls: keys = self._retrievePublicKey(keyurl, repo) -@@ -4725,7 +6080,9 @@ class YumBase(depsolve.Depsolve): +@@ -4725,7 +6082,9 @@ class YumBase(depsolve.Depsolve): # Try installing/updating GPG key self._getKeyImportMessage(info, keyurl) rc = False @@ -190306,7 +190356,7 @@ index 99039e0..a43f493 100644 rc = True # grab the .sig/.asc for the keyurl, if it exists -@@ -4751,8 +6108,8 @@ class YumBase(depsolve.Depsolve): +@@ -4751,8 +6110,8 @@ class YumBase(depsolve.Depsolve): ts = self.rpmdb.readOnlyTS() result = ts.pgpImportPubkey(misc.procgpgkey(info['raw_key'])) if result != 0: @@ -190317,7 +190367,7 @@ index 99039e0..a43f493 100644 self.logger.info(_('Key imported successfully')) key_installed = True -@@ -4760,18 +6117,20 @@ class YumBase(depsolve.Depsolve): +@@ -4760,18 +6119,20 @@ class YumBase(depsolve.Depsolve): raise Errors.YumBaseError, _("Didn't install any keys") if not key_installed: @@ -190343,7 +190393,7 @@ index 99039e0..a43f493 100644 def _getAnyKeyForRepo(self, repo, destdir, keyurl_list, is_cakey=False, callback=None): """ -@@ -4788,6 +6147,18 @@ class YumBase(depsolve.Depsolve): +@@ -4788,6 +6149,18 @@ class YumBase(depsolve.Depsolve): """ key_installed = False @@ -190362,7 +190412,7 @@ index 99039e0..a43f493 100644 user_cb_fail = False for keyurl in keyurl_list: keys = self._retrievePublicKey(keyurl, repo, getSig=not is_cakey) -@@ -4819,8 +6190,11 @@ class YumBase(depsolve.Depsolve): +@@ -4819,8 +6192,11 @@ class YumBase(depsolve.Depsolve): if not key_installed: self._getKeyImportMessage(info, keyurl, keytype) rc = False @@ -190375,7 +190425,7 @@ index 99039e0..a43f493 100644 elif callback: rc = callback({"repo": repo, "userid": info['userid'], "hexkeyid": info['hexkeyid'], "keyurl": keyurl, -@@ -4835,7 +6209,8 @@ class YumBase(depsolve.Depsolve): +@@ -4835,7 +6211,8 @@ class YumBase(depsolve.Depsolve): # Import the key result = misc.import_key_to_pubring(info['raw_key'], info['hexkeyid'], gpgdir=destdir) if not result: @@ -190385,7 +190435,7 @@ index 99039e0..a43f493 100644 self.logger.info(_('Key imported successfully')) key_installed = True # write out the key id to imported_cakeys in the repos basedir -@@ -4851,36 +6226,35 @@ class YumBase(depsolve.Depsolve): +@@ -4851,36 +6228,35 @@ class YumBase(depsolve.Depsolve): pass if not key_installed and user_cb_fail: @@ -190438,7 +190488,7 @@ index 99039e0..a43f493 100644 self._getAnyKeyForRepo(repo, repo.gpgcadir, repo.gpgcakey, is_cakey=True, callback=callback) def _limit_installonly_pkgs(self): -@@ -4889,7 +6263,7 @@ class YumBase(depsolve.Depsolve): +@@ -4889,7 +6265,7 @@ class YumBase(depsolve.Depsolve): New in 3.2.24: Obey yumdb_info.installonly data. """ def _sort_and_filter_installonly(pkgs): @@ -190447,7 +190497,7 @@ index 99039e0..a43f493 100644 using the yumdb. """ ret_beg = [] ret_mid = [] -@@ -4917,6 +6291,10 @@ class YumBase(depsolve.Depsolve): +@@ -4917,6 +6293,10 @@ class YumBase(depsolve.Depsolve): if self.conf.installonly_limit < 1 : return @@ -190458,7 +190508,7 @@ index 99039e0..a43f493 100644 toremove = [] # We "probably" want to use either self.ts or self.rpmdb.ts if either -@@ -4926,23 +6304,30 @@ class YumBase(depsolve.Depsolve): +@@ -4926,23 +6306,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) @@ -190497,7 +190547,7 @@ index 99039e0..a43f493 100644 for po in installed: if (po.version, po.release) == (cur_kernel_v, cur_kernel_r): # don't remove running -@@ -4959,19 +6344,22 @@ class YumBase(depsolve.Depsolve): +@@ -4959,19 +6346,22 @@ class YumBase(depsolve.Depsolve): txmbr.depends_on.append(rel) def processTransaction(self, callback=None,rpmTestDisplay=None, rpmDisplay=None): @@ -190533,7 +190583,7 @@ index 99039e0..a43f493 100644 if not callback: callback = callbacks.ProcessTransNoOutputCallback() -@@ -5062,8 +6450,8 @@ class YumBase(depsolve.Depsolve): +@@ -5062,8 +6452,8 @@ class YumBase(depsolve.Depsolve): raise Errors.YumRPMCheckError, retmsgs retmsgs = [_('ERROR with transaction check vs depsolve:')] retmsgs.extend(msgs) @@ -190544,7 +190594,7 @@ index 99039e0..a43f493 100644 raise Errors.YumRPMCheckError,retmsgs tsConf = {} -@@ -5114,13 +6502,19 @@ class YumBase(depsolve.Depsolve): +@@ -5114,13 +6504,19 @@ class YumBase(depsolve.Depsolve): return results def add_enable_repo(self, repoid, baseurls=[], mirrorlist=None, **kwargs): @@ -190571,7 +190621,7 @@ index 99039e0..a43f493 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 +6561,15 @@ class YumBase(depsolve.Depsolve): +@@ -5167,9 +6563,15 @@ class YumBase(depsolve.Depsolve): def setCacheDir(self, force=False, tmpdir=None, reuse=True, suffix='/$basearch/$releasever'): @@ -190590,7 +190640,7 @@ index 99039e0..a43f493 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 +6579,7 @@ class YumBase(depsolve.Depsolve): +@@ -5179,7 +6581,7 @@ class YumBase(depsolve.Depsolve): try: cachedir = misc.getCacheDir(tmpdir, reuse) except (IOError, OSError), e: @@ -190599,7 +190649,7 @@ index 99039e0..a43f493 100644 cachedir = None if cachedir is None: -@@ -5190,6 +6590,8 @@ class YumBase(depsolve.Depsolve): +@@ -5190,6 +6592,8 @@ class YumBase(depsolve.Depsolve): self.prerepoconf.cachedir = cachedir else: self.repos.setCacheDir(cachedir) @@ -190608,7 +190658,7 @@ index 99039e0..a43f493 100644 self.conf.cachedir = cachedir return True # We got a new cache dir -@@ -5220,13 +6622,24 @@ class YumBase(depsolve.Depsolve): +@@ -5220,13 +6624,24 @@ class YumBase(depsolve.Depsolve): self.history.write_addon_data('config-repos', myrepos) def verify_plugins_cb(self, verify_package): @@ -190636,7 +190686,7 @@ index 99039e0..a43f493 100644 if self.tsInfo._unresolvedMembers: if auto: self.logger.critical(_("Dependencies not solved. Will not save unresolved transaction.")) -@@ -5234,7 +6647,7 @@ class YumBase(depsolve.Depsolve): +@@ -5234,7 +6649,7 @@ class YumBase(depsolve.Depsolve): raise Errors.YumBaseError(_("Dependencies not solved. Will not save unresolved transaction.")) if not filename: @@ -190645,7 +190695,7 @@ index 99039e0..a43f493 100644 fd,filename = tempfile.mkstemp(suffix='.yumtx', prefix=prefix) f = os.fdopen(fd, 'w') else: -@@ -5244,13 +6657,17 @@ class YumBase(depsolve.Depsolve): +@@ -5244,13 +6659,17 @@ class YumBase(depsolve.Depsolve): msg = "%s\n" % self.rpmdb.simpleVersion(main_only=True)[0] msg += "%s\n" % self.ts.getTsFlags() @@ -190666,7 +190716,7 @@ index 99039e0..a43f493 100644 msg += "%s\n" % len(self.tsInfo.getMembers()) for txmbr in self.tsInfo.getMembers(): msg += txmbr._dump() -@@ -5260,42 +6677,84 @@ class YumBase(depsolve.Depsolve): +@@ -5260,42 +6679,84 @@ class YumBase(depsolve.Depsolve): except (IOError, OSError), e: self._ts_save_file = None if auto: @@ -190763,7 +190813,7 @@ index 99039e0..a43f493 100644 if ignorerpm: msg += _(" ignoring, as requested.") self.logger.critical(_(msg)) -@@ -5318,8 +6777,17 @@ class YumBase(depsolve.Depsolve): +@@ -5318,8 +6779,17 @@ class YumBase(depsolve.Depsolve): numrepos = int(data[2].strip()) repos = [] rindex=3+numrepos @@ -190782,7 +190832,7 @@ index 99039e0..a43f493 100644 # pkgs/txmbrs numpkgs = int(data[rindex].strip()) -@@ -5329,6 +6797,7 @@ class YumBase(depsolve.Depsolve): +@@ -5329,6 +6799,7 @@ class YumBase(depsolve.Depsolve): pkgcount = 0 pkgprob = False curpkg = None @@ -190790,7 +190840,7 @@ index 99039e0..a43f493 100644 for l in data[pkgstart:]: l = l.rstrip() # our main txmbrs -@@ -5356,6 +6825,7 @@ class YumBase(depsolve.Depsolve): +@@ -5356,6 +6827,7 @@ class YumBase(depsolve.Depsolve): if not ignoremissing: raise Errors.YumBaseError(msg) else: @@ -190798,7 +190848,7 @@ index 99039e0..a43f493 100644 self.logger.critical(msg) else: pkgcount += 1 -@@ -5432,12 +6902,18 @@ class YumBase(depsolve.Depsolve): +@@ -5432,12 +6904,18 @@ class YumBase(depsolve.Depsolve): if pkgprob: msg = _("Transaction members, relations are missing or ts has been modified,") if ignoremissing: @@ -190817,7 +190867,7 @@ index 99039e0..a43f493 100644 return self.tsInfo.getMembers() def _remove_old_deps(self): -@@ -5470,18 +6946,6 @@ class YumBase(depsolve.Depsolve): +@@ -5470,18 +6948,6 @@ class YumBase(depsolve.Depsolve): if requiring == required: # if they are self-requiring skip them continue @@ -190836,7 +190886,7 @@ index 99039e0..a43f493 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 +6997,24 @@ class YumBase(depsolve.Depsolve): +@@ -5533,7 +6999,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 @@ -190861,7 +190911,7 @@ index 99039e0..a43f493 100644 visited[curpkg] = True all_leaves_visited = True leaves = curpkg.requiring_packages() -@@ -5547,4 +7028,3 @@ class YumBase(depsolve.Depsolve): +@@ -5547,4 +7030,3 @@ class YumBase(depsolve.Depsolve): # Debugging output self.verbose_logger.log(logginglevels.DEBUG_2, _("%s has no user-installed revdeps."), pkg) return False @@ -191535,7 +191585,7 @@ index 65f6d5e..706e2a4 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..1d446c0 100644 +index d09511f..3bc5bd1 100644 --- a/yum/config.py +++ b/yum/config.py @@ -45,15 +45,18 @@ from misc import get_uuid, read_in_items_from_dot_dir @@ -192415,7 +192465,15 @@ index d09511f..1d446c0 100644 ck = self.__cached_keys if not isinstance(self, RepoConf): ck = set() -@@ -820,42 +965,52 @@ class RepoConf(BaseConfig): +@@ -797,6 +942,7 @@ class RepoConf(BaseConfig): + + name = Option() + enabled = Inherit(YumConf.enabled) ++ keepcache = Inherit(YumConf.keepcache) + baseurl = UrlListOption() + mirrorlist = UrlOption() + metalink = UrlOption() +@@ -820,42 +966,52 @@ class RepoConf(BaseConfig): keepalive = Inherit(YumConf.keepalive) enablegroups = Inherit(YumConf.enablegroups) @@ -192479,7 +192537,7 @@ index d09511f..1d446c0 100644 # ' xemacs syntax hack -@@ -876,20 +1031,24 @@ def readStartupConfig(configfile, root): +@@ -876,20 +1032,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 @@ -192510,7 +192568,7 @@ index d09511f..1d446c0 100644 # ' xemacs syntax hack -@@ -956,6 +1115,12 @@ def readMainConfig(startupconf): +@@ -956,6 +1116,12 @@ def readMainConfig(startupconf): return yumconf def readVersionGroupsConfig(configfile="/etc/yum/version-groups.conf"): @@ -192523,7 +192581,7 @@ index d09511f..1d446c0 100644 parser = ConfigParser() confpp_obj = ConfigPreProcessor(configfile) try: -@@ -970,17 +1135,16 @@ def readVersionGroupsConfig(configfile="/etc/yum/version-groups.conf"): +@@ -970,17 +1136,16 @@ def readVersionGroupsConfig(configfile="/etc/yum/version-groups.conf"): def getOption(conf, section, name, option): @@ -192551,7 +192609,7 @@ index d09511f..1d446c0 100644 try: val = conf.get(section, name) except (NoSectionError, NoOptionError): -@@ -1028,25 +1192,28 @@ def _getsysver(installroot, distroverpkg): +@@ -1028,25 +1193,28 @@ def _getsysver(installroot, distroverpkg): if idx.count() == 0: releasever = '$releasever' else: @@ -192591,7 +192649,7 @@ index d09511f..1d446c0 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 +1221,19 @@ def writeRawRepoFile(repo,only=None): +@@ -1054,6 +1222,19 @@ def writeRawRepoFile(repo,only=None): for sect in ini._sections.keys(): if varReplace(sect, repo.yumvar) == repo.id: section_id = sect @@ -192611,7 +192669,7 @@ index d09511f..1d446c0 100644 # Updated the ConfigParser with the changed values cfgOptions = repo.cfg.options(repo.id) -@@ -1069,7 +1249,7 @@ def writeRawRepoFile(repo,only=None): +@@ -1069,7 +1250,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 @@ -198420,7 +198478,7 @@ index 0000000..1cc207f + return txmbrs + diff --git a/yum/yumRepo.py b/yum/yumRepo.py -index e5e9ece..970b628 100644 +index e5e9ece..3b44eaa 100644 --- a/yum/yumRepo.py +++ b/yum/yumRepo.py @@ -20,10 +20,12 @@ import time @@ -199303,7 +199361,7 @@ index e5e9ece..970b628 100644 + if l_csum: + fsize = misc.stat_f(file) + if fsize is not None: # We just got an xattr, so it should be there -+ if size is None and l_csum == r_csum: ++ if size is None and l_csum == r_csum and fsize.st_size > 0: + return 1 + if size == fsize.st_size and l_csum == r_csum: + return 1 @@ -203545,7 +203603,7 @@ index 4dcbea7..03fc58a 100644 + + return 0, [basecmd + ' ' + subcommand + ' done'] diff --git a/yummain.py b/yummain.py -index 9f79f4f..2535d65 100755 +index 9f79f4f..f0b29ff 100755 --- a/yummain.py +++ b/yummain.py @@ -29,13 +29,13 @@ from yum import Errors @@ -203574,9 +203632,9 @@ index 9f79f4f..2535d65 100755 + base.cleanExpireCache() + + msg = _("""\ -+ One of the configured repositories failed (%(repo)s), and yum doesn't have -+enough cached data to continue. At this point the only safe thing yum can do -+is fail. ++ One of the configured repositories failed (%(repo)s), ++and yum doesn't have enough cached data to continue. At this point the only ++afe thing yum can do is fail. + There are a few ways to work "fix" this: + + 1. Contact the upstream for the repository and get them to fix the problem. @@ -203598,7 +203656,7 @@ index 9f79f4f..2535d65 100755 + slower). If it is a very temporary problem though, this is often a nice + compromise: + -+ yum-config-manager --save --setopt=skip_if_unavailable=true %(repoid)s ++ yum-config-manager --save --setopt=%(repoid)s.skip_if_unavailable=true %(repoid)s +""") + + repoui = _('Unknown') diff --git a/yum.spec b/yum.spec index c1385c2..2997353 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: 108%{?dist} +Release: 109%{?dist} License: GPLv2+ Group: System Environment/Base Source0: http://yum.baseurl.org/download/3.4/%{name}-%{version}.tar.gz @@ -403,6 +403,13 @@ exit 0 %endif %changelog +* Wed Sep 4 2013 James Antill - 3.4.3-109 +- Update to latest HEAD. +- update /etc/yum-cron-hourly.conf. BZ 1002623 +- Tweak y-c-t and history redo msg. BZ 974576. +- docs: $arch does not map 1:1 to uname(2) arch. BZ 1003554 +- checkMD: re-check when xattr matches but size==0. BZ 1002494 + * Wed Aug 28 2013 James Antill - 3.4.3-108 - Update to latest HEAD. - Use new comps. mock objects to re-integrate group removal. BZ 996866.