Skip to content

Commit

Permalink
Implement NoBuild
Browse files Browse the repository at this point in the history
  • Loading branch information
cdmihai committed Jan 10, 2021
1 parent 540b6fd commit 3353e49
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 7 deletions.
38 changes: 38 additions & 0 deletions src/Build.UnitTests/BackEnd/BuildManager_Tests.cs
Expand Up @@ -212,6 +212,14 @@ private void SimpleP2PBuild(BuildParameters buildParameters)
.ShouldBe(3);
}

[Fact]
public void GraphBuildOptionsDefaults()
{
var options = new GraphBuildOptions();

options.Build.ShouldBeTrue();
}

/// <summary>
/// A simple successful graph build.
/// </summary>
Expand Down Expand Up @@ -4279,5 +4287,35 @@ public void GraphBuildCircular()
result.OverallResult.ShouldBe(BuildResultCode.Failure);
result.CircularDependency.ShouldBeTrue();
}

[Fact]
public void GraphBuildShouldBeAbleToConstructGraphButSkipBuild()
{
var graph = Helpers.CreateProjectGraph(_env, new Dictionary<int, int[]> {{1, new[] {2, 3}}});

MockLogger logger = null;

using (var buildSession = new Helpers.BuildManagerSession(_env))
{
var graphResult = buildSession.BuildGraphSubmission(
new GraphBuildRequestData(
projectGraphEntryPoints: new[] {new ProjectGraphEntryPoint(graph.GraphRoots.First().ProjectInstance.FullPath)},
targetsToBuild: new string[0],
hostServices: null,
flags: BuildRequestDataFlags.None,
graphBuildOptions: new GraphBuildOptions {Build = false}));

graphResult.OverallResult.ShouldBe(BuildResultCode.Success);
logger = buildSession.Logger;
}

logger.EvaluationStartedEvents.Count.ShouldBe(3);
logger.ProjectStartedEvents.ShouldBeEmpty();
logger.TargetStartedEvents.ShouldBeEmpty();
logger.BuildStartedEvents.ShouldHaveSingleItem();
logger.BuildFinishedEvents.ShouldHaveSingleItem();
logger.FullLog.ShouldContain("Static graph loaded in");
logger.FullLog.ShouldContain("3 nodes, 2 edges");
}
}
}
1 change: 0 additions & 1 deletion src/Build.UnitTests/Graph/ProjectGraph_Tests.cs
Expand Up @@ -7,7 +7,6 @@
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using Microsoft.Build.BackEnd;
using Microsoft.Build.Evaluation;
using Microsoft.Build.Exceptions;
using Microsoft.Build.Execution;
Expand Down
20 changes: 14 additions & 6 deletions src/Build/BackEnd/BuildManager/BuildManager.cs
Expand Up @@ -1447,12 +1447,20 @@ private void ExecuteGraphBuildScheduler(GraphBuildSubmission submission)
projectGraph.ConstructionMetrics.NodeCount,
projectGraph.ConstructionMetrics.EdgeCount));

IReadOnlyDictionary<ProjectGraphNode, ImmutableList<string>> targetLists = projectGraph.GetTargetLists(submission.BuildRequestData.TargetNames);
Dictionary<ProjectGraphNode, BuildResult> resultsPerNode = null;

var resultsPerNode = BuildGraph(projectGraph, targetLists, submission);
if (submission.BuildRequestData.GraphBuildOptions.Build)
{
IReadOnlyDictionary<ProjectGraphNode, ImmutableList<string>> targetLists = projectGraph.GetTargetLists(submission.BuildRequestData.TargetNames);

resultsPerNode = BuildGraph(projectGraph, targetLists, submission.BuildRequestData);
}

// The overall submission is complete, so report it as complete
ReportResultsToSubmission(new GraphBuildResult(submission.SubmissionId, new ReadOnlyDictionary<ProjectGraphNode, BuildResult>(resultsPerNode)));
ReportResultsToSubmission(
new GraphBuildResult(
submission.SubmissionId,
new ReadOnlyDictionary<ProjectGraphNode, BuildResult>(resultsPerNode ?? new Dictionary<ProjectGraphNode, BuildResult>())));
}
catch (Exception ex) when (!ExceptionHandling.IsCriticalException(ex))
{
Expand Down Expand Up @@ -1507,7 +1515,7 @@ private void ExecuteGraphBuildScheduler(GraphBuildSubmission submission)
private Dictionary<ProjectGraphNode, BuildResult> BuildGraph(
ProjectGraph projectGraph,
IReadOnlyDictionary<ProjectGraphNode, ImmutableList<string>> targetsPerNode,
GraphBuildSubmission graphSubmission)
GraphBuildRequestData graphBuildRequestData)
{
var waitHandle = new AutoResetEvent(true);
var graphBuildStateLock = new object();
Expand Down Expand Up @@ -1543,8 +1551,8 @@ private void ExecuteGraphBuildScheduler(GraphBuildSubmission submission)
var request = new BuildRequestData(
node.ProjectInstance,
targetList.ToArray(),
graphSubmission.BuildRequestData.HostServices,
graphSubmission.BuildRequestData.Flags);
graphBuildRequestData.HostServices,
graphBuildRequestData.Flags);

// TODO Tack onto the existing submission instead of pending a whole new submission for every node
// Among other things, this makes BuildParameters.DetailedSummary produce a summary for each node, which is not desirable.
Expand Down
20 changes: 20 additions & 0 deletions src/Shared/UnitTests/MockLogger.cs
Expand Up @@ -81,6 +81,16 @@ internal sealed class MockLogger : ILogger
/// </summary>
internal List<ExternalProjectFinishedEventArgs> ExternalProjectFinishedEvents { get; } = new List<ExternalProjectFinishedEventArgs>();

/// <summary>
/// List of ProjectStarted events
/// </summary>
internal List<ProjectEvaluationStartedEventArgs> EvaluationStartedEvents { get; } = new List<ProjectEvaluationStartedEventArgs>();

/// <summary>
/// List of ProjectFinished events
/// </summary>
internal List<ProjectEvaluationFinishedEventArgs> EvaluationFinishedEvents { get; } = new List<ProjectEvaluationFinishedEventArgs>();

/// <summary>
/// List of ProjectStarted events
/// </summary>
Expand Down Expand Up @@ -293,6 +303,16 @@ internal void LoggerEventHandler(object sender, BuildEventArgs eventArgs)
ExternalProjectFinishedEvents.Add(finishedEventArgs);
break;
}
case ProjectEvaluationStartedEventArgs evaluationStartedEventArgs:
{
EvaluationStartedEvents.Add(evaluationStartedEventArgs);
break;
}
case ProjectEvaluationFinishedEventArgs evaluationFinishedEventArgs:
{
EvaluationFinishedEvents.Add(evaluationFinishedEventArgs);
break;
}
case ProjectStartedEventArgs startedEventArgs:
{
ProjectStartedEvents.Add(startedEventArgs);
Expand Down
5 changes: 5 additions & 0 deletions src/Shared/UnitTests/ObjectModelHelpers.cs
Expand Up @@ -1924,6 +1924,11 @@ internal class BuildManagerSession : IDisposable
_buildManager.BeginBuild(actualBuildParameters, deferredMessages);
}

public GraphBuildResult BuildGraphSubmission(GraphBuildRequestData requestData)
{
return _buildManager.BuildRequest(requestData);
}

public BuildResult BuildProjectFile(string projectFile, string[] entryTargets = null)
{
var buildResult = _buildManager.BuildRequest(
Expand Down

0 comments on commit 3353e49

Please sign in to comment.