From 19d71d392d4d2564ead8562d2c0a8bcf707ecc7c Mon Sep 17 00:00:00 2001 From: Kirill Osenkov Date: Fri, 16 Jun 2017 12:38:55 -0700 Subject: [PATCH] Add support for viewing source files in structured logger. Set MSBUILDLOGIMPORTS in both loggers. Collect imported projects mentioned in ProjectImportedEventArgs in structured logger. Support reading files from a .zip archive in both log readers. --- src/StructuredLogViewer/HostedBuild.cs | 7 +++ src/StructuredLogger/BinaryLog.cs | 7 +++ .../BinaryLogger/BinaryLogger.cs | 1 + .../Serialization/Binary/BinaryLogReader.cs | 7 +++ src/StructuredLogger/StructuredLogger.cs | 43 ++++++++++++++++--- 5 files changed, 58 insertions(+), 7 deletions(-) diff --git a/src/StructuredLogViewer/HostedBuild.cs b/src/StructuredLogViewer/HostedBuild.cs index c8119b2c..68a47ab4 100644 --- a/src/StructuredLogViewer/HostedBuild.cs +++ b/src/StructuredLogViewer/HostedBuild.cs @@ -63,6 +63,13 @@ public Task BuildAndGetResult(BuildProgress progress) var build = Serialization.Read(logFilePath); File.Delete(logFilePath); + + var projectImportsZip = Path.ChangeExtension(logFilePath, ".ProjectImports.zip"); + if (File.Exists(projectImportsZip)) + { + File.Delete(projectImportsZip); + } + return build; } catch (Exception ex) diff --git a/src/StructuredLogger/BinaryLog.cs b/src/StructuredLogger/BinaryLog.cs index b53b70f3..515662e0 100644 --- a/src/StructuredLogger/BinaryLog.cs +++ b/src/StructuredLogger/BinaryLog.cs @@ -1,4 +1,5 @@ using System.Diagnostics; +using System.IO; namespace Microsoft.Build.Logging.StructuredLogger { @@ -37,6 +38,12 @@ public static Build ReadBuild(string filePath) build.AddChild(new Error() { Text = "Error when opening the file: " + filePath }); } + var projectImportsZip = Path.ChangeExtension(filePath, ".ProjectImports.zip"); + if (sourceArchive == null && File.Exists(projectImportsZip)) + { + sourceArchive = File.ReadAllBytes(projectImportsZip); + } + build.SourceFilesArchive = sourceArchive; // build.AddChildAtBeginning(new Message { Text = "Elapsed: " + elapsed.ToString() }); diff --git a/src/StructuredLogger/BinaryLogger/BinaryLogger.cs b/src/StructuredLogger/BinaryLogger/BinaryLogger.cs index 6c1066b2..a242abf4 100644 --- a/src/StructuredLogger/BinaryLogger/BinaryLogger.cs +++ b/src/StructuredLogger/BinaryLogger/BinaryLogger.cs @@ -71,6 +71,7 @@ public enum ProjectImportsCollectionMode public void Initialize(IEventSource eventSource) { Environment.SetEnvironmentVariable("MSBUILDTARGETOUTPUTLOGGING", "true"); + Environment.SetEnvironmentVariable("MSBUILDLOGIMPORTS", "1"); ProcessParameters(); diff --git a/src/StructuredLogger/Serialization/Binary/BinaryLogReader.cs b/src/StructuredLogger/Serialization/Binary/BinaryLogReader.cs index 1e6e6599..05e6286c 100644 --- a/src/StructuredLogger/Serialization/Binary/BinaryLogReader.cs +++ b/src/StructuredLogger/Serialization/Binary/BinaryLogReader.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; namespace Microsoft.Build.Logging.StructuredLogger { @@ -23,6 +24,12 @@ public static Build Read(string filePath) buildStringCache.Intern(stringInstance); } + var projectImportsZip = Path.ChangeExtension(filePath, ".ProjectImports.zip"); + if (File.Exists(projectImportsZip)) + { + build.SourceFilesArchive = File.ReadAllBytes(projectImportsZip); + } + return build; } } diff --git a/src/StructuredLogger/StructuredLogger.cs b/src/StructuredLogger/StructuredLogger.cs index b4e75098..0a3d366c 100644 --- a/src/StructuredLogger/StructuredLogger.cs +++ b/src/StructuredLogger/StructuredLogger.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Reflection; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; @@ -16,7 +17,7 @@ public class StructuredLogger : Logger /// The path to the log file specified by the user /// private string _logFile; - private ProjectImportsCollector sourceFileCollector; + private ProjectImportsCollector projectImportsCollector; public static Build CurrentBuild { get; set; } public static bool SaveLogToDisk { get; set; } = true; @@ -28,6 +29,7 @@ public class StructuredLogger : Logger public override void Initialize(IEventSource eventSource) { Environment.SetEnvironmentVariable("MSBUILDTARGETOUTPUTLOGGING", "true"); + Environment.SetEnvironmentVariable("MSBUILDLOGIMPORTS", "1"); // Set this environment variable to log AssemblyFoldersEx search results from ResolveAssemblyReference // Environment.SetEnvironmentVariable("MSBUILDLOGVERBOSERARSEARCHRESULTS", "true"); @@ -38,7 +40,7 @@ public override void Initialize(IEventSource eventSource) { try { - sourceFileCollector = new ProjectImportsCollector(_logFile); + projectImportsCollector = new ProjectImportsCollector(_logFile); } catch (Exception ex) { @@ -63,17 +65,44 @@ public override void Initialize(IEventSource eventSource) eventSource.CustomEventRaised += construction.CustomEventRaised; eventSource.StatusEventRaised += construction.StatusEventRaised; - if (sourceFileCollector != null) + if (projectImportsCollector != null) { eventSource.AnyEventRaised += EventSource_AnyEventRaised; } + + projectImportedEventArgsType = typeof(BuildEventArgs) + .GetTypeInfo() + .Assembly + .GetType("Microsoft.Build.Framework.ProjectImportedEventArgs"); + if (projectImportedEventArgsType != null) + { + importedProjectFile = projectImportedEventArgsType.GetProperty("ImportedProjectFile", BindingFlags.Public | BindingFlags.Instance); + unexpandedProject = projectImportedEventArgsType.GetProperty("UnexpandedProject", BindingFlags.Public | BindingFlags.Instance); + } } + private Type projectImportedEventArgsType; + private PropertyInfo importedProjectFile; + private PropertyInfo unexpandedProject; + private void EventSource_AnyEventRaised(object sender, BuildEventArgs e) { try { - sourceFileCollector?.IncludeSourceFiles(e); + if (projectImportedEventArgsType != null && e.GetType() == projectImportedEventArgsType) + { + string importedProjectFile = (string)this.importedProjectFile.GetValue(e); + //string unexpandedProject = (string)this.unexpandedProject.GetValue(e); + //var buildMessage = (BuildMessageEventArgs)e; + //ProjectImportedEventArgs args = new ProjectImportedEventArgs(buildMessage.LineNumber, buildMessage.ColumnNumber, buildMessage.Message); + //args.ImportedProjectFile = importedProjectFile; + //args.UnexpandedProject = unexpandedProject; + //args.BuildEventContext = buildMessage.BuildEventContext; + projectImportsCollector.AddFile(importedProjectFile); + return; + } + + projectImportsCollector?.IncludeSourceFiles(e); } catch { @@ -84,10 +113,10 @@ public override void Shutdown() { base.Shutdown(); - if (sourceFileCollector != null) + if (projectImportsCollector != null) { - sourceFileCollector.Close(); - sourceFileCollector = null; + projectImportsCollector.Close(); + projectImportsCollector = null; } }