Index: lib/src/io.dart |
diff --git a/lib/src/io.dart b/lib/src/io.dart |
index 22ed041893237f74b6d18c522086d5546f42909e..69248cdb8a2f30d1dcf8959a11d3e66e07f8bd77 100644 |
--- a/lib/src/io.dart |
+++ b/lib/src/io.dart |
@@ -8,6 +8,7 @@ import 'dart:collection'; |
import 'dart:convert'; |
import 'dart:io'; |
+import 'package:async/async.dart'; |
import 'package:path/path.dart' as path; |
import 'package:pool/pool.dart'; |
import 'package:http/http.dart' show ByteStream; |
@@ -194,11 +195,10 @@ Future<String> createFileFromStream(Stream<List<int>> stream, String file) { |
// TODO(nweiz): remove extra logging when we figure out the windows bot issue. |
log.io("Creating $file from stream."); |
- return _descriptorPool.withResource(() { |
- return stream.pipe(new File(file).openWrite()).then((_) { |
- log.fine("Created $file from stream."); |
- return file; |
- }); |
+ return _descriptorPool.withResource/*<Future<String>>*/(() async { |
+ await stream.pipe(new File(file).openWrite()); |
+ log.fine("Created $file from stream."); |
+ return file; |
}); |
} |
@@ -639,10 +639,11 @@ Future flushThenExit(int status) { |
/// Returns a [EventSink] that pipes all data to [consumer] and a [Future] that |
/// will succeed when [EventSink] is closed or fail with any errors that occur |
/// while writing. |
-Pair<EventSink, Future> consumerToSink(StreamConsumer consumer) { |
- var controller = new StreamController(sync: true); |
+Pair<EventSink/*<T>*/, Future> consumerToSink/*<T>*/( |
+ StreamConsumer/*<T>*/ consumer) { |
+ var controller = new StreamController/*<T>*/(sync: true); |
var done = controller.stream.pipe(consumer); |
- return new Pair<EventSink, Future>(controller.sink, done); |
+ return new Pair(controller.sink, done); |
} |
// TODO(nweiz): remove this when issue 7786 is fixed. |
@@ -801,12 +802,10 @@ class PubProcess { |
_stdin = pair.first; |
_stdinClosed = errorGroup.registerFuture(pair.last); |
- _stdout = new ByteStream( |
- errorGroup.registerStream(process.stdout)); |
- _stderr = new ByteStream( |
- errorGroup.registerStream(process.stderr)); |
+ _stdout = new ByteStream(errorGroup.registerStream(process.stdout)); |
+ _stderr = new ByteStream(errorGroup.registerStream(process.stderr)); |
- var exitCodeCompleter = new Completer(); |
+ var exitCodeCompleter = new Completer<int>(); |
_exitCode = errorGroup.registerFuture(exitCodeCompleter.future); |
_process.exitCode.then((code) => exitCodeCompleter.complete(code)); |
} |
@@ -829,7 +828,7 @@ _doProcess(Function fn, String executable, List<String> args, |
// have any path separators in it), then spawn it through a shell. |
if ((Platform.operatingSystem == "windows") && |
(executable.indexOf('\\') == -1)) { |
- args = flatten(["/c", executable, args]); |
+ args = ["/c", executable]..addAll(args); |
executable = "cmd"; |
} |
@@ -858,12 +857,13 @@ void touch(String path) { |
/// |
/// Returns a future that completes to the value that the future returned from |
/// [fn] completes to. |
-Future withTempDir(Future fn(String path)) { |
- return new Future.sync(() { |
- var tempDir = createSystemTempDir(); |
- return new Future.sync(() => fn(tempDir)) |
- .whenComplete(() => deleteEntry(tempDir)); |
- }); |
+Future/*<T>*/ withTempDir/*<T>*/(Future/*<T>*/ fn(String path)) async { |
+ var tempDir = createSystemTempDir(); |
+ try { |
+ return await fn(tempDir); |
+ } finally { |
+ deleteEntry(tempDir); |
+ } |
} |
/// Binds an [HttpServer] to [host] and [port]. |
@@ -995,8 +995,8 @@ Future _extractTarGzWindows(Stream<List<int>> stream, String destination) { |
/// working directory. |
/// |
/// Returns a [ByteStream] that emits the contents of the archive. |
-ByteStream createTarGz(List contents, {baseDir}) { |
- return new ByteStream(futureStream(new Future.sync(() async { |
+ByteStream createTarGz(List contents, {String baseDir}) { |
+ return new ByteStream(StreamCompleter.fromFuture(new Future.sync(() async { |
var buffer = new StringBuffer(); |
buffer.write('Creating .tag.gz stream containing:\n'); |
contents.forEach((file) => buffer.write('$file\n')); |