| Index: utils/pub/log.dart
|
| diff --git a/utils/pub/log.dart b/utils/pub/log.dart
|
| deleted file mode 100644
|
| index e01425b7d2bf6789d0b08a4ec67baf690726b3f4..0000000000000000000000000000000000000000
|
| --- a/utils/pub/log.dart
|
| +++ /dev/null
|
| @@ -1,258 +0,0 @@
|
| -// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
|
| -// for details. All rights reserved. Use of this source code is governed by a
|
| -// BSD-style license that can be found in the LICENSE file.
|
| -
|
| -/// Message logging.
|
| -library log;
|
| -
|
| -import 'dart:io';
|
| -import 'dart:async';
|
| -
|
| -import 'io.dart';
|
| -import 'utils.dart';
|
| -
|
| -typedef LogFn(Entry entry);
|
| -final Map<Level, LogFn> _loggers = new Map<Level, LogFn>();
|
| -
|
| -/// The list of recorded log messages. Will only be recorded if
|
| -/// [recordTranscript()] is called.
|
| -List<Entry> _transcript;
|
| -
|
| -/// An enum type for defining the different logging levels. By default, [ERROR]
|
| -/// and [WARNING] messages are printed to sterr. [MESSAGE] messages are printed
|
| -/// to stdout, and others are ignored.
|
| -class Level {
|
| - /// An error occurred and an operation could not be completed. Usually shown
|
| - /// to the user on stderr.
|
| - static const ERROR = const Level._("ERR ");
|
| -
|
| - /// Something unexpected happened, but the program was able to continue,
|
| - /// though possibly in a degraded fashion.
|
| - static const WARNING = const Level._("WARN");
|
| -
|
| - /// A message intended specifically to be shown to the user.
|
| - static const MESSAGE = const Level._("MSG ");
|
| -
|
| - /// Some interaction with the external world occurred, such as a network
|
| - /// operation, process spawning, or file IO.
|
| - static const IO = const Level._("IO ");
|
| -
|
| - /// Incremental output during pub's version constraint solver.
|
| - static const SOLVER = const Level._("SLVR");
|
| -
|
| - /// Fine-grained and verbose additional information. Can be used to provide
|
| - /// program state context for other logs (such as what pub was doing when an
|
| - /// IO operation occurred) or just more detail for an operation.
|
| - static const FINE = const Level._("FINE");
|
| -
|
| - const Level._(this.name);
|
| - final String name;
|
| -
|
| - String toString() => name;
|
| - int get hashCode => name.hashCode;
|
| -}
|
| -
|
| -/// A single log entry.
|
| -class Entry {
|
| - final Level level;
|
| - final List<String> lines;
|
| -
|
| - Entry(this.level, this.lines);
|
| -}
|
| -
|
| -/// Logs [message] at [Level.ERROR].
|
| -void error(message, [error]) {
|
| - if (error != null) {
|
| - message = "$message: $error";
|
| - var trace = getAttachedStackTrace(error);
|
| - if (trace != null) {
|
| - message = "$message\nStackTrace: $trace";
|
| - }
|
| - }
|
| - write(Level.ERROR, message);
|
| -}
|
| -
|
| -/// Logs [message] at [Level.WARNING].
|
| -void warning(message) => write(Level.WARNING, message);
|
| -
|
| -/// Logs [message] at [Level.MESSAGE].
|
| -void message(message) => write(Level.MESSAGE, message);
|
| -
|
| -/// Logs [message] at [Level.IO].
|
| -void io(message) => write(Level.IO, message);
|
| -
|
| -/// Logs [message] at [Level.SOLVER].
|
| -void solver(message) => write(Level.SOLVER, message);
|
| -
|
| -/// Logs [message] at [Level.FINE].
|
| -void fine(message) => write(Level.FINE, message);
|
| -
|
| -/// Logs [message] at [level].
|
| -void write(Level level, message) {
|
| - if (_loggers.isEmpty) showNormal();
|
| -
|
| - var lines = splitLines(message.toString());
|
| - var entry = new Entry(level, lines);
|
| -
|
| - var logFn = _loggers[level];
|
| - if (logFn != null) logFn(entry);
|
| -
|
| - if (_transcript != null) _transcript.add(entry);
|
| -}
|
| -
|
| -/// Logs an asynchronous IO operation. Logs [startMessage] before the operation
|
| -/// starts, then when [operation] completes, invokes [endMessage] with the
|
| -/// completion value and logs the result of that. Returns a future that
|
| -/// completes after the logging is done.
|
| -///
|
| -/// If [endMessage] is omitted, then logs "Begin [startMessage]" before the
|
| -/// operation and "End [startMessage]" after it.
|
| -Future ioAsync(String startMessage, Future operation,
|
| - [String endMessage(value)]) {
|
| - if (endMessage == null) {
|
| - io("Begin $startMessage.");
|
| - } else {
|
| - io(startMessage);
|
| - }
|
| -
|
| - return operation.then((result) {
|
| - if (endMessage == null) {
|
| - io("End $startMessage.");
|
| - } else {
|
| - io(endMessage(result));
|
| - }
|
| - return result;
|
| - });
|
| -}
|
| -
|
| -/// Logs the spawning of an [executable] process with [arguments] at [IO]
|
| -/// level.
|
| -void process(String executable, List<String> arguments) {
|
| - io("Spawning $executable ${arguments.join(' ')}");
|
| -}
|
| -
|
| -/// Logs the results of running [executable].
|
| -void processResult(String executable, PubProcessResult result) {
|
| - // Log it all as one message so that it shows up as a single unit in the logs.
|
| - var buffer = new StringBuffer();
|
| - buffer.write("Finished $executable. Exit code ${result.exitCode}.");
|
| -
|
| - dumpOutput(String name, List<String> output) {
|
| - if (output.length == 0) {
|
| - buffer.write("Nothing output on $name.");
|
| - } else {
|
| - buffer.write("$name:");
|
| - var numLines = 0;
|
| - for (var line in output) {
|
| - if (++numLines > 1000) {
|
| - buffer.write('[${output.length - 1000}] more lines of output '
|
| - 'truncated...]');
|
| - break;
|
| - }
|
| -
|
| - buffer.write(line);
|
| - }
|
| - }
|
| - }
|
| -
|
| - dumpOutput("stdout", result.stdout);
|
| - dumpOutput("stderr", result.stderr);
|
| -
|
| - io(buffer.toString());
|
| -}
|
| -
|
| -/// Enables recording of log entries.
|
| -void recordTranscript() {
|
| - _transcript = <Entry>[];
|
| -}
|
| -
|
| -/// If [recordTranscript()] was called, then prints the previously recorded log
|
| -/// transcript to stderr.
|
| -void dumpTranscript() {
|
| - if (_transcript == null) return;
|
| -
|
| - stderr.writeln('---- Log transcript ----');
|
| - for (var entry in _transcript) {
|
| - _logToStderrWithLabel(entry);
|
| - }
|
| - stderr.writeln('---- End log transcript ----');
|
| -}
|
| -
|
| -/// Sets the verbosity to "normal", which shows errors, warnings, and messages.
|
| -void showNormal() {
|
| - _loggers[Level.ERROR] = _logToStderr;
|
| - _loggers[Level.WARNING] = _logToStderr;
|
| - _loggers[Level.MESSAGE] = _logToStdout;
|
| - _loggers[Level.IO] = null;
|
| - _loggers[Level.SOLVER] = null;
|
| - _loggers[Level.FINE] = null;
|
| -}
|
| -
|
| -/// Sets the verbosity to "io", which shows errors, warnings, messages, and IO
|
| -/// event logs.
|
| -void showIO() {
|
| - _loggers[Level.ERROR] = _logToStderrWithLabel;
|
| - _loggers[Level.WARNING] = _logToStderrWithLabel;
|
| - _loggers[Level.MESSAGE] = _logToStdoutWithLabel;
|
| - _loggers[Level.IO] = _logToStderrWithLabel;
|
| - _loggers[Level.SOLVER] = null;
|
| - _loggers[Level.FINE] = null;
|
| -}
|
| -
|
| -/// Sets the verbosity to "solver", which shows errors, warnings, messages, and
|
| -/// solver logs.
|
| -void showSolver() {
|
| - _loggers[Level.ERROR] = _logToStderr;
|
| - _loggers[Level.WARNING] = _logToStderr;
|
| - _loggers[Level.MESSAGE] = _logToStdout;
|
| - _loggers[Level.IO] = null;
|
| - _loggers[Level.SOLVER] = _logToStdout;
|
| - _loggers[Level.FINE] = null;
|
| -}
|
| -
|
| -/// Sets the verbosity to "all", which logs ALL the things.
|
| -void showAll() {
|
| - _loggers[Level.ERROR] = _logToStderrWithLabel;
|
| - _loggers[Level.WARNING] = _logToStderrWithLabel;
|
| - _loggers[Level.MESSAGE] = _logToStdoutWithLabel;
|
| - _loggers[Level.IO] = _logToStderrWithLabel;
|
| - _loggers[Level.SOLVER] = _logToStderrWithLabel;
|
| - _loggers[Level.FINE] = _logToStderrWithLabel;
|
| -}
|
| -
|
| -/// Log function that prints the message to stdout.
|
| -void _logToStdout(Entry entry) {
|
| - _logToStream(stdout, entry, showLabel: false);
|
| -}
|
| -
|
| -/// Log function that prints the message to stdout with the level name.
|
| -void _logToStdoutWithLabel(Entry entry) {
|
| - _logToStream(stdout, entry, showLabel: true);
|
| -}
|
| -
|
| -/// Log function that prints the message to stderr.
|
| -void _logToStderr(Entry entry) {
|
| - _logToStream(stderr, entry, showLabel: false);
|
| -}
|
| -
|
| -/// Log function that prints the message to stderr with the level name.
|
| -void _logToStderrWithLabel(Entry entry) {
|
| - _logToStream(stderr, entry, showLabel: true);
|
| -}
|
| -
|
| -void _logToStream(IOSink sink, Entry entry, {bool showLabel}) {
|
| - bool firstLine = true;
|
| - for (var line in entry.lines) {
|
| - if (showLabel) {
|
| - if (firstLine) {
|
| - sink.write('${entry.level.name}: ');
|
| - } else {
|
| - sink.write(' | ');
|
| - }
|
| - }
|
| -
|
| - sink.writeln(line);
|
| -
|
| - firstLine = false;
|
| - }
|
| -}
|
|
|