| 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 | 
|   11 import re |   11 import re | 
 |   12 import signal | 
|   12 import subprocess |   13 import subprocess | 
|   13 import sys |   14 import sys | 
|   14 import time |   15 import time | 
|   15 import urlparse |   16 import urlparse | 
|   16  |   17  | 
|   17 SKY_TOOLS_DIR = os.path.dirname(os.path.abspath(__file__)) |   18 SKY_TOOLS_DIR = os.path.dirname(os.path.abspath(__file__)) | 
|   18 SKY_ROOT = os.path.dirname(SKY_TOOLS_DIR) |   19 SKY_ROOT = os.path.dirname(SKY_TOOLS_DIR) | 
|   19 SRC_ROOT = os.path.dirname(SKY_ROOT) |   20 SRC_ROOT = os.path.dirname(SKY_ROOT) | 
|   20  |   21  | 
|   21 SKY_SERVER_PORT = 9888 |   22 SKY_SERVER_PORT = 9888 | 
|   22 DEFAULT_URL = "sky://domokit.github.io/home" |   23 DEFAULT_URL = "sky://domokit.github.io/home" | 
|   23 APK_NAME = 'SkyDemo.apk' |   24 APK_NAME = 'SkyDemo.apk' | 
|   24 ADB_PATH = os.path.join(SRC_ROOT, |   25 ADB_PATH = os.path.join(SRC_ROOT, | 
|   25     'third_party/android_tools/sdk/platform-tools/adb') |   26     'third_party/android_tools/sdk/platform-tools/adb') | 
|   26  |   27 ANDROID_PACKAGE = "org.domokit.sky.demo" | 
|   27  |   28  | 
|   28 PID_FILE_PATH = "/tmp/skydemo.pids" |   29 PID_FILE_PATH = "/tmp/skydemo.pids" | 
|   29 PID_FILE_KEYS = frozenset([ |   30 PID_FILE_KEYS = frozenset([ | 
|   30     'remote_sky_server_port', |   31     'remote_sky_server_port', | 
|   31     'sky_server_pid', |   32     'sky_server_pid', | 
|   32     'sky_server_port', |   33     'sky_server_port', | 
|   33     'sky_server_root', |   34     'sky_server_root', | 
|   34     'build_dir', |   35     'build_dir', | 
|   35 ]) |   36 ]) | 
|   36  |   37  | 
| (...skipping 25 matching lines...) Expand all  Loading... | 
|   62     def __iter__(self): |   63     def __iter__(self): | 
|   63         return iter(self._dict) |   64         return iter(self._dict) | 
|   64  |   65  | 
|   65     def __contains__(self, key): |   66     def __contains__(self, key): | 
|   66         assert key in self._known_keys, '%s not in allowed_keys' % key |   67         assert key in self._known_keys, '%s not in allowed_keys' % key | 
|   67         return key in self._dict |   68         return key in self._dict | 
|   68  |   69  | 
|   69     def clear(self): |   70     def clear(self): | 
|   70         self._dict = {} |   71         self._dict = {} | 
|   71  |   72  | 
 |   73     def pop(self, key, default=None): | 
 |   74         assert key in self._known_keys, '%s not in allowed_keys' % key | 
 |   75         return self._dict.pop(key, default) | 
 |   76  | 
|   72     @classmethod |   77     @classmethod | 
|   73     def read_from(cls, path, known_keys): |   78     def read_from(cls, path, known_keys): | 
|   74         contents = {} |   79         contents = {} | 
|   75         try: |   80         try: | 
|   76             with open(path, 'r') as pid_file: |   81             with open(path, 'r') as pid_file: | 
|   77                 contents = json.load(pid_file) |   82                 contents = json.load(pid_file) | 
|   78         except: |   83         except: | 
|   79             if os.path.exists(path): |   84             if os.path.exists(path): | 
|   80                 logging.warn('Failed to read pid file: %s' % path) |   85                 logging.warn('Failed to read pid file: %s' % path) | 
|   81         return cls(known_keys, contents) |   86         return cls(known_keys, contents) | 
| (...skipping 17 matching lines...) Expand all  Loading... | 
|   99     if urlparse.urlparse(args.url_or_path).scheme: |  104     if urlparse.urlparse(args.url_or_path).scheme: | 
|  100         return args.url_or_path |  105         return args.url_or_path | 
|  101     # The load happens on the remote device, use the remote port. |  106     # The load happens on the remote device, use the remote port. | 
|  102     remote_sky_server_port = pids.get('remote_sky_server_port', |  107     remote_sky_server_port = pids.get('remote_sky_server_port', | 
|  103         pids['sky_server_port']) |  108         pids['sky_server_port']) | 
|  104     url = SkyServer.url_for_path(remote_sky_server_port, |  109     url = SkyServer.url_for_path(remote_sky_server_port, | 
|  105         pids['sky_server_root'], args.url_or_path) |  110         pids['sky_server_root'], args.url_or_path) | 
|  106     return _convert_to_sky_url(url) |  111     return _convert_to_sky_url(url) | 
|  107  |  112  | 
|  108  |  113  | 
 |  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): | 
 |  118     return os.path.join(dev_sdk_root(build_dir), 'packages_root') | 
 |  119  | 
 |  120  | 
