From 0481189815c0cdd57a289f483f0dec5ea447f80f Mon Sep 17 00:00:00 2001 From: Gregory Paidis <115458417+gregory-paidis-sonarsource@users.noreply.github.com> Date: Thu, 26 Sep 2024 15:01:43 +0200 Subject: [PATCH] SCAN4NET-103 Additional Files: Exclude C++ build wrapper output (#2217) --- .../AdditionalFilesServiceTest.cs | 31 +++++++++++++++++++ .../AdditionalFilesService.cs | 15 ++++++++- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/Tests/SonarScanner.MSBuild.Shim.Test/AdditionalFilesServiceTest.cs b/Tests/SonarScanner.MSBuild.Shim.Test/AdditionalFilesServiceTest.cs index 06daf096b..486273686 100644 --- a/Tests/SonarScanner.MSBuild.Shim.Test/AdditionalFilesServiceTest.cs +++ b/Tests/SonarScanner.MSBuild.Shim.Test/AdditionalFilesServiceTest.cs @@ -202,6 +202,37 @@ public void AdditionalFiles_ExtensionsFound_AllExtensionPermutations(string prop files.Tests.Should().BeEmpty(); } + [TestMethod] + [DataRow("build-wrapper-dump.json")] + [DataRow("./compile_commands.json")] + [DataRow(".\\compile_commands.json")] + [DataRow("C:/dev/BUILD-WRAPPER-DUMP.json")] + [DataRow("C:\\dev\\cOmpile_commAnDs.json")] + [DataRow("C:\\dev/whatever/compile_commands.json")] + [DataRow("C:\\dev/whatever\\build-wrapper-dump.json")] + public void AdditionalFiles_ExcludedFilesIgnored(string excluded) + { + wrapper + .EnumerateFiles(Arg.Any(), Arg.Any(), Arg.Any()) + .Returns( + [ + new("valid.json"), + new(excluded) + ]); + + var config = new AnalysisConfig + { + ScanAllAnalysis = true, + LocalSettings = [], + ServerSettings = [new("sonar.json.file.suffixes", ".json")] + }; + + var files = sut.AdditionalFiles(config, ProjectBaseDir); + + files.Sources.Select(x => x.Name).Should().BeEquivalentTo("valid.json"); + files.Tests.Should().BeEmpty(); + } + [DataTestMethod] [DataRow("sonar.tsql.file.suffixes")] [DataRow("sonar.plsql.file.suffixes")] diff --git a/src/SonarScanner.MSBuild.Shim/AdditionalFilesService.cs b/src/SonarScanner.MSBuild.Shim/AdditionalFilesService.cs index 32a1cabda..a8dd8efd8 100644 --- a/src/SonarScanner.MSBuild.Shim/AdditionalFilesService.cs +++ b/src/SonarScanner.MSBuild.Shim/AdditionalFilesService.cs @@ -41,6 +41,16 @@ public class AdditionalFilesService(IDirectoryWrapper directoryWrapper) : IAddit ".sonar" ]; + // See https://github.com/SonarSource/sonar-iac/pull/1249/files#diff-a10a88bfebc0f61ea4e5c34a130cd3c79b7bae47f716b1a8e405282724cb9141R28 + // and https://sonarsource.atlassian.net/browse/SONARIAC-1419 + // sonar-iac already excludes these files, but the plugin is updated only on later versions of SQ, at least after 10.4. + // To support excluding them for previous versions, as long as we support them, we exclude them here. + private static readonly IReadOnlyList ExcludedFiles = + [ + "build-wrapper-dump.json", + "compile_commands.json", + ]; + private static readonly IReadOnlyList SupportedLanguages = [ "sonar.tsql.file.suffixes", @@ -83,7 +93,7 @@ private FileInfo[] GetAllFiles(IEnumerable extensions, DirectoryInfo pro .Concat([projectBaseDir]) // also include the root directory .Where(x => !IsExcludedDirectory(x)) .SelectMany(x => directoryWrapper.EnumerateFiles(x, "*", SearchOption.TopDirectoryOnly)) - .Where(x => extensions.Any(e => x.Name.EndsWith(e, StringComparison.OrdinalIgnoreCase) && !x.Name.Equals(e, StringComparison.OrdinalIgnoreCase))) + .Where(x => !IsExcludedFile(x) && extensions.Any(e => x.Name.EndsWith(e, StringComparison.OrdinalIgnoreCase) && !x.Name.Equals(e, StringComparison.OrdinalIgnoreCase))) .ToArray(); private static bool IsExcludedDirectory(DirectoryInfo directory) => @@ -91,6 +101,9 @@ private static bool IsExcludedDirectory(DirectoryInfo directory) => directory.FullName.Split(Path.DirectorySeparatorChar), // split it so that we also exclude subdirectories like .sonarqube/conf. part => part.Equals(x, StringComparison.OrdinalIgnoreCase))); + private static bool IsExcludedFile(FileInfo file) => + ExcludedFiles.Any(x => x.Equals(file.Name, StringComparison.OrdinalIgnoreCase)); + private static AdditionalFiles PartitionAdditionalFiles(FileInfo[] allFiles, AnalysisConfig analysisConfig) { var testExtensions = GetTestExtensions(analysisConfig);