| 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 |