using System.Collections;
using System.Collections.Generic;
using System.IO;
+using System.Linq;
using System.Security;
using System.Text;
using Microsoft.Build.Framework;
List<BuildStatusEventArgs> events;
Dictionary<string, List<string>> errorsTable;
Dictionary<string, List<string>> warningsTable;
+ SortedDictionary<string, PerfInfo> targetPerfTable, tasksPerfTable;
string current_events_string;
public ConsoleLogger ()
events = new List<BuildStatusEventArgs> ();
errorsTable = new Dictionary<string, List<string>> ();
warningsTable = new Dictionary<string, List<string>> ();
+ targetPerfTable = new SortedDictionary<string, PerfInfo> ();
+ tasksPerfTable = new SortedDictionary<string, PerfInfo> ();
//defaults
errorColor = ConsoleColor.DarkRed;
return;
}
+ TimeSpan timeElapsed = args.Timestamp - buildStart;
+ if (performanceSummary || verbosity == LoggerVerbosity.Diagnostic)
+ DumpPerformanceSummary ();
+
if (args.Succeeded == true && !projectFailed) {
WriteLine ("Build succeeded.");
} else {
WriteLine ("Build FAILED.");
}
- if (performanceSummary == true) {
- }
-
if (warnings.Count > 0) {
WriteLine (Environment.NewLine + "Warnings:");
SetColor (warningColor);
}
if (showSummary == true){
- TimeSpan timeElapsed = args.Timestamp - buildStart;
WriteLine (String.Format ("\t {0} Warning(s)", warningCount));
WriteLine (String.Format ("\t {0} Error(s)", errorCount));
WriteLine (String.Empty);
void PopEvent ()
{
+ if (performanceSummary || verbosity == LoggerVerbosity.Diagnostic) {
+ var args = events [events.Count - 1];
+ TargetStartedEventArgs tgt_args = args as TargetStartedEventArgs;
+ if (tgt_args != null) {
+ AddPerfInfo (tgt_args.TargetName, args.Timestamp, targetPerfTable);
+ } else {
+ TaskStartedEventArgs tsk_args = args as TaskStartedEventArgs;
+ if (tsk_args != null)
+ AddPerfInfo (tsk_args.TaskName, args.Timestamp, tasksPerfTable);
+ }
+ }
+
events.RemoveAt (events.Count - 1);
current_events_string = null;
}
string last_imported_target_file = String.Empty;
for (int i = 0; i < events.Count; i ++) {
- BuildStatusEventArgs args = events [i];
+ var args = events [i];
ProjectStartedEventArgs pargs = args as ProjectStartedEventArgs;
if (pargs != null) {
sb.AppendFormat ("{0} ({1}) ->\n", pargs.ProjectFile,
return sb.ToString ();
}
+
+ void AddPerfInfo (string name, DateTime start, IDictionary<string, PerfInfo> perf_table)
+ {
+ PerfInfo pi;
+ if (!perf_table.TryGetValue (name, out pi)) {
+ pi = new PerfInfo ();
+ perf_table [name] = pi;
+ }
+
+ pi.Time += DateTime.Now - start;
+ pi.NumberOfCalls ++;
+ }
+
+ void DumpPerformanceSummary ()
+ {
+ SetColor (eventColor);
+ WriteLine ("Target perfomance summary:");
+ ResetColor ();
+
+ foreach (var pi in targetPerfTable.OrderBy (pair => pair.Value.Time))
+ WriteLine (String.Format ("{0,10:0.000} ms {1,-50} {2,5} calls", pi.Value.Time.TotalMilliseconds, pi.Key, pi.Value.NumberOfCalls));
+
+ WriteLine (String.Empty);
+
+ SetColor (eventColor);
+ WriteLine ("Tasks perfomance summary:");
+ ResetColor ();
+
+ foreach (var pi in tasksPerfTable.OrderBy (pair => pair.Value.Time))
+ WriteLine (String.Format ("{0,10:0.000} ms {1,-50} {2,5} calls", pi.Value.Time.TotalMilliseconds, pi.Key, pi.Value.NumberOfCalls));
+
+ WriteLine (String.Empty);
+ }
private void WriteLineWithoutIndent (string message)
{
set { writeHandler = value; }
}
}
+
+ class PerfInfo {
+ public TimeSpan Time;
+ public int NumberOfCalls;
+ }
}
#endif