OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library pub.executable; | 5 library pub.executable; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'dart:io'; | 8 import 'dart:io'; |
9 | 9 |
10 import 'package:barback/barback.dart'; | 10 import 'package:barback/barback.dart'; |
11 import 'package:path/path.dart' as p; | 11 import 'package:path/path.dart' as p; |
12 import 'package:stack_trace/stack_trace.dart'; | |
13 | 12 |
14 import 'barback/asset_environment.dart'; | 13 import 'barback/asset_environment.dart'; |
15 import 'entrypoint.dart'; | 14 import 'entrypoint.dart'; |
16 import 'exit_codes.dart' as exit_codes; | 15 import 'exit_codes.dart' as exit_codes; |
17 import 'io.dart'; | 16 import 'io.dart'; |
18 import 'log.dart' as log; | 17 import 'log.dart' as log; |
19 import 'utils.dart'; | 18 import 'utils.dart'; |
20 | 19 |
21 /// All signals that can be caught by a Dart process. | 20 /// All signals that can be caught by a Dart process. |
22 /// | 21 /// |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 message += " in package ${log.bold(package)}"; | 106 message += " in package ${log.bold(package)}"; |
108 } | 107 } |
109 log.error("$message."); | 108 log.error("$message."); |
110 return exit_codes.NO_INPUT; | 109 return exit_codes.NO_INPUT; |
111 } | 110 } |
112 | 111 |
113 // If we're running an executable directly from the filesystem, make sure that | 112 // If we're running an executable directly from the filesystem, make sure that |
114 // it knows where to load the packages. If it's a dependency's executable, for | 113 // it knows where to load the packages. If it's a dependency's executable, for |
115 // example, it may not have the right packages directory itself. | 114 // example, it may not have the right packages directory itself. |
116 if (executableUrl.scheme == 'file' || executableUrl.scheme == '') { | 115 if (executableUrl.scheme == 'file' || executableUrl.scheme == '') { |
117 // TODO(nweiz): use a .packages file once sdk#23369 is fixed. | |
118 | |
119 // We use an absolute path here not because the VM insists but because it's | 116 // We use an absolute path here not because the VM insists but because it's |
120 // helpful for the subprocess to be able to spawn Dart with | 117 // helpful for the subprocess to be able to spawn Dart with |
121 // Platform.executableArguments and have that work regardless of the working | 118 // Platform.executableArguments and have that work regardless of the working |
122 // directory. | 119 // directory. |
123 vmArgs.add('--packages=${p.toUri(p.absolute(entrypoint.packagesFile))}'); | 120 vmArgs.add('--packages=${p.toUri(p.absolute(entrypoint.packagesFile))}'); |
124 } | 121 } |
125 | 122 |
126 vmArgs.add(executableUrl.toString()); | 123 vmArgs.add(executableUrl.toString()); |
127 vmArgs.addAll(args); | 124 vmArgs.addAll(args); |
128 | 125 |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 /// If [recompile] is passed, it's called if the snapshot is out-of-date. It's | 200 /// If [recompile] is passed, it's called if the snapshot is out-of-date. It's |
204 /// expected to regenerate a snapshot at [path], after which the snapshot will | 201 /// expected to regenerate a snapshot at [path], after which the snapshot will |
205 /// be re-run. It may return a Future. | 202 /// be re-run. It may return a Future. |
206 /// | 203 /// |
207 /// If [checked] is set, runs the snapshot in checked mode. | 204 /// If [checked] is set, runs the snapshot in checked mode. |
208 /// | 205 /// |
209 /// Returns the snapshot's exit code. | 206 /// Returns the snapshot's exit code. |
210 /// | 207 /// |
211 /// This doesn't do any validation of the snapshot's SDK version. | 208 /// This doesn't do any validation of the snapshot's SDK version. |
212 Future<int> runSnapshot(String path, Iterable<String> args, {recompile(), | 209 Future<int> runSnapshot(String path, Iterable<String> args, {recompile(), |
213 bool checked: false}) async { | 210 String packagesFile, bool checked: false}) async { |
214 var vmArgs = [path]..addAll(args); | |
215 | |
216 // TODO(nweiz): pass a flag to silence the "Wrong full snapshot version" | 211 // TODO(nweiz): pass a flag to silence the "Wrong full snapshot version" |
217 // message when issue 20784 is fixed. | 212 // message when issue 20784 is fixed. |
218 if (checked) vmArgs.insert(0, "--checked"); | 213 var vmArgs = []; |
| 214 if (checked) vmArgs.add("--checked"); |
| 215 |
| 216 if (packagesFile != null) { |
| 217 // We use an absolute path here not because the VM insists but because it's |
| 218 // helpful for the subprocess to be able to spawn Dart with |
| 219 // Platform.executableArguments and have that work regardless of the working |
| 220 // directory. |
| 221 vmArgs.add("--packages=${p.toUri(p.absolute(packagesFile))}"); |
| 222 } |
| 223 |
| 224 vmArgs.add(path); |
| 225 vmArgs.addAll(args); |
219 | 226 |
220 // We need to split stdin so that we can send the same input both to the | 227 // We need to split stdin so that we can send the same input both to the |
221 // first and second process, if we start more than one. | 228 // first and second process, if we start more than one. |
222 var stdin1; | 229 var stdin1; |
223 var stdin2; | 230 var stdin2; |
224 if (recompile == null) { | 231 if (recompile == null) { |
225 stdin1 = stdin; | 232 stdin1 = stdin; |
226 } else { | 233 } else { |
227 var pair = tee(stdin); | 234 var pair = tee(stdin); |
228 stdin1 = pair.first; | 235 stdin1 = pair.first; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
262 signal.watch().listen((_) { | 269 signal.watch().listen((_) { |
263 log.fine("Forwarding $signal to running process."); | 270 log.fine("Forwarding $signal to running process."); |
264 process.kill(signal); | 271 process.kill(signal); |
265 }); | 272 }); |
266 } | 273 } |
267 } | 274 } |
268 | 275 |
269 /// Runs the executable snapshot at [snapshotPath]. | 276 /// Runs the executable snapshot at [snapshotPath]. |
270 Future<int> _runCachedExecutable(Entrypoint entrypoint, String snapshotPath, | 277 Future<int> _runCachedExecutable(Entrypoint entrypoint, String snapshotPath, |
271 List<String> args, {bool checked: false}) { | 278 List<String> args, {bool checked: false}) { |
272 return runSnapshot(snapshotPath, args, checked: checked, recompile: () { | 279 return runSnapshot(snapshotPath, args, |
| 280 packagesFile: entrypoint.packagesFile, |
| 281 checked: checked, |
| 282 recompile: () { |
273 log.fine("Precompiled executable is out of date."); | 283 log.fine("Precompiled executable is out of date."); |
274 return entrypoint.precompileExecutables(); | 284 return entrypoint.precompileExecutables(); |
275 }); | 285 }); |
276 } | 286 } |
OLD | NEW |