[xbuild] ConsoleLogger - parse params only on Initialize.
[mono.git] / mcs / class / Microsoft.Build.Engine / Microsoft.Build.BuildEngine / ConsoleLogger.cs
index 2ccefe63b9cb2b7436fc743344f76dd103a1d332..2381cff584c7d3271e2f871a4c56d42318682715 100644 (file)
@@ -197,8 +197,68 @@ namespace Microsoft.Build.BuildEngine {
                public void ApplyParameter (string parameterName,
                                            string parameterValue)
                {
-                       // FIXME: what we should do here? in msbuild it isn't
-                       // changing "parameters" property
+                       switch (parameterName) {
+                               case "PerformanceSummary":
+                                       this.performanceSummary = true;
+                                       break;
+                               case "Summary":
+                                       this.showSummary = true;
+                                       break;
+                               case "NoSummary":
+                                       this.showSummary = false;
+                                       break;
+                               case "NoItemAndPropertyList":
+                                       this.noItemAndPropertyList = true;
+                                       break;
+                               default:
+                                       if (parameterName.StartsWith ("Verbosity="))
+                                               ParseVerbosity (parameterName);
+                                       break;
+                       }
+               }
+
+               void ParseVerbosity (string s)
+               {
+                       string key, value;
+                       if (!TrySplitKeyValuePair (s, out key, out value))
+                               throw new LoggerException ("Unknown Verbosity, should be set as 'Verbosity=<verbosity>'");
+
+                       switch (value) {
+                       case "q":
+                       case "quiet":
+                               Verbosity = LoggerVerbosity.Quiet;
+                               break;
+                       case "m":
+                       case "minimal":
+                               Verbosity = LoggerVerbosity.Minimal;
+                               break;
+                       case "n":
+                       case "normal":
+                               Verbosity = LoggerVerbosity.Normal;
+                               break;
+                       case "d":
+                       case "detailed":
+                               Verbosity = LoggerVerbosity.Detailed;
+                               break;
+                       case "diag":
+                       case "diagnostic":
+                               Verbosity = LoggerVerbosity.Diagnostic;
+                               break;
+                       default:
+                               throw new LoggerException (String.Format ("Unknown verbosity - '{0}'", s));
+                       }
+               }
+
+               bool TrySplitKeyValuePair (string pair, out string key, out string value)
+               {
+                       key = value = null;
+                       string[] parts = pair.Split ('=');
+                       if (parts.Length != 2)
+                               return false;
+
+                       key = parts [0];
+                       value = parts [1];
+                       return true;
                }
 
                public virtual void Initialize (IEventSource eventSource)
@@ -220,6 +280,9 @@ namespace Microsoft.Build.BuildEngine {
                        eventSource.MessageRaised += MessageHandler;
                        eventSource.WarningRaised += WarningHandler;
                        eventSource.ErrorRaised += ErrorHandler;
+
+                       if (!String.IsNullOrEmpty (parameters))
+                               ParseParameters ();
                }
 
                public void BuildStartedHandler (object sender, BuildStartedEventArgs args)
@@ -235,6 +298,25 @@ namespace Microsoft.Build.BuildEngine {
                }
                
                public void BuildFinishedHandler (object sender, BuildFinishedEventArgs args)
+               {
+                       BuildFinishedHandlerActual (args);
+
+                       // Reset
+                       events.Clear ();
+                       errorsTable.Clear ();
+                       warningsTable.Clear ();
+                       targetPerfTable.Clear ();
+                       tasksPerfTable.Clear ();
+                       errors.Clear ();
+                       warnings.Clear ();
+
+                       indent = 0;
+                       errorCount = 0;
+                       warningCount = 0;
+                       projectFailed = false;
+               }
+
+               void BuildFinishedHandlerActual (BuildFinishedEventArgs args)
                {
                        if (!IsVerbosityGreaterOrEqual (LoggerVerbosity.Normal)) {
                                PopEvent (args);
@@ -304,7 +386,6 @@ namespace Microsoft.Build.BuildEngine {
                                WriteLine (String.Format ("Project \"{0}\" ({1} target(s)):", args.ProjectFile,
                                                        String.IsNullOrEmpty (args.TargetNames) ? "default" : args.TargetNames));
                                ResetColor ();
-                               WriteLine (String.Empty);
                                DumpProperties (args.Properties);
                                DumpItems (args.Items);
                        }
@@ -331,6 +412,7 @@ namespace Microsoft.Build.BuildEngine {
                        if (IsVerbosityGreaterOrEqual (LoggerVerbosity.Normal)) {
                                indent++;
                                SetColor (eventColor);
+                               WriteLine (String.Empty);
                                WriteLine (String.Format ("Target {0}:",args.TargetName));
                                ResetColor ();
                        }
@@ -352,7 +434,7 @@ namespace Microsoft.Build.BuildEngine {
                
                public void TaskStartedHandler (object sender, TaskStartedEventArgs args)
                {
-                       if (this.verbosity == LoggerVerbosity.Detailed) {
+                       if (IsVerbosityGreaterOrEqual (LoggerVerbosity.Detailed)) {
                                SetColor (eventColor);
                                WriteLine (String.Format ("Task \"{0}\"",args.TaskName));
                                ResetColor ();
@@ -437,9 +519,11 @@ namespace Microsoft.Build.BuildEngine {
                                StringBuilder sb = new StringBuilder ();
                                for (int i = 0; i < indent; i++)
                                        sb.Append ('\t');
-                               sb.Append (message);
 
-                               writeHandler (sb.ToString ());
+                               string indent_str = sb.ToString ();
+
+                               foreach (string line in message.Split (new string[] {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries))
+                                       writeHandler (indent_str + line);
                        } else {
                                writeHandler (message);
                        }
@@ -586,21 +670,8 @@ namespace Microsoft.Build.BuildEngine {
                private void ParseParameters ()
                {
                        string[] splittedParameters = parameters.Split (';');
-                       foreach (string s in splittedParameters ) {
-                               switch (s) {
-                               case "PerformanceSummary":
-                                       this.performanceSummary = true;
-                                       break;
-                               case "NoSummary":
-                                       this.showSummary = false;
-                                       break;
-                               case "NoItemAndPropertyList":
-                                       this.noItemAndPropertyList = true;
-                                       break;
-                               default:
-                                       throw new ArgumentException ("Invalid parameter : " + s);
-                               }
-                       }
+                       foreach (string s in splittedParameters )
+                               ApplyParameter (s, null);
                }
                
                public virtual void Shutdown ()
@@ -705,7 +776,7 @@ namespace Microsoft.Build.BuildEngine {
                                return;
 
                        SetColor (eventColor);
-                       WriteLine ("\n");
+                       WriteLine (String.Empty);
                        WriteLine ("Initial Properties:");
                        ResetColor ();
 
@@ -718,7 +789,6 @@ namespace Microsoft.Build.BuildEngine {
 
                        foreach (KeyValuePair<string, string> pair in dict)
                                WriteLine (String.Format ("{0} = {1}", pair.Key, pair.Value));
-                       WriteLine ("\n");
                }
 
                void DumpItems (IEnumerable items)
@@ -727,7 +797,7 @@ namespace Microsoft.Build.BuildEngine {
                                return;
 
                        SetColor (eventColor);
-                       WriteLine ("\n");
+                       WriteLine (String.Empty);
                        WriteLine ("Initial Items:");
                        ResetColor ();
                        if (items == null)
@@ -749,7 +819,6 @@ namespace Microsoft.Build.BuildEngine {
                                        WriteLine (item.ItemSpec);
                                indent--;
                        }
-                       WriteLine ("\n");
                }
 
                public string Parameters {
@@ -760,8 +829,6 @@ namespace Microsoft.Build.BuildEngine {
                                if (value == null)
                                        throw new ArgumentNullException ();
                                parameters = value;
-                               if (parameters != String.Empty)
-                                       ParseParameters ();
                        }
                }