[Yum-devel] [PATCH 1/3] Add update-to and upgrade-to commands, as "hidden" alias for update/upgrade.

tim.lauridsen at gmail.com tim.lauridsen at gmail.com
Thu Mar 31 05:26:12 UTC 2011


On Thu, Mar 31, 2011 at 12:01 AM, James Antill <james at and.org> wrote:

> ---
>  cli.py          |    4 +-
>  yum/__init__.py |   58
> +++++++++++++++++++++++++++++++++++++++++-------------
>  yumcommands.py  |    8 +++---
>  3 files changed, 50 insertions(+), 20 deletions(-)
>
> diff --git a/cli.py b/cli.py
> index eca1812..1b7d7e6 100644
> --- a/cli.py
> +++ b/cli.py
> @@ -713,7 +713,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
>             return 1, [_('Nothing to do')]
>         return 0, [_('Nothing to do')]
>
> -    def updatePkgs(self, userlist, quiet=0):
> +    def updatePkgs(self, userlist, quiet=0, update_to=False):
>         """take user commands and populate transaction wrapper with
>            packages to be updated"""
>
> @@ -740,7 +740,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
>                     userlist.remove(item)
>
>             for arg in userlist:
> -                if not self.update(pattern=arg):
> +                if not self.update(pattern=arg, update_to=update_to):
>                     self._checkMaybeYouMeant(arg)
>
>         if len(self.tsInfo) > oldcount:
> diff --git a/yum/__init__.py b/yum/__init__.py
> index d1f07d0..60c572d 100644
> --- a/yum/__init__.py
> +++ b/yum/__init__.py
> @@ -3005,9 +3005,28 @@ class YumBase(depsolve.Depsolve):
>
>         if not depstring:
>             return []
> -        results = self.pkgSack.searchProvides(depstring)
> -        return results
> -
> +
> +        # parse the string out
> +        #  either it is 'dep (some operator) e:v-r'
> +        #  or /file/dep
> +        #  or packagename
> +        if type(depstring) == types.TupleType:
> +            (depname, depflags, depver) = depstring
> +        else:
> +            depname = depstring
> +            depflags = None
> +            depver = None
> +
> +            if depstring[0] != '/':
> +                # not a file dep - look at it for being versioned
> +                dep_split = depstring.split()
> +                if len(dep_split) == 3:
> +                    depname, flagsymbol, depver = dep_split
> +                    if not flagsymbol in SYMBOLFLAGS:
> +                        raise Errors.YumBaseError, _('Invalid version flag
> from: %s') % str(depstring)
> +                    depflags = SYMBOLFLAGS[flagsymbol]
> +
> +        return self.pkgSack.getProvides(depname, depflags, depver).keys()
>
>     def returnPackageByDep(self, depstring):
>         """Pass in a generic [build]require string and this function will
> @@ -3563,7 +3582,7 @@ class YumBase(depsolve.Depsolve):
>             txmbr.reason = 'dep'
>         return txmbr
>
> -    def update(self, po=None, requiringPo=None, **kwargs):
> +    def update(self, po=None, requiringPo=None, update_to=False,
> **kwargs):
>         """try to mark for update the item(s) specified.
>             po is a package object - if that is there, mark it for update,
>             if possible
> @@ -3634,26 +3653,37 @@ class YumBase(depsolve.Depsolve):
>             if kwargs['pattern'] and kwargs['pattern'][0] == '@':
>                 return self._at_groupinstall(kwargs['pattern'])
>
> -            (e, m, u) = self.rpmdb.matchPackageNames([kwargs['pattern']])
> -            instpkgs.extend(e)
> -            instpkgs.extend(m)
> +            arg = kwargs['pattern']
> +            if not update_to:
> +                instpkgs  = self.rpmdb.returnPackages(patterns=[arg])
> +            else:
> +                availpkgs = self.pkgSack.returnPackages(patterns=[arg])
>
> -            if u:
> +            if not instpkgs and not availpkgs:
>                 depmatches = []
> -                arg = u[0]
>                 try:
> -                    depmatches = self.returnInstalledPackagesByDep(arg)
> +                    if update_to:
> +                        depmatches = self.returnPackagesByDep(arg)
> +                    else:
> +                        depmatches =
> self.returnInstalledPackagesByDep(arg)
>                 except yum.Errors.YumBaseError, e:
>                     self.logger.critical(_('%s') % e)
> -
> -                instpkgs.extend(depmatches)
> +
> +                if update_to:
> +                    availpkgs.extend(depmatches)
> +                else:
> +                    instpkgs.extend(depmatches)
>
>             #  Always look for available packages, it doesn't seem to do
> any
>             # harm (apart from some time). And it fixes weird edge cases
> where
>             # "update a" (which requires a new b) is different from "update
> b"
>             try:
> -                pats = [kwargs['pattern']]
> -                m = self.pkgSack.returnNewestByNameArch(patterns=pats)
> +                if update_to:
> +                    m = []
> +                else:
> +                    pats = [kwargs['pattern']]
> +                    # pats += list(set([pkg.name for pkg in instpkgs]))
> +                    m = self.pkgSack.returnNewestByNameArch(patterns=pats)
>             except Errors.PackageSackError:
>                 m = []
>             availpkgs.extend(m)
> diff --git a/yumcommands.py b/yumcommands.py
> index 41f0092..fd69f05 100644
> --- a/yumcommands.py
> +++ b/yumcommands.py
> @@ -207,7 +207,7 @@ class InstallCommand(YumCommand):
>
>  class UpdateCommand(YumCommand):
>     def getNames(self):
> -        return ['update']
> +        return ['update', 'update-to']
>
>     def getUsage(self):
>         return _("[PACKAGE...]")
> @@ -223,7 +223,7 @@ class UpdateCommand(YumCommand):
>     def doCommand(self, base, basecmd, extcmds):
>         self.doneCommand(base, _("Setting up Update Process"))
>         try:
> -            return base.updatePkgs(extcmds)
> +            return base.updatePkgs(extcmds, update_to=(basecmd ==
> 'update-to'))
>         except yum.Errors.YumBaseError, e:
>             return 1, [str(e)]
>
> @@ -691,7 +691,7 @@ class SearchCommand(YumCommand):
>
>  class UpgradeCommand(YumCommand):
>     def getNames(self):
> -        return ['upgrade']
> +        return ['upgrade', 'upgrade-to']
>
>     def getUsage(self):
>         return 'PACKAGE...'
> @@ -708,7 +708,7 @@ class UpgradeCommand(YumCommand):
>         base.conf.obsoletes = 1
>         self.doneCommand(base, _("Setting up Upgrade Process"))
>         try:
> -            return base.updatePkgs(extcmds)
> +            return base.updatePkgs(extcmds, update_to=(basecmd ==
> 'upgrade-to'))
>         except yum.Errors.YumBaseError, e:
>             return 1, [str(e)]
>
> --
> 1.7.3.4
>
> _______________________________________________
> Yum-devel mailing list
> Yum-devel at lists.baseurl.org
> http://lists.baseurl.org/mailman/listinfo/yum-devel


Do we need a separate command for this, is it not better to just fix 'yum
update foo-1.2' to do what 'yum update-to foo-1.2', if I understand it
right then 'yum update foo-1.2' will update to the newest version of foo >
1.2, if foo-1.2 is already installed. This is kind of wrong in my book.
If I do a 'yum install foo-1.2' I expect foo-1.2 to get installed and get a
foo-1.2 is already installed if foo-1.2 is already installed.
yum update foo-1.2 should work the same way.

Tim
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.baseurl.org/pipermail/yum-devel/attachments/20110331/66955284/attachment-0001.html>


More information about the Yum-devel mailing list