Skip to content

Commit 038b8be

Browse files
committed
Merge branch 'main' into net9
2 parents 2b2d4fc + ea18ace commit 038b8be

18 files changed

+185
-69
lines changed

src/Readme.txt

+1
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ CHANGELOG
7272
* New: Added support for .NET 9. Dropped support for .NET 6 and .NET 7
7373
* Fix: #699 Rounding crap score to full number
7474
* Fix: #700 Fixed handling of .netconfig files (sourceDirectories, reportTypes, plugins, assemblyFilters, etc.)
75+
* Fix: #704 Improved handling of file filters
7576

7677
5.3.11.0
7778

src/ReportGenerator.Core.Test/Parser/Filtering/DefaultFilterTest.cs

+48-8
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,10 @@ public void OnlyIncludesWithWildcards_NotMatchingElement_ElementIsNotAccepted()
5656
{
5757
IFilter filter = new DefaultFilter(new[] { "+Test*" });
5858

59-
Assert.False(filter.IsElementIncludedInReport("PrefixTest"), "Element is expected to be included.");
60-
Assert.False(filter.IsElementIncludedInReport("prefixtest"), "Element is expected to be included.");
61-
Assert.False(filter.IsElementIncludedInReport("PrefixTest123"), "Element is expected to be included.");
62-
Assert.False(filter.IsElementIncludedInReport("prefixtest123"), "Element is expected to be included.");
59+
Assert.False(filter.IsElementIncludedInReport("PrefixTest"), "Element is expected to be excluded.");
60+
Assert.False(filter.IsElementIncludedInReport("prefixtest"), "Element is expected to be excluded.");
61+
Assert.False(filter.IsElementIncludedInReport("PrefixTest123"), "Element is expected to be excluded.");
62+
Assert.False(filter.IsElementIncludedInReport("prefixtest123"), "Element is expected to be excluded.");
6363
Assert.True(filter.HasCustomFilters);
6464
}
6565

@@ -100,10 +100,50 @@ public void IncludesAndExcludesWithWildcards_NotMatchingElement_ElementIsNotAcce
100100
{
101101
IFilter filter = new DefaultFilter(new[] { "+Test*", "-Tes*" });
102102

103-
Assert.False(filter.IsElementIncludedInReport("Test"), "Element is expected to be included.");
104-
Assert.False(filter.IsElementIncludedInReport("test"), "Element is expected to be included.");
105-
Assert.False(filter.IsElementIncludedInReport("PrefixTest123"), "Element is expected to be included.");
106-
Assert.False(filter.IsElementIncludedInReport("prefixtest123"), "Element is expected to be included.");
103+
Assert.False(filter.IsElementIncludedInReport("Test"), "Element is expected to be excluded.");
104+
Assert.False(filter.IsElementIncludedInReport("test"), "Element is expected to be excluded.");
105+
Assert.False(filter.IsElementIncludedInReport("PrefixTest123"), "Element is expected to be excluded.");
106+
Assert.False(filter.IsElementIncludedInReport("prefixtest123"), "Element is expected to be excluded.");
107+
Assert.True(filter.HasCustomFilters);
108+
}
109+
110+
[Fact]
111+
public void LinuxPath_NoOsIndependantPathSeparator()
112+
{
113+
IFilter filter = new DefaultFilter(new[] { "+abc/def" });
114+
115+
Assert.True(filter.IsElementIncludedInReport("abc/def"), "Element is expected to be included.");
116+
Assert.False(filter.IsElementIncludedInReport("abc\\def"), "Element is expected to be excluded.");
117+
Assert.True(filter.HasCustomFilters);
118+
}
119+
120+
[Fact]
121+
public void LinuxPath_OsIndependantPathSeparator()
122+
{
123+
IFilter filter = new DefaultFilter(new[] { "+abc/def" }, true);
124+
125+
Assert.True(filter.IsElementIncludedInReport("abc/def"), "Element is expected to be included.");
126+
Assert.True(filter.IsElementIncludedInReport("abc\\def"), "Element is expected to be included.");
127+
Assert.True(filter.HasCustomFilters);
128+
}
129+
130+
[Fact]
131+
public void WindowsPath_NoOsIndependantPathSeparator()
132+
{
133+
IFilter filter = new DefaultFilter(new[] { "+abc\\def" });
134+
135+
Assert.False(filter.IsElementIncludedInReport("abc/def"), "Element is expected to be excluded.");
136+
Assert.True(filter.IsElementIncludedInReport("abc\\def"), "Element is expected to be included.");
137+
Assert.True(filter.HasCustomFilters);
138+
}
139+
140+
[Fact]
141+
public void WindowsPath_OsIndependantPathSeparator()
142+
{
143+
IFilter filter = new DefaultFilter(new[] { "+abc/def" }, true);
144+
145+
Assert.True(filter.IsElementIncludedInReport("abc/def"), "Element is expected to be included.");
146+
Assert.True(filter.IsElementIncludedInReport("abc\\def"), "Element is expected to be included.");
107147
Assert.True(filter.HasCustomFilters);
108148
}
109149
}

