[Yum-devel] [PATCH] Add distro-sync command, to "force update" to the latest versions.
Dennis Gregorovic
dgregor at redhat.com
Thu Mar 4 23:07:47 UTC 2010
On Thu, 2010-03-04 at 17:22 -0500, James Antill wrote:
> This should be safe to go in for 3.2.27, as it's an entirely self
> contained command ... I've tried it here going on multiple directions,
> and it WMF(tm).
Just a couple nitpicks inline.
> ---
> cli.py | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> yumcommands.py | 25 ++++++++++++++++++++++
> 2 files changed, 88 insertions(+), 0 deletions(-)
>
> diff --git a/cli.py b/cli.py
> index f5ed53d..584dcf1 100644
> --- a/cli.py
> +++ b/cli.py
> @@ -100,6 +100,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
> self.registerCommand(yumcommands.VersionCommand())
> self.registerCommand(yumcommands.HistoryCommand())
> self.registerCommand(yumcommands.CheckRpmdbCommand())
> + self.registerCommand(yumcommands.DistroSyncCommand())
>
> def registerCommand(self, command):
> for name in command.getNames():
> @@ -649,6 +650,68 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
> else:
> return 0, [_('No Packages marked for Update')]
>
> + def distroSyncPkgs(self, userlist):
> + """ This does either upgrade/downgrade, depending on if the latest
> + installed version is older or newer. We allow "selection" but not
> + local packages (use tmprepo, or something). """
> +
> + dupdates = []
> + ipkgs = {}
> + iapkgs = {}
> + for pkg in sorted(self.rpmdb.returnPackages(patterns=userlist)):
> + ipkgs[pkg.name] = pkg
> + iapkgs.setdefault(pkg.name, set()).add(pkg)
iapkgs isn't used elsewhere. Can it be removed?
> +
> + obsoletes = []
> + if self.conf.obsoletes:
> + obsoletes = self.up.getObsoletesTuples(newest=1)
> +
> + for (obsoleting, installed) in obsoletes:
> + if installed[0] not in ipkgs:
> + continue
> + dupdates.extend(self.update(pkgtup=installed))
> + for (obsoleting, installed) in obsoletes:
> + if installed[0] not in ipkgs:
> + continue
> + del ipkg[installed[0]]
> +
> + apkgs = {}
> + for pkg in self.pkgSack.returnNewestByName():
> + if pkg.name not in ipkgs:
> + continue
> + apkgs[pkg.name] = pkg
> +
> + for ipkgname in ipkgs:
> + if ipkgname not in apkgs:
> + continue
> +
> + ipkg = ipkgs[ipkgname]
> + apkg = apkgs[ipkgname]
> + if ipkg.verEQ(apkg):
> + continue
> + if self.allowedMultipleInstalls(apkg):
> + found = False
> + for napkg in self.rpmdb.searchNames([apkg.name]):
> + if napkg.verEQ(apkg):
> + found = True
> + elif napkg.verGT(apkg):
> + dupdates.extend(self.remove(po=napkg))
> + if found:
> + continue
> + dupdates.extend(self.install(pattern=ipkg.name))
That should be apkg.name.
> + elif ipkg.verLT(apkg):
> + n,a,e,v,r = apkg.pkgtup
> + dupdates.extend(self.update(name=n, epoch=e, ver=v, rel=r))
> + else:
> + n,a,e,v,r = apkg.pkgtup
> + dupdates.extend(self.downgrade(name=n, epoch=e, ver=v, rel=r))
> +
> + if dupdates:
> + msg = _('%d packages marked for Distribution Synchronization') % len(dupdates)
> + return 2, [msg]
> + else:
> + return 0, [_('No Packages marked for Distribution Synchronization')]
> +
> def erasePkgs(self, userlist):
> """take user commands and populate a transaction wrapper with packages
> to be erased/removed"""
> diff --git a/yumcommands.py b/yumcommands.py
> index 35bd97c..67989ee 100644
> --- a/yumcommands.py
> +++ b/yumcommands.py
> @@ -205,6 +205,31 @@ class UpdateCommand(YumCommand):
> except yum.Errors.YumBaseError, e:
> return 1, [str(e)]
>
> +class DistroSyncCommand(YumCommand):
> + def getNames(self):
> + return ['distribution-synchronization', 'distro-sync',
> + 'distribution-update', 'distro-update',
> + 'distribution-upgrade', 'distro-upgrade']
> +
> + def getUsage(self):
> + return _("[PACKAGE...]")
> +
> + def getSummary(self):
> + return _("Synchronize installed packages to the latest available versions")
> +
> + def doCheck(self, base, basecmd, extcmds):
> + checkRootUID(base)
> + checkGPGKey(base)
> +
> + def doCommand(self, base, basecmd, extcmds):
> + self.doneCommand(base, _("Setting up Distribution Synchronization Process"))
> + try:
> + if not basecmd.endswith('-update'):
> + base.conf.obsoletes = 1
> + return base.distroSyncPkgs(extcmds)
> + except yum.Errors.YumBaseError, e:
> + return 1, [str(e)]
> +
> def _add_pkg_simple_list_lens(data, pkg, indent=''):
> """ Get the length of each pkg's column. Add that to data.
> This "knows" about simpleList and printVer. """
More information about the Yum-devel
mailing list