Skip to content

Commit 65950f7

Browse files
authored
Fix hang if build does not start (Buildalyzer#272)
1 parent e1c24ec commit 65950f7

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

src/Buildalyzer/ProjectAnalyzer.cs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using Buildalyzer.Logger;
1010
using Buildalyzer.Logging;
1111
using Microsoft.Build.Construction;
12+
using Microsoft.Build.Framework;
1213
using Microsoft.Build.Logging;
1314
using Microsoft.Extensions.Logging;
1415
using MsBuildPipeLogger;
@@ -153,6 +154,14 @@ private IAnalyzerResults BuildTargets(
153154
using (CancellationTokenSource cancellation = new CancellationTokenSource())
154155
{
155156
using var pipeLogger = new AnonymousPipeLoggerServer(cancellation.Token);
157+
bool receivedAnyEvent = false;
158+
159+
void OnPipeLoggerOnAnyEventRaised(object o, BuildEventArgs buildEventArgs)
160+
{
161+
receivedAnyEvent = true;
162+
}
163+
164+
pipeLogger.AnyEventRaised += OnPipeLoggerOnAnyEventRaised;
156165
using var eventProcessor = new EventProcessor(Manager, this, BuildLoggers, pipeLogger, results != null);
157166

158167
// Run MSBuild
@@ -170,8 +179,24 @@ private IAnalyzerResults BuildTargets(
170179
GetEffectiveEnvironmentVariables(buildEnvironment),
171180
Manager.LoggerFactory))
172181
{
182+
void OnProcessRunnerExited()
183+
{
184+
if (!receivedAnyEvent && processRunner.ExitCode != 0)
185+
{
186+
pipeLogger.Dispose();
187+
}
188+
}
189+
190+
processRunner.Exited += OnProcessRunnerExited;
173191
processRunner.Start();
174-
pipeLogger.ReadAll();
192+
try
193+
{
194+
pipeLogger.ReadAll();
195+
}
196+
catch (ObjectDisposedException)
197+
{
198+
// Ignore
199+
}
175200
processRunner.WaitForExit();
176201
exitCode = processRunner.ExitCode;
177202
}

tests/Buildalyzer.Tests/Integration/SimpleProjectsFixture.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -709,6 +709,23 @@ public void GetsAdditionalFile()
709709
.Should().BeEquivalentTo("message.txt");
710710
}
711711

712+
[Test]
713+
public void HandlesProcessFailure()
714+
{
715+
// Given
716+
StringWriter log = new StringWriter();
717+
IProjectAnalyzer analyzer = GetProjectAnalyzer(@"SdkNet6Exe\SdkNet6Exe.csproj", log);
718+
719+
// When
720+
IAnalyzerResults results = analyzer.Build(new EnvironmentOptions
721+
{
722+
Arguments = { "/unknown" } // This argument will cause msbuild to immediately fail
723+
});
724+
725+
// Then
726+
results.OverallSuccess.ShouldBeFalse();
727+
}
728+
712729
private static IProjectAnalyzer GetProjectAnalyzer(string projectFile, StringWriter log)
713730
{
714731
IProjectAnalyzer analyzer = new AnalyzerManager(

0 commit comments

Comments
 (0)