src/ReportGenerator.Core/Parser/CoverageReportParser.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ public CoverageReportParser(IReportContext reportContext)
181181
this.sourceDirectories = reportContext.ReportConfiguration.SourceDirectories ?? throw new ArgumentNullException(nameof(reportContext.ReportConfiguration.SourceDirectories));
182182
this.assemblyFilter = new DefaultFilter(reportContext.ReportConfiguration.AssemblyFilters);
183183
this.classFilter = new DefaultFilter(reportContext.ReportConfiguration.ClassFilters);
184-
this.fileFilter = new DefaultFilter(reportContext.ReportConfiguration.FileFilters);
184+
this.fileFilter = new DefaultFilter(reportContext.ReportConfiguration.FileFilters, true);
185185
}
186186

187187
/// <summary>

src/ReportGenerator.Core/Parser/Filtering/DefaultFilter.cs

+23-4
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,16 @@ public class DefaultFilter : IFilter
2828
/// </summary>
2929
/// <param name="filters">The filters.</param>
3030
public DefaultFilter(IEnumerable<string> filters)
31+
: this(filters, false)
32+
{
33+
}
34+
35+
/// <summary>
36+
/// Initializes a new instance of the <see cref="DefaultFilter"/> class.
37+
/// </summary>
38+
/// <param name="filters">The filters.</param>
39+
/// <param name="osIndependantPathSeparator">Indicates whether filter thould be treated as paths and the operating system format should be ignored.</param>
40+
public DefaultFilter(IEnumerable<string> filters, bool osIndependantPathSeparator)
3141
{
3242
if (filters == null)
3343
{
@@ -36,12 +46,12 @@ public DefaultFilter(IEnumerable<string> filters)
3646

3747
this.excludeFilters = filters
3848
.Where(f => f.StartsWith("-", StringComparison.OrdinalIgnoreCase))
39-
.Select(f => CreateFilterRegex(f))
49+
.Select(f => CreateFilterRegex(f, osIndependantPathSeparator))
4050
.ToArray();
4151

4252
this.includeFilters = filters
4353
.Where(f => f.StartsWith("+", StringComparison.OrdinalIgnoreCase))
44-
.Select(f => CreateFilterRegex(f))
54+
.Select(f => CreateFilterRegex(f, osIndependantPathSeparator))
4555
.ToArray();
4656

4757
this.HasCustomFilters = this.excludeFilters.Length > 0 || this.includeFilters.Length > 0;
@@ -50,7 +60,7 @@ public DefaultFilter(IEnumerable<string> filters)
5060
{
5161
this.includeFilters = new[]
5262
{
53-
CreateFilterRegex("+*")
63+
CreateFilterRegex("+*", false)
5464
};
5565
}
5666
}
@@ -87,14 +97,23 @@ public bool IsElementIncludedInReport(string name)
8797
/// Special characters are escaped. Wildcards '*' are converted to '.*'.
8898
/// </summary>
8999
/// <param name="filter">The filter.</param>
100+
/// <param name="osIndependantPathSeparator">Indicates whether filter thould be treated as paths and the operating system format should be ignored.</param>
90101
/// <returns>The regular expression.</returns>
91-
private static Regex CreateFilterRegex(string filter)
102+
private static Regex CreateFilterRegex(string filter, bool osIndependantPathSeparator)
92103
{
93104
filter = filter.Substring(1);
94105
filter = filter.Replace("*", "$$$*");
95106
filter = Regex.Escape(filter);
96107
filter = filter.Replace(@"\$\$\$\*", ".*");
97108

109+
if (osIndependantPathSeparator)
110+
{
111+
filter = filter
112+
.Replace("/", "$$$")
113+
.Replace("\\", "$$$")
114+
.Replace("$$$", @"[/\\]");
115+
}
116+
98117
return new Regex($"^{filter}$", RegexOptions.Compiled | RegexOptions.IgnoreCase);
99118
}
100119
}

