[yum: 1/2] Fix the skip broken tuples => dict. bug. BZ 717973.

James Antill james at fedoraproject.org
Thu Jun 30 17:10:24 UTC 2011


commit bb24d5a142a2c47bb96ab1df663b3f9e1f156e3c
Author: James Antill <james at and.org>
Date:   Tue Jun 28 17:03:31 2011 -0400

    Fix the skip broken tuples => dict. bug. BZ 717973.

 yum-HEAD.patch            | 1916 +++++++++++++++++++++++++++++++++++++++++++++
 yum-ppc64-preferred.patch |   13 +
 yum.spec                  |   10 +-
 3 files changed, 1938 insertions(+), 1 deletions(-)
---
diff --git a/yum-HEAD.patch b/yum-HEAD.patch
index 8501f19..d0b6a7e 100644
--- a/yum-HEAD.patch
+++ b/yum-HEAD.patch
@@ -1,3 +1,43 @@
+diff --git a/rpmUtils/arch.py b/rpmUtils/arch.py
+index 6082005..ad7bbb1 100644
+--- a/rpmUtils/arch.py
++++ b/rpmUtils/arch.py
+@@ -3,6 +3,8 @@
+ 
+ import os
+ 
++_ppc64_native_is_best = False
++
+ # dict mapping arch -> ( multicompat, best personality, biarch personality )
+ multilibArches = { "x86_64":  ( "athlon", "x86_64", "athlon" ),
+                    "sparc64v": ( "sparcv9v", "sparcv9v", "sparc64v" ),
+@@ -10,6 +12,8 @@ multilibArches = { "x86_64":  ( "athlon", "x86_64", "athlon" ),
+                    "ppc64":   ( "ppc", "ppc", "ppc64" ),
+                    "s390x":   ( "s390", "s390x", "s390" ),
+                    }
++if _ppc64_native_is_best:
++    multilibArches["ppc64"] = ( "ppc", "ppc64", "ppc64" )
+ 
+ arches = {
+     # ia32
+@@ -339,7 +343,7 @@ def getBestArch(myarch=None):
+     if arch.startswith("sparc64"):
+         arch = multilibArches[arch][1]
+ 
+-    if arch.startswith("ppc64"):
++    if arch.startswith("ppc64") and not _ppc64_native_is_best:
+         arch = 'ppc'
+ 
+     return arch
+@@ -357,7 +361,7 @@ def getBaseArch(myarch=None):
+ 
+     if myarch.startswith("sparc64"):
+         return "sparc"
+-    elif myarch.startswith("ppc64"):
++    elif myarch.startswith("ppc64") and not _ppc64_native_is_best:
+         return "ppc"
+     elif myarch.startswith("arm"):
+         return "arm"
 diff --git a/yum.spec b/yum.spec
 index abd203f..9e7ed43 100644
 --- a/yum.spec
@@ -10,3 +50,1879 @@ index abd203f..9e7ed43 100644
  Release: 0
  License: GPLv2+
  Group: System Environment/Base
+diff --git a/yum/__init__.py b/yum/__init__.py
+index 99039e0..e9bc1f9 100644
+--- a/yum/__init__.py
++++ b/yum/__init__.py
+@@ -1242,13 +1242,15 @@ class YumBase(depsolve.Depsolve):
+         if None in pkgtup:
+             return None
+         return pkgtup
+-    def _add_not_found_a(self, pkgs, nevra_dict):
+-        pkgtup = self._add_not_found(pkgs, nevra_dict)
++    def _add_not_found_a(self, pkgs, nevra_dict={}, pkgtup=None):
++        if pkgtup is None and nevra_dict:
++            pkgtup = self._add_not_found(pkgs, nevra_dict)
+         if pkgtup is None:
+             return
+         self._not_found_a[pkgtup] = YumNotFoundPackage(pkgtup)
+-    def _add_not_found_i(self, pkgs, nevra_dict):
+-        pkgtup = self._add_not_found(pkgs, nevra_dict)
++    def _add_not_found_i(self, pkgs, nevra_dict={}, pkgtup=None):
++        if pkgtup is None and nevra_dict:
++            pkgtup = self._add_not_found(pkgs, nevra_dict)
+         if pkgtup is None:
+             return
+         self._not_found_i[pkgtup] = YumNotFoundPackage(pkgtup)
+@@ -3049,7 +3051,7 @@ class YumBase(depsolve.Depsolve):
+         pkgs = self.pkgSack.searchPkgTuple(pkgtup)
+ 
+         if len(pkgs) == 0:
+-            self._add_not_found_a(pkgs, pkgtup)
++            self._add_not_found_a(pkgs, pkgtup=pkgtup)
+             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)
+@@ -3071,7 +3073,7 @@ class YumBase(depsolve.Depsolve):
+ 
+         pkgs = self.rpmdb.searchPkgTuple(pkgtup)
+         if len(pkgs) == 0:
+-            self._add_not_found_i(pkgs, pkgtup)
++            self._add_not_found_i(pkgs, pkgtup=pkgtup)
+             raise Errors.RpmDBError, _('Package tuple %s could not be found in rpmdb') % str(pkgtup)
+ 
+         # Dito. FIXME from getPackageObject() for len() > 1 ... :)
+diff --git a/yumcommands.py b/yumcommands.py
+index 4dcbea7..3a985c3 100644
+--- a/yumcommands.py
++++ b/yumcommands.py
+@@ -43,16 +43,22 @@ def _err_mini_usage(base, basecmd):
+     base.logger.critical(txt)
+ 
+ def checkRootUID(base):
+-    """
+-    Verify that the program is being run by the root user.
++    """Verify that the program is being run by the root user.
+ 
+-    @param base: a YumBase object.
++    :param base: a :class:`yum.Yumbase` object.
++    :raises: :class:`cli.CliError`
+     """
+     if base.conf.uid != 0:
+         base.logger.critical(_('You need to be root to perform this command.'))
+         raise cli.CliError
+ 
+ def checkGPGKey(base):
++    """Verify that there are gpg keys for the enabled repositories in the
++    rpm database.
++
++    :param base: a :class:`yum.Yumbase` object.
++    :raises: :class:`cli.CliError`
++    """
+     if not base.gpgKeyCheck():
+         for repo in base.repos.listEnabled():
+             if (repo.gpgcheck or repo.repo_gpgcheck) and not repo.gpgkey:
+@@ -75,6 +81,14 @@ For more information contact your distribution or package provider.
+                 raise cli.CliError
+ 
+ def checkPackageArg(base, basecmd, extcmds):
++    """Verify that *extcmds* contains the name of at least one package for
++    *basecmd* to act on.
++
++    :param base: a :class:`yum.Yumbase` object.
++    :param basecmd: the name of the command being checked for
++    :param extcmds: a list of arguments passed to *basecmd*
++    :raises: :class:`cli.CliError`
++    """
+     if len(extcmds) == 0:
+         base.logger.critical(
+                 _('Error: Need to pass a list of pkgs to %s') % basecmd)
+@@ -82,18 +96,44 @@ def checkPackageArg(base, basecmd, extcmds):
+         raise cli.CliError
+ 
+ def checkItemArg(base, basecmd, extcmds):
++    """Verify that *extcmds* contains the name of at least one item for
++    *basecmd* to act on.  Generally, the items are command-line
++    arguments that are not the name of a package, such as a file name
++    passed to provides.
++
++    :param base: a :class:`yum.Yumbase` object.
++    :param basecmd: the name of the command being checked for
++    :param extcmds: a list of arguments passed to *basecmd*
++    :raises: :class:`cli.CliError`
++    """
+     if len(extcmds) == 0:
+         base.logger.critical(_('Error: Need an item to match'))
+         _err_mini_usage(base, basecmd)
+         raise cli.CliError
+ 
+ def checkGroupArg(base, basecmd, extcmds):
++    """Verify that *extcmds* contains the name of at least one group for
++    *basecmd* to act on.
++
++    :param base: a :class:`yum.Yumbase` object.
++    :param basecmd: the name of the command being checked for
++    :param extcmds: a list of arguments passed to *basecmd*
++    :raises: :class:`cli.CliError`
++    """
+     if len(extcmds) == 0:
+         base.logger.critical(_('Error: Need a group or list of groups'))
+         _err_mini_usage(base, basecmd)
+         raise cli.CliError    
+ 
+ def checkCleanArg(base, basecmd, extcmds):
++    """Verify that *extcmds* contains at least one argument, and that all
++    arguments in *extcmds* are valid options for clean.
++
++    :param base: a :class:`yum.Yumbase` object
++    :param basecmd: the name of the command being checked for
++    :param extcmds: a list of arguments passed to *basecmd*
++    :raises: :class:`cli.CliError`
++    """
+     VALID_ARGS = ('headers', 'packages', 'metadata', 'dbcache', 'plugins',
+                   'expire-cache', 'rpmdb', 'all')
+ 
+@@ -108,12 +148,14 @@ def checkCleanArg(base, basecmd, extcmds):
+             raise cli.CliError
+ 
+ def checkShellArg(base, basecmd, extcmds):
+-    """
+-    Verify that the arguments given to 'yum shell' are valid.
+-
+-    yum shell can be given either no args, or exactly one argument,
+-    which is the name of a file. If these are not met,
+-    raise cli.CliError.
++    """Verify that the arguments given to 'yum shell' are valid.  yum
++    shell can be given either no argument, or exactly one argument,
++    which is the name of a file.
++
++    :param base: a :class:`yum.Yumbase` object.
++    :param basecmd: the name of the command being checked for
++    :param extcmds: a list of arguments passed to *basecmd*
++    :raises: :class:`cli.CliError`
+     """
+     if len(extcmds) == 0:
+         base.verbose_logger.debug(_("No argument to shell"))
+@@ -133,10 +175,12 @@ def checkShellArg(base, basecmd, extcmds):
+         raise cli.CliError
+ 
+ def checkEnabledRepo(base, possible_local_files=[]):
+-    """
+-    Verify that there is at least one enabled repo.
++    """Verify that there is at least one enabled repo.
+ 
+-    @param base: a YumBase object.
++    :param base: a :class:`yum.Yumbase` object.
++    :param basecmd: the name of the command being checked for
++    :param extcmds: a list of arguments passed to *basecmd*
++    :raises: :class:`cli.CliError`:
+     """
+     if base.repos.listEnabled():
+         return
+@@ -152,63 +196,145 @@ def checkEnabledRepo(base, possible_local_files=[]):
+     raise cli.CliError
+ 
+ class YumCommand:
+-        
++    """An abstract base class that defines the methods needed by the cli
++    to execute a specific command.  Subclasses must override at least
++    :func:`getUsage` and :func:`getSummary`.
++    """
++
+     def __init__(self):
+         self.done_command_once = False
+         self.hidden = False
+ 
+     def doneCommand(self, base, msg, *args):
++        """ Output *msg* the first time that this method is called, and do
++        nothing on subsequent calls.  This is to prevent duplicate
++        messages from being printed for the same command.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param msg: the message to be output
++        :param *args: additional arguments associated with the message
++        """
+         if not self.done_command_once:
+             base.verbose_logger.info(msg, *args)
+         self.done_command_once = True
+ 
+     def getNames(self):
++        """Return a list of strings that are the names of the command.
++        The command can be called from the command line by using any
++        of these names.
++
++        :return: a list containing the names of the command
++        """
+         return []
+ 
+     def getUsage(self):
+-        """
+-        @return: A usage string for the command, including arguments.
++        """Return a usage string for the command, including arguments.
++
++        :return: a usage string for the command
+         """
+         raise NotImplementedError
+ 
+     def getSummary(self):
+-        """
+-        @return: A one line summary of what the command does.
++        """Return a one line summary of what the command does.
++
++        :return: a one line summary of what the command does
+         """
+         raise NotImplementedError
+     
+     def doCheck(self, base, basecmd, extcmds):
++        """Verify that various conditions are met so that the command
++        can run.
++
++        :param base: a :class:`yum.Yumbase` object.
++        :param basecmd: the name of the command being checked for
++        :param extcmds: a list of arguments passed to *basecmd*
++        """
+         pass
+ 
+     def doCommand(self, base, basecmd, extcmds):
+-        """
+-        @return: (exit_code, [ errors ]) where exit_code is:
+-           0 = we're done, exit
+-           1 = we've errored, exit with error string
+-           2 = we've got work yet to do, onto the next stage
++        """Execute the command
++
++        :param base: a :class:`yum.Yumbase` object.
++        :param basecmd: the name of the command being executed
++        :param extcmds: a list of arguments passed to *basecmd*
++        :return: (exit_code, [ errors ])
++
++        exit_code is::
++
++            0 = we're done, exit
++            1 = we've errored, exit with error string
++            2 = we've got work yet to do, onto the next stage
+         """
+         return 0, [_('Nothing to do')]
+     
+     def needTs(self, base, basecmd, extcmds):
++        """Return whether a transaction set must be set up before the
++        command can run
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: a list of arguments passed to *basecmd*
++        :return: True if a transaction set is needed, False otherwise
++        """
+         return True
+         
+ class InstallCommand(YumCommand):
++    """A class containing methods needed by the cli to execute the
++    install command.
++    """
++
+     def getNames(self):
++        """Return a list containing the names of this command.  This
++        command can be called from the command line by using any of
++        these names.
++
++        :return: a list containing the names of this command
++        """
+         return ['install']
+ 
+     def getUsage(self):
++        """Return a usage string for this command.
++
++        :return: a usage string for this command
++        """
+         return _("PACKAGE...")
+ 
+     def getSummary(self):
++        """Return a one line summary of this command.
++
++        :return: a one line summary of this command
++        """
+         return _("Install a package or packages on your system")
+     
+     def doCheck(self, base, basecmd, extcmds):
++        """Verify that conditions are met so that this command can run.
++        These include that the program is being run by the root user,
++        that there are enabled repositories with gpg keys, and that
++        this command is called with appropriate arguments.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        """
+         checkRootUID(base)
+         checkGPGKey(base)
+         checkPackageArg(base, basecmd, extcmds)
+         checkEnabledRepo(base, extcmds)
+ 
+     def doCommand(self, base, basecmd, extcmds):
++        """Execute this command.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        :return: (exit_code, [ errors ])
++
++        exit_code is::
++
++            0 = we're done, exit
++            1 = we've errored, exit with error string
++            2 = we've got work yet to do, onto the next stage
++        """
+         self.doneCommand(base, _("Setting up Install Process"))
+         try:
+             return base.installPkgs(extcmds)
+@@ -216,21 +342,60 @@ class InstallCommand(YumCommand):
+             return 1, [str(e)]
+ 
+ class UpdateCommand(YumCommand):
++    """A class containing methods needed by the cli to execute the
++    update command.
++    """
++
+     def getNames(self):
++        """Return a list containing the names of this command.  This
++        command can by called from the command line by using any of
++        these names.
++
++        :return: a list containing the names of this command
++        """
+         return ['update', 'update-to']
+ 
+     def getUsage(self):
++        """Return a usage string for this command.
++
++        :return: a usage string for this command
++        """
+         return _("[PACKAGE...]")
+ 
+     def getSummary(self):
++        """Return a one line summary of this command.
++
++        :return: a one line summary of this command
++        """
+         return _("Update a package or packages on your system")
+ 
+     def doCheck(self, base, basecmd, extcmds):
++        """Verify that conditions are met so that this command can run.
++        These include that there are enabled repositories with gpg
++        keys, and that this command is being run by the root user.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        """
+         checkRootUID(base)
+         checkGPGKey(base)
+         checkEnabledRepo(base, extcmds)
+ 
+     def doCommand(self, base, basecmd, extcmds):
++        """Execute this command.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        :return: (exit_code, [ errors ])
++
++        exit_code is::
++
++            0 = we're done, exit
++            1 = we've errored, exit with error string
++            2 = we've got work yet to do, onto the next stage
++        """
+         self.doneCommand(base, _("Setting up Update Process"))
+         try:
+             return base.updatePkgs(extcmds, update_to=(basecmd == 'update-to'))
+@@ -238,21 +403,59 @@ class UpdateCommand(YumCommand):
+             return 1, [str(e)]
+ 
+ class DistroSyncCommand(YumCommand):
++    """A class containing methods needed by the cli to execute the
++    distro-synch command.
++    """
++
+     def getNames(self):
++        """Return a list containing the names of this command.  This
++        command can be called from the command line by using any of these names.
++
++        :return: a list containing the names of this command
++        """
+         return ['distribution-synchronization', 'distro-sync']
+ 
+     def getUsage(self):
++        """Return a usage string for this command.
++
++        :return: a usage string for this command
++        """
+         return _("[PACKAGE...]")
+ 
+     def getSummary(self):
++        """Return a one line summary of this command.
++
++        :return: a one line summary of this command
++        """
+         return _("Synchronize installed packages to the latest available versions")
+ 
+     def doCheck(self, base, basecmd, extcmds):
++        """Verify that conditions are met so that this command can run.
++        These include that the program is being run by the root user,
++        and that there are enabled repositories with gpg keys.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        """
+         checkRootUID(base)
+         checkGPGKey(base)
+         checkEnabledRepo(base, extcmds)
+ 
+     def doCommand(self, base, basecmd, extcmds):
++        """Execute this command.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        :return: (exit_code, [ errors ])
++
++        exit_code is::
++
++            0 = we're done, exit
++            1 = we've errored, exit with error string
++            2 = we've got work yet to do, onto the next stage
++        """
+         self.doneCommand(base, _("Setting up Distribution Synchronization Process"))
+         try:
+             base.conf.obsoletes = 1
+@@ -289,16 +492,46 @@ def _list_cmd_calc_columns(base, ypl):
+     return (-columns[0], -columns[1], -columns[2])
+ 
+ class InfoCommand(YumCommand):
++    """A class containing methods needed by the cli to execute the
++    update command.
++    """
++
+     def getNames(self):
++        """Return a list containing the names of this command.  This
++        command can be called from the command line by using any of these names.
++
++        :return: a list containing the names of this command
++        """
+         return ['info']
+ 
+     def getUsage(self):
++        """Return a usage string for this command.
++
++        :return: a usage string for this command
++        """
+         return "[PACKAGE|all|available|installed|updates|extras|obsoletes|recent]"
+ 
+     def getSummary(self):
++        """Return a one line summary of this command.
++
++        :return: a one line summary of this command
++        """
+         return _("Display details about a package or group of packages")
+ 
+     def doCommand(self, base, basecmd, extcmds):
++        """Execute this command.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        :return: (exit_code, [ errors ])
++
++        exit_code is::
++
++            0 = we're done, exit
++            1 = we've errored, exit with error string
++            2 = we've got work yet to do, onto the next stage
++        """
+         try:
+             highlight = base.term.MODE['bold']
+             ypl = base.returnPkgLists(extcmds, installed_available=highlight)
+@@ -389,35 +622,95 @@ class InfoCommand(YumCommand):
+             return 0, []
+ 
+     def needTs(self, base, basecmd, extcmds):
++        """Return whether a transaction set must be set up before this
++        command can run.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: a list of arguments passed to *basecmd*
++        :return: True if a transaction set is needed, False otherwise
++        """
+         if len(extcmds) and extcmds[0] == 'installed':
+             return False
+         
+         return True
+ 
+ class ListCommand(InfoCommand):
++    """A class containing methods needed by the cli to execute the
++    list command.
++    """
++
+     def getNames(self):
++        """Return a list containing the names of this command.  This
++        command can be called from the command line by using any of these names.
++
++        :return: a list containing the names of this command
++        """
+         return ['list']
+ 
+     def getSummary(self):
++        """Return a one line summary of this command.
++
++        :return: a one line summary of this command
++        """
+         return _("List a package or groups of packages")
+ 
+ 
+ class EraseCommand(YumCommand):
++    """A class containing methods needed by the cli to execute the
++    erase command.
++    """
++
+         
+     def getNames(self):
++        """Return a list containing the names of this command.  This
++        command can be called from the command line by using any of these names.
++
++        :return: a list containing the names of this command
++        """
+         return ['erase', 'remove']
+ 
+     def getUsage(self):
++        """Return a usage string for this command.
++
++        :return: a usage string for this command
++        """
+         return "PACKAGE..."
+ 
+     def getSummary(self):
++        """Return a one line summary of this command.
++
++        :return: a one line summary of this command
++        """
+         return _("Remove a package or packages from your system")
+ 
+     def doCheck(self, base, basecmd, extcmds):
++        """Verify that conditions are met so that this command can
++        run.  These include that the program is being run by the root
++        user, and that this command is called with appropriate
++        arguments.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        """
+         checkRootUID(base)
+         checkPackageArg(base, basecmd, extcmds)
+ 
+     def doCommand(self, base, basecmd, extcmds):
++        """Execute this command.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        :return: (exit_code, [ errors ])
++
++        exit_code is::
++
++            0 = we're done, exit
++            1 = we've errored, exit with error string
++            2 = we've got work yet to do, onto the next stage
++        """
+         self.doneCommand(base, _("Setting up Remove Process"))
+         try:
+             return base.erasePkgs(extcmds)
+@@ -425,9 +718,25 @@ class EraseCommand(YumCommand):
+             return 1, [str(e)]
+ 
+     def needTs(self, base, basecmd, extcmds):
++        """Return whether a transaction set must be set up before this
++        command can run.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: a list of arguments passed to *basecmd*
++        :return: True if a transaction set is needed, False otherwise
++        """
+         return False
+ 
+     def needTsRemove(self, base, basecmd, extcmds):
++        """Return whether a transaction set for removal only must be
++        set up before this command can run.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: a list of arguments passed to *basecmd*
++        :return: True if a remove-only transaction set is needed, False otherwise
++        """
+         return True
+ 
+  
+@@ -442,12 +751,25 @@ class GroupsCommand(YumCommand):
+                        'groupinfo'    : 'info'}
+ 
+     def getNames(self):
++        """Return a list containing the names of this command.  This
++        command can be called from the command line by using any of these names.
++
++        :return: a list containing the names of this command
++        """
+         return ['groups', 'group'] + self.direct_commands.keys()
+ 
+     def getUsage(self):
++        """Return a usage string for this command.
++
++        :return: a usage string for this command
++        """
+         return "[list|info|summary|install|upgrade|remove|mark] [GROUP]"
+ 
+     def getSummary(self):
++        """Return a one line summary of this command.
++
++        :return: a one line summary of this command
++        """
+         return _("Display, or use, the groups information")
+     
+     def _grp_setup_doCommand(self, base):
+@@ -479,6 +801,14 @@ class GroupsCommand(YumCommand):
+         return cmd, extcmds
+ 
+     def doCheck(self, base, basecmd, extcmds):
++        """Verify that conditions are met so that this command can run.
++        The exact conditions checked will vary depending on the
++        subcommand that is being called.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        """
+         cmd, extcmds = self._grp_cmd(basecmd, extcmds)
+ 
+         checkEnabledRepo(base)
+@@ -505,6 +835,19 @@ class GroupsCommand(YumCommand):
+             raise cli.CliError
+ 
+     def doCommand(self, base, basecmd, extcmds):
++        """Execute this command.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        :return: (exit_code, [ errors ])
++
++        exit_code is::
++
++            0 = we're done, exit
++            1 = we've errored, exit with error string
++            2 = we've got work yet to do, onto the next stage
++        """
+         cmd, extcmds = self._grp_cmd(basecmd, extcmds)
+ 
+         self._grp_setup_doCommand(base)
+@@ -529,6 +872,14 @@ class GroupsCommand(YumCommand):
+ 
+ 
+     def needTs(self, base, basecmd, extcmds):
++        """Return whether a transaction set must be set up before this
++        command can run.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: a list of arguments passed to *basecmd*
++        :return: True if a transaction set is needed, False otherwise
++        """
+         cmd, extcmds = self._grp_cmd(basecmd, extcmds)
+ 
+         if cmd in ('list', 'info', 'remove', 'summary'):
+@@ -536,6 +887,14 @@ class GroupsCommand(YumCommand):
+         return True
+ 
+     def needTsRemove(self, base, basecmd, extcmds):
++        """Return whether a transaction set for removal only must be
++        set up before this command can run.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: a list of arguments passed to *basecmd*
++        :return: True if a remove-only transaction set is needed, False otherwise
++        """
+         cmd, extcmds = self._grp_cmd(basecmd, extcmds)
+ 
+         if cmd in ('remove',):
+@@ -543,20 +902,56 @@ class GroupsCommand(YumCommand):
+         return False
+ 
+ class MakeCacheCommand(YumCommand):
++    """A class containing methods needed by the cli to execute the
++    makecache command.
++    """
+ 
+     def getNames(self):
++        """Return a list containing the names of this command.  This
++        command can be called from the command line by using any of these names.
++
++        :return: a list containing the names of this command
++        """
+         return ['makecache']
+ 
+     def getUsage(self):
++        """Return a usage string for this command.
++
++        :return: a usage string for this command
++        """
+         return ""
+ 
+     def getSummary(self):
++        """Return a one line summary of this command.
++
++        :return: a one line summary of this command
++        """
+         return _("Generate the metadata cache")
+ 
+     def doCheck(self, base, basecmd, extcmds):
++        """Verify that conditions are met so that this command can
++        run; namely that there is an enabled repository.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        """
+         checkEnabledRepo(base)
+ 
+     def doCommand(self, base, basecmd, extcmds):
++        """Execute this command.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        :return: (exit_code, [ errors ])
++
++        exit_code is::
++
++            0 = we're done, exit
++            1 = we've errored, exit with error string
++            2 = we've got work yet to do, onto the next stage
++        """
+         base.logger.debug(_("Making cache files for all metadata files."))
+         base.logger.debug(_("This may take a while depending on the speed of this computer"))
+         try:
+@@ -582,44 +977,134 @@ class MakeCacheCommand(YumCommand):
+         return 0, [_('Metadata Cache Created')]
+ 
+     def needTs(self, base, basecmd, extcmds):
++        """Return whether a transaction set must be set up before this
++        command can run.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: a list of arguments passed to *basecmd*
++        :return: True if a transaction set is needed, False otherwise
++        """
+         return False
+ 
+ class CleanCommand(YumCommand):
++    """A class containing methods needed by the cli to execute the
++    clean command.
++    """
+     
+     def getNames(self):
++        """Return a list containing the names of this command.  This
++        command can be called from the command line by using any of these names.
++
++        :return: a list containing the names of this command
++        """
+         return ['clean']
+ 
+     def getUsage(self):
++        """Return a usage string for this command.
++
++        :return: a usage string for this command
++        """
+         return "[headers|packages|metadata|dbcache|plugins|expire-cache|all]"
+ 
+     def getSummary(self):
++        """Return a one line summary of this command.
++
++        :return: a one line summary of this command
++        """
+         return _("Remove cached data")
+ 
+     def doCheck(self, base, basecmd, extcmds):
++        """Verify that conditions are met so that this command can run.
++        These include that there is at least one enabled repository,
++        and that this command is called with appropriate arguments.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        """
+         checkCleanArg(base, basecmd, extcmds)
+         checkEnabledRepo(base)
+         
+     def doCommand(self, base, basecmd, extcmds):
++        """Execute this command.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        :return: (exit_code, [ errors ])
++
++        exit_code is::
++
++            0 = we're done, exit
++            1 = we've errored, exit with error string
++            2 = we've got work yet to do, onto the next stage
++        """
+         base.conf.cache = 1
+         return base.cleanCli(extcmds)
+ 
+     def needTs(self, base, basecmd, extcmds):
++        """Return whether a transaction set must be set up before this
++        command can run.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: a list of arguments passed to *basecmd*
++        :return: True if a transaction set is needed, False otherwise
++        """
+         return False
+ 
+ class ProvidesCommand(YumCommand):
++    """A class containing methods needed by the cli to execute the
++    provides command.
++    """
++
+     def getNames(self):
++        """Return a list containing the names of this command.  This
++        command can be called from the command line by using any of these names.
++
++        :return: a list containing the names of this command
++        """
+         return ['provides', 'whatprovides']
+ 
+     def getUsage(self):
++        """Return a usage string for this command.
++
++        :return: a usage string for this command
++        """
+         return "SOME_STRING"
+     
+     def getSummary(self):
++        """Return a one line summary of this command.
++
++        :return: a one line summary of this command
++        """
+         return _("Find what package provides the given value")
+ 
+     def doCheck(self, base, basecmd, extcmds):
++        """Verify that conditions are met so that this command can
++        run; namely that this command is called with appropriate arguments.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        """
+         checkItemArg(base, basecmd, extcmds)
+ 
+     def doCommand(self, base, basecmd, extcmds):
++        """Execute this command.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        :return: (exit_code, [ errors ])
++
++        exit_code is::
++
++            0 = we're done, exit
++            1 = we've errored, exit with error string
++            2 = we've got work yet to do, onto the next stage
++        """
+         base.logger.debug("Searching Packages: ")
+         try:
+             return base.provides(extcmds)
+@@ -627,19 +1112,56 @@ class ProvidesCommand(YumCommand):
+             return 1, [str(e)]
+ 
+ class CheckUpdateCommand(YumCommand):
++    """A class containing methods needed by the cli to execute the
++    update command.
++    """
++
+     def getNames(self):
++        """Return a list containing the names of this command.  This
++        command can be called from the command line by using any of these names.
++
++        :return: a list containing the names of this command
++        """
+         return ['check-update']
+ 
+     def getUsage(self):
++        """Return a usage string for this command.
++
++        :return: a usage string for this command
++        """
+         return "[PACKAGE...]"
+ 
+     def getSummary(self):
++        """Return a one line summary of this command.
++
++        :return: a one line summary of this command
++        """
+         return _("Check for available package updates")
+ 
+     def doCheck(self, base, basecmd, extcmds):
++        """Verify that conditions are met so that this command can
++        run; namely that there is at least one enabled repository.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        """
+         checkEnabledRepo(base)
+ 
+     def doCommand(self, base, basecmd, extcmds):
++        """Execute this command.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        :return: (exit_code, [ errors ])
++
++        exit_code is::
++
++            0 = we're done, exit
++            1 = we've errored, exit with error string
++            2 = we've got work yet to do, onto the next stage
++        """
+         obscmds = ['obsoletes'] + extcmds
+         base.extcmds.insert(0, 'updates')
+         result = 0
+@@ -681,19 +1203,56 @@ class CheckUpdateCommand(YumCommand):
+             return result, []
+ 
+ class SearchCommand(YumCommand):
++    """A class containing methods needed by the cli to execute the
++    search command.
++    """
++
+     def getNames(self):
++        """Return a list containing the names of this command.  This
++        command can be called from the command line by using any of these names.
++
++        :return: a list containing the names of this command
++        """
+         return ['search']
+ 
+     def getUsage(self):
++        """Return a usage string for this command.
++
++        :return: a usage string for this command
++        """
+         return "SOME_STRING"
+ 
+     def getSummary(self):
++        """Return a one line summary of this command.
++
++        :return: a one line summary of this command
++        """
+         return _("Search package details for the given string")
+ 
+     def doCheck(self, base, basecmd, extcmds):
++        """Verify that conditions are met so that this command can
++        run; namely that this command is called with appropriate arguments.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        """
+         checkItemArg(base, basecmd, extcmds)
+ 
+     def doCommand(self, base, basecmd, extcmds):
++        """Execute this command.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        :return: (exit_code, [ errors ])
++
++        exit_code is::
++
++            0 = we're done, exit
++            1 = we've errored, exit with error string
++            2 = we've got work yet to do, onto the next stage
++        """
+         base.logger.debug(_("Searching Packages: "))
+         try:
+             return base.search(extcmds)
+@@ -701,24 +1260,70 @@ class SearchCommand(YumCommand):
+             return 1, [str(e)]
+ 
+     def needTs(self, base, basecmd, extcmds):
++        """Return whether a transaction set must be set up before this
++        command can run.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: a list of arguments passed to *basecmd*
++        :return: True if a transaction set is needed, False otherwise
++        """
+         return False
+ 
+ class UpgradeCommand(YumCommand):
++    """A class containing methods needed by the cli to execute the
++    update command.
++    """
++
+     def getNames(self):
++        """Return a list containing the names of this command.  This
++        command can be called from the command line by using any of these names.
++
++        :return: a list containing the names of this command
++        """
+         return ['upgrade', 'upgrade-to']
+ 
+     def getUsage(self):
++        """Return a usage string for this command.
++
++        :return: a usage string for this command
++        """
+         return 'PACKAGE...'
+ 
+     def getSummary(self):
++        """Return a one line summary of this command.
++
++        :return: a one line summary of this command
++        """
+         return _("Update packages taking obsoletes into account")
+ 
+     def doCheck(self, base, basecmd, extcmds):
++        """Verify that conditions are met so that this command can
++         run.  These include that the program is being run by the root
++         user, and that there are enabled repositories with gpg.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        """
+         checkRootUID(base)
+         checkGPGKey(base)
+         checkEnabledRepo(base, extcmds)
+ 
+     def doCommand(self, base, basecmd, extcmds):
++        """Execute this command.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        :return: (exit_code, [ errors ])
++
++        exit_code is::
++
++            0 = we're done, exit
++            1 = we've errored, exit with error string
++            2 = we've got work yet to do, onto the next stage
++        """
+         base.conf.obsoletes = 1
+         self.doneCommand(base, _("Setting up Upgrade Process"))
+         try:
+@@ -727,25 +1332,64 @@ class UpgradeCommand(YumCommand):
+             return 1, [str(e)]
+ 
+ class LocalInstallCommand(YumCommand):
++    """A class containing methods needed by the cli to execute the
++    localinstall command.
++    """
++
+     def __init__(self):
+         YumCommand.__init__(self)
+         self.hidden = True
+ 
+     def getNames(self):
++        """Return a list containing the names of this command.  This
++        command can be called from the command line by using any of these names.
++
++        :return: a list containing the names of this command
++        """
+         return ['localinstall', 'localupdate']
+ 
+     def getUsage(self):
++        """Return a usage string for this command.
++
++        :return: a usage string for this command
++        """
+         return "FILE"
+ 
+     def getSummary(self):
++        """Return a one line summary of this command.
++
++        :return: a one line summary of this command
++        """
+         return _("Install a local RPM")
+ 
+     def doCheck(self, base, basecmd, extcmds):
++        """Verify that conditions are met so that this command can
++        run.  These include that there are enabled repositories with
++        gpg keys, and that this command is called with appropriate
++        arguments.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        """
+         checkRootUID(base)
+         checkGPGKey(base)
+         checkPackageArg(base, basecmd, extcmds)
+         
+     def doCommand(self, base, basecmd, extcmds):
++        """Execute this command.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        :return: (exit_code, [ errors ])
++
++        exit_code is:
++
++            0 = we're done, exit
++            1 = we've errored, exit with error string
++            2 = we've got work yet to do, onto the next stage
++        """
+         self.doneCommand(base, _("Setting up Local Package Process"))
+ 
+         updateonly = basecmd == 'localupdate'
+@@ -755,19 +1399,57 @@ class LocalInstallCommand(YumCommand):
+             return 1, [str(e)]
+ 
+     def needTs(self, base, basecmd, extcmds):
++        """Return whether a transaction set must be set up before this
++        command can run.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: a list of arguments passed to *basecmd*
++        :return: True if a transaction set is needed, False otherwise
++        """
+         return False
+ 
+ class ResolveDepCommand(YumCommand):
++    """A class containing methods needed by the cli to execute the
++    resolvedep command.
++    """
++
+     def getNames(self):
++        """Return a list containing the names of this command.  This
++        command can be called from the command line by using any of these names.
++
++        :return: a list containing the names of this command
++        """
+         return ['resolvedep']
+ 
+     def getUsage(self):
++        """Return a usage string for this command.
++
++        :return: a usage string for this command
++        """
+         return "DEPENDENCY"
+ 
+     def getSummary(self):
++        """Return a one line summary of this command.
++
++        :return: a one line summary of this command
++        """
+         return _("Determine which package provides the given dependency")
+ 
+     def doCommand(self, base, basecmd, extcmds):
++        """Execute this command.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        :return: (exit_code, [ errors ])
++
++        exit_code is::
++
++            0 = we're done, exit
++            1 = we've errored, exit with error string
++            2 = we've got work yet to do, onto the next stage
++        """
+         base.logger.debug(_("Searching Packages for Dependency:"))
+         try:
+             return base.resolveDepCli(extcmds)
+@@ -775,19 +1457,56 @@ class ResolveDepCommand(YumCommand):
+             return 1, [str(e)]
+ 
+ class ShellCommand(YumCommand):
++    """A class containing methods needed by the cli to execute the
++    shell command.
++    """
++
+     def getNames(self):
++        """Return a list containing the names of this command.  This
++        command can be called from the command line by using any of these names.
++
++        :return: a list containing the names of this command
++        """
+         return ['shell']
+ 
+     def getUsage(self):
++        """Return a usage string for this command.
++
++        :return: a usage string for this command
++        """
+         return "[FILENAME]"
+ 
+     def getSummary(self):
++        """Return a one line summary of this command.
++
++        :return: a one line summary of this command
++        """
+         return _("Run an interactive yum shell")
+ 
+     def doCheck(self, base, basecmd, extcmds):
++        """Verify that conditions are met so that this command can
++        run; namely that this command is called with appropriate arguments.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        """
+         checkShellArg(base, basecmd, extcmds)
+ 
+     def doCommand(self, base, basecmd, extcmds):
++        """Execute this command.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        :return: (exit_code, [ errors ])
++
++        exit_code is::
++
++            0 = we're done, exit
++            1 = we've errored, exit with error string
++            2 = we've got work yet to do, onto the next stage
++        """
+         self.doneCommand(base, _('Setting up Yum Shell'))
+         try:
+             return base.doShell()
+@@ -795,23 +1514,69 @@ class ShellCommand(YumCommand):
+             return 1, [str(e)]
+ 
+     def needTs(self, base, basecmd, extcmds):
++        """Return whether a transaction set must be set up before this
++        command can run.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: a list of arguments passed to *basecmd*
++        :return: True if a transaction set is needed, False otherwise
++        """
+         return False
+ 
+ 
+ class DepListCommand(YumCommand):
++    """A class containing methods needed by the cli to execute the
++    deplist command.
++    """
++
+     def getNames(self):
++        """Return a list containing the names of this command.  This
++        command can be called from the command line by using any of these names.
++
++        :return: a list containing the names of this command
++        """
+         return ['deplist']
+ 
+     def getUsage(self):
++        """Return a usage string for this command.
++
++        :return: a usage string for this command
++        """
+         return 'PACKAGE...'
+ 
+     def getSummary(self):
++        """Return a one line summary of this command.
++
++        :return: a one line summary of this command
++        """
+         return _("List a package's dependencies")
+ 
+     def doCheck(self, base, basecmd, extcmds):
++        """Verify that conditions are met so that this command can
++        run; namely that this command is called with appropriate
++        arguments.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        """
+         checkPackageArg(base, basecmd, extcmds)
+ 
+     def doCommand(self, base, basecmd, extcmds):
++        """Execute this command.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        :return: (exit_code, [ errors ])
++
++        exit_code is::
++
++            0 = we're done, exit
++            1 = we've errored, exit with error string
++            2 = we've got work yet to do, onto the next stage
++        """
+         self.doneCommand(base, _("Finding dependencies: "))
+         try:
+             return base.deplist(extcmds)
+@@ -820,17 +1585,46 @@ class DepListCommand(YumCommand):
+ 
+ 
+ class RepoListCommand(YumCommand):
++    """A class containing methods needed by the cli to execute the
++    repolist command.
++    """
+     
+     def getNames(self):
++        """Return a list containing the names of this command.  This
++        command can be called from the command line by using any of these names.
++
++        :return: a list containing the names of this command
++        """
+         return ('repolist',)
+ 
+     def getUsage(self):
++        """Return a usage string for this command.
++
++        :return: a usage string for this command
++        """
+         return '[all|enabled|disabled]'
+ 
+     def getSummary(self):
++        """Return a one line summary of this command.
++
++        :return: a one line summary of this command
++        """
+         return _('Display the configured software repositories')
+ 
+     def doCommand(self, base, basecmd, extcmds):
++        """Execute this command.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        :return: (exit_code, [ errors ])
++
++        exit_code is::
++
++            0 = we're done, exit
++            1 = we've errored, exit with error string
++            2 = we've got work yet to do, onto the next stage
++        """
+         def _repo_size(repo):
+             ret = 0
+             for pkg in repo.sack.returnPackages():
+@@ -1088,21 +1882,54 @@ class RepoListCommand(YumCommand):
+         return 0, ['repolist: ' +to_unicode(locale.format("%d", tot_num, True))]
+ 
+     def needTs(self, base, basecmd, extcmds):
++        """Return whether a transaction set must be set up before this
++        command can run.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: a list of arguments passed to *basecmd*
++        :return: True if a transaction set is needed, False otherwise
++        """
+         return False
+ 
+ 
+ class HelpCommand(YumCommand):
++    """A class containing methods needed by the cli to execute the
++    help command.
++    """
++
+ 
+     def getNames(self):
++        """Return a list containing the names of this command.  This
++        command can be called from the command line by using any of these names.
++
++        :return: a list containing the names of this command
++        """
+         return ['help']
+ 
+     def getUsage(self):
++        """Return a usage string for this command.
++
++        :return: a usage string for this command
++        """
+         return "COMMAND"
+ 
+     def getSummary(self):
++        """Return a one line summary of this command.
++
++        :return: a one line summary of this command
++        """
+         return _("Display a helpful usage message")
+ 
+     def doCheck(self, base, basecmd, extcmds):
++        """Verify that conditions are met so that this command can
++        run; namely that this command is called with appropriate
++        arguments.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        """
+         if len(extcmds) == 0:
+             base.usage()
+             raise cli.CliError
+@@ -1147,28 +1974,85 @@ class HelpCommand(YumCommand):
+         return help_output
+ 
+     def doCommand(self, base, basecmd, extcmds):
++        """Execute this command.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        :return: (exit_code, [ errors ])
++
++        exit_code is::
++
++            0 = we're done, exit
++            1 = we've errored, exit with error string
++            2 = we've got work yet to do, onto the next stage
++        """
+         if extcmds[0] in base.yum_cli_commands:
+             command = base.yum_cli_commands[extcmds[0]]
+             base.verbose_logger.info(self._makeOutput(command))
+         return 0, []
+ 
+     def needTs(self, base, basecmd, extcmds):
++        """Return whether a transaction set must be set up before this
++        command can run.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: a list of arguments passed to *basecmd*
++        :return: True if a transaction set is needed, False otherwise
++        """
+         return False
+ 
+ class ReInstallCommand(YumCommand):
++    """A class containing methods needed by the cli to execute the
++    reinstall command.
++    """
++
+     def getNames(self):
++        """Return a list containing the names of this command.  This
++        command can be called from the command line by using any of these names.
++
++        :return: a list containing the names of this command
++        """
+         return ['reinstall']
+ 
+     def getUsage(self):
++        """Return a usage string for this command.
++
++        :return: a usage string for this command
++        """
+         return "PACKAGE..."
+ 
+     def doCheck(self, base, basecmd, extcmds):
++        """Verify that conditions are met so that this command can
++        run.  These include that the program is being run by the root
++        user, that there are enabled repositories with gpg keys, and
++        that this command is called with appropriate arguments.
++
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        """
+         checkRootUID(base)
+         checkGPGKey(base)
+         checkPackageArg(base, basecmd, extcmds)
+         checkEnabledRepo(base, extcmds)
+ 
+     def doCommand(self, base, basecmd, extcmds):
++        """Execute this command.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        :return: (exit_code, [ errors ])
++
++        exit_code is::
++
++            0 = we're done, exit
++            1 = we've errored, exit with error string
++            2 = we've got work yet to do, onto the next stage
++        """
+         self.doneCommand(base, _("Setting up Reinstall Process"))
+         try:
+             return base.reinstallPkgs(extcmds)
+@@ -1177,25 +2061,73 @@ class ReInstallCommand(YumCommand):
+             return 1, [to_unicode(e)]
+ 
+     def getSummary(self):
++        """Return a one line summary of this command.
++
++        :return: a one line summary of this command
++        """
+         return _("reinstall a package")
+ 
+     def needTs(self, base, basecmd, extcmds):
++        """Return whether a transaction set must be set up before this
++        command can run.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: a list of arguments passed to *basecmd*
++        :return: True if a transaction set is needed, False otherwise
++        """
+         return False
+         
+ class DowngradeCommand(YumCommand):
++    """A class containing methods needed by the cli to execute the
++    downgrade command.
++    """
++
+     def getNames(self):
++        """Return a list containing the names of this command.  This
++        command can be called from the command line by using any of these names.
++
++        :return: a list containing the names of this command
++        """
+         return ['downgrade']
+ 
+     def getUsage(self):
++        """Return a usage string for this command.
++
++        :return: a usage string for this command
++        """
+         return "PACKAGE..."
+ 
+     def doCheck(self, base, basecmd, extcmds):
++        """Verify that conditions are met so that this command can
++        run.  These include that the program is being run by the root
++        user, that there are enabled repositories with gpg keys, and
++        that this command is called with appropriate arguments.
++
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        """
+         checkRootUID(base)
+         checkGPGKey(base)
+         checkPackageArg(base, basecmd, extcmds)
+         checkEnabledRepo(base, extcmds)
+ 
+     def doCommand(self, base, basecmd, extcmds):
++        """Execute this command.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        :return: (exit_code, [ errors ])
++
++        exit_code is::
++
++            0 = we're done, exit
++            1 = we've errored, exit with error string
++            2 = we've got work yet to do, onto the next stage
++        """
+         self.doneCommand(base, _("Setting up Downgrade Process"))
+         try:
+             return base.downgradePkgs(extcmds)
+@@ -1203,23 +2135,65 @@ class DowngradeCommand(YumCommand):
+             return 1, [str(e)]
+ 
+     def getSummary(self):
++        """Return a one line summary of this command.
++
++        :return: a one line summary of this command
++        """
+         return _("downgrade a package")
+ 
+     def needTs(self, base, basecmd, extcmds):
++        """Return whether a transaction set must be set up before this
++        command can run.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: a list of arguments passed to *basecmd*
++        :return: True if a transaction set is needed, False otherwise
++        """
+         return False
+ 
+ 
+ class VersionCommand(YumCommand):
++    """A class containing methods needed by the cli to execute the
++    version command.
++    """
++
+     def getNames(self):
++        """Return a list containing the names of this command.  This
++        command can be called from the command line by using any of these names.
++
++        :return: a list containing the names of this command
++        """
+         return ['version']
+ 
+     def getUsage(self):
++        """Return a usage string for this command.
++
++        :return: a usage string for this command
++        """
+         return "[all|installed|available]"
+ 
+     def getSummary(self):
++        """Return a one line summary of this command.
++
++        :return: a one line summary of this command
++        """
+         return _("Display a version for the machine and/or available repos.")
+ 
+     def doCommand(self, base, basecmd, extcmds):
++        """Execute this command.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        :return: (exit_code, [ errors ])
++
++        exit_code is::
++
++            0 = we're done, exit
++            1 = we've errored, exit with error string
++            2 = we've got work yet to do, onto the next stage
++        """
+         vcmd = 'installed'
+         if extcmds:
+             vcmd = extcmds[0]
+@@ -1344,6 +2318,14 @@ class VersionCommand(YumCommand):
+         return 0, ['version']
+ 
+     def needTs(self, base, basecmd, extcmds):
++        """Return whether a transaction set must be set up before this
++        command can run.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: a list of arguments passed to *basecmd*
++        :return: True if a transaction set is needed, False otherwise
++        """
+         vcmd = 'installed'
+         if extcmds:
+             vcmd = extcmds[0]
+@@ -1354,13 +2336,30 @@ class VersionCommand(YumCommand):
+ 
+ 
+ class HistoryCommand(YumCommand):
++    """A class containing methods needed by the cli to execute the
++    history command.
++    """
++
+     def getNames(self):
++        """Return a list containing the names of this command.  This
++        command can be called from the command line by using any of these names.
++
++        :return: a list containing the names of this command
++        """
+         return ['history']
+ 
+     def getUsage(self):
++        """Return a usage string for this command.
++
++        :return: a usage string for this command
++        """
+         return "[info|list|packages-list|summary|addon-info|redo|undo|rollback|new]"
+ 
+     def getSummary(self):
++        """Return a one line summary of this command.
++
++        :return: a one line summary of this command
++        """
+         return _("Display, or use, the transaction history")
+ 
+     def _hcmd_redo(self, base, extcmds):
+@@ -1427,6 +2426,14 @@ class HistoryCommand(YumCommand):
+         base.history._create_db_file()
+ 
+     def doCheck(self, base, basecmd, extcmds):
++        """Verify that conditions are met so that this command can
++        run.  The exact conditions checked will vary depending on the
++        subcommand that is being called.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        """
+         cmds = ('list', 'info', 'summary', 'repeat', 'redo', 'undo', 'new',
+                 'rollback',
+                 'addon', 'addon-info',
+@@ -1444,6 +2451,19 @@ class HistoryCommand(YumCommand):
+             raise cli.CliError
+ 
+     def doCommand(self, base, basecmd, extcmds):
++        """Execute this command.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        :return: (exit_code, [ errors ])
++
++        exit_code is::
++
++            0 = we're done, exit
++            1 = we've errored, exit with error string
++            2 = we've got work yet to do, onto the next stage
++        """
+         vcmd = 'list'
+         if extcmds:
+             vcmd = extcmds[0]
+@@ -1474,6 +2494,14 @@ class HistoryCommand(YumCommand):
+         return ret
+ 
+     def needTs(self, base, basecmd, extcmds):
++        """Return whether a transaction set must be set up before this
++        command can run.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: a list of arguments passed to *basecmd*
++        :return: True if a transaction set is needed, False otherwise
++        """
+         vcmd = 'list'
+         if extcmds:
+             vcmd = extcmds[0]
+@@ -1481,16 +2509,46 @@ class HistoryCommand(YumCommand):
+ 
+ 
+ class CheckRpmdbCommand(YumCommand):
++    """A class containing methods needed by the cli to execute the
++    check-rpmdb command.
++    """
++
+     def getNames(self):
++        """Return a list containing the names of this command.  This
++        command can be called from the command line by using any of these names.
++
++        :return: a list containing the names of this command
++        """
+         return ['check', 'check-rpmdb']
+ 
+     def getUsage(self):
++        """Return a usage string for this command.
++
++        :return: a usage string for this command
++        """
+         return "[dependencies|duplicates|all]"
+ 
+     def getSummary(self):
++        """Return a one line summary of this command.
++
++        :return: a one line summary of this command
++        """
+         return _("Check for problems in the rpmdb")
+ 
+     def doCommand(self, base, basecmd, extcmds):
++        """Execute this command.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        :return: (exit_code, [ errors ])
++
++        exit_code is::
++
++            0 = we're done, exit
++            1 = we've errored, exit with error string
++            2 = we've got work yet to do, onto the next stage
++        """
+         chkcmd = 'all'
+         if extcmds:
+             chkcmd = extcmds
+@@ -1505,19 +2563,57 @@ class CheckRpmdbCommand(YumCommand):
+         return rc, ['%s %s' % (basecmd, chkcmd)]
+ 
+     def needTs(self, base, basecmd, extcmds):
++        """Return whether a transaction set must be set up before this
++        command can run.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: a list of arguments passed to *basecmd*
++        :return: True if a transaction set is needed, False otherwise
++        """
+         return False
+ 
+ class LoadTransactionCommand(YumCommand):
++    """A class containing methods needed by the cli to execute the
++    load-transaction command.
++    """
++
+     def getNames(self):
++        """Return a list containing the names of this command.  This
++        command can be called from the command line by using any of these names.
++
++        :return: a list containing the names of this command
++        """
+         return ['load-transaction', 'load-ts']
+ 
+     def getUsage(self):
++        """Return a usage string for this command.
++
++        :return: a usage string for this command
++        """
+         return "filename"
+ 
+     def getSummary(self):
++        """Return a one line summary of this command.
++
++        :return: a one line summary of this command
++        """
+         return _("load a saved transaction from filename")
+ 
+     def doCommand(self, base, basecmd, extcmds):
++        """Execute this command.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: the command line arguments passed to *basecmd*
++        :return: (exit_code, [ errors ])
++
++        exit_code is::
++
++            0 = we're done, exit
++            1 = we've errored, exit with error string
++            2 = we've got work yet to do, onto the next stage
++        """
+         if not extcmds:
+             base.logger.critical(_("No saved transaction file specified."))
+             raise cli.CliError
+@@ -1533,5 +2629,13 @@ class LoadTransactionCommand(YumCommand):
+ 
+ 
+     def needTs(self, base, basecmd, extcmds):
++        """Return whether a transaction set must be set up before this
++        command can run.
++
++        :param base: a :class:`yum.Yumbase` object
++        :param basecmd: the name of the command
++        :param extcmds: a list of arguments passed to *basecmd*
++        :return: True if a transaction set is needed, False otherwise
++        """
+         return True
+ 
diff --git a/yum-ppc64-preferred.patch b/yum-ppc64-preferred.patch
new file mode 100644
index 0000000..0aa1b4e
--- /dev/null
+++ b/yum-ppc64-preferred.patch
@@ -0,0 +1,13 @@
+diff -ru yum-3.4.3-orig/rpmUtils/arch.py yum-3.4.3/rpmUtils/arch.py
+--- yum-3.4.3-orig/rpmUtils/arch.py	2011-06-28 17:01:10.009680846 -0400
++++ yum-3.4.3/rpmUtils/arch.py	2011-06-28 17:01:31.849916539 -0400
+@@ -3,7 +3,7 @@
+ 
+ import os
+ 
+-_ppc64_native_is_best = False
++_ppc64_native_is_best = True
+ 
+ # dict mapping arch -> ( multicompat, best personality, biarch personality )
+ multilibArches = { "x86_64":  ( "athlon", "x86_64", "athlon" ),
+Only in yum-3.4.3/rpmUtils: arch.py~
diff --git a/yum.spec b/yum.spec
index 7fdb389..c83aec4 100644
--- a/yum.spec
+++ b/yum.spec
@@ -7,7 +7,7 @@
 Summary: RPM package installer/updater/manager
 Name: yum
 Version: 3.4.3
-Release: 1%{?dist}
+Release: 3%{?dist}
 License: GPLv2+
 Group: System Environment/Base
 Source0: http://yum.baseurl.org/download/3.4/%{name}-%{version}.tar.gz
@@ -19,6 +19,7 @@ Patch3: yum-multilib-policy-best.patch
 Patch4: no-more-exactarchlist.patch
 Patch5: geode-arch.patch
 Patch6: yum-HEAD.patch
+Patch7: yum-ppc64-preferred.patch
 Patch20: yum-manpage-files.patch
 
 URL: http://yum.baseurl.org/
@@ -123,6 +124,7 @@ Install this package if you want auto yum updates nightly via cron.
 %patch4 -p0
 %patch5 -p1
 %patch6 -p1
+%patch7 -p1
 %patch20 -p1
 
 %build
@@ -246,6 +248,12 @@ exit 0
 %config(noreplace) %{_sysconfdir}/sysconfig/yum-cron
 
 %changelog
+* Thu Jun 30 2011 James Antill <james at fedoraproject.org> - 3.4.3-3
+- Fix the skip broken tuples => dict. bug. BZ 717973.
+
+* Wed Jun 29 2011 James Antill <james at fedoraproject.org> - 3.4.3-2
+- Add ppc64 arch. change for BZ 713791.
+
 * Tue Jun 28 2011 James Antill <james at fedoraproject.org> - 3.4.3-1
 - update to 3.4.3
 - Real upstream workaround for rpm chroot and history insanity.


More information about the scm-commits mailing list