Skip to content

Commit 28c419d

Browse files
[tool] Conditionalize color on stdout (flutter#4436)
Refactors colorization to a centralized utility file, and makes it all conditional on `stdout` having ANSI escape support. This makes the output more readable on LUCI, which unlike the Cirrus log display doesn't handle ANSI. Fixes flutter#89392
1 parent 404084c commit 28c419d

35 files changed

+187
-26
lines changed

script/tool/lib/src/analyze_command.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import 'package:file/file.dart';
66
import 'package:yaml/yaml.dart';
77

8-
import 'common/core.dart';
8+
import 'common/output_utils.dart';
99
import 'common/package_looping_command.dart';
1010
import 'common/repository_package.dart';
1111

script/tool/lib/src/build_examples_command.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:file/file.dart';
66
import 'package:yaml/yaml.dart';
77

88
import 'common/core.dart';
9+
import 'common/output_utils.dart';
910
import 'common/package_looping_command.dart';
1011
import 'common/plugin_utils.dart';
1112
import 'common/repository_package.dart';

script/tool/lib/src/common/cmake.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:file/file.dart';
66
import 'package:platform/platform.dart';
77

88
import 'core.dart';
9+
import 'output_utils.dart';
910
import 'process_runner.dart';
1011

1112
const String _cacheCommandKey = 'CMAKE_COMMAND:INTERNAL';

script/tool/lib/src/common/core.dart

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
44

5-
import 'package:colorize/colorize.dart';
65
import 'package:file/file.dart';
76
import 'package:pub_semver/pub_semver.dart';
87

@@ -69,16 +68,6 @@ bool isPackage(FileSystemEntity entity) {
6968
return entity.childFile('pubspec.yaml').existsSync();
7069
}
7170

72-
/// Prints `successMessage` in green.
73-
void printSuccess(String successMessage) {
74-
print(Colorize(successMessage)..green());
75-
}
76-
77-
/// Prints `errorMessage` in red.
78-
void printError(String errorMessage) {
79-
print(Colorize(errorMessage)..red());
80-
}
81-
8271
/// Error thrown when a command needs to exit with a non-zero exit code.
8372
///
8473
/// While there is no specific definition of the meaning of different non-zero
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
import 'dart:io';
6+
7+
import 'package:colorize/colorize.dart';
8+
import 'package:meta/meta.dart';
9+
10+
export 'package:colorize/colorize.dart' show Styles;
11+
12+
/// True if color should be applied.
13+
///
14+
/// Defaults to autodetecting stdout.
15+
@visibleForTesting
16+
bool useColorForOutput = stdout.supportsAnsiEscapes;
17+
18+
String _colorizeIfAppropriate(String string, Styles color) {
19+
if (!useColorForOutput) {
20+
return string;
21+
}
22+
return Colorize(string).apply(color).toString();
23+
}
24+
25+
/// Prints [message] in green, if the environment supports color.
26+
void printSuccess(String message) {
27+
print(_colorizeIfAppropriate(message, Styles.GREEN));
28+
}
29+
30+
/// Prints [message] in yellow, if the environment supports color.
31+
void printWarning(String message) {
32+
print(_colorizeIfAppropriate(message, Styles.YELLOW));
33+
}
34+
35+
/// Prints [message] in red, if the environment supports color.
36+
void printError(String message) {
37+
print(_colorizeIfAppropriate(message, Styles.RED));
38+
}
39+
40+
/// Returns [message] with escapes to print it in [color], if the environment
41+
/// supports color.
42+
String colorizeString(String message, Styles color) {
43+
return _colorizeIfAppropriate(message, color);
44+
}

script/tool/lib/src/common/package_command.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import 'package:yaml/yaml.dart';
1414

1515
import 'core.dart';
1616
import 'git_version_finder.dart';
17+
import 'output_utils.dart';
1718
import 'process_runner.dart';
1819
import 'repository_package.dart';
1920

script/tool/lib/src/common/package_looping_command.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44

55
import 'dart:async';
66

7-
import 'package:colorize/colorize.dart';
87
import 'package:file/file.dart';
98
import 'package:path/path.dart' as p;
109
import 'package:pub_semver/pub_semver.dart';
1110

1211
import 'core.dart';
12+
import 'output_utils.dart';
1313
import 'package_command.dart';
1414
import 'repository_package.dart';
1515

@@ -208,7 +208,7 @@ abstract class PackageLoopingCommand extends PackageCommand {
208208
/// messages. DO NOT RELY on someone noticing a warning; instead, use it for
209209
/// things that might be useful to someone debugging an unexpected result.
210210
void logWarning(String warningMessage) {
211-
_printColorized(warningMessage, Styles.YELLOW);
211+
printWarning(warningMessage);
212212
if (_currentPackageEntry != null) {
213213
_packagesWithWarnings.add(_currentPackageEntry!);
214214
} else {
@@ -467,7 +467,7 @@ abstract class PackageLoopingCommand extends PackageCommand {
467467
}
468468

469469
if (!captureOutput) {
470-
summary = (Colorize(summary)..apply(style)).toString();
470+
summary = colorizeString(summary, style);
471471
}
472472
print(' ${entry.package.displayName} - $summary');
473473
}
@@ -500,7 +500,7 @@ abstract class PackageLoopingCommand extends PackageCommand {
500500
if (captureOutput) {
501501
print(message);
502502
} else {
503-
print(Colorize(message)..apply(color));
503+
print(colorizeString(message, color));
504504
}
505505
}
506506

script/tool/lib/src/common/xcode.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import 'dart:io' as io;
77

88
import 'package:file/file.dart';
99

10-
import 'core.dart';
10+
import 'output_utils.dart';
1111
import 'process_runner.dart';
1212

1313
const String _xcodeBuildCommand = 'xcodebuild';

script/tool/lib/src/create_all_packages_app_command.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import 'package:pubspec_parse/pubspec_parse.dart';
1111

1212
import 'common/core.dart';
1313
import 'common/file_utils.dart';
14+
import 'common/output_utils.dart';
1415
import 'common/package_command.dart';
1516
import 'common/process_runner.dart';
1617
import 'common/pub_utils.dart';

script/tool/lib/src/dart_test_command.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import 'package:file/file.dart';
66

77
import 'common/core.dart';
8+
import 'common/output_utils.dart';
89
import 'common/package_looping_command.dart';
910
import 'common/plugin_utils.dart';
1011
import 'common/pub_utils.dart';

0 commit comments

Comments
 (0)