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

Side by Side Diff: mojo/devtools/common/devtoolslib/shell_arguments.py

Issue 1397193005: mojo_run: support parallel Android runs of mojo_run. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 2 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
OLDNEW
1 # Copyright 2015 The Chromium Authors. All rights reserved. 1 # Copyright 2015 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 """Produces configured shell abstractions. 5 """Produces configured shell abstractions.
6 6
7 This module knows how to produce a configured shell abstraction based on 7 This module knows how to produce a configured shell abstraction based on
8 shell_config.ShellConfig. 8 shell_config.ShellConfig.
9 """ 9 """
10 10
11 import os.path 11 import os.path
12 import sys 12 import sys
13 import urlparse 13 import urlparse
14 14
15 from devtoolslib.android_shell import AndroidShell 15 from devtoolslib.android_shell import AndroidShell
16 from devtoolslib.linux_shell import LinuxShell 16 from devtoolslib.linux_shell import LinuxShell
17 from devtoolslib.shell_config import ShellConfigurationException 17 from devtoolslib.shell_config import ShellConfigurationException
18 18
19 # When spinning up servers for local origins, we want to use predictable ports 19 # When spinning up servers for local origins, we want to use predictable ports
20 # so that caching works between subsequent runs with the same command line. 20 # so that caching works between subsequent runs with the same command line.
21 _LOCAL_ORIGIN_PORT = 31840 21 _LOCAL_ORIGIN_PORT = 31840
22 _MAPPINGS_BASE_PORT = 31841 22 _MAPPINGS_BASE_PORT = 31841
23 23
24 24
25 def _is_web_url(dest): 25 def _is_web_url(dest):
26 return True if urlparse.urlparse(dest).scheme else False 26 return True if urlparse.urlparse(dest).scheme else False
27 27
28 28
29 def _host_local_url_destination(shell, dest_file, port): 29 def _host_local_url_destination(shell, dest_file, port, free_host_port):
30 """Starts a local server to host |dest_file|. 30 """Starts a local server to host |dest_file|.
31 31
32 Returns: 32 Returns:
33 Url of the hosted file. 33 Url of the hosted file.
34 """ 34 """
35 directory = os.path.dirname(dest_file) 35 directory = os.path.dirname(dest_file)
36 if not os.path.exists(directory): 36 if not os.path.exists(directory):
37 raise ValueError('local path passed as --map-url destination ' 37 raise ValueError('local path passed as --map-url destination '
38 'does not exist') 38 'does not exist')
39 server_url = shell.serve_local_directory(directory, port) 39 server_url = shell.serve_local_directory(directory, port, free_host_port)
40 return server_url + os.path.relpath(dest_file, directory) 40 return server_url + os.path.relpath(dest_file, directory)
41 41
42 42
43 def _host_local_origin_destination(shell, dest_dir, port): 43 def _host_local_origin_destination(shell, dest_dir, port, free_host_port):
44 """Starts a local server to host |dest_dir|. 44 """Starts a local server to host |dest_dir|.
45 45
46 Returns: 46 Returns:
47 Url of the hosted directory. 47 Url of the hosted directory.
48 """ 48 """
49 return shell.serve_local_directory(dest_dir, port) 49 return shell.serve_local_directory(dest_dir, port, free_host_port)
50 50
51 51
52 def _rewrite(mapping, host_destination_functon, shell, port): 52 def _rewrite(mapping, host_destination_functon, shell, port, free_host_port):
53 """Takes a mapping given as <src>=<dest> and rewrites the <dest> part to be 53 """Takes a mapping given as <src>=<dest> and rewrites the <dest> part to be
54 hosted locally using the given function if <dest> is not a web url. 54 hosted locally using the given function if <dest> is not a web url.
55 """ 55 """
56 parts = mapping.split('=') 56 parts = mapping.split('=')
57 if len(parts) != 2: 57 if len(parts) != 2:
58 raise ValueError('each mapping value should be in format ' 58 raise ValueError('each mapping value should be in format '
59 '"<url>=<url-or-local-path>"') 59 '"<url>=<url-or-local-path>"')
60 if _is_web_url(parts[1]): 60 if _is_web_url(parts[1]):
61 # The destination is a web url, do nothing. 61 # The destination is a web url, do nothing.
62 return mapping 62 return mapping
63 63
64 src = parts[0] 64 src = parts[0]
65 dest = host_destination_functon(shell, parts[1], port) 65 dest = host_destination_functon(shell, parts[1], port, free_host_port)
66 return src + '=' + dest 66 return src + '=' + dest
67 67
68 68
69 def _apply_mappings(shell, original_arguments, map_urls, map_origins): 69 def _apply_mappings(shell, original_arguments, map_urls, map_origins,
70 free_host_ports):
70 """Applies mappings for specified urls and origins. For each local path 71 """Applies mappings for specified urls and origins. For each local path
71 specified as destination a local server will be spawned and the mapping will 72 specified as destination a local server will be spawned and the mapping will
72 be rewritten accordingly. 73 be rewritten accordingly.
73 74
74 Args: 75 Args:
75 shell: The shell that is being configured. 76 shell: The shell that is being configured.
76 original_arguments: Current list of shell arguments. 77 original_arguments: Current list of shell arguments.
77 map_urls: List of url mappings, each in the form of 78 map_urls: List of url mappings, each in the form of
78 <url>=<url-or-local-path>. 79 <url>=<url-or-local-path>.
79 map_origins: List of origin mappings, each in the form of 80 map_origins: List of origin mappings, each in the form of
80 <origin>=<url-or-local-path>. 81 <origin>=<url-or-local-path>.
81 82
82 Returns: 83 Returns:
83 The updated argument list. 84 The updated argument list.
84 """ 85 """
85 next_port = _MAPPINGS_BASE_PORT 86 next_port = _MAPPINGS_BASE_PORT
86 args = original_arguments 87 args = original_arguments
87 if map_urls: 88 if map_urls:
88 # Sort the mappings to preserve caching regardless of argument order. 89 # Sort the mappings to preserve caching regardless of argument order.
89 for map_url in sorted(map_urls): 90 for map_url in sorted(map_urls):
90 mapping = _rewrite(map_url, _host_local_url_destination, shell, next_port) 91 mapping = _rewrite(map_url, _host_local_url_destination, shell, next_port,
92 free_host_ports)
91 next_port += 1 93 next_port += 1
92 # All url mappings need to be coalesced into one shell argument. 94 # All url mappings need to be coalesced into one shell argument.
93 args = append_to_argument(args, '--url-mappings=', mapping) 95 args = append_to_argument(args, '--url-mappings=', mapping)
94 96
95 if map_origins: 97 if map_origins:
96 for map_origin in sorted(map_origins): 98 for map_origin in sorted(map_origins):
97 mapping = _rewrite(map_origin, _host_local_origin_destination, shell, 99 mapping = _rewrite(map_origin, _host_local_origin_destination, shell,
98 next_port) 100 next_port, free_host_ports)
99 next_port += 1 101 next_port += 1
100 # Origin mappings are specified as separate, repeated shell arguments. 102 # Origin mappings are specified as separate, repeated shell arguments.
101 args.append('--map-origin=' + mapping) 103 args.append('--map-origin=' + mapping)
102 return args 104 return args
103 105
104 106
105 def configure_local_origin(shell, local_dir, fixed_port=True): 107 def configure_local_origin(shell, local_dir, free_host_port):
qsr 2015/10/14 07:35:39 Was someone using this? If no, no problem, but oth
ppi 2015/10/14 16:53:19 According to git grep, no-one was using this.
106 """Sets up a local http server to serve files in |local_dir| along with 108 """Sets up a local http server to serve files in |local_dir| along with
107 device port forwarding if needed. 109 device port forwarding if needed.
108 110
109 Returns: 111 Returns:
110 The list of arguments to be appended to the shell argument list. 112 The list of arguments to be appended to the shell argument list.
111 """ 113 """
112 114
113 origin_url = shell.serve_local_directory( 115 origin_url = shell.serve_local_directory(
114 local_dir, _LOCAL_ORIGIN_PORT if fixed_port else 0) 116 local_dir, _LOCAL_ORIGIN_PORT, free_host_port)
115 return ["--origin=" + origin_url] 117 return ["--origin=" + origin_url]
116 118
117 119
118 def append_to_argument(arguments, key, value, delimiter=","): 120 def append_to_argument(arguments, key, value, delimiter=","):
119 """Looks for an argument of the form "key=val1,val2" within |arguments| and 121 """Looks for an argument of the form "key=val1,val2" within |arguments| and
120 appends |value| to it. 122 appends |value| to it.
121 123
122 If the argument is not present in |arguments| it is added. 124 If the argument is not present in |arguments| it is added.
123 125
124 Args: 126 Args:
(...skipping 13 matching lines...) Expand all
138 if not argument.startswith(key): 140 if not argument.startswith(key):
139 continue 141 continue
140 arguments[i] = argument + delimiter + value 142 arguments[i] = argument + delimiter + value
141 break 143 break
142 else: 144 else:
143 arguments.append(key + value) 145 arguments.append(key + value)
144 146
145 return arguments 147 return arguments
146 148
147 149
148 def _configure_dev_server(shell, shell_args, dev_server_config, verbose): 150 def _configure_dev_server(shell, shell_args, dev_server_config, free_host_port,
151 verbose):
149 """Sets up a dev server on the host according to |dev_server_config|. 152 """Sets up a dev server on the host according to |dev_server_config|.
150 153
151 Args: 154 Args:
152 shell: The shell that is being configured. 155 shell: The shell that is being configured.
153 shell_arguments: Current list of shell arguments. 156 shell_arguments: Current list of shell arguments.
154 dev_server_config: Instance of shell_config.DevServerConfig describing the 157 dev_server_config: Instance of shell_config.DevServerConfig describing the
155 dev server to be set up. 158 dev server to be set up.
156 159
157 Returns: 160 Returns:
158 The updated argument list. 161 The updated argument list.
159 """ 162 """
160 port = dev_server_config.port if dev_server_config.port else 0 163 port = dev_server_config.port if dev_server_config.port else 0
161 server_url = shell.serve_local_directories(dev_server_config.mappings, 164 server_url = shell.serve_local_directories(dev_server_config.mappings,
162 port=port) 165 port=port,
166 free_host_port=free_host_port)
163 shell_args.append('--map-origin=%s=%s' % (dev_server_config.host, server_url)) 167 shell_args.append('--map-origin=%s=%s' % (dev_server_config.host, server_url))
164 168
165 if verbose: 169 if verbose:
166 print "Configured %s locally at %s to serve:" % (dev_server_config.host, 170 print "Configured %s locally at %s to serve:" % (dev_server_config.host,
167 server_url) 171 server_url)
168 for mapping_prefix, mapping_path in dev_server_config.mappings: 172 for mapping_prefix, mapping_path in dev_server_config.mappings:
169 print " /%s -> %s" % (mapping_prefix, mapping_path) 173 print " /%s -> %s" % (mapping_prefix, mapping_path)
170 return shell_args 174 return shell_args
171 175
172 176
(...skipping 30 matching lines...) Expand all
203 shell.install_apk(shell_config.shell_path) 207 shell.install_apk(shell_config.shell_path)
204 else: 208 else:
205 if not shell_config.shell_path: 209 if not shell_config.shell_path:
206 raise ShellConfigurationException('Can not run without a shell binary. ' 210 raise ShellConfigurationException('Can not run without a shell binary. '
207 'Please pass --shell-path.') 211 'Please pass --shell-path.')
208 shell = LinuxShell(shell_config.shell_path) 212 shell = LinuxShell(shell_config.shell_path)
209 if shell_config.use_osmesa: 213 if shell_config.use_osmesa:
210 shell_args.append('--args-for=mojo:native_viewport_service --use-osmesa') 214 shell_args.append('--args-for=mojo:native_viewport_service --use-osmesa')
211 215
212 shell_args = _apply_mappings(shell, shell_args, shell_config.map_url_list, 216 shell_args = _apply_mappings(shell, shell_args, shell_config.map_url_list,
213 shell_config.map_origin_list) 217 shell_config.map_origin_list,
218 shell_config.free_host_ports)
214 219
215 if shell_config.origin: 220 if shell_config.origin:
216 if _is_web_url(shell_config.origin): 221 if _is_web_url(shell_config.origin):
217 shell_args.append('--origin=' + shell_config.origin) 222 shell_args.append('--origin=' + shell_config.origin)
218 else: 223 else:
219 shell_args.extend(configure_local_origin(shell, shell_config.origin, 224 shell_args.extend(configure_local_origin(shell, shell_config.origin,
220 fixed_port=True)) 225 shell_config.free_host_ports))
221 226
222 if shell_config.content_handlers: 227 if shell_config.content_handlers:
223 for (mime_type, 228 for (mime_type,
224 content_handler_url) in shell_config.content_handlers.iteritems(): 229 content_handler_url) in shell_config.content_handlers.iteritems():
225 shell_args = append_to_argument(shell_args, '--content-handlers=', 230 shell_args = append_to_argument(shell_args, '--content-handlers=',
226 '%s,%s' % (mime_type, 231 '%s,%s' % (mime_type,
227 content_handler_url)) 232 content_handler_url))
228 233
229 for dev_server_config in shell_config.dev_servers: 234 for dev_server_config in shell_config.dev_servers:
230 shell_args = _configure_dev_server(shell, shell_args, dev_server_config, 235 shell_args = _configure_dev_server(shell, shell_args, dev_server_config,
236 shell_config.free_host_ports,
231 shell_config.verbose) 237 shell_config.verbose)
232 238
233 return shell, shell_args 239 return shell, shell_args
OLDNEW
« no previous file with comments | « mojo/devtools/common/devtoolslib/shell.py ('k') | mojo/devtools/common/devtoolslib/shell_config.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698