| // Copyright 2014 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'dart:core' as core_internals show print; |
| import 'dart:core' hide print; |
| import 'dart:io' as io_internals show exit; |
| import 'dart:io' hide exit; |
| |
| final bool hasColor = stdout.supportsAnsiEscapes; |
| |
| final String bold = hasColor ? '\x1B[1m' : ''; // used for shard titles |
| final String red = hasColor ? '\x1B[31m' : ''; // used for errors |
| final String green = hasColor ? '\x1B[32m' : ''; // used for section titles, commands |
| final String yellow = hasColor ? '\x1B[33m' : ''; // used for skips |
| final String cyan = hasColor ? '\x1B[36m' : ''; // used for paths |
| final String reverse = hasColor ? '\x1B[7m' : ''; // used for clocks |
| final String reset = hasColor ? '\x1B[0m' : ''; |
| |
| class ExitException implements Exception { |
| ExitException(this.exitCode); |
| |
| final int exitCode; |
| |
| void apply() { |
| io_internals.exit(exitCode); |
| } |
| } |
| |
| // We actually reimplement exit() so that it uses exceptions rather |
| // than truly immediately terminating the application, so that we can |
| // test the exit code in unit tests (see test/analyze_test.dart). |
| void exit(int exitCode) { |
| throw ExitException(exitCode); |
| } |
| |
| void exitWithError(List<String> messages) { |
| final String redLine = '$red━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━$reset'; |
| print(redLine); |
| messages.forEach(print); |
| print(redLine); |
| exit(1); |
| } |
| |
| typedef PrintCallback = void Function(Object line); |
| |
| // Allow print() to be overridden, for tests. |
| PrintCallback print = core_internals.print; |
| |
| String get clock { |
| final DateTime now = DateTime.now(); |
| return '$reverse▌' |
| '${now.hour.toString().padLeft(2, "0")}:' |
| '${now.minute.toString().padLeft(2, "0")}:' |
| '${now.second.toString().padLeft(2, "0")}' |
| '▐$reset'; |
| } |
| |
| String prettyPrintDuration(Duration duration) { |
| String result = ''; |
| final int minutes = duration.inMinutes; |
| if (minutes > 0) |
| result += '${minutes}min '; |
| final int seconds = duration.inSeconds - minutes * 60; |
| final int milliseconds = duration.inMilliseconds - (seconds * 1000 + minutes * 60 * 1000); |
| result += '$seconds.${milliseconds.toString().padLeft(3, "0")}s'; |
| return result; |
| } |
| |
| void printProgress(String action, String workingDir, String command) { |
| print('$clock $action: cd $cyan$workingDir$reset; $green$command$reset'); |
| } |