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

Side by Side Diff: shell/subcmds/shell_cmd.py

Issue 6250058: Split out the big chromite shell 'main.py' into lots of subfiles. (Closed) Base URL: ssh://git@gitrw.chromium.org:9222/chromite.git@master
Patch Set: Created 9 years, 10 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 #!/usr/bin/python
sosa 2011/02/02 01:16:19 same
diandersAtChromium 2011/02/02 01:49:10 Done.
2 #
3 # Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
4 # Use of this source code is governed by a BSD-style license that can be
5 # found in the LICENSE file.
6
7 """Implementation of the 'shell' chromite command."""
8
9 # Python imports
10 import optparse
11 import os
12
13
14 # Local imports
15 from chromite.lib import cros_build_lib as cros_lib
16 from chromite.shell import utils
17 from chromite.shell import subcmd
18
19
20 def _SplitEnvFromArgs(argv):
21 """Split environment settings from arguments.
22
23 This function will just loop over the arguments, looking for ones with an '='
24 character in them. As long as it finds them, it takes them out of the arg
25 list adds them to a dictionary. As soon as it finds the first argument
26 without an '=', it stops looping.
27
28 NOTE: Some doctests below test for equality with ==, since dicts with more
29 than one item may be arbitrarily ordered.
30
31 >>> result = _SplitEnvFromArgs(['abc=1', 'def=two', 'three'])
32 >>> result == ({'abc': '1', 'def': 'two'}, ['three'])
33 True
34
35 >>> _SplitEnvFromArgs(['one', 'two', 'three'])
36 ({}, ['one', 'two', 'three'])
37
38 >>> _SplitEnvFromArgs(['abc=1', 'three', 'def=two'])
39 ({'abc': '1'}, ['three', 'def=two'])
40
41 >>> result = _SplitEnvFromArgs(['abc=1', 'ghi=4 4', 'def=two'])
42 >>> result == ({'abc': '1', 'ghi': '4 4', 'def': 'two'}, [])
43 True
44
45 >>> _SplitEnvFromArgs(['abc=1', 'abc=2', 'three'])
46 ({'abc': '2'}, ['three'])
47
48 >>> _SplitEnvFromArgs([])
49 ({}, [])
50
51 Args:
52 argv: The arguments to parse; this list is not modified. Should
53 not include "argv[0]"
54 Returns:
55 env: A dict containing key=value paris.
56 argv: A new list containing anything left after.
57 """
58 # Copy the list so we don't screw with caller...
59 argv = list(argv)
60
61 env = {}
62 while argv:
63 if '=' in argv[0]:
64 key, val = argv.pop(0).split('=', 2)
65 env[key] = val
66 else:
67 break
68
69 return env, argv
70
71
72 class ShellCmd(subcmd.ChromiteCmd):
73 """Start a shell in the chroot.
74
75 This can either just start a simple interactive shell, it can be used to
76 run an arbirtary command inside the chroot and then exit.
77 """
78
79 def Run(self, raw_argv, chroot_config=None):
80 """Run the command.
81
82 Args:
83 raw_argv: Command line arguments, including this command's name, but not
84 the chromite command name or chromite options.
85 chroot_config: A SafeConfigParser for the chroot config; or None chromite
86 was called from within the chroot.
87 """
88 # Parse options for command...
89 # ...note that OptionParser will eat the '--' if it's there, which is what
90 # we want..
91 usage_str = ('usage: %%prog [chromite_options] %s [options] [VAR=value] '
92 '[-- command [arg1] [arg2] ...]') % raw_argv[0]
93 parser = optparse.OptionParser(usage=usage_str)
94 (_, argv) = parser.parse_args(raw_argv[1:])
95
96 # Enter the chroot if needed...
97 if not cros_lib.IsInsideChroot():
98 utils.EnterChroot(chroot_config, (self, 'Run'), raw_argv)
99 else:
100 # We'll put CWD as src/scripts when running the command. Since everyone
101 # running by hand has their cwd there, it is probably the safest.
102 cwd = os.path.join(utils.SRCROOT_PATH, 'src', 'scripts')
103
104 # By default, no special environment...
105 env = None
106
107 if not argv:
108 # If no arguments, we'll just start bash.
109 argv = ['bash']
110 else:
111 # Parse the command line, looking at the beginning for VAR=value type
112 # statements. I couldn't figure out a way to get bash to do this for
113 # me.
114 user_env, argv = _SplitEnvFromArgs(argv)
115 if not argv:
116 cros_lib.Die('No command specified')
117
118 # If there was some environment, use it to override the standard
119 # environment.
120 if user_env:
121 env = dict(os.environ)
122 env.update(user_env)
123
124 # Don't show anything special for errors; we'll let the shell report them.
125 cros_lib.RunCommand(argv, cwd=cwd, env=env, error_ok=True, ignore_sigint=T rue)
sosa 2011/02/02 01:16:19 80 char
diandersAtChromium 2011/02/02 01:49:10 Done.
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698