From 071efec27126efb2d5ca4b6c0478fbe103ddb70a Mon Sep 17 00:00:00 2001 From: Michael Goderbauer Date: Wed, 15 Feb 2017 13:20:17 -0800 Subject: [PATCH] Implements WindowsStdoutLogger (#8189) Replaces unprintable characters with alternative symbols. --- packages/flutter_tools/lib/executable.dart | 2 +- .../flutter_tools/lib/src/base/logger.dart | 27 ++++++++++++++++++- packages/flutter_tools/lib/src/doctor.dart | 2 +- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/packages/flutter_tools/lib/executable.dart b/packages/flutter_tools/lib/executable.dart index abe0edd3dc9..8d4085bde4a 100644 --- a/packages/flutter_tools/lib/executable.dart +++ b/packages/flutter_tools/lib/executable.dart @@ -105,7 +105,7 @@ Future main(List args) async { context.putIfAbsent(Platform, () => new LocalPlatform()); context.putIfAbsent(FileSystem, () => new LocalFileSystem()); context.putIfAbsent(ProcessManager, () => new LocalProcessManager()); - context.putIfAbsent(Logger, () => new StdoutLogger()); + context.putIfAbsent(Logger, () => platform.isWindows ? new WindowsStdoutLogger() : new StdoutLogger()); // Order-independent context entries context.putIfAbsent(DeviceManager, () => new DeviceManager()); diff --git a/packages/flutter_tools/lib/src/base/logger.dart b/packages/flutter_tools/lib/src/base/logger.dart index ceedd9ec847..d413ac919d6 100644 --- a/packages/flutter_tools/lib/src/base/logger.dart +++ b/packages/flutter_tools/lib/src/base/logger.dart @@ -6,6 +6,7 @@ import 'dart:async'; import 'dart:convert' show ASCII, LineSplitter; import 'package:intl/intl.dart'; +import 'package:meta/meta.dart'; import 'package:stack_trace/stack_trace.dart'; import 'io.dart'; @@ -53,6 +54,7 @@ class Status { typedef void _FinishCallback(); class StdoutLogger extends Logger { + Status _status; @override @@ -83,6 +85,11 @@ class StdoutLogger extends Logger { message = LineSplitter.split(message).map((String line) => ' ' * indent + line).join('\n'); if (newline) message = '$message\n'; + writeToStdOut(message); + } + + @protected + void writeToStdOut(String message) { stdout.write(message); } @@ -106,6 +113,24 @@ class StdoutLogger extends Logger { } } +/// A [StdoutLogger] which replaces Unicode characters that cannot be printed to +/// the Windows console with alternative symbols. +/// +/// This exists because of https://github.com/dart-lang/sdk/issues/28571. +class WindowsStdoutLogger extends StdoutLogger { + + @override + void writeToStdOut(String message) { + stdout.write(message + .replaceAll('✗', 'X') + .replaceAll('✓', '+') + .replaceAll('•', '*') + ); + // TODO(goderbauer): find a way to replace all other non-printable characters + // with the unrepresentable character symbol '�' + } +} + class BufferLogger extends Logger { @override bool get isVerbose => false; @@ -217,7 +242,7 @@ enum _LogType { class AnsiTerminal { AnsiTerminal() { - // TODO(devoncarew): This detection does not work for Windows. + // TODO(devoncarew): This detection does not work for Windows (https://github.com/dart-lang/sdk/issues/28614). String term = platform.environment['TERM']; supportsColor = term != null && term != 'dumb'; } diff --git a/packages/flutter_tools/lib/src/doctor.dart b/packages/flutter_tools/lib/src/doctor.dart index a7742f1b930..204c0bd4828 100644 --- a/packages/flutter_tools/lib/src/doctor.dart +++ b/packages/flutter_tools/lib/src/doctor.dart @@ -126,7 +126,7 @@ class Doctor { for (ValidationMessage message in result.messages) { String text = message.message.replaceAll('\n', '\n '); if (message.isError) { - printStatus(' x $text', emphasis: true); + printStatus(' ✗ $text', emphasis: true); } else { printStatus(' • $text'); }