Source code for rez.cli.suite

# SPDX-License-Identifier: Apache-2.0
# Copyright Contributors to the Rez Project


'''
Manage a suite or print information about an existing suite.
'''
from __future__ import print_function


[docs]def setup_parser(parser, completions=False): parser.add_argument( "-l", "--list", action="store_true", help="list visible suites") parser.add_argument( "-t", "--tools", dest="print_tools", action="store_true", help="print a list of the executables available in the suite") parser.add_argument( "--which", type=str, metavar="TOOL", help="print path to the tool in the suite, if it exists") parser.add_argument( "--validate", action="store_true", help="validate the suite") parser.add_argument( "--create", action="store_true", help="create an empty suite at DIR") parser.add_argument( "-c", "--context", type=str, metavar="NAME", help="specify a context name (only used when using a context-specific " "option, such as --add)") parser.add_argument( "-i", "--interactive", action="store_true", help="enter an interactive shell in the given context") add_action = parser.add_argument( "-a", "--add", type=str, metavar="RXT", help="add a context to the suite") add_action = parser.add_argument( "-P", "--prefix-char", dest="prefix_char", type=str, metavar="CHAR", help="set the char used to access rez options via a suite tool " "for the context being added (default: '+'). If set to the empty string, " "rez options are disabled. This option is only used in combination with " "--add") parser.add_argument( "-r", "--remove", type=str, metavar="NAME", help="remove a context from the suite") parser.add_argument( "-d", "--description", type=str, metavar="DESC", help="set the description of a context in the suite") parser.add_argument( "-p", "--prefix", type=str, help="set the prefix of a context in the suite") parser.add_argument( "-s", "--suffix", type=str, help="set the suffix of a context in the suite") parser.add_argument( "--hide", type=str, metavar="TOOL", help="hide a tool of a context in the suite") parser.add_argument( "--unhide", type=str, metavar="TOOL", help="unhide a tool of a context in the suite") parser.add_argument( "--alias", type=str, nargs=2, metavar=("TOOL", "ALIAS"), help="create an alias for a tool in the suite") parser.add_argument( "--unalias", type=str, metavar="TOOL", help="remove an alias for a tool in the suite") parser.add_argument( "-b", "--bump", type=str, metavar="NAME", help="bump a context, making its tools higher priority than others") find_request_action = parser.add_argument( "--find-request", type=str, metavar="PKG", help="find the contexts that contain the given package in the request") find_resolve_action = parser.add_argument( "--find-resolve", type=str, metavar="PKG", help="find the contexts that contain the given package in the resolve") DIR_action = parser.add_argument( "DIR", type=str, nargs='?', help="directory of suite to create or manage") if completions: from rez.cli._complete_util import FilesCompleter, PackageCompleter, \ PackageFamilyCompleter DIR_action.completer = FilesCompleter(dirs=True, files=False) add_action.completer = FilesCompleter(dirs=False, file_patterns=["*.rxt"]) find_request_action.completer = PackageFamilyCompleter find_resolve_action.completer = PackageCompleter
[docs]def command(opts, parser, extra_arg_groups=None): from rez.suite import Suite from rez.status import status from rez.exceptions import SuiteError from rez.resolved_context import ResolvedContext import sys context_needed = set(("add", "prefix", "suffix", "hide", "unhide", "alias", "unalias", "interactive")) save_needed = set(("add", "remove", "bump", "prefix", "suffix", "hide", "unhide", "alias", "unalias")) def _pr(s): if opts.verbose: print(s) def _option(name): value = getattr(opts, name) if value and name in context_needed and not opts.context: parser.error("--context must be supplied when using --%s" % name.replace('_', '-')) return value if opts.list: suites = status.suites if suites: for suite in suites: print(suite.load_path) else: print("No visible suites.") sys.exit(0) if not opts.DIR: parser.error("DIR required.") if opts.create: suite = Suite() _pr("create empty suite at %r..." % opts.DIR) suite.save(opts.DIR) # raises if dir already exists sys.exit(0) suite = Suite.load(opts.DIR) if _option("interactive"): context = suite.context(opts.context) retcode, _, _ = context.execute_shell(block=True) sys.exit(retcode) elif _option("validate"): try: suite.validate() except SuiteError as e: print("The suite is invalid:\n%s" % str(e), file=sys.stderr) sys.exit(1) print("The suite is valid.") elif _option("find_request") or _option("find_resolve"): context_names = suite.find_contexts(in_request=opts.find_request, in_resolve=opts.find_resolve) if context_names: print('\n'.join(context_names)) elif _option("print_tools"): suite.print_tools(verbose=opts.verbose, context_name=opts.context) elif _option("add"): _pr("loading context at %r..." % opts.add) context = ResolvedContext.load(opts.add) _pr("adding context %r..." % opts.context) suite.add_context(name=opts.context, context=context, prefix_char=opts.prefix_char) elif _option("remove"): _pr("removing context %r..." % opts.remove) suite.remove_context(name=opts.remove) elif _option("bump"): _pr("bumping context %r..." % opts.bump) suite.bump_context(name=opts.bump) elif _option("prefix"): _pr("prefixing context %r..." % opts.context) suite.set_context_prefix(name=opts.context, prefix=opts.prefix) elif _option("suffix"): _pr("suffixing context %r..." % opts.context) suite.set_context_suffix(name=opts.context, suffix=opts.suffix) elif _option("hide"): _pr("hiding tool %r in context %r..." % (opts.hide, opts.context)) suite.hide_tool(context_name=opts.context, tool_name=opts.hide) elif _option("unhide"): _pr("unhiding tool %r in context %r..." % (opts.unhide, opts.context)) suite.unhide_tool(context_name=opts.context, tool_name=opts.unhide) elif _option("alias"): _pr("aliasing tool %r as %r in context %r..." % (opts.alias[0], opts.alias[1], opts.context)) suite.alias_tool(context_name=opts.context, tool_name=opts.alias[0], tool_alias=opts.alias[1]) elif _option("unalias"): _pr("unaliasing tool %r in context %r..." % (opts.unalias, opts.context)) suite.unalias_tool(context_name=opts.context, tool_name=opts.unalias) elif _option("which"): filepath = suite.get_tool_filepath(opts.which) if filepath: print(filepath) sys.exit(0) else: sys.exit(1) elif opts.context: context = suite.context(opts.context) context.print_info(verbosity=opts.verbose) else: suite.print_info(verbose=opts.verbose) sys.exit(0) do_save = any(getattr(opts, x) for x in save_needed) if do_save: _pr("saving suite to %r..." % opts.DIR) suite.save(opts.DIR)