4 // Rolf Bjarne Kvinge (rolf@xamarin.com)
6 // Copyright (C) 2011 Xamarin Inc.
8 // Permission is hereby granted, free of charge, to any person obtaining
9 // a copy of this software and associated documentation files (the
10 // "Software"), to deal in the Software without restriction, including
11 // without limitation the rights to use, copy, modify, merge, publish,
12 // distribute, sublicense, and/or sell copies of the Software, and to
13 // permit persons to whom the Software is furnished to do so, subject to
14 // the following conditions:
16 // The above copyright notice and this permission notice shall be
17 // included in all copies or substantial portions of the Software.
19 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
23 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
24 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
25 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 using System.Globalization;
30 using Microsoft.Build.Framework;
32 namespace Microsoft.Build.Logging
34 public class ConsoleLogger : INodeLogger
36 public ConsoleLogger ()
37 : this (LoggerVerbosity.Normal)
41 public ConsoleLogger (LoggerVerbosity verbosity)
42 : this (verbosity, message => Console.WriteLine (message), color => Console.ForegroundColor = color, Console.ResetColor)
46 public ConsoleLogger (LoggerVerbosity verbosity, WriteHandler write, ColorSetter colorSet, ColorResetter colorReset)
49 throw new ArgumentNullException ("write");
51 throw new ArgumentNullException ("colorSet");
52 if (colorReset == null)
53 throw new ArgumentNullException ("colorReset");
54 Verbosity = verbosity;
57 reset_color = colorReset;
61 ColorSetter set_color;
62 ColorResetter reset_color;
64 #region INodeLogger implementation
66 public virtual void Initialize (IEventSource eventSource, int nodeCount)
68 throw new NotImplementedException ();
73 #region ILogger implementation
75 public virtual void Initialize (IEventSource eventSource)
77 throw new NotImplementedException ();
80 public virtual void Shutdown ()
82 throw new NotImplementedException ();
85 public string Parameters { get; set; }
87 public LoggerVerbosity Verbosity { get; set; }
89 public bool ShowSummary { get; set; }
91 public bool SkipProjectStartedText { get; set; }
93 public WriteHandler WriteHandler {
97 throw new ArgumentNullException ("value");
104 public void ApplyParameter (string parameterName, string parameterValue)
106 throw new NotImplementedException ();
109 DateTime build_started;
111 public void BuildFinishedHandler (object sender, BuildFinishedEventArgs e)
113 if (Verbosity == LoggerVerbosity.Quiet || Verbosity == LoggerVerbosity.Minimal)
116 set_color (ConsoleColor.White);
121 // .NET doesn't care if BuildStarted is actually invoked.
122 write (string.Format ("Time Elapsed {0}", (e.Timestamp - build_started).ToString ("hh\\:mm\\:ss\\.ff")));
127 public void BuildStartedHandler (object sender, BuildStartedEventArgs e)
129 if (Verbosity == LoggerVerbosity.Quiet || Verbosity == LoggerVerbosity.Minimal)
132 build_started = e.Timestamp;
133 set_color (ConsoleColor.White);
134 write (string.Format ("Build started {0}.", e.Timestamp.ToString ("yyyy/MM/dd HH:mm:ss")));
139 public void CustomEventHandler (object sender, CustomBuildEventArgs e)
144 string GetLocation (int lineNumber, int columnNumber, int endLineNumber, int endColumnNumber)
146 string line = null, col = null;
147 if (lineNumber > 0) {
148 if (endLineNumber > 0)
149 line = string.Format ("{0}-{1}", lineNumber, endLineNumber);
151 line = lineNumber.ToString ();
153 if (columnNumber > 0) {
154 if (endColumnNumber > 0)
155 col = string.Format ("{0}-{1}", columnNumber, endColumnNumber);
157 col = columnNumber.ToString ();
159 string loc = line != null ? line + (col != null ? "," + col : null) : null;
160 return string.IsNullOrEmpty (loc) ? string.Empty : '(' + loc + ')';
163 public void ErrorHandler (object sender, BuildErrorEventArgs e)
165 if (Verbosity == LoggerVerbosity.Quiet)
168 set_color (ConsoleColor.Red);
169 string loc = GetLocation (e.LineNumber, e.ColumnNumber, e.EndLineNumber, e.EndColumnNumber);
170 write (string.Format ("{0}{1} : {2} error {3}: {4}", e.File, loc, e.Subcategory, e.Code, e.Message));
175 public void MessageHandler (object sender, BuildMessageEventArgs e)
177 switch (e.Importance) {
178 case MessageImportance.High:
179 set_color (ConsoleColor.White);
181 case MessageImportance.Low:
182 case MessageImportance.Normal:
183 set_color (ConsoleColor.Gray);
190 public void ProjectFinishedHandler (object sender, ProjectFinishedEventArgs e)
192 if (Verbosity == LoggerVerbosity.Quiet || Verbosity == LoggerVerbosity.Minimal)
195 set_color (ConsoleColor.Cyan);
203 public void ProjectStartedHandler (object sender, ProjectStartedEventArgs e)
205 if (Verbosity == LoggerVerbosity.Quiet || Verbosity == LoggerVerbosity.Minimal)
208 set_color (ConsoleColor.Cyan);
209 write ("__________________________________________________");
211 write (string.Format ("Project \"{0}\" ({1} target(s)):", e.ProjectFile, e.TargetNames));
218 public void TargetFinishedHandler (object sender, TargetFinishedEventArgs e)
220 if (Verbosity != LoggerVerbosity.Detailed && Verbosity != LoggerVerbosity.Diagnostic)
223 set_color (ConsoleColor.Cyan);
231 public void TargetStartedHandler (object sender, TargetStartedEventArgs e)
233 if (Verbosity != LoggerVerbosity.Detailed && Verbosity != LoggerVerbosity.Diagnostic)
236 string message = Verbosity == LoggerVerbosity.Detailed ?
237 string.Format ("Target \"{0}\":", e.TargetName) :
238 string.Format ("Target \"{0}\" in file \"{1}\":", e.TargetName, e.TargetFile);
240 set_color (ConsoleColor.Cyan);
246 public void TaskFinishedHandler (object sender, TaskFinishedEventArgs e)
248 if (Verbosity != LoggerVerbosity.Detailed && Verbosity != LoggerVerbosity.Diagnostic)
251 set_color (ConsoleColor.Cyan);
252 write (" " + e.Message);
257 public void TaskStartedHandler (object sender, TaskStartedEventArgs e)
259 if (Verbosity != LoggerVerbosity.Detailed && Verbosity != LoggerVerbosity.Diagnostic)
262 set_color (ConsoleColor.Cyan);
263 write (" " + e.Message);
268 public void WarningHandler (object sender, BuildWarningEventArgs e)
270 if (Verbosity == LoggerVerbosity.Quiet)
273 set_color (ConsoleColor.Yellow);
274 string loc = GetLocation (e.LineNumber, e.ColumnNumber, e.EndLineNumber, e.EndColumnNumber);
275 write (string.Format ("{0}{1} : {2} warning {3}: {4}", e.File, loc, e.Subcategory, e.Code, e.Message));