| Index: lib/src/util/io.dart
|
| diff --git a/lib/src/util/io.dart b/lib/src/util/io.dart
|
| index cb35ed7c25a302d53e08aaa633f7b6fa60b27520..dbe34f4e01ff7965590232a7a83c39c58b672b53 100644
|
| --- a/lib/src/util/io.dart
|
| +++ b/lib/src/util/io.dart
|
| @@ -14,6 +14,12 @@ import 'package:pub_semver/pub_semver.dart';
|
| import '../backend/operating_system.dart';
|
| import '../runner/application_exception.dart';
|
|
|
| +/// The ASCII code for a newline character.
|
| +const _newline = 0xA;
|
| +
|
| +/// The ASCII code for a carriage return character.
|
| +const _carriageReturn = 0xD;
|
| +
|
| /// The root directory of the Dart SDK.
|
| final String sdkDir =
|
| p.dirname(p.dirname(Platform.executable));
|
| @@ -95,6 +101,30 @@ Future withTempDir(Future fn(String path)) {
|
| });
|
| }
|
|
|
| +/// Return a transformation of [input] with all null bytes removed.
|
| +///
|
| +/// This works around the combination of issue 23295 and 22667 by removing null
|
| +/// bytes. This workaround can be removed when either of those are fixed in the
|
| +/// oldest supported SDK.
|
| +///
|
| +/// It also somewhat works around issue 23303 by removing any carriage returns
|
| +/// that are followed by newlines, to ensure that carriage returns aren't
|
| +/// doubled up in the output. This can be removed when the issue is fixed in the
|
| +/// oldest supported SDk.
|
| +Stream<List<int>> santizeForWindows(Stream<List<int>> input) {
|
| + if (!Platform.isWindows) return input;
|
| +
|
| + return input.map((list) {
|
| + var previous;
|
| + return list.reversed.where((byte) {
|
| + if (byte == 0) return false;
|
| + if (byte == _carriageReturn && previous == _newline) return false;
|
| + previous = byte;
|
| + return true;
|
| + }).toList().reversed.toList();
|
| + });
|
| +}
|
| +
|
| /// Creates a URL string for [address]:[port].
|
| ///
|
| /// Handles properly formatting IPv6 addresses.
|
|
|