33// Licensed under the MIT license. 
44
55using  Microsoft . Build . Framework ; 
6+ using  Microsoft . Build . Logging ; 
67using  System ; 
78using  System . Collections . Concurrent ; 
89using  System . Collections . Generic ; 
910using  System . Linq ; 
11+ using  System . Text ; 
1012
1113namespace  Microsoft . Build . Utilities . ProjectCreation 
1214{ 
@@ -35,6 +37,11 @@ public sealed class BuildOutput : ILogger, IDisposable
3537        /// </summary> 
3638        private  readonly  List < BuildWarningEventArgs >  _warnings  =  new  List < BuildWarningEventArgs > ( ) ; 
3739
40+         /// <summary> 
41+         /// Stores all build events. 
42+         /// </summary> 
43+         private  ConcurrentQueue < BuildEventArgs >  _allEvents  =  new  ConcurrentQueue < BuildEventArgs > ( ) ; 
44+ 
3845        /// <summary> 
3946        /// Stores the <see cref="BuildFinishedEventArgs"/> that were logged when the build finished. 
4047        /// </summary> 
@@ -44,6 +51,11 @@ private BuildOutput()
4451        { 
4552        } 
4653
54+         /// <summary> 
55+         /// Gets all events that were logged. 
56+         /// </summary> 
57+         public  IReadOnlyCollection < BuildEventArgs >  AllEvents  =>  _allEvents ; 
58+ 
4759        /// <summary> 
4860        /// Gets the errors that were logged. 
4961        /// </summary> 
@@ -106,6 +118,75 @@ public void Dispose()
106118            _errors . Clear ( ) ; 
107119            _messages . Clear ( ) ; 
108120            _warnings . Clear ( ) ; 
121+             _allEvents  =  null ; 
122+         } 
123+ 
124+         /// <summary> 
125+         /// Gets the current build output in the format of a console log. 
126+         /// </summary> 
127+         /// <param name="verbosity">The logger verbosity to use.</param> 
128+         /// <returns>The build output in the format of a console log.</returns> 
129+         public  string  GetConsoleLog ( LoggerVerbosity  verbosity  =  LoggerVerbosity . Normal ) 
130+         { 
131+             StringBuilder  sb  =  new  StringBuilder ( _allEvents . Count  *  300 ) ; 
132+ 
133+             ConsoleLogger  logger  =  new  ConsoleLogger ( verbosity ,  message =>  sb . AppendLine ( message ) ,  color =>  {  } ,  ( )  =>  {  } ) ; 
134+ 
135+             foreach  ( BuildEventArgs  buildEventArgs  in  _allEvents ) 
136+             { 
137+                 switch  ( buildEventArgs ) 
138+                 { 
139+                     case  BuildMessageEventArgs  buildMessageEventArgs : 
140+                         logger . MessageHandler ( logger ,  buildMessageEventArgs ) ; 
141+                         break ; 
142+ 
143+                     case  BuildErrorEventArgs  buildErrorEventArgs : 
144+                         logger . ErrorHandler ( logger ,  buildErrorEventArgs ) ; 
145+                         break ; 
146+ 
147+                     case  BuildWarningEventArgs  buildWarningEventArgs : 
148+                         logger . WarningHandler ( logger ,  buildWarningEventArgs ) ; 
149+                         break ; 
150+ 
151+                     case  BuildStartedEventArgs  buildStartedEventArgs : 
152+                         logger . BuildStartedHandler ( logger ,  buildStartedEventArgs ) ; 
153+                         break ; 
154+ 
155+                     case  BuildFinishedEventArgs  buildFinishedEventArgs : 
156+                         logger . BuildFinishedHandler ( logger ,  buildFinishedEventArgs ) ; 
157+                         break ; 
158+ 
159+                     case  ProjectStartedEventArgs  projectStartedEventArgs : 
160+                         logger . ProjectStartedHandler ( logger ,  projectStartedEventArgs ) ; 
161+                         break ; 
162+ 
163+                     case  ProjectFinishedEventArgs  projectFinishedEventArgs : 
164+                         logger . ProjectFinishedHandler ( logger ,  projectFinishedEventArgs ) ; 
165+                         break ; 
166+ 
167+                     case  TargetStartedEventArgs  targetStartedEventArgs : 
168+                         logger . TargetStartedHandler ( logger ,  targetStartedEventArgs ) ; 
169+                         break ; 
170+ 
171+                     case  TargetFinishedEventArgs  targetFinishedEventArgs : 
172+                         logger . TargetFinishedHandler ( logger ,  targetFinishedEventArgs ) ; 
173+                         break ; 
174+ 
175+                     case  TaskStartedEventArgs  taskStartedEventArgs : 
176+                         logger . TaskStartedHandler ( logger ,  taskStartedEventArgs ) ; 
177+                         break ; 
178+ 
179+                     case  TaskFinishedEventArgs  taskFinishedEventArgs : 
180+                         logger . TaskFinishedHandler ( logger ,  taskFinishedEventArgs ) ; 
181+                         break ; 
182+ 
183+                     case  CustomBuildEventArgs  customBuildEventArgs : 
184+                         logger . CustomEventHandler ( logger ,  customBuildEventArgs ) ; 
185+                         break ; 
186+                 } 
187+             } 
188+ 
189+             return  sb . ToString ( ) ; 
109190        } 
110191
111192        /// <inheritdoc cref="ILogger.Initialize"/> 
@@ -116,13 +197,19 @@ public void Initialize(IEventSource eventSource)
116197            eventSource . MessageRaised  +=  OnMessageRaised ; 
117198            eventSource . ProjectFinished  +=  OnProjectFinished ; 
118199            eventSource . WarningRaised  +=  OnWarningRaised ; 
200+             eventSource . AnyEventRaised  +=  OnAnyEventRaised ; 
119201        } 
120202
121203        /// <inheritdoc cref="ILogger.Shutdown"/> 
122204        public  void  Shutdown ( ) 
123205        { 
124206        } 
125207
208+         private  void  OnAnyEventRaised ( object  sender ,  BuildEventArgs  e ) 
209+         { 
210+             _allEvents . Enqueue ( e ) ; 
211+         } 
212+ 
126213        private  void  OnBuildFinished ( object  sender ,  BuildFinishedEventArgs  args )  =>  _buildFinished  =  args ; 
127214
128215        private  void  OnErrorRaised ( object  sender ,  BuildErrorEventArgs  args )  =>  _errors . Add ( args ) ; 
0 commit comments