diff options
author | Chris Larson <chris_larson@mentor.com> | 2010-08-02 13:42:23 -0700 |
---|---|---|
committer | Richard Purdie <rpurdie@linux.intel.com> | 2010-08-03 14:06:07 +0100 |
commit | 191a2883492841f30bbc21ab7bf4e4a0810d0760 (patch) | |
tree | f91e66f57380a47ea31e95bac28a93dd1e9e6370 /bitbake/lib/pysh/pysh.py | |
parent | e6b6767369f6d0caa7a9efe32ccd4ed514bb3148 (diff) | |
download | poky-191a2883492841f30bbc21ab7bf4e4a0810d0760.tar.gz |
Add pysh, ply, and codegen to lib/ to prepare for future work
(Bitbake rev: d0a6e9c5c1887a885e0e73eba264ca66801f5ed0)
Signed-off-by: Chris Larson <chris_larson@mentor.com>
Signed-off-by: Richard Purdie <rpurdie@linux.intel.com>
Diffstat (limited to 'bitbake/lib/pysh/pysh.py')
-rw-r--r-- | bitbake/lib/pysh/pysh.py | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/bitbake/lib/pysh/pysh.py b/bitbake/lib/pysh/pysh.py new file mode 100644 index 0000000000..b4e6145b51 --- /dev/null +++ b/bitbake/lib/pysh/pysh.py | |||
@@ -0,0 +1,167 @@ | |||
1 | # pysh.py - command processing for pysh. | ||
2 | # | ||
3 | # Copyright 2007 Patrick Mezard | ||
4 | # | ||
5 | # This software may be used and distributed according to the terms | ||
6 | # of the GNU General Public License, incorporated herein by reference. | ||
7 | |||
8 | import optparse | ||
9 | import os | ||
10 | import sys | ||
11 | |||
12 | import interp | ||
13 | |||
14 | SH_OPT = optparse.OptionParser(prog='pysh', usage="%prog [OPTIONS]", version='0.1') | ||
15 | SH_OPT.add_option('-c', action='store_true', dest='command_string', default=None, | ||
16 | help='A string that shall be interpreted by the shell as one or more commands') | ||
17 | SH_OPT.add_option('--redirect-to', dest='redirect_to', default=None, | ||
18 | help='Redirect script commands stdout and stderr to the specified file') | ||
19 | # See utility_command in builtin.py about the reason for this flag. | ||
20 | SH_OPT.add_option('--redirected', dest='redirected', action='store_true', default=False, | ||
21 | help='Tell the interpreter that stdout and stderr are actually the same objects, which is really stdout') | ||
22 | SH_OPT.add_option('--debug-parsing', action='store_true', dest='debug_parsing', default=False, | ||
23 | help='Trace PLY execution') | ||
24 | SH_OPT.add_option('--debug-tree', action='store_true', dest='debug_tree', default=False, | ||
25 | help='Display the generated syntax tree.') | ||
26 | SH_OPT.add_option('--debug-cmd', action='store_true', dest='debug_cmd', default=False, | ||
27 | help='Trace command execution before parameters expansion and exit status.') | ||
28 | SH_OPT.add_option('--debug-utility', action='store_true', dest='debug_utility', default=False, | ||
29 | help='Trace utility calls, after parameters expansions') | ||
30 | SH_OPT.add_option('--ast', action='store_true', dest='ast', default=False, | ||
31 | help='Encoded commands to execute in a subprocess') | ||
32 | SH_OPT.add_option('--profile', action='store_true', default=False, | ||
33 | help='Profile pysh run') | ||
34 | |||
35 | |||
36 | def split_args(args): | ||
37 | # Separate shell arguments from command ones | ||
38 | # Just stop at the first argument not starting with a dash. I know, this is completely broken, | ||
39 | # it ignores files starting with a dash or may take option values for command file. This is not | ||
40 | # supposed to happen for now | ||
41 | command_index = len(args) | ||
42 | for i,arg in enumerate(args): | ||
43 | if not arg.startswith('-'): | ||
44 | command_index = i | ||
45 | break | ||
46 | |||
47 | return args[:command_index], args[command_index:] | ||
48 | |||
49 | |||
50 | def fixenv(env): | ||
51 | path = env.get('PATH') | ||
52 | if path is not None: | ||
53 | parts = path.split(os.pathsep) | ||
54 | # Remove Windows utilities from PATH, they are useless at best and | ||
55 | # some of them (find) may be confused with other utilities. | ||
56 | parts = [p for p in parts if 'system32' not in p.lower()] | ||
57 | env['PATH'] = os.pathsep.join(parts) | ||
58 | if env.get('HOME') is None: | ||
59 | # Several utilities, including cvsps, cannot work without | ||
60 | # a defined HOME directory. | ||
61 | env['HOME'] = os.path.expanduser('~') | ||
62 | return env | ||
63 | |||
64 | def _sh(cwd, shargs, cmdargs, options, debugflags=None, env=None): | ||
65 | if os.environ.get('PYSH_TEXT') != '1': | ||
66 | import msvcrt | ||
67 | for fp in (sys.stdin, sys.stdout, sys.stderr): | ||
68 | msvcrt.setmode(fp.fileno(), os.O_BINARY) | ||
69 | |||
70 | hgbin = os.environ.get('PYSH_HGTEXT') != '1' | ||
71 | |||
72 | if debugflags is None: | ||
73 | debugflags = [] | ||
74 | if options.debug_parsing: debugflags.append('debug-parsing') | ||
75 | if options.debug_utility: debugflags.append('debug-utility') | ||
76 | if options.debug_cmd: debugflags.append('debug-cmd') | ||
77 | if options.debug_tree: debugflags.append('debug-tree') | ||
78 | |||
79 | if env is None: | ||
80 | env = fixenv(dict(os.environ)) | ||
81 | if cwd is None: | ||
82 | cwd = os.getcwd() | ||
83 | |||
84 | if not cmdargs: | ||
85 | # Nothing to do | ||
86 | return 0 | ||
87 | |||
88 | ast = None | ||
89 | command_file = None | ||
90 | if options.command_string: | ||
91 | input = cmdargs[0] | ||
92 | if not options.ast: | ||
93 | input += '\n' | ||
94 | else: | ||
95 | args, input = interp.decodeargs(input), None | ||
96 | env, ast = args | ||
97 | cwd = env.get('PWD', cwd) | ||
98 | else: | ||
99 | command_file = cmdargs[0] | ||
100 | arguments = cmdargs[1:] | ||
101 | |||
102 | prefix = interp.resolve_shebang(command_file, ignoreshell=True) | ||
103 | if prefix: | ||
104 | input = ' '.join(prefix + [command_file] + arguments) | ||
105 | else: | ||
106 | # Read commands from file | ||
107 | f = file(command_file) | ||
108 | try: | ||
109 | # Trailing newline to help the parser | ||
110 | input = f.read() + '\n' | ||
111 | finally: | ||
112 | f.close() | ||
113 | |||
114 | redirect = None | ||
115 | try: | ||
116 | if options.redirected: | ||
117 | stdout = sys.stdout | ||
118 | stderr = stdout | ||
119 | elif options.redirect_to: | ||
120 | redirect = open(options.redirect_to, 'wb') | ||
121 | stdout = redirect | ||
122 | stderr = redirect | ||
123 | else: | ||
124 | stdout = sys.stdout | ||
125 | stderr = sys.stderr | ||
126 | |||
127 | # TODO: set arguments to environment variables | ||
128 | opts = interp.Options() | ||
129 | opts.hgbinary = hgbin | ||
130 | ip = interp.Interpreter(cwd, debugflags, stdout=stdout, stderr=stderr, | ||
131 | opts=opts) | ||
132 | try: | ||
133 | # Export given environment in shell object | ||
134 | for k,v in env.iteritems(): | ||
135 | ip.get_env().export(k,v) | ||
136 | return ip.execute_script(input, ast, scriptpath=command_file) | ||
137 | finally: | ||
138 | ip.close() | ||
139 | finally: | ||
140 | if redirect is not None: | ||
141 | redirect.close() | ||
142 | |||
143 | def sh(cwd=None, args=None, debugflags=None, env=None): | ||
144 | if args is None: | ||
145 | args = sys.argv[1:] | ||
146 | shargs, cmdargs = split_args(args) | ||
147 | options, shargs = SH_OPT.parse_args(shargs) | ||
148 | |||
149 | if options.profile: | ||
150 | import lsprof | ||
151 | p = lsprof.Profiler() | ||
152 | p.enable(subcalls=True) | ||
153 | try: | ||
154 | return _sh(cwd, shargs, cmdargs, options, debugflags, env) | ||
155 | finally: | ||
156 | p.disable() | ||
157 | stats = lsprof.Stats(p.getstats()) | ||
158 | stats.sort() | ||
159 | stats.pprint(top=10, file=sys.stderr, climit=5) | ||
160 | else: | ||
161 | return _sh(cwd, shargs, cmdargs, options, debugflags, env) | ||
162 | |||
163 | def main(): | ||
164 | sys.exit(sh()) | ||
165 | |||
166 | if __name__=='__main__': | ||
167 | main() | ||