--- cli.py | 3 +- yum/__init__.py | 26 ++++++++ yumcommands.py | 174 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 201 insertions(+), 2 deletions(-)
diff --git a/cli.py b/cli.py index b74606c..01024cd 100755 --- a/cli.py +++ b/cli.py @@ -108,6 +108,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput): self.registerCommand(yumcommands.DistroSyncCommand()) self.registerCommand(yumcommands.LoadTransactionCommand()) self.registerCommand(yumcommands.SwapCommand()) + self.registerCommand(yumcommands.RepoPkgsCommand()) def registerCommand(self, command): """Register a :class:`yumcommands.YumCommand` so that it can be called by @@ -825,7 +826,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput): return ret - def installPkgs(self, userlist, basecmd='install'): + def installPkgs(self, userlist, basecmd='install', repoid=None): """Attempt to take the user specified list of packages or wildcards and install them, or if they are installed, update them to a newer version. If a complete version number is diff --git a/yum/__init__.py b/yum/__init__.py index abed04d..abc4c34 100644 --- a/yum/__init__.py +++ b/yum/__init__.py @@ -4420,9 +4420,14 @@ much more problems). if kwargs['pattern'] and kwargs['pattern'][0] == '@': return self._at_groupinstall(kwargs['pattern']) + repo = None # All of them + if 'repoid' in kwargs: + repoid = kwargs['repoid'] + was_pattern = True pats = [kwargs['pattern']] mypkgs = self.pkgSack.returnPackages(patterns=pats, + repoid=repoid, ignore_case=False) pkgs.extend(mypkgs) # if we have anything left unmatched, let's take a look for it @@ -4442,6 +4447,10 @@ much more problems). else: nevra_dict = self._nevra_kwarg_parse(kwargs) + repo = None # All of them + if 'repoid' in kwargs: + repoid = kwargs['repoid'] + pkgs = self.pkgSack.searchNevra(name=nevra_dict['name'], epoch=nevra_dict['epoch'], arch=nevra_dict['arch'], ver=nevra_dict['version'], rel=nevra_dict['release']) @@ -5016,6 +5025,20 @@ much more problems). return self._at_groupremove(kwargs['pattern']) (e,m,u) = self.rpmdb.matchPackageNames([kwargs['pattern']]) + if 'repoid' in kwargs: + def _filter_repoid(pkgs): + ret = [] + for pkg in pkgs: + if 'from_repo' not in pkg.yumdb_info: + continue + if pkg.yumdb_info.from_repo != kwargs['repoid']: + continue + ret.append(pkg) + return ret + + e = _filter_repoid(e) + m = _filter_repoid(m) + pkgs.extend(e) pkgs.extend(m) if u: @@ -5026,6 +5049,9 @@ much more problems). except yum.Errors.YumBaseError, e: self.logger.critical(_('%s') % e) + if 'repoid' in kwargs: + depmatches = _filter_repoid(depmatches) + if not depmatches: arg = to_unicode(arg) self.logger.critical(_('No Match for argument: %s') % to_unicode(arg)) diff --git a/yumcommands.py b/yumcommands.py index 3e02dd6..8ad588f 100644 --- a/yumcommands.py +++ b/yumcommands.py @@ -22,7 +22,7 @@ Classes for subcommands of the yum command line interface. import os import cli from yum import logginglevels -from yum import _ +from yum import _, P_ from yum import misc import yum.Errors import operator @@ -115,6 +115,39 @@ def checkSwapPackageArg(base, basecmd, extcmds): _err_mini_usage(base, basecmd) raise cli.CliError +def checkRepoPackageArg(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) < 2: # <repoid> install|remove [pkgs] + base.logger.critical( + _('Error: Need to pass a repoid. and command to %s') % basecmd) + _err_mini_usage(base, basecmd) + raise cli.CliError + + repos = base.repos.findRepos(extcmds[0]) + if not repos: + base.logger.critical( + _('Error: Need to pass a single valid repoid. to %s') % basecmd) + _err_mini_usage(base, basecmd) + raise cli.CliError + + if len(repos) != 1 or repos[0].id != extcmds[0]: + base.logger.critical( + _('Error: Need to pass a single valid repoid. to %s') % basecmd) + _err_mini_usage(base, basecmd) + raise cli.CliError + if not repos[0].isEnabled(): + base.logger.critical( + _('Error: Repo %s is not enabled') % extcmds[0]) + _err_mini_usage(base, basecmd) + raise cli.CliError + def checkItemArg(base, basecmd, extcmds): """Verify that *extcmds* contains the name of at least one item for @@ -3196,3 +3229,142 @@ class SwapCommand(YumCommand): base.cmdstring = oline return 2, ['%s %s' % (basecmd, " ".join(extcmds))] + + +class RepoPkgsCommand(YumCommand): + """A class containing methods needed by the cli to execute the + repo 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 ['repo-pkgs', + 'repo-packages', 'repository-pkgs', 'repository-packages'] + + def getUsage(self): + """Return a usage string for this command. + + :return: a usage string for this command + """ + return "<enabled-repoid> <install|remove|remove-or-reinstall> [pkg(s)]" + + def getSummary(self): + """Return a one line summary of this command. + + :return: a one line summary of this command + """ + return _("Treat a repo. as a group of packages, so we can install/remove all of them") + + 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) + checkRepoPackageArg(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 + """ + + repoid = extcmds[0] + cmd = extcmds[1] + args = extcmds[2:] + if not args: + args = ['*'] + num = 0 + if False: pass + elif cmd == 'install': # install is simpler version of installPkgs... + for arg in args: + txmbrs = base.install(pattern=arg, repoid=repoid) + num += len(txmbrs) + + if num: + return 2, P_('%d package to install', '%d packages to install', + num) + + elif cmd == 'remove': # Also mostly the same... + for arg in args: + txmbrs = base.remove(pattern=arg, repoid=repoid) + num += len(txmbrs) + + if num: + return 2, P_('%d package to remove', '%d packages to remove', + num) + + elif cmd == 'remove-or-reinstall': # More complicated... + for arg in args: + txmbrs = base.remove(pattern=arg, repoid=repoid) + # Add an install() if it's in another repo. + for txmbr in txmbrs[:]: + pkgs = base.pkgSack.searchPkgTuple(txmbr.pkgtup) + for pkg in sorted(pkgs): + if pkg.repoid == repoid: + continue + txmbrs += base.install(po=pkg) + break + + num += len(txmbrs) + + elif cmd == 'remove-or-sync': # Even more complicated... + for arg in args: + txmbrs = base.remove(pattern=arg, repoid=repoid) + # Add an install/upgrade/downgrade if a version is in another + # repo. + for txmbr in txmbrs[:]: + pkgs = base.pkgSack.searchNames([txmbr.name]) + toinst = None + for pkg in sorted(pkgs): + if pkg.repoid == repoid: + continue + if toinst is None: + toinst = pkg + if toinst.verLT(pkg): + if toinst.verEQ(txmbr.po): + break + toinst = pkg + if toinst.verEQ(txmbr.po) and toinst.arch == txmbr.arch: + break + + if toinst is not None: + if toinst.verEQ(txmbr.po): + txmbrs += base.install(po=toinst) + elif toinst.verGT(txmbr.po): + txmbrs += base.update(po=toinst) + else: + base.tsInfo.remove(txmbr.pkgtup) + txmbrs.remove(txmbr) + txmbrs += base.downgrade(po=toinst) + + num += len(txmbrs) + + if num: + return 2, P_('%d package to remove/reinstall', + '%d packages to remove/reinstall', num) + + else: + return 1, [_('Not a valid sub-command of %s') % basecmd] + + return 0, [_('Nothing to do')] -- 1.7.6.5 _______________________________________________ Yum-devel mailing list Yum-devel@lists.baseurl.org http://lists.baseurl.org/mailman/listinfo/yum-devel