| Index: sdk/lib/_internal/pub/lib/src/io.dart
|
| diff --git a/sdk/lib/_internal/pub/lib/src/io.dart b/sdk/lib/_internal/pub/lib/src/io.dart
|
| index 40f09bf0b1c781846477cb09a7bf4bb2b0cf0efb..89179ebdac869de0b23d9f0d32789c3c08526c95 100644
|
| --- a/sdk/lib/_internal/pub/lib/src/io.dart
|
| +++ b/sdk/lib/_internal/pub/lib/src/io.dart
|
| @@ -12,6 +12,8 @@ import 'dart:io';
|
|
|
| import 'package:path/path.dart' as path;
|
| import 'package:http/http.dart' show ByteStream;
|
| +import 'package:stack_trace/stack_trace.dart';
|
| +
|
| import 'error_group.dart';
|
| import 'log.dart' as log;
|
| import 'sdk.dart' as sdk;
|
| @@ -462,19 +464,16 @@ Pair<EventSink, Future> consumerToSink(StreamConsumer consumer) {
|
| Future store(Stream stream, EventSink sink,
|
| {bool cancelOnError: true, bool closeSink: true}) {
|
| var completer = new Completer();
|
| - stream.listen(sink.add,
|
| - onError: (e, [stackTrace]) {
|
| - // TODO(floitsch): Sink.addError without stack trace.
|
| - sink.addError(e);
|
| - if (cancelOnError) {
|
| - completer.complete();
|
| - if (closeSink) sink.close();
|
| - }
|
| - },
|
| - onDone: () {
|
| - if (closeSink) sink.close();
|
| - completer.complete();
|
| - }, cancelOnError: cancelOnError);
|
| + stream.listen(sink.add, onError: (e, stackTrace) {
|
| + sink.addError(e, stackTrace);
|
| + if (cancelOnError) {
|
| + completer.complete();
|
| + if (closeSink) sink.close();
|
| + }
|
| + }, onDone: () {
|
| + if (closeSink) sink.close();
|
| + completer.complete();
|
| + }, cancelOnError: cancelOnError);
|
| return completer.future;
|
| }
|
|
|
| @@ -634,16 +633,17 @@ Future timeout(Future input, int milliseconds, String description) {
|
| var completer = new Completer();
|
| var timer = new Timer(new Duration(milliseconds: milliseconds), () {
|
| completer.completeError(new TimeoutException(
|
| - 'Timed out while $description.'));
|
| + 'Timed out while $description.'),
|
| + new Trace.current());
|
| });
|
| input.then((value) {
|
| if (completer.isCompleted) return;
|
| timer.cancel();
|
| completer.complete(value);
|
| - }).catchError((e) {
|
| + }).catchError((e, stackTrace) {
|
| if (completer.isCompleted) return;
|
| timer.cancel();
|
| - completer.completeError(e);
|
| + completer.completeError(e, stackTrace);
|
| });
|
| return completer.future;
|
| }
|
| @@ -775,10 +775,10 @@ ByteStream createTarGz(List contents, {baseDir}) {
|
| // file and pass them in via --files-from for tar and -i@filename for 7zip.
|
| startProcess("tar", args).then((process) {
|
| store(process.stdout, controller);
|
| - }).catchError((e) {
|
| + }).catchError((e, stackTrace) {
|
| // We don't have to worry about double-signaling here, since the store()
|
| // above will only be reached if startProcess succeeds.
|
| - controller.addError(e);
|
| + controller.addError(e, stackTrace);
|
| controller.close();
|
| });
|
| return new ByteStream(controller.stream);
|
| @@ -807,10 +807,10 @@ ByteStream createTarGz(List contents, {baseDir}) {
|
| // occurs.
|
| return store(process.stdout, controller);
|
| });
|
| - }).catchError((e) {
|
| + }).catchError((e, stackTrace) {
|
| // We don't have to worry about double-signaling here, since the store()
|
| // above will only be reached if everything succeeds.
|
| - controller.addError(e);
|
| + controller.addError(e, stackTrace);
|
| controller.close();
|
| });
|
| return new ByteStream(controller.stream);
|
|
|