---
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
[email protected]
http://lists.baseurl.org/mailman/listinfo/yum-devel