Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(111)

Unified Diff: shell/main.py

Issue 6720024: Plumb in subcommand options (Closed) Base URL: ssh://gitrw.chromium.org:9222/chromite.git@master
Patch Set: Iterate until we have a command Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | shell/subcmds/build_cmd.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: shell/main.py
diff --git a/shell/main.py b/shell/main.py
index c847e9df2eb700192777befce68dc526347c6474..8c1d642d8fb1bbb3904c3962317b6f56ea3a2dbe 100755
--- a/shell/main.py
+++ b/shell/main.py
@@ -128,7 +128,7 @@ def main():
# Verbose defaults to full for now, just to keep people acclimatized to
# vast amounts of comforting output.
- parser.add_option('-v', dest='verbose', default=3,
+ parser.add_option('-v', dest='verbose', default=3, type='int',
help='Control verbosity: 0=silent, 1=progress, 3=full')
parser.add_option('-q', action='store_const', dest='verbose', const=0,
help='Be quieter (sets verbosity to 1)')
@@ -138,10 +138,48 @@ def main():
help="Chroot spec to use. Can be an absolute path to a spec file "
"or a substring of a chroot spec name (without .spec suffix)")
parser.usage = help_str
- try:
- (options, args) = parser.parse_args()
- except:
- sys.exit(1)
+
+ # We want to parse only the options that we understand at the top level of
diandersAtChromium 2011/04/08 00:43:46 Maybe put this whole chunk of parsing code in a he
sjg 2011/04/08 20:25:26 done - added a few tests also.
+ # Chromite. Our heuristic here is that anything after the first positional
+ # parameter (which we assume is the command) is ignored at this level, and
+ # is passed down to the command level to handle.
+ # TODO(sjg): Revisit this to include tolerant option parser instead
+ # http://codereview.chromium.org/6469035/
+ our_args = [] # Arguments that we will parse here.
+ cmd_args = [] # Arguments that we will pass down to the command level.
+ positional = 0
+ for arg in sys.argv:
diandersAtChromium 2011/04/08 00:43:46 This loop keeps confusing me the way it's written.
sjg 2011/04/08 20:25:26 Yes, and in fact this inspired me to simplify it a
+
+ # Option arguments are collected as is, but we only allow two positional
+ # arguments: argv[0] is the program name, the next is the command name.
+ if positional == 2:
+ cmd_args = sys.argv[len(our_args):]
+ break
+ if arg[0] != '-':
+ positional += 1
+ our_args.append(arg)
+
+ # Loop until we have enough arguments to get a command.
+ cmd_str = ''
+ while not cmd_str:
+ (options, args) = parser.parse_args(our_args)
+
+ # Get the command from the resulting arg list.
+ if len(args) > 1:
+ cmd_str = args[1].lower()
+ elif cmd_args:
+ # We don't have a command yet. Transfer a positional arg from from
+ # cmd_args to our_args to see if that does the trick. We move over any
+ # options we find also.
+ while cmd_args:
+ arg = cmd_args[0]
diandersAtChromium 2011/04/08 00:43:46 arg = cmd_args.pop(0)
sjg 2011/04/08 20:25:26 done
+ our_args.append(arg)
+ cmd_args = cmd_args[1:]
+ if arg[0] != '-':
diandersAtChromium 2011/04/08 00:43:46 startswith
sjg 2011/04/08 20:25:26 done
+ break
+ else:
+ # No more cmd_args to consume.
+ break
# Set up the cros system.
cros_env = chromite_env.ChromiteEnv()
@@ -163,13 +201,6 @@ def main():
# Already in the chroot; no need to get config...
chroot_config = None
- # Get command and arguments
- if args:
- cmd_str = args[0].lower()
- args = args[1:]
- else:
- cmd_str = ''
-
# Validate the subcmd, popping a menu if needed.
cmd_str = _FindCommand(cmd_str)
oper.Info("Running command '%s'." % cmd_str)
@@ -179,7 +210,7 @@ def main():
cmd_obj = cmd_cls()
cmd_obj.SetChromiteEnv(cros_env)
try:
- cmd_obj.Run([cmd_str] + args, chroot_config=chroot_config)
+ cmd_obj.Run([cmd_str] + cmd_args, chroot_config=chroot_config)
# Handle an error in one of the scripts: print a message and exit.
except chromite_env.ChromiteError, msg:
« no previous file with comments | « no previous file | shell/subcmds/build_cmd.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698