Skip to content

Commit 62b5974

Browse files
committed
Track which projects/solutions fail to build
1 parent 43df639 commit 62b5974

3 files changed

Lines changed: 42 additions & 4 deletions

File tree

csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ internal class DotNetRule : IBuildRule<CSharpAutobuildOptions>
1717
{
1818
private IEnumerable<Project<CSharpAutobuildOptions>> notDotNetProjects;
1919

20+
public readonly List<IProjectOrSolution> FailedProjectsOrSolutions = new();
21+
2022
/// <summary>
2123
/// A list of projects which are incompatible with DotNet.
2224
/// </summary>
@@ -67,7 +69,10 @@ public BuildScript Analyse(IAutobuilder<CSharpAutobuildOptions> builder, bool au
6769

6870
var build = GetBuildScript(builder, dotNetPath, environment, projectOrSolution.FullPath);
6971

70-
ret &= BuildScript.Try(clean) & BuildScript.Try(restore) & build;
72+
ret &= BuildScript.Try(clean) & BuildScript.Try(restore) & BuildScript.OnFailure(build, ret =>
73+
{
74+
FailedProjectsOrSolutions.Add(projectOrSolution);
75+
});
7176
}
7277
return ret;
7378
});

csharp/autobuilder/Semmle.Autobuild.Shared/BuildScript.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ public abstract class BuildScript
7070
/// <returns>The exit code from this build script.</returns>
7171
public abstract int Run(IBuildActions actions, Action<string, bool> startCallback, Action<int, string, bool> exitCallBack, BuildOutputHandler onOutput, BuildOutputHandler onError);
7272

73+
/// <summary>
74+
/// A build script which executes an external program or script.
75+
/// </summary>
7376
private class BuildCommand : BuildScript
7477
{
7578
private readonly string exe, arguments;
@@ -154,6 +157,9 @@ public override int Run(IBuildActions actions, Action<string, bool> startCallbac
154157

155158
}
156159

160+
/// <summary>
161+
/// A build script which runs a C# function.
162+
/// </summary>
157163
private class ReturnBuildCommand : BuildScript
158164
{
159165
private readonly Func<IBuildActions, int> func;
@@ -333,6 +339,23 @@ public static BuildScript Bind(BuildScript s1, Func<IList<string>, int, BuildScr
333339
/// </summary>
334340
public static BuildScript Try(BuildScript s) => s | Success;
335341

342+
/// <summary>
343+
/// Creates a build script that runs the build script <paramref name="s" />. If
344+
/// running <paramref name="s" /> fails, <paramref name="k" /> is invoked with
345+
/// the exit code.
346+
/// </summary>
347+
/// <param name="s">The build script to run.</param>
348+
/// <param name="k">
349+
/// The callback that is invoked if <paramref name="s" /> failed.
350+
/// </param>
351+
/// <returns>The build script which implements this.</returns>
352+
public static BuildScript OnFailure(BuildScript s, Action<int> k) =>
353+
new BindBuildScript(s, ret => Create(actions =>
354+
{
355+
if (!Succeeded(ret)) k(ret);
356+
return ret;
357+
}));
358+
336359
/// <summary>
337360
/// Creates a build script that deletes the given directory.
338361
/// </summary>

csharp/autobuilder/Semmle.Autobuild.Shared/MsBuildRule.cs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using Semmle.Util.Logging;
2-
using System;
2+
using System.Collections.Generic;
33
using System.Linq;
4-
using System.Runtime.InteropServices;
54

65
namespace Semmle.Autobuild.Shared
76
{
@@ -31,6 +30,11 @@ public static CommandBuilder MsBuildCommand(this CommandBuilder cmdBuilder, IAut
3130
/// </summary>
3231
public class MsBuildRule : IBuildRule<AutobuildOptionsShared>
3332
{
33+
/// <summary>
34+
/// A list of solutions or projects which failed to build.
35+
/// </summary>
36+
public readonly List<IProjectOrSolution> FailedProjectsOrSolutions = new();
37+
3438
public BuildScript Analyse(IAutobuilder<AutobuildOptionsShared> builder, bool auto)
3539
{
3640
if (!builder.ProjectsOrSolutionsToBuild.Any())
@@ -128,7 +132,13 @@ BuildScript GetNugetRestoreScript() =>
128132

129133
command.Argument(builder.Options.MsBuildArguments);
130134

131-
ret &= command.Script;
135+
// append the build script which invokes msbuild to the overall build script `ret`;
136+
// we insert a check that building the current project or solution was successful:
137+
// if it was not successful, we add it to `FailedProjectsOrSolutions`
138+
ret &= BuildScript.OnFailure(command.Script, ret =>
139+
{
140+
FailedProjectsOrSolutions.Add(projectOrSolution);
141+
});
132142
}
133143

134144
return ret;

0 commit comments

Comments
 (0)