Skip to content

Commit

Permalink
Add support for viewing source files in structured logger.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
KirillOsenkov committed Jun 16, 2017
1 parent 7746302 commit 19d71d3
Show file tree
Hide file tree
Showing 5 changed files with 58 additions and 7 deletions.
7 changes: 7 additions & 0 deletions src/StructuredLogViewer/HostedBuild.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,13 @@ public Task<Build> 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)
Expand Down
7 changes: 7 additions & 0 deletions src/StructuredLogger/BinaryLog.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Diagnostics;
using System.IO;

namespace Microsoft.Build.Logging.StructuredLogger
{
Expand Down Expand Up @@ -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() });

Expand Down
1 change: 1 addition & 0 deletions src/StructuredLogger/BinaryLogger/BinaryLogger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ public enum ProjectImportsCollectionMode
public void Initialize(IEventSource eventSource)
{
Environment.SetEnvironmentVariable("MSBUILDTARGETOUTPUTLOGGING", "true");
Environment.SetEnvironmentVariable("MSBUILDLOGIMPORTS", "1");

ProcessParameters();

Expand Down
7 changes: 7 additions & 0 deletions src/StructuredLogger/Serialization/Binary/BinaryLogReader.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.IO;

namespace Microsoft.Build.Logging.StructuredLogger
{
Expand All @@ -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;
}
}
Expand Down
43 changes: 36 additions & 7 deletions src/StructuredLogger/StructuredLogger.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.IO;
using System.Reflection;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;

Expand All @@ -16,7 +17,7 @@ public class StructuredLogger : Logger
/// The path to the log file specified by the user
/// </summary>
private string _logFile;
private ProjectImportsCollector sourceFileCollector;
private ProjectImportsCollector projectImportsCollector;

public static Build CurrentBuild { get; set; }
public static bool SaveLogToDisk { get; set; } = true;
Expand All @@ -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");
Expand All @@ -38,7 +40,7 @@ public override void Initialize(IEventSource eventSource)
{
try
{
sourceFileCollector = new ProjectImportsCollector(_logFile);
projectImportsCollector = new ProjectImportsCollector(_logFile);
}
catch (Exception ex)
{
Expand All @@ -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
{
Expand All @@ -84,10 +113,10 @@ public override void Shutdown()
{
base.Shutdown();

if (sourceFileCollector != null)
if (projectImportsCollector != null)
{
sourceFileCollector.Close();
sourceFileCollector = null;
projectImportsCollector.Close();
projectImportsCollector = null;
}
}

Expand Down

0 comments on commit 19d71d3

Please sign in to comment.