|  109 class StartSky(object): |  121 class StartSky(object): | 
|  110     def add_subparser(self, subparsers): |  122     def add_subparser(self, subparsers): | 
|  111         start_parser = subparsers.add_parser('start', |  123         start_parser = subparsers.add_parser('start', | 
|  112             help='launch SKyShell.apk on the device') |  124             help='launch SKyShell.apk on the device') | 
|  113         start_parser.add_argument('build_dir', type=str) |  125         start_parser.add_argument('build_dir', type=str) | 
|  114         start_parser.add_argument('url_or_path', nargs='?', type=str, |  126         start_parser.add_argument('url_or_path', nargs='?', type=str, | 
|  115             default=DEFAULT_URL) |  127             default=DEFAULT_URL) | 
|  116         start_parser.add_argument('--no_install', action="store_false", |  128         start_parser.add_argument('--no_install', action="store_false", | 
|  117             default=True, dest="install", |  129             default=True, dest="install", | 
|  118             help="Don't install SkyDemo.apk before starting") |  130             help="Don't install SkyDemo.apk before starting") | 
| (...skipping 17 matching lines...) Expand all  Loading... | 
|  136         server_root = self._server_root_for_url(args.url_or_path) |  148         server_root = self._server_root_for_url(args.url_or_path) | 
|  137         sky_server = SkyServer(SKY_SERVER_PORT, configuration, server_root, pack
     ages_root) |  149         sky_server = SkyServer(SKY_SERVER_PORT, configuration, server_root, pack
     ages_root) | 
|  138         return sky_server |  150         return sky_server | 
|  139  |  151  | 
|  140     def run(self, args, pids): |  152     def run(self, args, pids): | 
|  141         apk_path = os.path.join(args.build_dir, 'apks', APK_NAME) |  153         apk_path = os.path.join(args.build_dir, 'apks', APK_NAME) | 
|  142         if not os.path.exists(apk_path): |  154         if not os.path.exists(apk_path): | 
|  143             print "'%s' does not exist?" % apk_path |  155             print "'%s' does not exist?" % apk_path | 
|  144             return 2 |  156             return 2 | 
|  145  |  157  | 
|  146         sdk_root = os.path.join(args.build_dir, 'gen', 'sky_sdk') |  158         sdk_root = dev_sdk_root(args.build_dir) | 
|  147         packages_root = os.path.join(sdk_root, 'packages_root') |  159         packages_root = dev_packages_root(args.build_dir) | 
|  148         sky_tools_directory = os.path.join(SRC_ROOT, 'sky/tools') |  160         sky_tools_directory = os.path.join(SRC_ROOT, 'sky/tools') | 
|  149         subprocess.check_call([ |  161         subprocess.check_call([ | 
|  150             os.path.join(sky_tools_directory, 'deploy_sdk.py'), |  162             os.path.join(sky_tools_directory, 'deploy_sdk.py'), | 
|  151             '--build-dir', args.build_dir, |  163             '--build-dir', args.build_dir, | 
|  152             '--non-interactive', |  164             '--non-interactive', | 
|  153             '--dev-environment', |  165             '--dev-environment', | 
|  154             '--fake-pub-get-into', packages_root, |  166             '--fake-pub-get-into', packages_root, | 
|  155             sdk_root, |  167             sdk_root, | 
|  156         ]) |  168         ]) | 
|  157  |  169  | 
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  190             return |  202             return | 
|  191         logging.info('Killing %s (%d).' % (name, pid)) |  203         logging.info('Killing %s (%d).' % (name, pid)) | 
|  192         try: |  204         try: | 
|  193             os.kill(pid, signal.SIGTERM) |  205             os.kill(pid, signal.SIGTERM) | 
|  194         except OSError: |  206         except OSError: | 
|  195             logging.info('%s (%d) already gone.' % (name, pid)) |  207             logging.info('%s (%d) already gone.' % (name, pid)) | 
|  196  |  208  | 
|  197     def run(self, args, pids): |  209     def run(self, args, pids): | 
|  198         self._kill_if_exists(pids, 'sky_server_pid', 'sky_server') |  210         self._kill_if_exists(pids, 'sky_server_pid', 'sky_server') | 
|  199  |  211  | 
|  200         if 'remote_sky_server_port' in self.pids: |  212         if 'remote_sky_server_port' in pids: | 
|  201             port_string = 'tcp:%s' % self.pids['remote_sky_server_port'] |  213             port_string = 'tcp:%s' % pids['remote_sky_server_port'] | 
|  202             subprocess.call([ADB_PATH, 'reverse', '--remove', port_string]) |  214             subprocess.call([ADB_PATH, 'reverse', '--remove', port_string]) | 
|  203  |  215  | 
|  204         subprocess.call([ |  216         subprocess.call([ | 
|  205             ADB_PATH, 'shell', 'am', 'force-stop', ANDROID_PACKAGE]) |  217             ADB_PATH, 'shell', 'am', 'force-stop', ANDROID_PACKAGE]) | 
|  206  |  218  | 
|  207         pids.clear() |  219         pids.clear() | 
|  208  |  220  | 
|  209  |  221  | 
|  210 class Analyze(object): |  222 class Analyze(object): | 
|  211     def add_subparser(self, subparsers): |  223     def add_subparser(self, subparsers): | 
|  212         analyze_parser = subparsers.add_parser('analyze', |  224         analyze_parser = subparsers.add_parser('analyze', | 
|  213             help=('run the dart analyzer with sky url mappings')) |  225             help=('run the dart analyzer with sky url mappings')) | 
|  214         analyze_parser.add_argument('app_path', type=str) |  226         analyze_parser.add_argument('app_path', type=str) | 
|  215         analyze_parser.set_defaults(func=self.run) |  227         analyze_parser.set_defaults(func=self.run) | 
|  216  |  228  | 
|  217     def run(self, args, pids): |  229     def run(self, args, pids): | 
 |  230         build_dir = pids.get('build_dir') | 
 |  231         if not build_dir: | 
 |  232             logging.fatal("pids file missing build_dir. Try 'start' first.") | 
 |  233             return 2 | 
