Skip to content

Commit a397bf5

Browse files
author
roeil
committed
refactor(paths-filter): use regex in paths filter, remove filtering mode, defer filtering of commits
1 parent 6c0e49f commit a397bf5

File tree

8 files changed

+42
-48
lines changed

8 files changed

+42
-48
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using GitVersion.Core.Tests.Helpers;
2-
using GitVersion.Git;
32
using GitVersion.VersionCalculation;
43

54
namespace GitVersion.Core.Tests;
@@ -9,12 +8,4 @@ public class PathFilterTests : TestBase
98
{
109
[Test]
1110
public void VerifyNullGuard() => Should.Throw<ArgumentNullException>(() => new PathFilter(null!, null!, null!));
12-
13-
[Test]
14-
public void VerifyNullGuard2()
15-
{
16-
var sut = new PathFilter(null!, null!, [""]);
17-
18-
Should.Throw<ArgumentNullException>(() => sut.Exclude((ICommit?)null, out _));
19-
}
2011
}

src/GitVersion.Core/VersionCalculation/IncrementStrategyFinder.cs

+5-8
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,11 @@ public VersionField DetermineIncrementedField(
5858
var pathFilters = configuration.Ignore.ToFilters(repository, versionContext.Value).OfType<PathFilter>();
5959

6060
var increments = commits
61-
.Where(c => !pathFilters.Any(f => f.Exclude(c, out _)))
62-
.Select(c => GetIncrementFromCommit(c, majorRegex, minorRegex, patchRegex, noBumpRegex))
63-
.Where(v => v != null)
64-
.ToList();
65-
66-
return increments.Count != 0
67-
? increments.Max()
68-
: null;
61+
.Select(c => (commit: c, increment: GetIncrementFromCommit(c, majorRegex, minorRegex, patchRegex, noBumpRegex)))
62+
.Where(pair => pair.increment != null)
63+
.OrderByDescending(pair => pair.increment);
64+
65+
return increments.FirstOrDefault(pair => !pathFilters.Any(f => f.Exclude(pair.commit, out _)), (null!, null)).increment;
6966
}
7067