src/ReportGenerator.Core/Reporting/Builders/CloverReportBuilder.cs

+6-2
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,11 @@ public void CreateSummaryReport(SummaryResult summaryResult)
246246
int totalProjectNcloc = 0;
247247
int totalProjectFiles = 0;
248248

249-
foreach (var assembly in summaryResult.Assemblies)
249+
var assembliesWithClasses = summaryResult.Assemblies
250+
.Where(a => a.Classes.Any())
251+
.ToArray();
252+
253+
foreach (var assembly in assembliesWithClasses)
250254
{
251255
if (this.packageElementsByName.TryGetValue(assembly.Name, out XElement packageElement))
252256
{
@@ -356,7 +360,7 @@ public void CreateSummaryReport(SummaryResult summaryResult)
356360
new XAttribute("loc", totalProjectLoc.ToString(CultureInfo.InvariantCulture)),
357361
new XAttribute("ncloc", totalProjectNcloc.ToString(CultureInfo.InvariantCulture)),
358362
new XAttribute("files", totalProjectFiles.ToString(CultureInfo.InvariantCulture)),
359-
new XAttribute("packages", summaryResult.Assemblies.Count.ToString(CultureInfo.InvariantCulture))));
363+
new XAttribute("packages", assembliesWithClasses.Length.ToString(CultureInfo.InvariantCulture))));
360364

