OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright 2015 The Chromium Authors. All rights reserved. | 2 # Copyright 2015 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 from skypy.skyserver import SkyServer | 6 from skypy.skyserver import SkyServer |
7 import argparse | 7 import argparse |
8 import json | 8 import json |
9 import logging | 9 import logging |
10 import os | 10 import os |
(...skipping 17 matching lines...) Expand all Loading... |
28 | 28 |
29 PID_FILE_PATH = "/tmp/skydemo.pids" | 29 PID_FILE_PATH = "/tmp/skydemo.pids" |
30 PID_FILE_KEYS = frozenset([ | 30 PID_FILE_KEYS = frozenset([ |
31 'remote_sky_server_port', | 31 'remote_sky_server_port', |
32 'sky_server_pid', | 32 'sky_server_pid', |
33 'sky_server_port', | 33 'sky_server_port', |
34 'sky_server_root', | 34 'sky_server_root', |
35 'build_dir', | 35 'build_dir', |
36 ]) | 36 ]) |
37 | 37 |
| 38 _IGNORED_PATTERNS = [ |
| 39 # Ignored because they're not indicative of specific errors. |
| 40 re.compile(r'^$'), |
| 41 re.compile(r'^Analyzing \['), |
| 42 re.compile(r'^No issues found'), |
| 43 re.compile(r'^[0-9]+ errors? and [0-9]+ warnings? found.'), |
| 44 re.compile(r'^([0-9]+|No) (error|warning|issue)s? found.'), |
| 45 |
| 46 # TODO: Remove once sdk-extensions are in place |
| 47 re.compile(r'^\[error\] Native functions can only be declared in'), |
| 48 # TODO: Remove this once dev SDK includes Uri.directory constructor. |
| 49 re.compile(r'.*The class \'Uri\' does not have a constructor \'directory\''), |
| 50 ] |
| 51 |
38 # This 'strict dictionary' approach is useful for catching typos. | 52 # This 'strict dictionary' approach is useful for catching typos. |
39 class Pids(object): | 53 class Pids(object): |
40 def __init__(self, known_keys, contents=None): | 54 def __init__(self, known_keys, contents=None): |
41 self._known_keys = known_keys | 55 self._known_keys = known_keys |
42 self._dict = contents if contents is not None else {} | 56 self._dict = contents if contents is not None else {} |
43 | 57 |
44 def __len__(self): | 58 def __len__(self): |
45 return len(self._dict) | 59 return len(self._dict) |
46 | 60 |
47 def get(self, key, default=None): | 61 def get(self, key, default=None): |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 if urlparse.urlparse(args.url_or_path).scheme: | 118 if urlparse.urlparse(args.url_or_path).scheme: |
105 return args.url_or_path | 119 return args.url_or_path |
106 # The load happens on the remote device, use the remote port. | 120 # The load happens on the remote device, use the remote port. |
107 remote_sky_server_port = pids.get('remote_sky_server_port', | 121 remote_sky_server_port = pids.get('remote_sky_server_port', |
108 pids['sky_server_port']) | 122 pids['sky_server_port']) |
109 url = SkyServer.url_for_path(remote_sky_server_port, | 123 url = SkyServer.url_for_path(remote_sky_server_port, |
110 pids['sky_server_root'], args.url_or_path) | 124 pids['sky_server_root'], args.url_or_path) |
111 return _convert_to_sky_url(url) | 125 return _convert_to_sky_url(url) |
112 | 126 |
113 | 127 |
114 def dev_sdk_root(build_dir): | |
115 return os.path.join(build_dir, 'gen', 'sky_sdk') | |
116 | |
117 def dev_packages_root(build_dir): | 128 def dev_packages_root(build_dir): |
118 return os.path.join(dev_sdk_root(build_dir), 'packages_root') | 129 return os.path.join(build_dir, 'gen', 'dart-pkg', 'packages') |
119 | 130 |
120 | 131 |
121 class StartSky(object): | 132 class StartSky(object): |
122 def add_subparser(self, subparsers): | 133 def add_subparser(self, subparsers): |
123 start_parser = subparsers.add_parser('start', | 134 start_parser = subparsers.add_parser('start', |
124 help='launch SKyShell.apk on the device') | 135 help='launch SKyShell.apk on the device') |
125 start_parser.add_argument('build_dir', type=str) | 136 start_parser.add_argument('build_dir', type=str) |
126 start_parser.add_argument('url_or_path', nargs='?', type=str, | 137 start_parser.add_argument('url_or_path', nargs='?', type=str, |
127 default=DEFAULT_URL) | 138 default=DEFAULT_URL) |
128 start_parser.add_argument('--no_install', action="store_false", | 139 start_parser.add_argument('--no_install', action="store_false", |
(...skipping 19 matching lines...) Expand all Loading... |
148 server_root = self._server_root_for_url(args.url_or_path) | 159 server_root = self._server_root_for_url(args.url_or_path) |
149 sky_server = SkyServer(SKY_SERVER_PORT, configuration, server_root, pack
ages_root) | 160 sky_server = SkyServer(SKY_SERVER_PORT, configuration, server_root, pack
ages_root) |
150 return sky_server | 161 return sky_server |
151 | 162 |
152 def run(self, args, pids): | 163 def run(self, args, pids): |
153 apk_path = os.path.join(args.build_dir, 'apks', APK_NAME) | 164 apk_path = os.path.join(args.build_dir, 'apks', APK_NAME) |
154 if not os.path.exists(apk_path): | 165 if not os.path.exists(apk_path): |
155 print "'%s' does not exist?" % apk_path | 166 print "'%s' does not exist?" % apk_path |
156 return 2 | 167 return 2 |
157 | 168 |
158 sdk_root = dev_sdk_root(args.build_dir) | |
159 packages_root = dev_packages_root(args.build_dir) | 169 packages_root = dev_packages_root(args.build_dir) |
160 sky_tools_directory = os.path.join(SRC_ROOT, 'sky/tools') | |
161 subprocess.check_call([ | |
162 os.path.join(sky_tools_directory, 'deploy_sdk.py'), | |
163 '--build-dir', args.build_dir, | |
164 '--non-interactive', | |
165 '--dev-environment', | |
166 '--fake-pub-get-into', packages_root, | |
167 sdk_root, | |
168 ]) | |
169 | |
170 sky_server = self._sky_server_for_args(args, packages_root) | 170 sky_server = self._sky_server_for_args(args, packages_root) |
171 pids['sky_server_pid'] = sky_server.start() | 171 pids['sky_server_pid'] = sky_server.start() |
172 pids['sky_server_port'] = sky_server.port | 172 pids['sky_server_port'] = sky_server.port |
173 pids['sky_server_root'] = sky_server.root | 173 pids['sky_server_root'] = sky_server.root |
174 | 174 |
175 pids['build_dir'] = os.path.abspath(args.build_dir) | 175 pids['build_dir'] = os.path.abspath(args.build_dir) |
176 | 176 |
177 if args.install: | 177 if args.install: |
178 # -r to replace an existing apk, -d to allow version downgrade. | 178 # -r to replace an existing apk, -d to allow version downgrade. |
179 subprocess.check_call([ADB_PATH, 'install', '-r', '-d', apk_path]) | 179 subprocess.check_call([ADB_PATH, 'install', '-r', '-d', apk_path]) |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
230 def run(self, args, pids): | 230 def run(self, args, pids): |
231 build_dir = pids.get('build_dir') | 231 build_dir = pids.get('build_dir') |
232 if not build_dir: | 232 if not build_dir: |
233 logging.fatal("pids file missing build_dir. Try 'start' first.") | 233 logging.fatal("pids file missing build_dir. Try 'start' first.") |
234 return 2 | 234 return 2 |
235 ANALYZER_PATH = 'third_party/dart-sdk/dart-sdk/bin/dartanalyzer' | 235 ANALYZER_PATH = 'third_party/dart-sdk/dart-sdk/bin/dartanalyzer' |
236 | 236 |
237 bindings_path = os.path.join(build_dir, 'gen/sky/bindings') | 237 bindings_path = os.path.join(build_dir, 'gen/sky/bindings') |
238 sky_builtin_path = \ | 238 sky_builtin_path = \ |
239 os.path.join(SRC_ROOT, 'sky/engine/bindings/builtin.dart') | 239 os.path.join(SRC_ROOT, 'sky/engine/bindings/builtin.dart') |
| 240 sky_internals_path = \ |
| 241 os.path.join(SRC_ROOT, 'sky/sdk/lib/internals.dart') |
240 dart_sky_path = os.path.join(bindings_path, 'dart_sky.dart') | 242 dart_sky_path = os.path.join(bindings_path, 'dart_sky.dart') |
241 analyzer_args = [ANALYZER_PATH, | 243 analyzer_args = [ANALYZER_PATH, |
| 244 "--url-mapping=dart:sky.internals,%s" % sky_internals_path, |
242 "--url-mapping=dart:sky,%s" % dart_sky_path, | 245 "--url-mapping=dart:sky,%s" % dart_sky_path, |
243 "--url-mapping=dart:sky_builtin,%s" % sky_builtin_path, | 246 "--url-mapping=dart:sky_builtin,%s" % sky_builtin_path, |
244 "--package-root", dev_packages_root(build_dir), | 247 "--package-root", dev_packages_root(build_dir), |
245 "--package-warnings", | 248 "--package-warnings", |
246 args.app_path | 249 args.app_path |
247 ] | 250 ] |
248 return subprocess.call(analyzer_args) | 251 try: |
| 252 subprocess.check_output(analyzer_args, |
| 253 shell=False, |
| 254 stderr=subprocess.STDOUT) |
| 255 except subprocess.CalledProcessError as e: |
| 256 errors = set(l for l in e.output.split('\n') |
| 257 if not any(p.match(l) for p in _IGNORED_PATTERNS)) |
| 258 # If we do not have any errors left after filtering, return 0. |
| 259 if len(errors) == 0: |
| 260 return 0 |
| 261 # Print errors. |
| 262 for error in sorted(errors): |
| 263 print >> sys.stderr, error |
| 264 # Return analyzer error code. |
| 265 return e.returncode |
| 266 return 0 |
| 267 |
249 | 268 |
250 class StartTracing(object): | 269 class StartTracing(object): |
251 def add_subparser(self, subparsers): | 270 def add_subparser(self, subparsers): |
252 start_tracing_parser = subparsers.add_parser('start_tracing', | 271 start_tracing_parser = subparsers.add_parser('start_tracing', |
253 help=('start tracing a running sky instance')) | 272 help=('start tracing a running sky instance')) |
254 start_tracing_parser.set_defaults(func=self.run) | 273 start_tracing_parser.set_defaults(func=self.run) |
255 | 274 |
256 def run(self, args, pids): | 275 def run(self, args, pids): |
257 subprocess.check_output([ADB_PATH, 'shell', | 276 subprocess.check_output([ADB_PATH, 'shell', |
258 'am', 'broadcast', | 277 'am', 'broadcast', |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
312 args = parser.parse_args() | 331 args = parser.parse_args() |
313 pids = Pids.read_from(PID_FILE_PATH, PID_FILE_KEYS) | 332 pids = Pids.read_from(PID_FILE_PATH, PID_FILE_KEYS) |
314 exit_code = args.func(args, pids) | 333 exit_code = args.func(args, pids) |
315 # We could do this with an at-exit handler instead? | 334 # We could do this with an at-exit handler instead? |
316 pids.write_to(PID_FILE_PATH) | 335 pids.write_to(PID_FILE_PATH) |
317 sys.exit(exit_code) | 336 sys.exit(exit_code) |
318 | 337 |
319 | 338 |
320 if __name__ == '__main__': | 339 if __name__ == '__main__': |
321 SkyShellRunner().main() | 340 SkyShellRunner().main() |
OLD | NEW |