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)
103 WriteLine (String.Empty);
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));
122 WriteLine (String.Empty);
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));
130 WriteLine (String.Empty);
133 public void ProjectFinishedHandler (object sender, ProjectFinishedEventArgs args)
135 if (IsVerbosityGreaterOrEqual (LoggerVerbosity.Normal)) {
136 WriteLine (String.Format ("Done building project \"{0}\".{1}", args.ProjectFile,
137 args.Succeeded ? String.Empty : "-- FAILED"));
138 WriteLine (String.Empty);
142 public void TargetStartedHandler (object sender, TargetStartedEventArgs args)
144 WriteLine (String.Format ("Target {0}:",args.TargetName));
148 public void TargetFinishedHandler (object sender, TargetFinishedEventArgs args)
151 if (IsVerbosityGreaterOrEqual (LoggerVerbosity.Diagnostic))
152 WriteLine (String.Format ("Done building target \"{0}\" in project \"{1}\".{2}",
153 args.TargetName, args.ProjectFile,
154 args.Succeeded ? String.Empty : "-- FAILED"));
157 WriteLine (String.Empty);
160 public void TaskStartedHandler (object sender, TaskStartedEventArgs args)
162 if (this.verbosity == LoggerVerbosity.Diagnostic)
163 WriteLine (String.Format ("Task \"{0}\"",args.TaskName));
167 public void TaskFinishedHandler (object sender, TaskFinishedEventArgs args)
170 if (this.verbosity == LoggerVerbosity.Diagnostic) {
172 WriteLine (String.Format ("Done executing task \"{0}\"", args.TaskName));
174 WriteLine (String.Format ("Task \"{0}\" execution failed", args.TaskName));
180 public void MessageHandler (object sender, BuildMessageEventArgs args)
182 if (IsMessageOk (args)) {
183 WriteLine (args.Message);
187 public void WarningHandler (object sender, BuildWarningEventArgs args)
189 if (IsVerbosityGreaterOrEqual (LoggerVerbosity.Normal))
190 WriteLineWithoutIndent (FormatWarningEvent (args));
194 public void ErrorHandler (object sender, BuildErrorEventArgs args)
196 if (IsVerbosityGreaterOrEqual (LoggerVerbosity.Minimal))
197 WriteLineWithoutIndent (FormatErrorEvent (args));
202 public void CustomEventHandler (object sender, CustomBuildEventArgs args)
206 private void WriteLine (string message)
208 for (int i = 0; i < indent; i++)
209 Console.Write ('\t');
210 writeHandler (message);
213 private void WriteLineWithoutIndent (string message)
215 writeHandler (message);
218 private void WriteHandlerFunction (string message)
220 Console.WriteLine (message);
223 private void ParseParameters ()
225 string[] splittedParameters = parameters.Split (';');
226 foreach (string s in splittedParameters ) {
228 case "PerformanceSummary":
229 this.performanceSummary = true;
232 this.showSummary = false;
235 throw new ArgumentException ("Invalid parameter.");
240 public virtual void Shutdown ()
244 private string FormatErrorEvent (BuildErrorEventArgs args)
246 // FIXME: show more complicated args
247 if (args.LineNumber != 0 && args.ColumnNumber != 0) {
248 return String.Format ("{0}({1},{2}): {3} error {4}: {5}", args.File, args.LineNumber, args.ColumnNumber,
249 args.Subcategory, args.Code, args.Message);
251 return String.Format ("{0}: {1} error {2}: {3}", args.File, args.Subcategory, args.Code,
256 private string FormatWarningEvent (BuildWarningEventArgs args)
258 // FIXME: show more complicated args
259 if (args.LineNumber != 0 && args.ColumnNumber != 0) {
260 return String.Format ("{0}({1},{2}): {3} warning {4}: {5}", args.File, args.LineNumber, args.ColumnNumber,
261 args.Subcategory, args.Code, args.Message);
263 return String.Format ("{0}: {1} warning {2}: {3}", args.File, args.Subcategory, args.Code,
268 private bool IsMessageOk (BuildMessageEventArgs bsea)
270 if (bsea.Importance == MessageImportance.High && IsVerbosityGreaterOrEqual (LoggerVerbosity.Minimal)) {
272 } else if (bsea.Importance == MessageImportance.Normal && IsVerbosityGreaterOrEqual (LoggerVerbosity.Normal)) {
274 } else if (bsea.Importance == MessageImportance.Low && IsVerbosityGreaterOrEqual (LoggerVerbosity.Detailed)) {
280 private bool IsVerbosityGreaterOrEqual (LoggerVerbosity v)
282 if (v == LoggerVerbosity.Diagnostic) {
283 return LoggerVerbosity.Diagnostic <= verbosity;
284 } else if (v == LoggerVerbosity.Detailed) {
285 return LoggerVerbosity.Detailed <= verbosity;
286 } else if (v == LoggerVerbosity.Normal) {
287 return LoggerVerbosity.Normal <= verbosity;
288 } else if (v == LoggerVerbosity.Minimal) {
289 return LoggerVerbosity.Minimal <= verbosity;
290 } else if (v == LoggerVerbosity.Quiet) {
296 public string Parameters {
302 throw new ArgumentNullException ();
304 if (parameters != String.Empty)
309 public bool ShowSummary {
310 get { return showSummary; }
311 set { showSummary = value; }
314 public bool SkipProjectStartedText {
315 get { return skipProjectStartedText; }
316 set { skipProjectStartedText = value; }
319 public LoggerVerbosity Verbosity {
320 get { return verbosity; }
321 set { verbosity = value; }
324 protected WriteHandler WriteHandler {
325 get { return writeHandler; }
326 set { writeHandler = value; }