| Index: utils/pub/io.dart
|
| diff --git a/utils/pub/io.dart b/utils/pub/io.dart
|
| index a85c7c3efbea2314ae1a20a4541c90f94953d5ba..0f2ae70f7792445d0b1944ed953f0f9392d40584 100644
|
| --- a/utils/pub/io.dart
|
| +++ b/utils/pub/io.dart
|
| @@ -163,8 +163,16 @@ Future<File> createFileFromStream(InputStream stream, path) {
|
| completer.complete(file);
|
| };
|
|
|
| + // TODO(nweiz): remove this when issue 4061 is fixed.
|
| + var stackTrace;
|
| + try {
|
| + throw null;
|
| + } catch (_, localStackTrace) {
|
| + stackTrace = localStackTrace;
|
| + }
|
| +
|
| completeError(error) {
|
| - if (!completer.isComplete) completer.completeException(error);
|
| + if (!completer.isComplete) completer.completeException(error, stackTrace);
|
| }
|
|
|
| stream.onError = completeError;
|
| @@ -251,7 +259,15 @@ Future<List<String>> listDir(dir,
|
| if (done) completer.complete(contents);
|
| };
|
|
|
| - lister.onError = (error) => completer.completeException(error);
|
| + // TODO(nweiz): remove this when issue 4061 is fixed.
|
| + var stackTrace;
|
| + try {
|
| + throw null;
|
| + } catch (_, localStackTrace) {
|
| + stackTrace = localStackTrace;
|
| + }
|
| +
|
| + lister.onError = (error) => completer.completeException(error, stackTrace);
|
| lister.onDir = (file) => contents.add(file);
|
| lister.onFile = (file) {
|
| if (!includeHiddenFiles && basename(file).startsWith('.')) return;
|
| @@ -399,6 +415,14 @@ Future<String> readLine([StringInputStream stream]) {
|
| stream.onError = null;
|
| }
|
|
|
| + // TODO(nweiz): remove this when issue 4061 is fixed.
|
| + var stackTrace;
|
| + try {
|
| + throw null;
|
| + } catch (_, localStackTrace) {
|
| + stackTrace = localStackTrace;
|
| + }
|
| +
|
| var completer = new Completer();
|
| stream.onClosed = () {
|
| removeCallbacks();
|
| @@ -412,7 +436,7 @@ Future<String> readLine([StringInputStream stream]) {
|
|
|
| stream.onError = (e) {
|
| removeCallbacks();
|
| - completer.completeException(e);
|
| + completer.completeException(e, stackTrace);
|
| };
|
|
|
| return completer.future;
|
| @@ -442,6 +466,14 @@ Future<InputStream> httpGet(uri) {
|
| var client = new HttpClient();
|
| var connection = client.getUrl(uri);
|
|
|
| + // TODO(nweiz): remove this when issue 4061 is fixed.
|
| + var stackTrace;
|
| + try {
|
| + throw null;
|
| + } catch (_, localStackTrace) {
|
| + stackTrace = localStackTrace;
|
| + }
|
| +
|
| connection.onError = (e) {
|
| // Show a friendly error if the URL couldn't be resolved.
|
| if (e is SocketIOException &&
|
| @@ -454,14 +486,15 @@ Future<InputStream> httpGet(uri) {
|
| }
|
|
|
| client.shutdown();
|
| - completer.completeException(e);
|
| + completer.completeException(e, stackTrace);
|
| };
|
|
|
| connection.onResponse = (response) {
|
| if (response.statusCode >= 400) {
|
| client.shutdown();
|
| completer.completeException(
|
| - new PubHttpException(response.statusCode, response.reasonPhrase));
|
| + new PubHttpException(response.statusCode, response.reasonPhrase),
|
| + stackTrace);
|
| return;
|
| }
|
|
|
| @@ -504,11 +537,19 @@ Future pipeInputToInput(InputStream source, ListInputStream sink) {
|
| Future<List<int>> consumeInputStream(InputStream stream) {
|
| if (stream.closed) return new Future.immediate(<int>[]);
|
|
|
| + // TODO(nweiz): remove this when issue 4061 is fixed.
|
| + var stackTrace;
|
| + try {
|
| + throw null;
|
| + } catch (_, localStackTrace) {
|
| + stackTrace = localStackTrace;
|
| + }
|
| +
|
| var completer = new Completer<List<int>>();
|
| var buffer = <int>[];
|
| stream.onClosed = () => completer.complete(buffer);
|
| stream.onData = () => buffer.addAll(stream.read());
|
| - stream.onError = (e) => completer.completeException(e);
|
| + stream.onError = (e) => completer.completeException(e, stackTrace);
|
| return completer.future;
|
| }
|
|
|
| @@ -516,11 +557,19 @@ Future<List<int>> consumeInputStream(InputStream stream) {
|
| Future<String> consumeStringInputStream(StringInputStream stream) {
|
| if (stream.closed) return new Future.immediate('');
|
|
|
| + // TODO(nweiz): remove this when issue 4061 is fixed.
|
| + var stackTrace;
|
| + try {
|
| + throw null;
|
| + } catch (_, localStackTrace) {
|
| + stackTrace = localStackTrace;
|
| + }
|
| +
|
| var completer = new Completer<String>();
|
| var buffer = new StringBuffer();
|
| stream.onClosed = () => completer.complete(buffer.toString());
|
| stream.onData = () => buffer.add(stream.read());
|
| - stream.onError = (e) => completer.completeException(e);
|
| + stream.onError = (e) => completer.completeException(e, stackTrace);
|
| return completer.future;
|
| }
|
|
|
| @@ -591,8 +640,17 @@ Future _doProcess(Function fn, String executable, List<String> args, workingDir,
|
| /// Due to issue 6984, it's necessary to drain the request body before closing
|
| /// the response.
|
| Future closeHttpResponse(HttpRequest request, HttpResponse response) {
|
| + // TODO(nweiz): remove this when issue 4061 is fixed.
|
| + var stackTrace;
|
| + try {
|
| + throw null;
|
| + } catch (_, localStackTrace) {
|
| + stackTrace = localStackTrace;
|
| + }
|
| +
|
| var completer = new Completer();
|
| - request.inputStream.onError = completer.completeException;
|
| + request.inputStream.onError = (e) =>
|
| + completer.completeException(e, stackTrace);
|
| request.inputStream.onData = request.inputStream.read;
|
| request.inputStream.onClosed = () {
|
| response.outputStream.close();
|
| @@ -621,7 +679,7 @@ Future timeout(Future input, int milliseconds, String description) {
|
| input.handleException((e) {
|
| if (completer.future.isComplete) return false;
|
| timer.cancel();
|
| - completer.completeException(e);
|
| + completer.completeException(e, input.stackTrace);
|
| return true;
|
| });
|
| input.then((value) {
|
| @@ -728,7 +786,7 @@ Future<bool> extractTarGz(InputStream stream, destination) {
|
| process.stderr.pipe(stderr, close: false);
|
| });
|
| processFuture.handleException((error) {
|
| - completer.completeException(error);
|
| + completer.completeException(error, processFuture.stackTrace);
|
| return true;
|
| });
|
|
|
|
|