diff --git a/SOURCES/BZ-1047793-lvm-snapshot.patch b/SOURCES/BZ-1047793-lvm-snapshot.patch new file mode 100644 index 0000000..8988f0e --- /dev/null +++ b/SOURCES/BZ-1047793-lvm-snapshot.patch @@ -0,0 +1,297 @@ +commit 13bbacb4dd25b83cd29389e0608fde1614537257 +Author: Valentina Mukhamedzhanova +Date: Mon Jan 12 15:21:46 2015 +0100 + + Multiple lvm fixes. BZ 1047793, BZ 1145485 + - add fssnap_abort_on_errors config option + - fix default for fssnap_automatic_keep in the man page + - add logging for automatic fssnap events + - add lvm binary path test to _FSSnap.available + - check for lvm2 and lvm2-python-libs packages instead of python-lvm + +diff --git a/docs/yum.8 b/docs/yum.8 +index 998a5ad..a0038f6 100644 +--- a/docs/yum.8 ++++ b/docs/yum.8 +@@ -741,7 +741,7 @@ then you can create and delete snapshots using: + .br + + .br +-Configuration Options: \fBfssnap_automatic_pre\fP, \fBfssnap_automatic_post\fP, \fBfssnap_automatic_keep\fP, \fBfssnap_percentage\fP, \fBfssnap_devices\fP ++Configuration Options: \fBfssnap_automatic_pre\fP, \fBfssnap_automatic_post\fP, \fBfssnap_automatic_keep\fP, \fBfssnap_percentage\fP, \fBfssnap_devices\fP, \fBfssnap_abort_on_errors\fP + + .IP + .IP "\fBfs\fP" +diff --git a/docs/yum.conf.5 b/docs/yum.conf.5 +index 0362e85..272e07b 100644 +--- a/docs/yum.conf.5 ++++ b/docs/yum.conf.5 +@@ -873,7 +873,7 @@ Boolean (1, 0, True, False, yes, no) Defaults to False + .IP + \fBfssnap_automatic_keep\fR + How many old snapshots should yum keep when trying to automatically create a +-new snapshot. Setting to 0 disables this feature. Default is '0'. ++new snapshot. Setting to 0 disables this feature. Default is '1'. + + .IP + \fBfssnap_automatic_percentage\fR +@@ -887,6 +887,21 @@ first match (positive or negative) wins. + Default is: !*/swap !*/lv_swap glob:/etc/yum/fssnap.d/*.conf + + .IP ++\fBfssnap_abort_on_errors\fR ++When fssnap_automatic_pre or fssnap_automatic_post is enabled, it's possible to specify which ++fssnap errors should make the transaction fail. The default is `any'. ++ ++`broken-setup' - Abort current transaction if snapshot support is unavailable because ++lvm is missing or broken. ++ ++`snapshot-failure' - Abort current transaction if creating a snapshot fails (e.g. there is not enough ++free space to make a snapshot). ++ ++`any' - Abort current transaction if any of the above occurs. ++ ++`none' - Never abort a transaction in case of errors. ++ ++.IP + \fBdepsolve_loop_limit\fR + Set the number of times any attempt to depsolve before we just give up. This + shouldn't be needed as yum should always solve or fail, however it has been +diff --git a/yum/__init__.py b/yum/__init__.py +index 6d2c078..347aa7c 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -1727,6 +1727,13 @@ much more problems). + :raises: :class:`yum.Errors.YumRPMTransError` if there is a + transaction cannot be completed + """ ++ if (self.conf.fssnap_automatic_pre or self.conf.fssnap_automatic_post) and not self.fssnap.available: ++ msg = _("Snapshot support not available.") ++ if self.conf.fssnap_abort_on_errors in ('broken-setup', 'any'): ++ raise Errors.YumRPMTransError(msg="Aborting transaction.", errors=msg) ++ else: ++ self.verbose_logger.critical(msg) ++ + if self.fssnap.available and ((self.conf.fssnap_automatic_pre or + self.conf.fssnap_automatic_post) and + self.conf.fssnap_automatic_keep): +@@ -1748,17 +1755,30 @@ much more problems). + if num > self.conf.fssnap_automatic_keep: + todel.append(snap['dev']) + # Display something to the user? +- self.fssnap.del_snapshots(devices=todel) ++ snaps = self.fssnap.del_snapshots(devices=todel) ++ if len(snaps): ++ self.verbose_logger.info(_("Deleted %u snapshots.") % len(snaps)) + + if (self.fssnap.available and + (not self.ts.isTsFlagSet(rpm.RPMTRANS_FLAG_TEST) and + self.conf.fssnap_automatic_pre)): + if not self.fssnap.has_space(self.conf.fssnap_percentage): +- msg = _("Not enough space to create pre. FS snapshot, aborting transaction.") +- raise Errors.YumRPMTransError(msg=msg, errors=[]) ++ msg = _("Not enough space to create pre. FS snapshot.") ++ if self.conf.fssnap_abort_on_errors in ('snapshot-failure', 'any'): ++ raise Errors.YumRPMTransError(msg="Aborting transaction", errors=msg) ++ else: ++ self.verbose_logger.critical(msg) + else: + tags = {'*': ['reason=automatic']} # FIXME: pre. tags +- self.fssnap.snapshot(self.conf.fssnap_percentage, tags=tags) ++ snaps = self.fssnap.snapshot(self.conf.fssnap_percentage, tags=tags) ++ if not snaps: ++ msg = _("Failed to create snapshot") ++ if self.conf.fssnap_abort_on_errors in ('snapshot-failure', 'any'): ++ raise Errors.YumRPMTransError(msg="Aborting transaction", errors=msg) ++ else: ++ self.verbose_logger.critical(msg) ++ for (odev, ndev) in snaps: ++ self.verbose_logger.info(_("Created snapshot from %s, results is: %s") % (odev, ndev)) + + self.plugins.run('pretrans') + +@@ -1895,11 +1915,14 @@ much more problems). + self.conf.fssnap_automatic_post)): + if not self.fssnap.has_space(self.conf.fssnap_percentage): + msg = _("Not enough space to create post trans FS snapshot.") +- self.logger.critical(msg) ++ self.verbose_logger.critical(msg) + else: + tags = {'*': ['reason=automatic']} # FIXME: post tags +- self.fssnap.snapshot(self.conf.fssnap_percentage, tags=tags) +- ++ snaps = self.fssnap.snapshot(self.conf.fssnap_percentage, tags=tags) ++ if not snaps: ++ self.verbose_logger.critical(_("Failed to create snapshot")) ++ for (odev, ndev) in snaps: ++ self.verbose_logger.info(_("Created snapshot from %s, results is: %s") % (odev, ndev)) + return resultobject + + def verifyTransaction(self, resultobject=None, txmbr_cb=None): +diff --git a/yum/config.py b/yum/config.py +index 8eab5bc..02061ba 100644 +--- a/yum/config.py ++++ b/yum/config.py +@@ -899,6 +899,7 @@ class YumConf(StartupConf): + fssnap_devices = ListOption("!*/swap !*/lv_swap " + "glob:/etc/yum/fssnap.d/*.conf", + parse_default=True) ++ fssnap_abort_on_errors = SelectionOption('any', ('broken-setup', 'snapshot-failure', 'any', 'none')) + + depsolve_loop_limit = PositiveIntOption(100, names_of_0=[""]) + +diff --git a/yum/fssnapshots.py b/yum/fssnapshots.py +index e912ea1..9af252d 100755 +--- a/yum/fssnapshots.py ++++ b/yum/fssnapshots.py +@@ -146,7 +143,8 @@ class _FSSnap(object): + devices = [] + + self.version = _ver +- self.available = bool(lvm) ++ # Parts of the API seem to work even when lvm is not actually installed, hence the path test ++ self.available = bool(lvm and os.path.exists("/sbin/lvm")) + self.postfix_static = "_yum_" + self._postfix = None + self._root = root +diff --git a/yumcommands.py b/yumcommands.py +index a18bc5c..e77d209 100644 +--- a/yumcommands.py ++++ b/yumcommands.py +@@ -4264,11 +4264,13 @@ class FSSnapshotCommand(YumCommand): + subcommand = 'summary' + + if not base.fssnap.available: +- if not base.rpmdb.searchNames(['python-lvm']): +- print _("Snapshot support not available, no python-lvm package installed.") +- else: +- print _("Snapshot support not available, python-lvm is old/broken.") +- return 0, [basecmd + ' ' + subcommand + ' done'] ++ msg = _("Snapshot support not available, please check your lvm installation.") ++ if not base.rpmdb.searchNames(['lvm2']): ++ msg += " " + _("No lvm2 package installed.") ++ if not base.rpmdb.searchNames(['lvm2-python-libs']): ++ msg += " " + _("No lvm2-python-libs package installed.") ++ print msg ++ return 1, [basecmd + ' ' + subcommand + ' done'] + + if subcommand == 'list': + snaps = base.fssnap.old_snapshots() +@@ -4301,10 +4303,11 @@ class FSSnapshotCommand(YumCommand): + if subcommand == 'create': + tags = {'*': ['reason=manual']} + pc = base.conf.fssnap_percentage +- for (odev, ndev) in base.fssnap.snapshot(pc, tags=tags): +- print _("Created snapshot from %s, results is: %s") %(odev,ndev) +- else: ++ snaps = base.fssnap.snapshot(pc, tags=tags) ++ if not snaps: + print _("Failed to create snapshots") ++ for (odev, ndev) in snaps: ++ print _("Created snapshot from %s, results is: %s") %(odev,ndev) + + if subcommand == 'summary': + snaps = base.fssnap.old_snapshots() +commit 29440b1175411c3ccaca6010df8dec2d96088fbd +Author: Valentina Mukhamedzhanova +Date: Thu Jul 9 15:26:29 2015 +0200 + + Stop caching fssnapshot postfixes and add microseconds + +diff --git a/yum/fssnapshots.py b/yum/fssnapshots.py +index a07271d..10ec012 100755 +--- a/yum/fssnapshots.py ++++ b/yum/fssnapshots.py +@@ -3,6 +3,7 @@ + import os + import fnmatch + import time ++from datetime import datetime + + import subprocess + +@@ -228,23 +229,13 @@ class _FSSnap(object): + + return ret + +- def _get_postfix(self): +- if self._postfix is None: +- self._postfix = self.postfix_static +- self._postfix += time.strftime("%Y%m%d%H%M%S") +- return self._postfix +- +- postfix = property(fget=lambda self: self._get_postfix(), +- fset=lambda self, value: setattr(self, "_postfix",value), +- fdel=lambda self: setattr(self, "_postfix", None), +- doc="postfix for snapshots") + + def snapshot(self, percentage=100, prefix='', postfix=None, tags={}): + """ Attempt to take a snapshot, note that errors can happen after + this function succeeds. """ + + if postfix is None: +- postfix = self.postfix ++ postfix = '%s%s' % (self.postfix_static, datetime.now().strftime("%Y%m%d%H%M%S.%f")) + + ret = [] + for vgname in self._vgnames: +commit 2678b0a2eb042e011bcafb507eae5ea3565c9110 +Author: Valentina Mukhamedzhanova +Date: Mon Jul 13 16:28:32 2015 +0200 + + Test for lvm binary before using. + +diff --git a/yum/fssnapshots.py b/yum/fssnapshots.py +index 10ec012..70f80a0 100755 +--- a/yum/fssnapshots.py ++++ b/yum/fssnapshots.py +@@ -155,7 +155,7 @@ class _FSSnap(object): + if not self._devs: + return + +- self._vgnames = _list_vg_names() ++ self._vgnames = _list_vg_names() if self.available else [] + + def _use_dev(self, vgname, lv=None): + +commit e756473a1b01f40f087488f72d002d9993843a84 +Author: Valentina Mukhamedzhanova +Date: Wed Aug 12 12:54:55 2015 +0200 + + Update not enough space messages for fssnapshot + +diff --git a/yum/__init__.py b/yum/__init__.py +index 48956e9..84bea3e 100644 +--- a/yum/__init__.py ++++ b/yum/__init__.py +@@ -1773,7 +1773,7 @@ much more problems). + (not self.ts.isTsFlagSet(rpm.RPMTRANS_FLAG_TEST) and + self.conf.fssnap_automatic_pre)): + if not self.fssnap.has_space(self.conf.fssnap_percentage): +- msg = _("Not enough space to create pre. FS snapshot.") ++ msg = _("Not enough space on logical volumes to create pre. FS snapshot.") + if self.conf.fssnap_abort_on_errors in ('snapshot-failure', 'any'): + raise Errors.YumRPMTransError(msg="Aborting transaction", errors=msg) + else: +@@ -1926,7 +1926,7 @@ much more problems). + (not self.ts.isTsFlagSet(rpm.RPMTRANS_FLAG_TEST) and + self.conf.fssnap_automatic_post)): + if not self.fssnap.has_space(self.conf.fssnap_percentage): +- msg = _("Not enough space to create post trans FS snapshot.") ++ msg = _("Not enough space on logical volumes to create post trans FS snapshot.") + self.verbose_logger.critical(msg) + else: + tags = {'*': ['reason=automatic']} # FIXME: post tags +diff --git a/yumcommands.py b/yumcommands.py +index 4a39ddb..5234260 100644 +--- a/yumcommands.py ++++ b/yumcommands.py +@@ -4311,7 +4311,7 @@ class FSSnapshotCommand(YumCommand): + if base.fssnap.has_space(pc): + print _("Space available to take a snapshot.") + else: +- print _("Not enough space available to take a snapshot.") ++ print _("Not enough space available on logical volumes to take a snapshot.") + + if subcommand == 'create': + tags = {'*': ['reason=manual']} diff --git a/SOURCES/BZ-1063177-xml-traceback.patch b/SOURCES/BZ-1063177-xml-traceback.patch new file mode 100644 index 0000000..25550c3 --- /dev/null +++ b/SOURCES/BZ-1063177-xml-traceback.patch @@ -0,0 +1,24 @@ +commit 6132fa0c489f85c93ce77587ae3db4930d5bb1a4 +Author: Valentina Mukhamedzhanova +Date: Tue May 26 11:16:00 2015 +0200 + + Don't traceback on xml parsing. BZ#1063177 + +diff --git a/yum/repos.py b/yum/repos.py +index d5e50ac..a0ef28c 100644 +--- a/yum/repos.py ++++ b/yum/repos.py +@@ -381,6 +381,13 @@ class RepoStorage: + sack = repo.getPackageSack() + try: + sack.populate(repo, mdtype, callback, cacheonly) ++ except TypeError, e: ++ if not e.args[0].startswith('Parsing'): ++ raise ++ if mdtype in ['all', 'metadata'] and repo.skip_if_unavailable: ++ self.disableRepo(repo.id) ++ else: ++ raise Errors.RepoError(e.args[0]) + except Errors.RepoError, e: + if mdtype in ['all', 'metadata'] and repo.skip_if_unavailable: + self.disableRepo(repo.id) diff --git a/SOURCES/BZ-1168120-manpage.patch b/SOURCES/BZ-1168120-manpage.patch new file mode 100644 index 0000000..4b750ce --- /dev/null +++ b/SOURCES/BZ-1168120-manpage.patch @@ -0,0 +1,37 @@ +commit eb04b4977d16c31435449a9796189f341e7dd7d3 +Author: Valentina Mukhamedzhanova +Date: Thu Jul 10 12:05:04 2014 +0200 + + yum manpage: move 'history info' description to its proper place. + +diff --git a/docs/yum.8 b/docs/yum.8 +index 86df6b0..998a5ad 100644 +--- a/docs/yum.8 ++++ b/docs/yum.8 +@@ -535,6 +535,13 @@ The info/list/summary commands take either a transaction id or a package (with + wildcards, as in \fBSpecifying package names\fP), all three can also be passed + no arguments. list can be passed the keyword "all" to list all the transactions. + ++The info command can also take ranges of transaction ids, of the form start..end, ++which will then display a merged history as if all the transactions in the range ++had happened at once\&. ++.br ++Eg. "history info 1..4" will merge the first four transactions and display them ++as a single transaction. ++ + The packages-list/packages-info commands takes a package (with wildcards, as in + \fBSpecifying package names\fP). And show data from the point of view of that + package. +@@ -779,12 +786,6 @@ Checks the local rpmdb and produces information on any problems it finds. You + can pass the check command the arguments "dependencies", "duplicates", "obsoletes" or "provides", + to limit the checking that is performed (the default is "all" which does all). + +-The info command can also take ranges of transaction ids, of the form +-start..end, which will then display a merged history as if all the +-transactions in the range had happened at once\&. +-.br +-Eg. "history info 1..4" will merge the first four transactions and display them +-as a single transaction. + .IP + .IP "\fBhelp\fP" + Produces help, either for all commands or if given a command name then the help diff --git a/SOURCES/BZ-1168385-group-conditionals-deselect.patch b/SOURCES/BZ-1168385-group-conditionals-deselect.patch new file mode 100644 index 0000000..5a8cb33 --- /dev/null +++ b/SOURCES/BZ-1168385-group-conditionals-deselect.patch @@ -0,0 +1,58 @@ +commit 0df9058960d3fa24aa7695a4a14524127cc0e9be +Author: Valentina Mukhamedzhanova +Date: Tue Apr 21 08:44:52 2015 +0200 + + Fix tsInfo.conditionals in deselect() when the package is not yet in the transaction BZ#1168385 + +diff --git a/AUTHORS b/AUTHORS +index 71845e1..350e136 100644 +--- a/AUTHORS ++++ b/AUTHORS +@@ -24,6 +24,7 @@ YUM AUTHORS + James Antill + Panu Matilainen + Tambet Ingo ++ Valentina Mukhamedzhanova + + + Original Yup people: +diff --git a/yum/transactioninfo.py b/yum/transactioninfo.py +index 9ce5025..ec2c7cb 100644 +--- a/yum/transactioninfo.py ++++ b/yum/transactioninfo.py +@@ -237,6 +237,7 @@ class TransactionData: + if not txmbrs: + if self._inSack is not None: + pkgs = self._inSack.returnPackages(patterns=[pattern]) ++ if pkgs: pass + elif self.pkgSack is None: + pkgs = [] + else: +commit c8b564968286ffccbd46beeb40c95d5e1c74a2aa +Author: Valentina Mukhamedzhanova +Date: Mon Jul 13 13:45:45 2015 +0200 + + Fix UnboundLocalError in deselect() + +diff --git a/yum/transactioninfo.py b/yum/transactioninfo.py +index ec2c7cb..8d47caa 100644 +--- a/yum/transactioninfo.py ++++ b/yum/transactioninfo.py +@@ -235,13 +235,13 @@ class TransactionData: + txmbrs = self.matchNaevr(na[0], na[1]) + + if not txmbrs: ++ pkgs = [] + if self._inSack is not None: + pkgs = self._inSack.returnPackages(patterns=[pattern]) +- if pkgs: pass +- elif self.pkgSack is None: +- pkgs = [] +- else: ++ ++ if not pkgs and self.pkgSack is not None: + pkgs = self.pkgSack.returnPackages(patterns=[pattern]) ++ + if not pkgs: + pkgs = self.rpmdb.returnPackages(patterns=[pattern]) + diff --git a/SOURCES/BZ-1182075-yum-security-manpage.patch b/SOURCES/BZ-1182075-yum-security-manpage.patch new file mode 100644 index 0000000..b89ef9c --- /dev/null +++ b/SOURCES/BZ-1182075-yum-security-manpage.patch @@ -0,0 +1,88 @@ +commit 2e04296024bdb3b4745e7e36420eaffa04f80ec0 +Author: Valentina Mukhamedzhanova +Date: Wed Jun 17 18:50:40 2015 +0200 + + Add missing documentation from yum-security manpage. bug#1182075 + +diff --git a/docs/yum.8 b/docs/yum.8 +index a0038f6..99862fa 100644 +--- a/docs/yum.8 ++++ b/docs/yum.8 +@@ -938,6 +938,20 @@ Specifies an alternate directory to store packages. + Set any config option in yum config or repo files. For options in the global + config just use: \-\-setopt=option=value for repo options use: \-\-setopt=repoid.option=value + .PP ++.IP "\fB\-\-security\fP" ++This option includes packages that say they fix a security issue, in updates. ++.br ++.IP "\fB\--advisory=ADVS, --advisories=ADVS\fP" ++This option includes in updates packages corresponding to the advisory ID, Eg. FEDORA-2201-123. ++.IP "\fB\--bz=BZS\fP" ++This option includes in updates packages that say they fix a Bugzilla ID, Eg. 123. ++.IP "\fB\--cve=CVES\fP" ++This option includes in updates packages that say they fix a CVE - Common Vulnerabilities and Exposures ID (http://cve.mitre.org/about/), Eg. CVE-2201-0123. ++.IP "\fB\--bugfix\fP" ++This option includes in updates packages that say they fix a bugfix issue. ++.IP "\fB\--sec-severity=SEVS, --secseverity=SEVS\fP" ++This option includes in updates security relevant packages of the specified severity. ++ + + .SH "LIST OPTIONS" + The following are the ways which you can invoke \fByum\fP in list +@@ -1045,6 +1059,56 @@ Tell any enabled plugins to eliminate their cached data. + .IP "\fByum clean all\fP" + Does all of the above. + ++.SH "EXAMPLES" ++.PP ++To list all updates that are security relevant, and get a return code on whether there are security updates use: ++.IP ++yum --security check-update ++.PP ++To upgrade packages that have security errata (upgrades to the latest ++available package) use: ++.IP ++yum --security update ++.PP ++To upgrade packages that have security errata (upgrades to the last ++security errata package) use: ++.IP ++yum --security update-minimal ++.PP ++To get a list of all BZs that are fixed for packages you have installed use: ++.IP ++yum updateinfo list bugzillas ++.PP ++To get a list of all security advisories, including the ones you have already ++installed use: ++.IP ++yum updateinfo list all security ++.PP ++To get the information on advisory FEDORA-2707-4567 use: ++.IP ++yum updateinfo info FEDORA-2707-4567 ++.PP ++To update packages to the latest version which contain fixes for Bugzillas 123, 456 and 789; and all security updates use: ++.IP ++yum --bz 123 --bz 456 --bz 789 --security update ++.PP ++To update to the packages which just update Bugzillas 123, 456 and 789; and all security updates use: ++.IP ++yum --bz 123 --bz 456 --bz 789 --security update-minimal ++.PP ++To get an info list of the latest packages which contain fixes for Bugzilla 123; CVEs CVE-2207-0123 and CVE-2207-3210; and Fedora advisories FEDORA-2707-4567 and FEDORA-2707-7654 use: ++.IP ++yum --bz 123 --cve CVE-2207-0123 --cve CVE-2207-3210 --advisory FEDORA-2707-4567 --advisory FEDORA-2707-7654 info updates ++.PP ++To get a list of packages which are "new". ++.IP ++yum updateinfo list new ++.PP ++To get a summary of advisories you haven't installed yet use: ++.IP ++yum updateinfo summary ++ ++ + .PP + .SH "PLUGINS" + Yum can be extended through the use of plugins. A plugin is a Python ".py" file diff --git a/SOURCES/BZ-1182096-yum-cron-conf-upgrade-minimal.patch b/SOURCES/BZ-1182096-yum-cron-conf-upgrade-minimal.patch new file mode 100644 index 0000000..7b996b4 --- /dev/null +++ b/SOURCES/BZ-1182096-yum-cron-conf-upgrade-minimal.patch @@ -0,0 +1,40 @@ +commit cc4dc5b663b0be13fe6bf4de96458f87c90793ad +Author: Valentina Mukhamedzhanova +Date: Thu May 21 11:08:06 2015 +0200 + + Replace 'upgrade-minimal' with documented 'update-minimal' in yum-cron.conf files. BZ#1182096 + +diff --git a/etc/yum-cron-hourly.conf b/etc/yum-cron-hourly.conf +index 2a588cd..63c0bb6 100644 +--- a/etc/yum-cron-hourly.conf ++++ b/etc/yum-cron-hourly.conf +@@ -3,9 +3,9 @@ + # default = yum upgrade + # security = yum --security upgrade + # security-severity:Critical = yum --sec-severity=Critical upgrade +-# minimal = yum --bugfix upgrade-minimal +-# minimal-security = yum --security upgrade-minimal +-# minimal-security-severity:Critical = --sec-severity=Critical upgrade-minimal ++# minimal = yum --bugfix update-minimal ++# minimal-security = yum --security update-minimal ++# minimal-security-severity:Critical = --sec-severity=Critical update-minimal + update_cmd = default + + # Whether a message should emitted when updates are available. +diff --git a/etc/yum-cron.conf b/etc/yum-cron.conf +index 960fcc9..7ab4d04 100644 +--- a/etc/yum-cron.conf ++++ b/etc/yum-cron.conf +@@ -3,9 +3,9 @@ + # default = yum upgrade + # security = yum --security upgrade + # security-severity:Critical = yum --sec-severity=Critical upgrade +-# minimal = yum --bugfix upgrade-minimal +-# minimal-security = yum --security upgrade-minimal +-# minimal-security-severity:Critical = --sec-severity=Critical upgrade-minimal ++# minimal = yum --bugfix update-minimal ++# minimal-security = yum --security update-minimal ++# minimal-security-severity:Critical = --sec-severity=Critical update-minimal + update_cmd = default + + # Whether a message should be emitted when updates are available, diff --git a/SOURCES/BZ-1188960-API-missing-requires.patch b/SOURCES/BZ-1188960-API-missing-requires.patch new file mode 100644 index 0000000..27c2458 --- /dev/null +++ b/SOURCES/BZ-1188960-API-missing-requires.patch @@ -0,0 +1,161 @@ +commit 423f5ee15cb0184d6583b57429ba9cb5bd8cdd35 +Author: Valentina Mukhamedzhanova +Date: Wed Jun 24 17:05:59 2015 +0200 + + Plugin API update: missing_requires, pretty_output_update and promptYN fix. BZ#1188960 + +diff --git a/output.py b/output.py +index 091b58e..5a73f8e 100755 +--- a/output.py ++++ b/output.py +@@ -2795,6 +2795,13 @@ to exit. + if lastdbv.end_rpmdbversion != rpmdbv: + self._rpmdb_warn_checks() + ++ @staticmethod ++ def pretty_output_restring(restring): ++ for msg in restring: ++ prefix = _('Error: %s') ++ prefix2nd = (' ' * (utf8_width(prefix) - 2)) ++ yield (prefix, msg.replace('\n', '\n' + prefix2nd)) ++ + + class DepSolveProgressCallBack: + """A class to provide text output callback functions for Dependency Solver callback.""" +diff --git a/utils.py b/utils.py +index dbcd605..5ba320f 100755 +--- a/utils.py ++++ b/utils.py +@@ -393,10 +393,8 @@ class YumUtilBase(YumBaseCli): + return 0 + elif result == 1: + # Fatal error +- for msg in resultmsgs: +- prefix = _('Error: %s') +- prefix2nd = (' ' * (utf8_width(prefix) - 2)) +- self.logger.critical(prefix, msg.replace('\n', '\n' + prefix2nd)) ++ for prefix, msg in self.pretty_output_restring(resultmsgs): ++ self.logger.critical(prefix, msg) + if not self.conf.skip_broken: + self.verbose_logger.info(_(" You could try using --skip-broken to work around the problem")) + if not self._rpmdb_warn_checks(out=self.verbose_logger.info, warn=False): +diff --git a/yum/depsolve.py b/yum/depsolve.py +index 797826f..a1aeac3 100644 +--- a/yum/depsolve.py ++++ b/yum/depsolve.py +@@ -120,6 +120,7 @@ class Depsolve(object): + + self.installedFileRequires = None + self.installedUnresolvedFileRequires = None ++ self._missing_requires = False + + def doTsSetup(self): + """Sets up the transaction set before it is used.""" +@@ -375,6 +376,7 @@ class Depsolve(object): + return self._prco_req_nfv2req(req[0], req[1], req[2]) + + def _err_missing_requires(self, reqPo, reqTup): ++ self._missing_requires = True + if hasattr(self.dsCallback, 'format_missing_requires'): + msg = self.dsCallback.format_missing_requires(reqPo, reqTup) + if msg is not None: # PK +diff --git a/yum/plugins.py b/yum/plugins.py +index f34ea19..7034da9 100644 +--- a/yum/plugins.py ++++ b/yum/plugins.py +@@ -63,7 +63,7 @@ from yum.i18n import utf8_width + # API, the major version number must be incremented and the minor version number + # reset to 0. If a change is made that doesn't break backwards compatibility, + # then the minor number must be incremented. +-API_VERSION = '2.6' ++API_VERSION = '2.7' + + class DeprecatedInt(int): + """A simple int subclass that is used to check when a deprecated +@@ -416,18 +416,22 @@ class PluginConduit: + converted_level = logginglevels.logLevelFromErrorLevel(level) + self.logger.log(converted_level, msg) + +- def promptYN(self, msg): ++ def promptYN(self, msg, prompt=None): + """Return a yes or no response, either from assumeyes already + being set, or from prompting the user. + +- :param msg: the message to prompt the user with ++ :param msg: the message to show to the user ++ :param prompt: the question to ask the user (optional); defaults to 'Is this ok [y/N]: ' + :return: 1 if the response is yes, and 0 if the response is no + """ + self.info(2, msg) ++ if self._base.conf.assumeno: ++ return False + if self._base.conf.assumeyes: +- return 1 ++ return True + else: +- return self._base.userconfirm() ++ kwargs = {'prompt': prompt} if prompt else {} ++ return bool(self._base.userconfirm(**kwargs)) + + def getYumVersion(self): + """Return a string representing the current version of yum.""" +@@ -704,6 +708,14 @@ class DepsolvePluginConduit(MainPluginConduit): + self.resultcode = rescode + self.resultstring = restring + ++ @property ++ def missing_requires(self): ++ """Boolean indicating if depsolving failed due to missing dependencies.""" ++ return self._base._missing_requires ++ ++ def pretty_output_restring(self): ++ return '\n'.join(prefix % msg for prefix, msg in self._base.pretty_output_restring(self.resultstring)) ++ + class CompareProvidersPluginConduit(MainPluginConduit): + """Conduit to compare different providers of packages.""" + +diff --git a/yummain.py b/yummain.py +index 0c7c535..32680a8 100755 +--- a/yummain.py ++++ b/yummain.py +@@ -248,10 +248,8 @@ def main(args): + return base.exit_code + elif result == 1: + # Fatal error +- for msg in resultmsgs: +- prefix = _('Error: %s') +- prefix2nd = (' ' * (utf8_width(prefix) - 2)) +- logger.critical(prefix, msg.replace('\n', '\n' + prefix2nd)) ++ for prefix, msg in base.pretty_output_restring(resultmsgs): ++ logger.critical(prefix, msg) + if base._depsolving_failed: + if not base.conf.skip_broken: + verbose_logger.info(_(" You could try using --skip-broken to work around the problem")) +commit 1c883b65432c288ad941a362a49c15a8e4fb74b9 +Author: Valentina Mukhamedzhanova +Date: Mon Jun 29 16:56:13 2015 +0200 + + Add conduit.confList to plugin API + +diff --git a/yum/plugins.py b/yum/plugins.py +index 7034da9..6857626 100644 +--- a/yum/plugins.py ++++ b/yum/plugins.py +@@ -504,6 +504,17 @@ class PluginConduit: + """ + return config.getOption(self._conf, section, opt, config.BoolOption(default)) + ++ def confList(self, section, opt, default=None): ++ """Read a boolean value from the plugin's own configuration file ++ ++ :param section: configuration file section to read ++ :param opt: option name to read ++ :param default: value to read if the option is missing ++ :return: boolean option value read, or *default* if the option ++ was missing or could not be parsed ++ """ ++ return config.getOption(self._conf, section, opt, config.ListOption(default)) ++ + def registerPackageName(self, name): + """Register the name of a package to use. + diff --git a/SOURCES/BZ-1192239-update-minimal.patch b/SOURCES/BZ-1192239-update-minimal.patch new file mode 100644 index 0000000..2a1158f --- /dev/null +++ b/SOURCES/BZ-1192239-update-minimal.patch @@ -0,0 +1,32 @@ +commit bfeae9135994630147c4d6af8679f95157a90d76 +Author: Valentina Mukhamedzhanova +Date: Fri Feb 14 13:54:30 2014 +0100 + + Fix update-minimal traceback (#1048584) and ignoring updates. + +diff --git a/yum/updateinfo.py b/yum/updateinfo.py +index 1cc207f..8d91f88 100644 +--- a/yum/updateinfo.py ++++ b/yum/updateinfo.py +@@ -513,7 +513,7 @@ def update_minimal(base, extcmds=[]): + if extcmds and not _match_sec_cmd(extcmds, name, notice): + continue + if (not ndata and +- not _ysp_should_filter_pkg(base, name, notice, used_map)): ++ not _ysp_should_filter_pkg(opts, name, notice, used_map)): + continue + txmbrs.extend(base.update(name=pkgtup[0], arch=pkgtup[1], + epoch=pkgtup[2], +diff --git a/yumcommands.py b/yumcommands.py +index c93faa1..4e3b730 100644 +--- a/yumcommands.py ++++ b/yumcommands.py +@@ -4156,7 +4156,7 @@ class UpdateMinimalCommand(YumCommand): + + num = len(base.tsInfo) + _upi.update_minimal(base, extcmds) +- num -= len(base.tsInfo) ++ num = len(base.tsInfo) - num + + if num > 0: + msg = '%d packages marked for minimal Update' % num diff --git a/SOURCES/BZ-1193871-updateinfo-notice-when-arch-changed.patch b/SOURCES/BZ-1193871-updateinfo-notice-when-arch-changed.patch new file mode 100644 index 0000000..7e1d9a8 --- /dev/null +++ b/SOURCES/BZ-1193871-updateinfo-notice-when-arch-changed.patch @@ -0,0 +1,56 @@ +diff --git a/yum/update_md.py b/yum/update_md.py +--- a/yum/update_md.py 2015-01-19 07:44:35.567107008 -0500 ++++ b/yum/update_md.py 2015-01-19 08:57:31.576489424 -0500 +@@ -398,6 +399,9 @@ class UpdateMetadata(object): + except Errors.RepoMDError: + continue # No metadata found for this repo + ++ self.arch_storage = ArchStorage() ++ self.archlist = self.arch_storage.archlist ++ + def get_notices(self, name=None): + """ Return all notices. """ + if name is None: +@@ -434,16 +438,29 @@ class UpdateMetadata(object): + name = oldpkgtup[0] + arch = oldpkgtup[1] + ret = [] ++ other_arch_list = [] ++ notices = set() + for notice in self.get_notices(name): + for upkg in notice['pkglist']: + for pkg in upkg['packages']: ++ other_arch = False + if pkg['name'] != name or pkg['arch'] != arch: +- continue ++ if (notice not in notices and pkg['name'] == name and pkg['arch'] in self.archlist): ++ other_arch = True ++ else: ++ continue + pkgtup = (pkg['name'], pkg['arch'], pkg['epoch'] or '0', + pkg['version'], pkg['release']) + if _rpm_tup_vercmp(pkgtup, oldpkgtup) <= 0: + continue +- ret.append((pkgtup, notice)) ++ if other_arch: ++ other_arch_list.append((pkgtup, notice)) ++ else: ++ ret.append((pkgtup, notice)) ++ notices.add(notice) ++ for pkgtup, notice in other_arch_list: ++ if notice not in notices: ++ ret.append((pkgtup, notice)) + ret.sort(cmp=_rpm_tup_vercmp, key=lambda x: x[0], reverse=True) + return ret + +diff -up yum-3.4.3/yum/update_md.py.old yum-3.4.3/yum/update_md.py +--- yum-3.4.3/yum/update_md.py.old 2015-05-28 19:23:35.589691937 +0200 ++++ yum-3.4.3/yum/update_md.py 2015-05-28 19:24:05.971806965 +0200 +@@ -33,6 +33,7 @@ import Errors + import logginglevels + + import rpmUtils.miscutils ++from rpmUtils.arch import ArchStorage + + + def safe_iterparse(filename, logger=None): diff --git a/SOURCES/BZ-1199976-kbase-articles.patch b/SOURCES/BZ-1199976-kbase-articles.patch new file mode 100644 index 0000000..f2945eb --- /dev/null +++ b/SOURCES/BZ-1199976-kbase-articles.patch @@ -0,0 +1,67 @@ +diff --git a/output.py b/output.py +index 091b58e..b14f129 100755 +--- a/output.py ++++ b/output.py +@@ -447,6 +447,8 @@ class YumOutput: + self.term = YumTerm() + self._last_interrupt = None + ++ self.reported_error_msgs = {k: False for (k, v) in ERRORS_TO_KBASE_ARTICLES.iteritems()} ++ + + def printtime(self): + """Return a string representing the current time in the form:: +@@ -471,8 +473,22 @@ class YumOutput: + """ + self.logger.error('%s: %s', errobj.url, errobj.exception) + self.logger.error(_('Trying other mirror.')) ++ self.suggestKBaseArticle(errobj) + raise errobj.exception + ++ def suggestKBaseArticle(self, errobj): ++ errcode = None ++ if hasattr(errobj.exception, 'code') and errobj.exception.code in ERRORS_TO_KBASE_ARTICLES: ++ errcode = errobj.exception.code ++ elif hasattr(errobj.exception, 'errno') and errobj.exception.errno in ERRORS_TO_KBASE_ARTICLES: ++ errcode = errobj.exception.errno ++ if not errcode: ++ return ++ ++ if not self.reported_error_msgs[errcode]: ++ self.logger.error(ERRORS_TO_KBASE_ARTICLES[errcode]) ++ self.reported_error_msgs[errcode] = True ++ + + def simpleProgressBar(self, current, total, name=None): + """Output the current status to the terminal using a simple +diff --git a/yum/constants.py b/yum/constants.py +index 5c728d4..02b2527 100644 +--- a/yum/constants.py ++++ b/yum/constants.py +@@ -120,3 +120,25 @@ REPO_PROBLEM_METADATA=2 + REPO_PROBLEM_COMPS=3 + REPO_PROBLEM_OTHER=4 + REPO_PROBLEM_PACKAGE=5 ++ ++ ++ERRORS_TO_KBASE_ARTICLES = { ++ 404: """To address this issue please refer to the below knowledge base article ++ ++https://access.redhat.com/articles/1320623 ++ ++If above article doesn't help to resolve this issue please open a ticket with Red Hat Support. ++""", ++ 403: """To address this issue please refer to the below knowledge base article ++ ++https://access.redhat.com/solutions/69319 ++ ++If above article doesn't help to resolve this issue please open a ticket with Red Hat Support. ++""", ++ 60: """It was impossible to connect to the Red Hat servers. ++This could mean a connectivity issue in your environment, such as the requirement to configure a proxy, ++or a transparent proxy that tampers with TLS security, or an incorrect system clock. ++Please collect information about the specific failure that occurs in your environment, ++using the instructions in: https://access.redhat.com/solutions/1527033 and open a ticket with Red Hat Support. ++""" ++} +\ No newline at end of file diff --git a/SOURCES/BZ-1211384-yum-grouplist-headers.patch b/SOURCES/BZ-1211384-yum-grouplist-headers.patch new file mode 100644 index 0000000..2ba0b7b --- /dev/null +++ b/SOURCES/BZ-1211384-yum-grouplist-headers.patch @@ -0,0 +1,74 @@ +diff -up yum-3.4.3/cli.py.old yum-3.4.3/cli.py +--- yum-3.4.3/cli.py.old 2015-05-28 18:04:17.237676571 +0200 ++++ yum-3.4.3/cli.py 2015-05-28 18:05:27.644943137 +0200 +@@ -1807,22 +1807,22 @@ class YumBaseCli(yum.YumBase, output.Yum + msg += ' [%s]' % group.langonly + self.verbose_logger.info('%s', msg) + +- _out_grp(_('Installed environment groups:'), ievgrps) +- _out_grp(_('Available environment groups:'), evgrps) ++ _out_grp(_('Installed Environment Groups:'), ievgrps) ++ _out_grp(_('Available Environment Groups:'), evgrps) + + groups = [] + for group in installed: + if group.langonly: continue + if not wts['pkg']: continue + groups.append(group) +- _out_grp(_('Installed groups:'), groups) ++ _out_grp(_('Installed Groups:'), groups) + + groups = [] + for group in installed: + if not group.langonly: continue + if not wts['lang']: continue + groups.append(group) +- _out_grp(_('Installed language groups:'), groups) ++ _out_grp(_('Installed Language Groups:'), groups) + + groups = [] + for group in available: +@@ -1836,7 +1836,7 @@ class YumBaseCli(yum.YumBase, output.Yum + if not group.langonly: continue + if not wts['lang']: continue + groups.append(group) +- _out_grp(_('Available language groups:'), groups) ++ _out_grp(_('Available Language Groups:'), groups) + + if not done: + self.logger.error(_('Warning: no environments/groups match: %s'), +diff -up yum-3.4.3/po/yum.pot.old yum-3.4.3/po/yum.pot +--- yum-3.4.3/po/yum.pot.old 2015-05-28 18:05:37.610980869 +0200 ++++ yum-3.4.3/po/yum.pot 2015-05-28 18:06:23.557154824 +0200 +@@ -398,11 +398,11 @@ msgid "Cleaning up plugins" + msgstr "" + + #: ../cli.py:1732 +-msgid "Installed environment groups:" ++msgid "Installed Environment Groups:" + msgstr "" + + #: ../cli.py:1733 +-msgid "Available environment groups:" ++msgid "Available Environment Groups:" + msgstr "" + + #: ../cli.py:1740 +@@ -410,7 +410,7 @@ msgid "Installed groups:" + msgstr "" + + #: ../cli.py:1747 +-msgid "Installed language groups:" ++msgid "Installed Language Groups:" + msgstr "" + + #: ../cli.py:1754 +@@ -418,7 +418,7 @@ msgid "Available Groups:" + msgstr "" + + #: ../cli.py:1761 +-msgid "Available language groups:" ++msgid "Available Language Groups:" + msgstr "" + + #: ../cli.py:1764 diff --git a/SOURCES/BZ-1212506-running-kernel-epoch.patch b/SOURCES/BZ-1212506-running-kernel-epoch.patch new file mode 100644 index 0000000..cc543c5 --- /dev/null +++ b/SOURCES/BZ-1212506-running-kernel-epoch.patch @@ -0,0 +1,19 @@ +commit fefb6a732e0c15c73300858c3fa7d7e89e79d18f +Author: Valentina Mukhamedzhanova +Date: Wed Mar 11 10:52:49 2015 +0100 + + Make sure epoch is a string while checking for running kernel. BZ#1200159 + +diff --git a/yum/misc.py b/yum/misc.py +index 6850ae2..f72f028 100644 +--- a/yum/misc.py ++++ b/yum/misc.py +@@ -818,6 +818,8 @@ def get_running_kernel_pkgtup(ts): + e = h['epoch'] + if h['epoch'] is None: + e = '0' ++ else: ++ e = str(e) + return (h['name'], h['arch'], e, h['version'], h['release']) + + return (None, None, None, None, None) diff --git a/SOURCES/BZ-1212514-not-enough-space.patch b/SOURCES/BZ-1212514-not-enough-space.patch new file mode 100644 index 0000000..4b59ad9 --- /dev/null +++ b/SOURCES/BZ-1212514-not-enough-space.patch @@ -0,0 +1,57 @@ +commit 7b125d415195713596c798e8ac79e4812873d948 +Author: Valentina Mukhamedzhanova +Date: Tue Dec 9 10:27:40 2014 +0100 + + Expect KB as well as MB in disk requirements message from rpm. BZ 1051931 + +diff --git a/cli.py b/cli.py +index b7f5b5a..f04fe63 100755 +--- a/cli.py ++++ b/cli.py +@@ -498,13 +498,14 @@ class YumBaseCli(yum.YumBase, output.YumOutput): + """ + summary = '' + # do disk space report first +- p = re.compile('needs (\d+)MB on the (\S+) filesystem') ++ p = re.compile('needs (\d+)(K|M)B on the (\S+) filesystem') + disk = {} + for m in p.finditer(errstring): +- if m.group(2) not in disk: +- disk[m.group(2)] = int(m.group(1)) +- if disk[m.group(2)] < int(m.group(1)): +- disk[m.group(2)] = int(m.group(1)) ++ size_in_mb = int(m.group(1)) if m.group(2) == 'M' else round(int(m.group(1))/1024.0, 3) ++ if m.group(3) not in disk: ++ disk[m.group(3)] = size_in_mb ++ if disk[m.group(3)] < size_in_mb: ++ disk[m.group(3)] = size_in_mb + + if disk: + summary += _('Disk Requirements:\n') +commit 6ea8a6cf572efa7d7601dfc8535f5cc3cd80c3bd +Author: Valentina Mukhamedzhanova +Date: Tue Mar 17 11:19:10 2015 +0100 + + Fix rounding issue in required disk space message. + +diff --git a/cli.py b/cli.py +index cefc67e..9766f89 100755 +--- a/cli.py ++++ b/cli.py +@@ -25,6 +25,7 @@ import sys + import time + import random + import logging ++import math + from optparse import OptionParser,OptionGroup,SUPPRESS_HELP + import rpm + +@@ -501,7 +502,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput): + p = re.compile('needs (\d+)(K|M)B on the (\S+) filesystem') + disk = {} + for m in p.finditer(errstring): +- size_in_mb = int(m.group(1)) if m.group(2) == 'M' else round(int(m.group(1))/1024.0, 3) ++ size_in_mb = int(m.group(1)) if m.group(2) == 'M' else math.ceil(int(m.group(1))/1024.0) + if m.group(3) not in disk: + disk[m.group(3)] = size_in_mb + if disk[m.group(3)] < size_in_mb: diff --git a/SOURCES/BZ-1212519-exclude-installed.patch b/SOURCES/BZ-1212519-exclude-installed.patch new file mode 100644 index 0000000..d236c17 --- /dev/null +++ b/SOURCES/BZ-1212519-exclude-installed.patch @@ -0,0 +1,113 @@ +commit d875b67997356e7e1b4509607fec81ca8220c597 +Author: James Antill +Date: Tue Mar 3 01:54:02 2015 -0500 + + Add query_install_excludes conf./docs and use it for list/info/search/provides. + +diff --git a/cli.py b/cli.py +index f04fe63..cefc67e 100755 +--- a/cli.py ++++ b/cli.py +@@ -2299,7 +2299,8 @@ class YumOptionParser(OptionParser): + self.base.conf.disable_excludes = self._splitArg(opts.disableexcludes) + self.base.conf.disable_includes = self._splitArg(opts.disableincludes) + +- for exclude in self._splitArg(opts.exclude): ++ self.base.cmdline_excludes = self._splitArg(opts.exclude) ++ for exclude in self.base.cmdline_excludes: + try: + excludelist = self.base.conf.exclude + excludelist.append(exclude) +diff --git a/docs/yum.conf.5 b/docs/yum.conf.5 +index e0f4c8b..62aa78e 100644 +--- a/docs/yum.conf.5 ++++ b/docs/yum.conf.5 +@@ -156,10 +156,20 @@ This is commonly used so a package isn't upgraded or installed accidentally, but + can be used to remove packages in any way that "yum list" will show packages. + Shell globs using wildcards (eg. * and ?) are allowed. + +-Can be disabled using --disableexcludes. ++Can be disabled using disable_excludes or --disableexcludes. + Command-line option: \fB\-x\fP + + .IP ++\fBdisable_excludes\fR ++A way to permanently set the --disableexcludes command line option. ++ ++.IP ++\fBquery_install_excludes\fR ++This applies the command line exclude option (only, not the configuration ++exclude above) to installed packages being shown in some query commands ++(currently: list/info/search/provides). ++ ++.IP + \fBinstallonlypkgs \fR + List of package provides that should only ever be installed, never updated. + Kernels in particular fall into this category. Defaults to kernel, +diff --git a/output.py b/output.py +index 2787d86..091b58e 100755 +--- a/output.py ++++ b/output.py +@@ -1330,6 +1330,13 @@ class YumOutput: + :param verbose: whether to output extra verbose information + :param highlight: highlighting options for the highlighted matches + """ ++ if (po.repo.id == "installed" and ++ self.conf.query_install_excludes and self.cmdline_excludes): ++ # Very similar to _cmdline_exclude from yumcommands ++ e,m,u = yum.packages.parsePackages([po], self.cmdline_excludes) ++ if e or m: ++ return ++ + if self.conf.showdupesfromrepos: + msg = '%s : ' % po + else: +diff --git a/yum/config.py b/yum/config.py +index 02061ba..efe7be9 100644 +--- a/yum/config.py ++++ b/yum/config.py +@@ -821,6 +821,7 @@ class YumConf(StartupConf): + # XXX rpm_check_debug is unused, left around for API compatibility for now + rpm_check_debug = BoolOption(True) + disable_excludes = ListOption() ++ query_install_excludes = BoolOption(True) + skip_broken = BoolOption(False) + # Note that "instant" is the old behaviour, but group:primary is very + # similar but better :). +diff --git a/yumcommands.py b/yumcommands.py +index e77d209..6fa11fa 100644 +--- a/yumcommands.py ++++ b/yumcommands.py +@@ -41,6 +41,7 @@ import errno + + import yum.config + from yum import updateinfo ++from yum.packages import parsePackages + + def _err_mini_usage(base, basecmd): + if basecmd not in base.yum_cli_commands: +@@ -584,6 +585,14 @@ def _list_cmd_calc_columns(base, ypl): + columns = base.calcColumns(data, remainder_column=1) + return (-columns[0], -columns[1], -columns[2]) + ++def _cmdline_exclude(pkgs, cmdline_excludes): ++ """ Do an extra exclude for installed packages that match the cmd line. """ ++ if not cmdline_excludes: ++ return pkgs ++ e,m,u = parsePackages(pkgs, cmdline_excludes) ++ excluded = set(e + m) ++ return [po for po in pkgs if po not in excluded] ++ + class InfoCommand(YumCommand): + """A class containing methods needed by the cli to execute the + info command. +@@ -682,6 +691,9 @@ class InfoCommand(YumCommand): + clin = base.conf.color_list_installed_newer + clir = base.conf.color_list_installed_reinstall + clie = base.conf.color_list_installed_extra ++ if base.conf.query_install_excludes: ++ ypl.installed = _cmdline_exclude(ypl.installed, ++ base.cmdline_excludes) + rip = base.listPkgs(ypl.installed, _('Installed Packages'), basecmd, + highlight_na=update_pkgs, columns=columns, + highlight_modes={'>' : clio, '<' : clin, diff --git a/SOURCES/BZ-1233152-pvm-api-lv_attr.patch b/SOURCES/BZ-1233152-pvm-api-lv_attr.patch new file mode 100644 index 0000000..f02a96c --- /dev/null +++ b/SOURCES/BZ-1233152-pvm-api-lv_attr.patch @@ -0,0 +1,35 @@ +commit 1ba900a1c6a0a6d4dc3c2fd7a5de3027ecb3a153 +Author: Valentina Mukhamedzhanova +Date: Wed Jul 1 16:17:20 2015 +0200 + + Fix lvm API calls. Patch by Marek Marusic. BZ#1233152 + +diff --git a/yum/fssnapshots.py b/yum/fssnapshots.py +index 9af252d..a07271d 100755 +--- a/yum/fssnapshots.py ++++ b/yum/fssnapshots.py +@@ -25,21 +25,21 @@ except: + + + def _is_origin(lv): +- snap = lv.getProperty("lv_attr") ++ snap = lv.getAttr() + # snap=(, ) + if not snap[0]: # Broken?? + return None + return snap[0][0] in ('o', 'O') + + def _is_snap(lv): +- snap = lv.getProperty("lv_attr") ++ snap = lv.getAttr() + # snap=(, ) + if not snap[0]: # Broken?? + return None + return snap[0][0] in ('s', 'S') + + def _is_virt(lv): +- snap = lv.getProperty("lv_attr") ++ snap = lv.getAttr() + # snap=(, ) + if not snap[0]: # Broken?? + return None diff --git a/SOURCES/BZ-1244119-fssnapshot-automatic-percentage-manpage.patch b/SOURCES/BZ-1244119-fssnapshot-automatic-percentage-manpage.patch new file mode 100644 index 0000000..62698f3 --- /dev/null +++ b/SOURCES/BZ-1244119-fssnapshot-automatic-percentage-manpage.patch @@ -0,0 +1,25 @@ +commit 7db4c7826a538e0a3a59f1f5d6fca26de7895204 +Author: Valentina Mukhamedzhanova +Date: Thu Jul 30 15:20:27 2015 +0200 + + Fix fssnap_automatic_devices and fssnap_automatic_percentage in yum.conf manpage + +diff --git a/docs/yum.conf.5 b/docs/yum.conf.5 +index 22701e0..5993b57 100644 +--- a/docs/yum.conf.5 ++++ b/docs/yum.conf.5 +@@ -894,12 +894,12 @@ How many old snapshots should yum keep when trying to automatically create a + new snapshot. Setting to 0 disables this feature. Default is '1'. + + .IP +-\fBfssnap_automatic_percentage\fR ++\fBfssnap_percentage\fR + The size of new snaphosts, expressed as a percentage of the old origin device. + Any number between 1 and 100. Default is '100'. + + .IP +-\fBfssnap_automatic_devices\fR ++\fBfssnap_devices\fR + The origin LVM devices to use for snapshots. Wildcards and negation are allowed, + first match (positive or negative) wins. + Default is: !*/swap !*/lv_swap glob:/etc/yum/fssnap.d/*.conf diff --git a/SOURCES/BZ-1259837-igroups-empty-lines.patch b/SOURCES/BZ-1259837-igroups-empty-lines.patch new file mode 100644 index 0000000..58cd10b --- /dev/null +++ b/SOURCES/BZ-1259837-igroups-empty-lines.patch @@ -0,0 +1,48 @@ +diff -up yum-3.4.3/yum/igroups.py.old yum-3.4.3/yum/igroups.py +--- yum-3.4.3/yum/igroups.py.old 2015-09-09 16:18:23.494390878 +0200 ++++ yum-3.4.3/yum/igroups.py 2015-09-09 17:10:33.451517354 +0200 +@@ -43,6 +43,12 @@ def _makedirs_no_umask(*args): + + return ret + ++def _read_str(fo): ++ for s in fo: ++ if s[:-1]: ++ return s[:-1] ++ return '' ++ + class InstalledGroup(object): + def __init__(self, gid): + self.gid = gid +@@ -107,11 +113,11 @@ class InstalledGroups(object): + if not os.access(self.filename, os.R_OK): + return + +- def _read_str(fo): +- return fo.readline()[:-1] +- + fo = open(self.filename) +- ver = int(_read_str(fo)) ++ try: ++ ver = int(_read_str(fo)) ++ except ValueError: ++ return + if ver != 1: + return + +@@ -132,11 +138,11 @@ class InstalledGroups(object): + if not os.access(self.grp_filename, os.R_OK): + return + +- def _read_str(fo): +- return fo.readline()[:-1] +- + fo = open(self.grp_filename) +- ver = int(_read_str(fo)) ++ try: ++ ver = int(_read_str(fo)) ++ except ValueError: ++ return + if ver != 1: + return + diff --git a/SOURCES/yum.conf.centos b/SOURCES/yum.conf.centos deleted file mode 100644 index 367126f..0000000 --- a/SOURCES/yum.conf.centos +++ /dev/null @@ -1,26 +0,0 @@ -[main] -cachedir=/var/cache/yum/$basearch/$releasever -keepcache=0 -debuglevel=2 -logfile=/var/log/yum.log -exactarch=1 -obsoletes=1 -gpgcheck=1 -plugins=1 -installonly_limit=5 -bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum -distroverpkg=centos-release - - -# This is the default, if you make this bigger yum won't see if the metadata -# is newer on the remote and so you'll "gain" the bandwidth of not having to -# download the new metadata and "pay" for it by yum not having correct -# information. -# It is esp. important, to have correct metadata, for distributions like -# Fedora which don't keep old packages around. If you don't like this checking -# interupting your command line usage, it's much better to have something -# manually check the metadata once an hour (yum-updatesd will do this). -# metadata_expire=90m - -# PUT YOUR REPOS HERE OR IN separate files named file.repo -# in /etc/yum.repos.d diff --git a/SPECS/yum.spec b/SPECS/yum.spec index 4a50ea8..6c934f9 100644 --- a/SPECS/yum.spec +++ b/SPECS/yum.spec @@ -36,11 +36,11 @@ BuildRequires: bash-completion Summary: RPM package installer/updater/manager Name: yum Version: 3.4.3 -Release: 125%{?dist} +Release: 132%{?dist} License: GPLv2+ Group: System Environment/Base Source0: http://yum.baseurl.org/download/3.4/%{name}-%{version}.tar.gz -Source1: yum.conf.centos +Source1: yum.conf.fedora Source2: yum-updatesd.conf.fedora Patch1: yum-distro-configs.patch Patch5: geode-arch.patch @@ -77,6 +77,25 @@ Patch110: BZ-1063181-upgrades-for-install-only.patch Patch111: BZ-1147992-debuginfo-install-dolock-exception.patch Patch112: BZ-1095146-file-uris-normpath.patch +# rhel-7.2 +Patch150: BZ-1192239-update-minimal.patch +Patch151: BZ-1212514-not-enough-space.patch +Patch152: BZ-1212506-running-kernel-epoch.patch +Patch153: BZ-1168385-group-conditionals-deselect.patch +Patch154: BZ-1182096-yum-cron-conf-upgrade-minimal.patch +Patch155: BZ-1212519-exclude-installed.patch +Patch156: BZ-1063177-xml-traceback.patch +Patch157: BZ-1211384-yum-grouplist-headers.patch +Patch158: BZ-1193871-updateinfo-notice-when-arch-changed.patch +Patch159: BZ-1047793-lvm-snapshot.patch +Patch160: BZ-1168120-manpage.patch +Patch161: BZ-1182075-yum-security-manpage.patch +Patch162: BZ-1199976-kbase-articles.patch +Patch163: BZ-1188960-API-missing-requires.patch +Patch164: BZ-1233152-pvm-api-lv_attr.patch +Patch165: BZ-1244119-fssnapshot-automatic-percentage-manpage.patch +Patch166: BZ-1259837-igroups-empty-lines.patch + URL: http://yum.baseurl.org/ BuildArchitectures: noarch BuildRequires: python @@ -94,7 +113,6 @@ BuildRequires: pygpgme # End of CheckRequires Conflicts: pirut < 1.1.4 Requires: python >= 2.4 -Requires: yum-plugin-fastestmirror Requires: rpm-python, rpm >= 0:4.4.2 Requires: python-iniparse Requires: python-sqlite @@ -233,6 +251,25 @@ Install this package if you want auto yum updates nightly via cron. %patch111 -p1 %patch112 -p1 +# rhel-7.2 +%patch150 -p1 +%patch151 -p1 +%patch152 -p1 +%patch153 -p1 +%patch154 -p1 +%patch155 -p1 +%patch156 -p1 +%patch157 -p1 +%patch158 -p1 +%patch159 -p1 +%patch160 -p1 +%patch161 -p1 +%patch162 -p1 +%patch163 -p1 +%patch164 -p1 +%patch165 -p1 +%patch166 -p1 + # Do distro config. changes after everything else. %patch1 -p1 @@ -459,12 +496,65 @@ exit 0 %endif %changelog -* Thu Mar 05 2015 CentOS Sources - 3.4.3-125.el7.centos -- CentOS yum config -- use the CentOS bug tracker url -- retain installonly limit of 5 -- ensure distrover is always from centos-release -- Make yum require yum-plugin-fastestmirror +* Wed Sep 09 2015 Valentina Mukhamedzhanova - 3.4.3-132 +- Don't fail on empty lines in group files. +- Resolves: bug#1259837 + +* Wed Aug 12 2015 Valentina Mukhamedzhanova - 3.4.3-131 +- Update not enough space messages for fssnapshot. +- Related: bug#1047793 + +* Thu Jul 30 2015 Valentina Mukhamedzhanova - 3.4.3-130 +- Fix fssnap_automatic_devices and fssnap_automatic_percentage in yum.conf manpage. +- Resolves: bug#1244119 + +* Mon Jul 13 2015 Valentina Mukhamedzhanova - 3.4.3-129 +- Fix UnboundLocalError in deselect(). +- Related: bug#1168385 +- Update the URL of kcs article. +- Related: bug#1200338 + +* Thu Jul 09 2015 Valentina Mukhamedzhanova - 3.4.3-128 +- Stop caching fssnapshot postfixes and add microseconds. +- Related: bug#1047793 + +* Wed Jul 01 2015 Valentina Mukhamedzhanova - 3.4.3-127 +- Fix lvm API calls. Patch by Marek Marusic. +- Resolves: bug#1233152 + +* Thu May 21 2015 Valentina Mukhamedzhanova - 3.4.3-126 +- Fix update-minimal traceback and ignoring updates. +- Resolves: bug#1192239 +- Expect KB as well as MB in disk requirements message from rpm. +- Resolves: bug#1212514 +- Make sure epoch is a string while checking for running kernel. +- Resolves: bug#1212506 +- Fix tsInfo.conditionals in deselect() when the package is not yet in the transaction. +- Resolves: bug#1168385 +- Replace 'upgrade-minimal' with documented 'update-minimal' in yum-cron.conf files. +- Resolves: bug#1182096 +- Add query_install_excludes conf./docs and use it for list/info/search/provides. +- Resolves: bug#1212519 +- Don't traceback on xml parsing. +- Resolves: bug#1063177 +- Fix casing of 'yum grouplist' headers. +- Resolves: bug#1211384 +- Show advisory even if package arch changed. +- Resolves: bug#1193871 +- Add fssnap_abort_on_errors config option and improve detecting if lvm is installed. +- Resolves: bug#1047793 +- Fix default for fssnap_automatic_keep in the man page and dad logging for automatic fssnap events. +- Resolves: bug#1145485 +- yum manpage: move 'history info' description to its proper place. +- Resolves: bug#1168120 +- Add missing documentation from yum-security manpage. +- Resolves: bug#1182075 +- Add links to knowledge base articles for http errors 404 and 403 and curl error 60. +- Resolves: bug#1199976 +- Resolves: bug#1200312 +- Resolves: bug#1200338 +- API v2.7: missing_requires, pretty_output_update, promptYN fix, confList. +- Resolves: bug#1188960 * Mon Jan 12 2015 Valentina Mukhamedzhanova - 3.4.3-125 - Roll back the broken lvm patch.