7168
private VersionField? FindCommitMessageIncrement(

src/GitVersion.Core/VersionCalculation/Mainline/MainlineContext.cs

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44

55
namespace GitVersion.VersionCalculation.Mainline;
66

7-
internal record MainlineContext(IIncrementStrategyFinder IncrementStrategyFinder, IGitVersionConfiguration Configuration)
7+
internal record MainlineContext(IIncrementStrategyFinder IncrementStrategyFinder, IGitVersionConfiguration Configuration, IGitRepository Repository, GitVersionContext GitverContext)
88
{
99
public IIncrementStrategyFinder IncrementStrategyFinder { get; } = IncrementStrategyFinder.NotNull();
1010

1111
public IGitVersionConfiguration Configuration { get; } = Configuration.NotNull();
12+
public IGitRepository Repository { get; } = Repository.NotNull();
13+
public GitVersionContext GitverContext { get; } = GitverContext.NotNull();
1214

1315
public string? TargetLabel { get; init; }
1416

src/GitVersion.Core/VersionCalculation/Mainline/NonTrunk/MergeCommitOnNonTrunkBase.cs

+3-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ public virtual IEnumerable<IBaseVersionIncrement> GetIncrements(
1818
iteration: commit.ChildIteration,
1919
targetLabel: context.TargetLabel,
2020
incrementStrategyFinder: context.IncrementStrategyFinder,
21-
configuration: context.Configuration
21+
configuration: context.Configuration,
22+
repository: context.Repository,
23+
gitverContext: context.GitverContext
2224
);
2325

2426
context.Label ??= baseVersion.Operator?.Label;

src/GitVersion.Core/VersionCalculation/Mainline/Trunk/MergeCommitOnTrunkBase.cs

+3-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ public virtual IEnumerable<IBaseVersionIncrement> GetIncrements(
1616
iteration: commit.ChildIteration!,
1717
targetLabel: context.TargetLabel,
1818
incrementStrategyFinder: context.IncrementStrategyFinder,
19-
configuration: context.Configuration
19+
configuration: context.Configuration,
20+
repository: context.Repository,
21+
gitverContext: context.GitverContext
2022
);
2123

2224
context.Label ??= baseVersion.Operator?.Label;

src/GitVersion.Core/VersionCalculation/PathFilter.cs

+5-17
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1+
using System.Text.RegularExpressions;
12
using GitVersion.Extensions;
23
using GitVersion.Git;
34

45
namespace GitVersion.VersionCalculation;
56

6-
internal class PathFilter(IGitRepository repository, GitVersionContext context, IEnumerable<string> paths, PathFilter.PathFilterMode mode = PathFilter.PathFilterMode.Inclusive) : IVersionFilter
7+
internal class PathFilter(IGitRepository repository, GitVersionContext context, IEnumerable<string> paths) : IVersionFilter
78
{
89
public enum PathFilterMode { Inclusive = 0, Exclusive = 1 }
910

1011
private readonly IEnumerable<string> paths = paths.NotNull();
11-
private readonly PathFilterMode mode = mode;
1212
private readonly GitVersionContext context = context;
1313

1414
public bool Exclude(IBaseVersion baseVersion, out string? reason)
@@ -31,22 +31,10 @@ public bool Exclude(ICommit? commit, out string? reason)
3131

3232
if (patchPaths != null)
3333
{
34-
switch (this.mode)
34+
if (this.paths.Any(path => patchPaths.All(p => Regex.IsMatch(p, path, RegexOptions.IgnoreCase))))
3535
{
36-
case PathFilterMode.Inclusive:
37-
if (!this.paths.Any(path => patchPaths.Any(p => p.StartsWith(path, StringComparison.OrdinalIgnoreCase))))
38-
{
39-
reason = "Source was ignored due to commit path is not present";
40-
return true;
41-
}
42-
break;
43-
case PathFilterMode.Exclusive:
44-
if (this.paths.Any(path => patchPaths.All(p => p.StartsWith(path, StringComparison.OrdinalIgnoreCase))))
45-
{
46-
reason = "Source was ignored due to commit path excluded";
47-
return true;
48-
}
49-
break;
36+
reason = "Source was ignored due to commit path matching ignore regex";
37+
return true;
5038
}
5139
}
5240
}

src/GitVersion.Core/VersionCalculation/VersionCalculators/NextVersionCalculator.cs

+10-5
Original file line numberDiff line numberDiff line change
@@ -156,10 +156,10 @@ private SemanticVersion CalculateSemanticVersion(
156156

157157
private NextVersion CalculateNextVersion(IBranch branch, IGitVersionConfiguration configuration)
158158
{
159-
var nextVersions = GetNextVersions(branch, configuration);
159+
var nextVersions = GetNextVersions(branch, configuration).OrderByDescending(v => v.IncrementedVersion);
160160
log.Separator();
161161

162-
var maxVersion = nextVersions.Max()
162+
var maxVersion = nextVersions.FirstOrDefault(v => ShouldIncludeVersion(configuration, v))
163163
?? throw new GitVersionException("No base versions determined on the current branch.");
164164

165165
ICommit? latestBaseVersionSource;
@@ -168,6 +168,7 @@ private NextVersion CalculateNextVersion(IBranch branch, IGitVersionConfiguratio
168168
.Where(
169169
element => element.BaseVersion.BaseVersionSource != null
170170
&& element.IncrementedVersion == maxVersion.IncrementedVersion
171+
&& ShouldIncludeVersion(configuration, element)
171172
).ToArray();
172173
if (matchingVersionsOnceIncremented.Length > 1)
173174
{
@@ -193,11 +194,11 @@ private NextVersion CalculateNextVersion(IBranch branch, IGitVersionConfiguratio
193194
.Where(v => v.BaseVersion.BaseVersionSource != null)
194195
.OrderByDescending(v => v.IncrementedVersion)
195196
.ThenByDescending(v => v.BaseVersion.BaseVersionSource?.When)
196-
.FirstOrDefault();
197+
.FirstOrDefault(v => ShouldIncludeVersion(configuration, v));
197198

198199
version ??= versions.Where(v => v.BaseVersion.BaseVersionSource == null)
199200
.OrderByDescending(v => v.IncrementedVersion)
200-
.First();
201+
.First(v => ShouldIncludeVersion(configuration, v));
201202
latestBaseVersionSource = version.BaseVersion.BaseVersionSource;
202203
}
203204

@@ -217,6 +218,9 @@ private NextVersion CalculateNextVersion(IBranch branch, IGitVersionConfiguratio
217218
return new(maxVersion.IncrementedVersion, calculatedBase, maxVersion.BranchConfiguration);
218219
}
219220

221+
private bool ShouldIncludeVersion(IGitVersionConfiguration configuration, NextVersion version) =>
222+
configuration.Ignore.ToFilters(repository, this.Context).All(filter => !filter.Exclude(version.BaseVersion, out _));
223+
220224
private static NextVersion CompareVersions(NextVersion version1, NextVersion version2)
221225
{
222226
if (version1.BaseVersion.BaseVersionSource == null)
@@ -265,7 +269,8 @@ IEnumerable<NextVersion> GetNextVersionsInternal()
265269
foreach (var baseVersion in versionStrategy.GetBaseVersions(effectiveBranchConfiguration))
266270
{
267271
log.Info(baseVersion.ToString());
268-
if (IncludeVersion(baseVersion, configuration.Ignore))
272+
if (versionStrategy is not FallbackVersionStrategy || IncludeVersion(baseVersion, configuration.Ignore))
273+
//Defer the version inclusion check to the caller, for strategies other than FallbackVersionStrategy
269274
{
270275
atLeastOneBaseVersionReturned = true;
271276

src/GitVersion.Core/VersionCalculation/VersionSearchStrategies/MainlineVersionStrategy.cs

+13-6
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ namespace GitVersion.VersionCalculation;
1111

1212
internal sealed class MainlineVersionStrategy(
1313
Lazy<GitVersionContext> contextLazy,
14+
IGitRepository repository,
1415
IRepositoryStore repositoryStore,
1516
ITaggedSemanticVersionService taggedSemanticVersionService,
1617
IIncrementStrategyFinder incrementStrategyFinder)
@@ -19,6 +20,7 @@ internal sealed class MainlineVersionStrategy(
1920
private volatile int iterationCounter;
2021
private readonly Lazy<GitVersionContext> contextLazy = contextLazy.NotNull();
2122
private readonly ITaggedSemanticVersionService taggedSemanticVersionService = taggedSemanticVersionService.NotNull();
23+
private readonly IGitRepository repository = repository.NotNull();
2224
private readonly IRepositoryStore repositoryStore = repositoryStore.NotNull();
2325
private readonly IIncrementStrategyFinder incrementStrategyFinder = incrementStrategyFinder.NotNull();
2426

@@ -323,16 +325,16 @@ private bool IterateOverCommitsRecursive(
323325
return result;
324326
}
325327

326-
private static BaseVersion DetermineBaseVersion(MainlineIteration iteration, string? targetLabel,
328+
private BaseVersion DetermineBaseVersion(MainlineIteration iteration, string? targetLabel,
327329
IIncrementStrategyFinder incrementStrategyFinder, IGitVersionConfiguration configuration)
328-
=> DetermineBaseVersionRecursive(iteration, targetLabel, incrementStrategyFinder, configuration);
330+
=> DetermineBaseVersionRecursive(iteration, targetLabel, incrementStrategyFinder, configuration, this.repository, this.Context);
329331

330332
internal static BaseVersion DetermineBaseVersionRecursive(MainlineIteration iteration, string? targetLabel,
331-
IIncrementStrategyFinder incrementStrategyFinder, IGitVersionConfiguration configuration)
333+
IIncrementStrategyFinder incrementStrategyFinder, IGitVersionConfiguration configuration, IGitRepository repository, GitVersionContext gitverContext)
332334
{
333335
iteration.NotNull();
334336

335-
var incrementSteps = GetIncrements(iteration, targetLabel, incrementStrategyFinder, configuration).ToArray();
337+
var incrementSteps = GetIncrements(iteration, targetLabel, incrementStrategyFinder, configuration, repository, gitverContext).ToArray();
336338

337339
BaseVersion? result = null;
338340
foreach (var baseVersionIncrement in incrementSteps)
@@ -355,15 +357,20 @@ internal static BaseVersion DetermineBaseVersionRecursive(MainlineIteration iter
355357
}
356358

357359
private static IEnumerable<IBaseVersionIncrement> GetIncrements(MainlineIteration iteration, string? targetLabel,
358-
IIncrementStrategyFinder incrementStrategyFinder, IGitVersionConfiguration configuration)
360+
IIncrementStrategyFinder incrementStrategyFinder, IGitVersionConfiguration configuration, IGitRepository repository, GitVersionContext gitverContext)
359361
{
360-
MainlineContext context = new(incrementStrategyFinder, configuration)
362+
MainlineContext context = new(incrementStrategyFinder, configuration, repository, gitverContext)
361363
{
362364
TargetLabel = targetLabel
363365
};
364366

365367
foreach (var commit in iteration.Commits)
366368
{
369+
if (configuration.Ignore.ToFilters(repository, gitverContext).OfType<PathFilter>().Any(f => f.Exclude(commit.Value, out _)))
370+
{
371+
continue;
372+
}
373+
367374
foreach (var item in TrunkContextPreEnricherCollection)
368375
{
369376
item.Enrich(iteration, commit, context);

0 commit comments

Comments
 (0)