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;
49 public ConsoleLogger ()
50 : this (LoggerVerbosity.Normal)
54 public ConsoleLogger (LoggerVerbosity verbosity)
56 this.verbosity = verbosity;
59 this.warningCount = 0;
60 this.writeHandler += new WriteHandler (WriteHandlerFunction);
61 this.performanceSummary = false;
65 public virtual void ApplyParameter (string parameterName,
66 string parameterValue)
68 // FIXME: what we should do here? in msbuild it isn't
69 // changing "parameters" property
72 public virtual void Initialize (IEventSource eventSource)
74 eventSource.BuildStarted += new BuildStartedEventHandler (BuildStarted);
75 eventSource.BuildFinished += new BuildFinishedEventHandler (BuildFinished);
76 eventSource.ProjectStarted += new ProjectStartedEventHandler (ProjectStarted);
77 eventSource.ProjectFinished += new ProjectFinishedEventHandler (ProjectFinished);
78 eventSource.TargetStarted += new TargetStartedEventHandler (TargetStarted);
79 eventSource.TargetFinished += new TargetFinishedEventHandler (TargetFinished);
80 eventSource.TaskStarted += new TaskStartedEventHandler (TaskStarted);
81 eventSource.TaskFinished += new TaskFinishedEventHandler (TaskFinished);
82 eventSource.MessageRaised += new BuildMessageEventHandler (MessageRaised);
83 eventSource.WarningRaised += new BuildWarningEventHandler (WarningRaised);
84 eventSource.ErrorRaised += new BuildErrorEventHandler (ErrorRaised);
87 public void BuildStarted (object sender, BuildStartedEventArgs args)
90 WriteLine (String.Format ("Build started {0}.", args.TimeStamp));
91 WriteLine ("__________________________________________________");
92 buildStart = args.TimeStamp;
95 public void BuildFinished (object sender, BuildFinishedEventArgs args)
97 if (args.Succeeded == true) {
98 WriteLine ("Build succeeded.");
100 WriteLine ("Build failed.");
102 if (performanceSummary == true)
104 if (summary == true){
105 TimeSpan timeElapsed = args.TimeStamp - buildStart;
106 WriteLine (String.Format ("\t {0} Warning(s)", warningCount));
107 WriteLine (String.Format ("\t {0} Error(s)", errorCount));
109 WriteLine (String.Format ("Time Elapsed {0}", timeElapsed));
113 public void ProjectStarted (object sender, ProjectStartedEventArgs args)
115 WriteLine (String.Format ("Project \"{0}\" ({1} target(s)):", args.ProjectFile, args.TargetNames));
119 public void ProjectFinished (object sender, ProjectFinishedEventArgs args)
121 if (IsVerbosityGreaterOrEqual (LoggerVerbosity.Diagnostic)) {
122 WriteLine (String.Format ("Done building project \"{0}\".", args.ProjectFile));
127 public void TargetStarted (object sender, TargetStartedEventArgs args)
129 WriteLine (String.Format ("Target {0}:",args.TargetName));
133 public void TargetFinished (object sender, TargetFinishedEventArgs args)
136 if (IsVerbosityGreaterOrEqual (LoggerVerbosity.Diagnostic))
137 WriteLine (String.Format ("Done building target \"{0}\" in project \"{1}\".",
138 args.TargetName, args.ProjectFile));
142 public void TaskStarted (object sender, TaskStartedEventArgs args)
144 if (this.verbosity == LoggerVerbosity.Diagnostic)
145 WriteLine (String.Format ("Task \"{0}\"",args.TaskName));
149 public void TaskFinished (object sender, TaskFinishedEventArgs args)
152 if (this.verbosity == LoggerVerbosity.Diagnostic)
153 WriteLine (String.Format ("Done executing task \"{0}\"",args.TaskName));
156 public void MessageRaised (object sender, BuildMessageEventArgs args)
158 if (IsMessageOk (args)) {
159 WriteLine (args.Message);
163 public void WarningRaised (object sender, BuildWarningEventArgs args)
165 if (IsVerbosityGreaterOrEqual (LoggerVerbosity.Normal))
166 WriteLineWithoutIndent (FormatWarningEvent (args));
170 public void ErrorRaised (object sender, BuildErrorEventArgs args)
172 if (IsVerbosityGreaterOrEqual (LoggerVerbosity.Minimal))
173 WriteLineWithoutIndent (FormatErrorEvent (args));
177 private void WriteLine (string message)
179 for (int i = 0; i < indent; i++)
180 Console.Write ('\t');
181 writeHandler (message);
184 private void WriteLineWithoutIndent (string message)
186 writeHandler (message);
189 private void WriteLineWithSender (object sender, string message)
191 if ((string) sender == "MSBuild")
194 WriteLine ((string) sender + ": " + message);
197 private void WriteHandlerFunction (string message)
199 Console.WriteLine (message);
202 private void ParseParameters ()
204 string[] splittedParameters = parameters.Split (';');
205 foreach (string s in splittedParameters ) {
207 case "PerformanceSummary":
208 this.performanceSummary = true;
211 this.summary = false;
214 throw new ArgumentException ("Invalid parameter.");
219 public virtual void Shutdown ()
223 private string FormatErrorEvent (BuildErrorEventArgs args)
225 // FIXME: show more complicated args
226 if (args.LineNumber != 0 && args.ColumnNumber != 0) {
227 return String.Format ("{0}({1},{2}): {3} error {4}: {5}", args.File, args.LineNumber, args.ColumnNumber,
228 args.Subcategory, args.Code, args.Message);
230 return String.Format ("{0}: {1} error {2}: {3}", args.File, args.Subcategory, args.Code,
235 private string FormatWarningEvent (BuildWarningEventArgs args)
237 // FIXME: show more complicated args
238 if (args.LineNumber != 0 && args.ColumnNumber != 0) {
239 return String.Format ("{0}({1},{2}): {3} warning {4}: {5}", args.File, args.LineNumber, args.ColumnNumber,
240 args.Subcategory, args.Code, args.Message);
242 return String.Format ("{0}: {1} warning {2}: {3}", args.File, args.Subcategory, args.Code,
247 private bool IsMessageOk (BuildMessageEventArgs bsea)
249 if (bsea.Importance == MessageImportance.High && IsVerbosityGreaterOrEqual (LoggerVerbosity.Minimal)) {
251 } else if (bsea.Importance == MessageImportance.Normal && IsVerbosityGreaterOrEqual (LoggerVerbosity.Normal)) {
253 } else if (bsea.Importance == MessageImportance.Low && IsVerbosityGreaterOrEqual (LoggerVerbosity.Detailed)) {
259 private bool IsVerbosityGreaterOrEqual (LoggerVerbosity v)
261 if (v == LoggerVerbosity.Diagnostic) {
262 return LoggerVerbosity.Diagnostic <= verbosity;
263 } else if (v == LoggerVerbosity.Detailed) {
264 return LoggerVerbosity.Detailed <= verbosity;
265 } else if (v == LoggerVerbosity.Normal) {
266 return LoggerVerbosity.Normal <= verbosity;
267 } else if (v == LoggerVerbosity.Minimal) {
268 return LoggerVerbosity.Minimal <= verbosity;
269 } else if (v == LoggerVerbosity.Quiet) {
275 public string Parameters {
281 throw new ArgumentNullException ();
283 if (parameters != String.Empty)
288 public LoggerVerbosity Verbosity {
297 protected WriteHandler WriteHandler {
302 writeHandler = value;