// 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'); }