Skip to content

Commit

Permalink
SCAN4NET-103 Additional Files: Exclude C++ build wrapper output (#2217)
Browse files Browse the repository at this point in the history
  • Loading branch information
gregory-paidis-sonarsource authored Sep 26, 2024
1 parent 695ebf3 commit 0481189
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 1 deletion.
31 changes: 31 additions & 0 deletions Tests/SonarScanner.MSBuild.Shim.Test/AdditionalFilesServiceTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<DirectoryInfo>(), Arg.Any<string>(), Arg.Any<SearchOption>())
.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")]
Expand Down
15 changes: 14 additions & 1 deletion src/SonarScanner.MSBuild.Shim/AdditionalFilesService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<string> ExcludedFiles =
[
"build-wrapper-dump.json",
"compile_commands.json",
];

private static readonly IReadOnlyList<string> SupportedLanguages =
[
"sonar.tsql.file.suffixes",
Expand Down Expand Up @@ -83,14 +93,17 @@ private FileInfo[] GetAllFiles(IEnumerable<string> 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) =>
ExcludedDirectories.Any(x => Array.Exists(
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);
Expand Down

0 comments on commit 0481189

Please sign in to comment.