| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 /** | 5 /** |
| 6 * Helper functionality to make working with IO easier. | 6 * Helper functionality to make working with IO easier. |
| 7 */ | 7 */ |
| 8 library io; | 8 library io; |
| 9 | 9 |
| 10 import 'dart:io'; | 10 import 'dart:io'; |
| (...skipping 628 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 639 } | 639 } |
| 640 | 640 |
| 641 /// Spawns the process located at [executable], passing in [args]. Returns a | 641 /// Spawns the process located at [executable], passing in [args]. Returns a |
| 642 /// [Future] that will complete with the [Process] once it's been started. | 642 /// [Future] that will complete with the [Process] once it's been started. |
| 643 /// | 643 /// |
| 644 /// The spawned process will inherit its parent's environment variables. If | 644 /// The spawned process will inherit its parent's environment variables. If |
| 645 /// [environment] is provided, that will be used to augment (not replace) the | 645 /// [environment] is provided, that will be used to augment (not replace) the |
| 646 /// the inherited variables. | 646 /// the inherited variables. |
| 647 Future<Process> startProcess(String executable, List<String> args, | 647 Future<Process> startProcess(String executable, List<String> args, |
| 648 {workingDir, Map<String, String> environment}) => | 648 {workingDir, Map<String, String> environment}) => |
| 649 _doProcess(Process.start, executable, args, workingDir, environment); | 649 _doProcess(Process.start, executable, args, workingDir, environment) |
| 650 .transform((process) => new _WrappedProcess(process)); |
| 651 |
| 652 /// A wrapper around [Process] that buffers the stdout and stderr to avoid |
| 653 /// running into issue 7218. |
| 654 class _WrappedProcess implements Process { |
| 655 final Process _process; |
| 656 final InputStream stderr; |
| 657 final InputStream stdout; |
| 658 |
| 659 OutputStream get stdin => _process.stdin; |
| 660 |
| 661 void set onExit(void callback(int exitCode)) { |
| 662 _process.onExit = callback; |
| 663 } |
| 664 |
| 665 _WrappedProcess(Process process) |
| 666 : _process = process, |
| 667 stderr = wrapInputStream(process.stderr), |
| 668 stdout = wrapInputStream(process.stdout); |
| 669 |
| 670 bool kill([ProcessSignal signal = ProcessSignal.SIGTERM]) => |
| 671 _process.kill(signal); |
| 672 } |
| 650 | 673 |
| 651 /// Calls [fn] with appropriately modified arguments. [fn] should have the same | 674 /// Calls [fn] with appropriately modified arguments. [fn] should have the same |
| 652 /// signature as [Process.start], except that the returned [Future] may have a | 675 /// signature as [Process.start], except that the returned [Future] may have a |
| 653 /// type other than [Process]. | 676 /// type other than [Process]. |
| 654 Future _doProcess(Function fn, String executable, List<String> args, workingDir, | 677 Future _doProcess(Function fn, String executable, List<String> args, workingDir, |
| 655 Map<String, String> environment) { | 678 Map<String, String> environment) { |
| 656 // TODO(rnystrom): Should dart:io just handle this? | 679 // TODO(rnystrom): Should dart:io just handle this? |
| 657 // Spawning a process on Windows will not look for the executable in the | 680 // Spawning a process on Windows will not look for the executable in the |
| 658 // system path. So, if executable looks like it needs that (i.e. it doesn't | 681 // system path. So, if executable looks like it needs that (i.e. it doesn't |
| 659 // have any path separators in it), then spawn it through a shell. | 682 // have any path separators in it), then spawn it through a shell. |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 812 * directory or a path. Returns whether or not the extraction was successful. | 835 * directory or a path. Returns whether or not the extraction was successful. |
| 813 */ | 836 */ |
| 814 Future<bool> extractTarGz(InputStream stream, destination) { | 837 Future<bool> extractTarGz(InputStream stream, destination) { |
| 815 destination = _getPath(destination); | 838 destination = _getPath(destination); |
| 816 | 839 |
| 817 if (Platform.operatingSystem == "windows") { | 840 if (Platform.operatingSystem == "windows") { |
| 818 return _extractTarGzWindows(stream, destination); | 841 return _extractTarGzWindows(stream, destination); |
| 819 } | 842 } |
| 820 | 843 |
| 821 var completer = new Completer<int>(); | 844 var completer = new Completer<int>(); |
| 822 var processFuture = Process.start("tar", | 845 var processFuture = startProcess("tar", |
| 823 ["--extract", "--gunzip", "--directory", destination]); | 846 ["--extract", "--gunzip", "--directory", destination]); |
| 824 processFuture.then((process) { | 847 processFuture.then((process) { |
| 825 process.onExit = completer.complete; | 848 process.onExit = completer.complete; |
| 826 stream.pipe(process.stdin); | 849 stream.pipe(process.stdin); |
| 827 process.stdout.pipe(stdout, close: false); | 850 process.stdout.pipe(stdout, close: false); |
| 828 process.stderr.pipe(stderr, close: false); | 851 process.stderr.pipe(stderr, close: false); |
| 829 }); | 852 }); |
| 830 processFuture.handleException((error) { | 853 processFuture.handleException((error) { |
| 831 completer.completeException(error, processFuture.stackTrace); | 854 completer.completeException(error, processFuture.stackTrace); |
| 832 return true; | 855 return true; |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1029 return new Directory(entry); | 1052 return new Directory(entry); |
| 1030 } | 1053 } |
| 1031 | 1054 |
| 1032 /** | 1055 /** |
| 1033 * Gets a [Uri] for [uri], which can either already be one, or be a [String]. | 1056 * Gets a [Uri] for [uri], which can either already be one, or be a [String]. |
| 1034 */ | 1057 */ |
| 1035 Uri _getUri(uri) { | 1058 Uri _getUri(uri) { |
| 1036 if (uri is Uri) return uri; | 1059 if (uri is Uri) return uri; |
| 1037 return new Uri.fromString(uri); | 1060 return new Uri.fromString(uri); |
| 1038 } | 1061 } |
| OLD | NEW |