1- """
2- The main command-line entry point.
3- """
1+ """The main command-line entry point."""
42import sys
53from rez .vendor .argparse import _StoreTrueAction , SUPPRESS
64from rez .cli ._util import subcommands , LazyArgumentParser , _env_var_true
108
119
1210class SetupRezSubParser (object ):
13- """Callback class for lazily setting up rez sub-parsers."""
11+ """Callback class for lazily setting up rez sub-parsers.
12+ """
1413 def __init__ (self , module_name ):
1514 self .module_name = module_name
1615
@@ -86,28 +85,55 @@ def run(command=None):
8685 subparser = parser .add_subparsers (dest = 'cmd' , metavar = 'COMMAND' )
8786 for subcommand in subcommands :
8887 module_name = "rez.cli.%s" % subcommand
88+
8989 subparser .add_parser (
9090 subcommand ,
9191 help = '' , # required so that it can be setup later
9292 setup_subparser = SetupRezSubParser (module_name ))
9393
94- # parse args, but split extras into groups separated by "--"
95- all_args = ([command ] + sys .argv [1 :]) if command else sys .argv [1 :]
96- arg_groups = [[]]
97- for arg in all_args :
98- if arg == '--' :
99- arg_groups .append ([])
100- continue
101- arg_groups [- 1 ].append (arg )
102- opts = parser .parse_args (arg_groups [0 ])
94+ # construct args list. Note that commands like 'rez-env foo' and
95+ # 'rez env foo' are equivalent
96+ if command :
97+ args = [command ] + sys .argv [1 :]
98+ elif len (sys .argv ) > 1 and sys .argv [1 ] in subcommands :
99+ command = sys .argv [1 ]
100+ args = sys .argv [1 :]
101+ else :
102+ args = sys .argv [1 :]
103+
104+ # parse args depending on subcommand behaviour
105+ if command :
106+ arg_mode = subcommands [command ].get ("arg_mode" )
107+ else :
108+ arg_mode = None
109+
110+ if arg_mode == "grouped" :
111+ # args split into groups by '--'
112+ arg_groups = [[]]
113+ for arg in args :
114+ if arg == '--' :
115+ arg_groups .append ([])
116+ continue
117+ arg_groups [- 1 ].append (arg )
118+
119+ opts = parser .parse_args (arg_groups [0 ])
120+ extra_arg_groups = arg_groups [1 :]
121+ elif arg_mode == "passthrough" :
122+ # unknown args passed in first extra_arg_group
123+ opts , extra_args = parser .parse_known_args (args )
124+ extra_arg_groups = [extra_args ]
125+ else :
126+ # native arg parsing
127+ opts = parser .parse_args (args )
128+ extra_arg_groups = []
103129
104130 if opts .debug or _env_var_true ("REZ_DEBUG" ):
105131 exc_type = None
106132 else :
107133 exc_type = RezError
108134
109135 def run_cmd ():
110- return opts .func (opts , opts .parser , arg_groups [ 1 :] )
136+ return opts .func (opts , opts .parser , extra_arg_groups )
111137
112138 if opts .profile :
113139 import cProfile
@@ -120,7 +146,6 @@ def run_cmd():
120146 raise
121147 except exc_type as e :
122148 print_error ("%s: %s" % (e .__class__ .__name__ , str (e )))
123- #print >> sys.stderr, "rez: %s: %s" % (e.__class__.__name__, str(e))
124149 sys .exit (1 )
125150
126151 sys .exit (returncode or 0 )
0 commit comments