361365
var testProjectElement = new XElement(
362366
"testproject",

src/ReportGenerator.Core/Reporting/Builders/CoberturaReportBuilder.cs

+5-1
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,11 @@ public void CreateSummaryReport(SummaryResult summaryResult)
150150
{
151151
decimal? summaryComplexity = null;
152152

153-
foreach (var assembly in summaryResult.Assemblies)
153+
var assembliesWithClasses = summaryResult.Assemblies
154+
.Where(a => a.Classes.Any())
155+
.ToArray();
156+
157+
foreach (var assembly in assembliesWithClasses)
154158
{
155159
decimal? assemblyComplexity = null;
156160
if (this.packageElementsByName.TryGetValue(assembly.Name, out XElement packageElement))

src/ReportGenerator.Core/Reporting/Builders/CodeClimateReportBuilder.cs

+6-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using System.Globalization;
44
using System.IO;
5+
using System.Linq;
56
using System.Text;
67
using System.Text.Json;
78
using Palmmedia.ReportGenerator.Core.Common;
@@ -120,7 +121,11 @@ public void CreateSummaryReport(SummaryResult summaryResult)
120121

121122
reportTextWriter.WriteLine(" \"source_files\": [");
122123

123-
foreach (var assembly in summaryResult.Assemblies)
124+
var assembliesWithClasses = summaryResult.Assemblies
125+
.Where(a => a.Classes.Any())
126+
.ToArray();
127+
128+
foreach (var assembly in assembliesWithClasses)
124129
{
125130
foreach (var clazz in assembly.Classes)
126131
{

src/ReportGenerator.Core/Reporting/Builders/CsvSummaryReportBuilder.cs

+8-5
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using System.Globalization;
44
using System.IO;
55
using System.Linq;
6-
using System.Text;
76
using Palmmedia.ReportGenerator.Core.Common;
87
using Palmmedia.ReportGenerator.Core.Logging;
98
using Palmmedia.ReportGenerator.Core.Parser.Analysis;
@@ -83,6 +82,10 @@ public void CreateSummaryReport(SummaryResult summaryResult)
8382

8483
using (var reportTextWriter = File.CreateText(targetPath))
8584
{
85+
var assembliesWithClasses = summaryResult.Assemblies
86+
.Where(a => a.Classes.Any())
87+
.ToArray();
88+
8689
reportTextWriter.WriteLine(ReportResources.Summary);
8790
reportTextWriter.WriteLine(
8891
"{0};{1}",
@@ -95,15 +98,15 @@ public void CreateSummaryReport(SummaryResult summaryResult)
9598
reportTextWriter.WriteLine(
9699
"{0};{1}",
97100
ReportResources.Assemblies2,
98-
summaryResult.Assemblies.Count().ToString(CultureInfo.InvariantCulture));
101+
assembliesWithClasses.Count().ToString(CultureInfo.InvariantCulture));
99102
reportTextWriter.WriteLine(
100103
"{0};{1}",
101104
ReportResources.Classes,
102-
summaryResult.Assemblies.SelectMany(a => a.Classes).Count().ToString(CultureInfo.InvariantCulture));
105+
assembliesWithClasses.SelectMany(a => a.Classes).Count().ToString(CultureInfo.InvariantCulture));
103106
reportTextWriter.WriteLine(
104107
"{0};{1}",
105108
ReportResources.Files2,
106-
summaryResult.Assemblies.SelectMany(a => a.Classes).SelectMany(a => a.Files).Distinct().Count().ToString(CultureInfo.InvariantCulture));
109+
assembliesWithClasses.SelectMany(a => a.Classes).SelectMany(a => a.Files).Distinct().Count().ToString(CultureInfo.InvariantCulture));
107110
reportTextWriter.WriteLine(
108111
"{0};{1}",
109112
ReportResources.Coverage2,
@@ -125,7 +128,7 @@ public void CreateSummaryReport(SummaryResult summaryResult)
125128
ReportResources.TotalLines,
126129
summaryResult.TotalLines.GetValueOrDefault().ToString(CultureInfo.InvariantCulture));
127130

128-
foreach (var assembly in summaryResult.Assemblies)
131+
foreach (var assembly in assembliesWithClasses)
129132
{
130133
reportTextWriter.WriteLine();
131134
reportTextWriter.WriteLine(

src/ReportGenerator.Core/Reporting/Builders/HtmlReportBuilderBase.cs

+10-6
Original file line numberDiff line numberDiff line change
@@ -238,12 +238,16 @@ public virtual void CreateSummaryReport(IHtmlRenderer reportRenderer, SummaryRes
238238
reportRenderer.BeginSummaryReport(this.CreateTargetDirectory(), null, title);
239239
reportRenderer.HeaderWithGithubLinks(title);
240240

241+
var assembliesWithClasses = summaryResult.Assemblies
242+
.Where(a => a.Classes.Any())
243+
.ToArray();
244+
241245
var infoCardItems = new List<CardLineItem>()
242246
{
243247
new CardLineItem(ReportResources.Parser, summaryResult.UsedParser, null, CardLineItemAlignment.Left),
244-
new CardLineItem(ReportResources.Assemblies2, summaryResult.Assemblies.Count().ToString(CultureInfo.InvariantCulture), null),
245-
new CardLineItem(ReportResources.Classes, summaryResult.Assemblies.SelectMany(a => a.Classes).Count().ToString(CultureInfo.InvariantCulture), null),
246-
new CardLineItem(ReportResources.Files2, summaryResult.Assemblies.SelectMany(a => a.Classes).SelectMany(a => a.Files).Distinct().Count().ToString(CultureInfo.InvariantCulture), null)
248+
new CardLineItem(ReportResources.Assemblies2, assembliesWithClasses.Count().ToString(CultureInfo.InvariantCulture), null),
249+
new CardLineItem(ReportResources.Classes, assembliesWithClasses.SelectMany(a => a.Classes).Count().ToString(CultureInfo.InvariantCulture), null),
250+
new CardLineItem(ReportResources.Files2, assembliesWithClasses.SelectMany(a => a.Classes).SelectMany(a => a.Files).Distinct().Count().ToString(CultureInfo.InvariantCulture), null)
247251
};
248252

249253
if (this.ReportContext.ReportConfiguration.Tag != null)
@@ -356,12 +360,12 @@ public virtual void CreateSummaryReport(IHtmlRenderer reportRenderer, SummaryRes
356360

357361
reportRenderer.Header(ReportResources.Coverage3);
358362

359-
if (summaryResult.Assemblies.Any())
363+
if (assembliesWithClasses.Any())
360364
{
361365
reportRenderer.BeginSummaryTable();
362366
reportRenderer.BeginSummaryTable(summaryResult.SupportsBranchCoverage, proVersion);
363367

364-
foreach (var assembly in summaryResult.Assemblies)
368+
foreach (var assembly in assembliesWithClasses)
365369
{
366370
reportRenderer.SummaryAssembly(assembly, summaryResult.SupportsBranchCoverage, proVersion);
367371

@@ -384,7 +388,7 @@ public virtual void CreateSummaryReport(IHtmlRenderer reportRenderer, SummaryRes
384388
}
385389

386390
reportRenderer.CustomSummary(
387-
summaryResult.Assemblies,
391+
assembliesWithClasses,
388392
this.ReportContext.RiskHotspotAnalysisResult.RiskHotspots,
389393
summaryResult.SupportsBranchCoverage,
390394
proVersion);

src/ReportGenerator.Core/Reporting/Builders/JsonSummaryReportBuilder.cs

+8-4
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,17 @@ public void CreateSummaryReport(SummaryResult summaryResult)
7979

8080
using (var reportTextWriter = new StreamWriter(new FileStream(targetPath, FileMode.Create), new UTF8Encoding(encoderShouldEmitUTF8Identifier: false)))
8181
{
82+
var assembliesWithClasses = summaryResult.Assemblies
83+
.Where(a => a.Classes.Any())
84+
.ToArray();
85+
8286
reportTextWriter.WriteLine("{");
8387
reportTextWriter.WriteLine(" \"summary\": {");
8488
reportTextWriter.WriteLine($" \"generatedon\": \"{DateTime.Now.ToUniversalTime().ToString("s")}Z\",");
8589
reportTextWriter.WriteLine($" \"parser\": \"{summaryResult.UsedParser}\",");
86-
reportTextWriter.WriteLine($" \"assemblies\": {summaryResult.Assemblies.Count().ToString(CultureInfo.InvariantCulture)},");
87-
reportTextWriter.WriteLine($" \"classes\": {summaryResult.Assemblies.SelectMany(a => a.Classes).Count().ToString(CultureInfo.InvariantCulture)},");
88-
reportTextWriter.WriteLine($" \"files\": {summaryResult.Assemblies.SelectMany(a => a.Classes).SelectMany(a => a.Files).Distinct().Count().ToString(CultureInfo.InvariantCulture)},");
90+
reportTextWriter.WriteLine($" \"assemblies\": {assembliesWithClasses.Count().ToString(CultureInfo.InvariantCulture)},");
91+
reportTextWriter.WriteLine($" \"classes\": {assembliesWithClasses.SelectMany(a => a.Classes).Count().ToString(CultureInfo.InvariantCulture)},");
92+
reportTextWriter.WriteLine($" \"files\": {assembliesWithClasses.SelectMany(a => a.Classes).SelectMany(a => a.Files).Distinct().Count().ToString(CultureInfo.InvariantCulture)},");
8993
reportTextWriter.WriteLine($" \"coveredlines\": {summaryResult.CoveredLines.ToString(CultureInfo.InvariantCulture)},");
9094
reportTextWriter.WriteLine($" \"uncoveredlines\": {(summaryResult.CoverableLines - summaryResult.CoveredLines).ToString(CultureInfo.InvariantCulture)},");
9195
reportTextWriter.WriteLine($" \"coverablelines\": {summaryResult.CoverableLines.ToString(CultureInfo.InvariantCulture)},");
@@ -161,7 +165,7 @@ public void CreateSummaryReport(SummaryResult summaryResult)
161165

162166
int assemblyCounter = 0;
163167

164-
foreach (var assembly in summaryResult.Assemblies)
168+
foreach (var assembly in assembliesWithClasses)
165169
{
166170
if (assemblyCounter > 0)
167171
{

src/ReportGenerator.Core/Reporting/Builders/LCovSummaryReportBuilder.cs

+6-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
using System.Collections.Generic;
33
using System.Globalization;
44
using System.IO;
5-
using System.Text;
5+
using System.Linq;
66
using Palmmedia.ReportGenerator.Core.Common;
77
using Palmmedia.ReportGenerator.Core.Logging;
88
using Palmmedia.ReportGenerator.Core.Parser.Analysis;
@@ -85,7 +85,11 @@ public void CreateSummaryReport(SummaryResult summaryResult)
8585
reportTextWriter.WriteLine("TN:");
8686
long branchCounter = 0;
8787

88-
foreach (var assembly in summaryResult.Assemblies)
88+
var assembliesWithClasses = summaryResult.Assemblies
89+
.Where(a => a.Classes.Any())
90+
.ToArray();
91+
92+
foreach (var assembly in assembliesWithClasses)
8993
{
9094
foreach (var @class in assembly.Classes)
9195
{

0 commit comments

Comments
 (0)