Skip to content

Commit 0481189

Browse files
SCAN4NET-103 Additional Files: Exclude C++ build wrapper output (#2217)
1 parent 695ebf3 commit 0481189

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed

Tests/SonarScanner.MSBuild.Shim.Test/AdditionalFilesServiceTest.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,37 @@ public void AdditionalFiles_ExtensionsFound_AllExtensionPermutations(string prop
202202
files.Tests.Should().BeEmpty();
203203
}
204204

205+
[TestMethod]
206+
[DataRow("build-wrapper-dump.json")]
207+
[DataRow("./compile_commands.json")]
208+
[DataRow(".\\compile_commands.json")]
209+
[DataRow("C:/dev/BUILD-WRAPPER-DUMP.json")]
210+
[DataRow("C:\\dev\\cOmpile_commAnDs.json")]
211+
[DataRow("C:\\dev/whatever/compile_commands.json")]
212+
[DataRow("C:\\dev/whatever\\build-wrapper-dump.json")]
213+
public void AdditionalFiles_ExcludedFilesIgnored(string excluded)
214+
{
215+
wrapper
216+
.EnumerateFiles(Arg.Any<DirectoryInfo>(), Arg.Any<string>(), Arg.Any<SearchOption>())
217+
.Returns(
218+
[
219+
new("valid.json"),
220+
new(excluded)
221+
]);
222+
223+
var config = new AnalysisConfig
224+
{
225+
ScanAllAnalysis = true,
226+
LocalSettings = [],
227+
ServerSettings = [new("sonar.json.file.suffixes", ".json")]
228+
};
229+
230+
var files = sut.AdditionalFiles(config, ProjectBaseDir);
231+
232+
files.Sources.Select(x => x.Name).Should().BeEquivalentTo("valid.json");
233+
files.Tests.Should().BeEmpty();
234+
}
235+
205236
[DataTestMethod]
206237
[DataRow("sonar.tsql.file.suffixes")]
207238
[DataRow("sonar.plsql.file.suffixes")]

src/SonarScanner.MSBuild.Shim/AdditionalFilesService.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,16 @@ public class AdditionalFilesService(IDirectoryWrapper directoryWrapper) : IAddit
4141
".sonar"
4242
];
4343

44+
// See https://github.com/SonarSource/sonar-iac/pull/1249/files#diff-a10a88bfebc0f61ea4e5c34a130cd3c79b7bae47f716b1a8e405282724cb9141R28
45+
// and https://sonarsource.atlassian.net/browse/SONARIAC-1419
46+
// sonar-iac already excludes these files, but the plugin is updated only on later versions of SQ, at least after 10.4.
47+
// To support excluding them for previous versions, as long as we support them, we exclude them here.
48+
private static readonly IReadOnlyList<string> ExcludedFiles =
49+
[
50+
"build-wrapper-dump.json",
51+
"compile_commands.json",
52+
];
53+
4454
private static readonly IReadOnlyList<string> SupportedLanguages =
4555
[
4656
"sonar.tsql.file.suffixes",
@@ -83,14 +93,17 @@ private FileInfo[] GetAllFiles(IEnumerable<string> extensions, DirectoryInfo pro
8393
.Concat([projectBaseDir]) // also include the root directory
8494
.Where(x => !IsExcludedDirectory(x))
8595
.SelectMany(x => directoryWrapper.EnumerateFiles(x, "*", SearchOption.TopDirectoryOnly))
86-
.Where(x => extensions.Any(e => x.Name.EndsWith(e, StringComparison.OrdinalIgnoreCase) && !x.Name.Equals(e, StringComparison.OrdinalIgnoreCase)))
96+
.Where(x => !IsExcludedFile(x) && extensions.Any(e => x.Name.EndsWith(e, StringComparison.OrdinalIgnoreCase) && !x.Name.Equals(e, StringComparison.OrdinalIgnoreCase)))
8797
.ToArray();
8898

8999
private static bool IsExcludedDirectory(DirectoryInfo directory) =>
90100
ExcludedDirectories.Any(x => Array.Exists(
91101
directory.FullName.Split(Path.DirectorySeparatorChar), // split it so that we also exclude subdirectories like .sonarqube/conf.
92102
part => part.Equals(x, StringComparison.OrdinalIgnoreCase)));
93103

104+
private static bool IsExcludedFile(FileInfo file) =>
105+
ExcludedFiles.Any(x => x.Equals(file.Name, StringComparison.OrdinalIgnoreCase));
106+
94107
private static AdditionalFiles PartitionAdditionalFiles(FileInfo[] allFiles, AnalysisConfig analysisConfig)
95108
{
96109
var testExtensions = GetTestExtensions(analysisConfig);

0 commit comments

Comments
 (0)