2 // ConsoleLogger.cs: Outputs to the console
5 // Marek Sieradzki (marek.sieradzki@gmail.com)
7 // (C) 2005 Marek Sieradzki
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 using System.Runtime.InteropServices;
33 using System.Security;
34 using Microsoft.Build.Framework;
36 namespace Microsoft.Build.BuildEngine {
37 public class ConsoleLogger : ILogger {
41 LoggerVerbosity verbosity;
42 WriteHandler writeHandler;
46 bool performanceSummary;
48 bool skipProjectStartedText;
50 public ConsoleLogger ()
51 : this (LoggerVerbosity.Normal, null, null, null)
55 public ConsoleLogger (LoggerVerbosity verbosity)
56 : this (LoggerVerbosity.Normal, null, null, null)
60 // FIXME: what about colorSet and colorReset?
61 public ConsoleLogger (LoggerVerbosity verbosity,
64 ColorResetter colorReset)
66 this.verbosity = verbosity;
69 this.warningCount = 0;
71 this.writeHandler += new WriteHandler (WriteHandlerFunction);
73 this.writeHandler += write;
74 this.performanceSummary = false;
75 this.showSummary = true;
76 this.skipProjectStartedText = false;
79 public void ApplyParameter (string parameterName,
80 string parameterValue)
82 // FIXME: what we should do here? in msbuild it isn't
83 // changing "parameters" property
86 public virtual void Initialize (IEventSource eventSource)
88 eventSource.BuildStarted += new BuildStartedEventHandler (BuildStartedHandler);
89 eventSource.BuildFinished += new BuildFinishedEventHandler (BuildFinishedHandler);
90 eventSource.ProjectStarted += new ProjectStartedEventHandler (ProjectStartedHandler);
91 eventSource.ProjectFinished += new ProjectFinishedEventHandler (ProjectFinishedHandler);
92 eventSource.TargetStarted += new TargetStartedEventHandler (TargetStartedHandler);
93 eventSource.TargetFinished += new TargetFinishedEventHandler (TargetFinishedHandler);
94 eventSource.TaskStarted += new TaskStartedEventHandler (TaskStartedHandler);
95 eventSource.TaskFinished += new TaskFinishedEventHandler (TaskFinishedHandler);
96 eventSource.MessageRaised += new BuildMessageEventHandler (MessageHandler);
97 eventSource.WarningRaised += new BuildWarningEventHandler (WarningHandler);
98 eventSource.ErrorRaised += new BuildErrorEventHandler (ErrorHandler);
101 public void BuildStartedHandler (object sender, BuildStartedEventArgs args)
104 WriteLine (String.Format ("Build started {0}.", args.Timestamp));
105 WriteLine ("__________________________________________________");
106 buildStart = args.Timestamp;
109 public void BuildFinishedHandler (object sender, BuildFinishedEventArgs args)
111 if (args.Succeeded == true) {
112 WriteLine ("Build succeeded.");
114 WriteLine ("Build failed.");
116 if (performanceSummary == true) {
118 if (showSummary == true){
119 TimeSpan timeElapsed = args.Timestamp - buildStart;
120 WriteLine (String.Format ("\t {0} Warning(s)", warningCount));
121 WriteLine (String.Format ("\t {0} Error(s)", errorCount));
123 WriteLine (String.Format ("Time Elapsed {0}", timeElapsed));
127 public void ProjectStartedHandler (object sender, ProjectStartedEventArgs args)
129 WriteLine (String.Format ("Project \"{0}\" ({1} target(s)):", args.ProjectFile, args.TargetNames));
133 public void ProjectFinishedHandler (object sender, ProjectFinishedEventArgs args)
135 if (IsVerbosityGreaterOrEqual (LoggerVerbosity.Diagnostic)) {
136 WriteLine (String.Format ("Done building project \"{0}\".", args.ProjectFile));
141 public void TargetStartedHandler (object sender, TargetStartedEventArgs args)
143 WriteLine (String.Format ("Target {0}:",args.TargetName));
147 public void TargetFinishedHandler (object sender, TargetFinishedEventArgs args)
150 if (IsVerbosityGreaterOrEqual (LoggerVerbosity.Diagnostic))
151 WriteLine (String.Format ("Done building target \"{0}\" in project \"{1}\".",
152 args.TargetName, args.ProjectFile));
156 public void TaskStartedHandler (object sender, TaskStartedEventArgs args)
158 if (this.verbosity == LoggerVerbosity.Diagnostic)
159 WriteLine (String.Format ("Task \"{0}\"",args.TaskName));
163 public void TaskFinishedHandler (object sender, TaskFinishedEventArgs args)
166 if (this.verbosity == LoggerVerbosity.Diagnostic)
167 WriteLine (String.Format ("Done executing task \"{0}\"",args.TaskName));
170 public void MessageHandler (object sender, BuildMessageEventArgs args)
172 if (IsMessageOk (args)) {
173 WriteLine (args.Message);
177 public void WarningHandler (object sender, BuildWarningEventArgs args)
179 if (IsVerbosityGreaterOrEqual (LoggerVerbosity.Normal))
180 WriteLineWithoutIndent (FormatWarningEvent (args));
184 public void ErrorHandler (object sender, BuildErrorEventArgs args)
186 if (IsVerbosityGreaterOrEqual (LoggerVerbosity.Minimal))
187 WriteLineWithoutIndent (FormatErrorEvent (args));
192 public void CustomEventHandler (object sender, CustomBuildEventArgs args)
196 private void WriteLine (string message)
198 for (int i = 0; i < indent; i++)
199 Console.Write ('\t');
200 writeHandler (message);
203 private void WriteLineWithoutIndent (string message)
205 writeHandler (message);
208 private void WriteHandlerFunction (string message)
210 Console.WriteLine (message);
213 private void ParseParameters ()
215 string[] splittedParameters = parameters.Split (';');
216 foreach (string s in splittedParameters ) {
218 case "PerformanceSummary":
219 this.performanceSummary = true;
222 this.showSummary = false;
225 throw new ArgumentException ("Invalid parameter.");
230 public virtual void Shutdown ()
234 private string FormatErrorEvent (BuildErrorEventArgs args)
236 // FIXME: show more complicated args
237 if (args.LineNumber != 0 && args.ColumnNumber != 0) {
238 return String.Format ("{0}({1},{2}): {3} error {4}: {5}", args.File, args.LineNumber, args.ColumnNumber,
239 args.Subcategory, args.Code, args.Message);
241 return String.Format ("{0}: {1} error {2}: {3}", args.File, args.Subcategory, args.Code,
246 private string FormatWarningEvent (BuildWarningEventArgs args)
248 // FIXME: show more complicated args
249 if (args.LineNumber != 0 && args.ColumnNumber != 0) {
250 return String.Format ("{0}({1},{2}): {3} warning {4}: {5}", args.File, args.LineNumber, args.ColumnNumber,
251 args.Subcategory, args.Code, args.Message);
253 return String.Format ("{0}: {1} warning {2}: {3}", args.File, args.Subcategory, args.Code,
258 private bool IsMessageOk (BuildMessageEventArgs bsea)
260 if (bsea.Importance == MessageImportance.High && IsVerbosityGreaterOrEqual (LoggerVerbosity.Minimal)) {
262 } else if (bsea.Importance == MessageImportance.Normal && IsVerbosityGreaterOrEqual (LoggerVerbosity.Normal)) {
264 } else if (bsea.Importance == MessageImportance.Low && IsVerbosityGreaterOrEqual (LoggerVerbosity.Detailed)) {
270 private bool IsVerbosityGreaterOrEqual (LoggerVerbosity v)
272 if (v == LoggerVerbosity.Diagnostic) {
273 return LoggerVerbosity.Diagnostic <= verbosity;
274 } else if (v == LoggerVerbosity.Detailed) {
275 return LoggerVerbosity.Detailed <= verbosity;
276 } else if (v == LoggerVerbosity.Normal) {
277 return LoggerVerbosity.Normal <= verbosity;
278 } else if (v == LoggerVerbosity.Minimal) {
279 return LoggerVerbosity.Minimal <= verbosity;
280 } else if (v == LoggerVerbosity.Quiet) {
286 public string Parameters {
292 throw new ArgumentNullException ();
294 if (parameters != String.Empty)
299 public bool ShowSummary {
300 get { return showSummary; }
301 set { showSummary = value; }
304 public bool SkipProjectStartedText {
305 get { return skipProjectStartedText; }
306 set { skipProjectStartedText = value; }
309 public LoggerVerbosity Verbosity {
310 get { return verbosity; }
311 set { verbosity = value; }
314 protected WriteHandler WriteHandler {
315 get { return writeHandler; }
316 set { writeHandler = value; }