|  218         ANALYZER_PATH = 'third_party/dart-sdk/dart-sdk/bin/dartanalyzer' |  234         ANALYZER_PATH = 'third_party/dart-sdk/dart-sdk/bin/dartanalyzer' | 
|  219  |  235  | 
|  220         build_dir = os.path.abspath(pids['build_dir']) |  | 
|  221         bindings_path = os.path.join(build_dir, 'gen/sky/bindings') |  236         bindings_path = os.path.join(build_dir, 'gen/sky/bindings') | 
|  222         sky_builtin_path = \ |  237         sky_builtin_path = \ | 
|  223             os.path.join(SRC_ROOT, 'sky/engine/bindings/builtin.dart') |  238             os.path.join(SRC_ROOT, 'sky/engine/bindings/builtin.dart') | 
|  224         dart_sky_path = os.path.join(bindings_path, 'dart_sky.dart') |  239         dart_sky_path = os.path.join(bindings_path, 'dart_sky.dart') | 
|  225         analyzer_args = [ANALYZER_PATH, |  240         analyzer_args = [ANALYZER_PATH, | 
|  226             "--url-mapping=dart:sky,%s" % dart_sky_path, |  241             "--url-mapping=dart:sky,%s" % dart_sky_path, | 
|  227             "--url-mapping=dart:sky_builtin,%s" % sky_builtin_path, |  242             "--url-mapping=dart:sky_builtin,%s" % sky_builtin_path, | 
 |  243             "--package-root", dev_packages_root(build_dir), | 
|  228             args.app_path |  244             args.app_path | 
|  229         ] |  245         ] | 
|  230         subprocess.call(analyzer_args) |  246         return subprocess.call(analyzer_args) | 
|  231  |  247  | 
|  232 class StartTracing(object): |  248 class StartTracing(object): | 
|  233     def add_subparser(self, subparsers): |  249     def add_subparser(self, subparsers): | 
|  234         start_tracing_parser = subparsers.add_parser('start_tracing', |  250         start_tracing_parser = subparsers.add_parser('start_tracing', | 
|  235             help=('start tracing a running sky instance')) |  251             help=('start tracing a running sky instance')) | 
|  236         start_tracing_parser.set_defaults(func=self.run) |  252         start_tracing_parser.set_defaults(func=self.run) | 
|  237  |  253  | 
|  238     def run(self, args, pids): |  254     def run(self, args, pids): | 
|  239         subprocess.check_output([ADB_PATH, 'shell', |  255         subprocess.check_output([ADB_PATH, 'shell', | 
|  240             'am', 'broadcast', |  256             'am', 'broadcast', | 
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  294         args = parser.parse_args() |  310         args = parser.parse_args() | 
|  295         pids = Pids.read_from(PID_FILE_PATH, PID_FILE_KEYS) |  311         pids = Pids.read_from(PID_FILE_PATH, PID_FILE_KEYS) | 
|  296         exit_code = args.func(args, pids) |  312         exit_code = args.func(args, pids) | 
|  297         # We could do this with an at-exit handler instead? |  313         # We could do this with an at-exit handler instead? | 
|  298         pids.write_to(PID_FILE_PATH) |  314         pids.write_to(PID_FILE_PATH) | 
|  299         sys.exit(exit_code) |  315         sys.exit(exit_code) | 
|  300  |  316  | 
|  301  |  317  | 
|  302 if __name__ == '__main__': |  318 if __name__ == '__main__': | 
|  303     SkyShellRunner().main() |  319     SkyShellRunner().main() | 
| OLD | NEW |