diff --git a/docs/configuration.md b/docs/configuration.md index 73b569ffb2..7d1bf22672 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -41,6 +41,10 @@ The global configuration options are: - **`commits-since-version-source-padding:`** The number of characters to pad `CommitsSinceVersionSource` to in the `CommitsSinceVersionSourcePadded` [variable](/more-info/variables). Is default set to `4`, which will pad the `CommitsSinceVersionSource` value of `1` to `0001`. - **`commit-message-incrementing:`** Sets whether it should be possible to increment the version with special syntax in the commit message. See the `*-version-bump-message` options above for details on the syntax. Default set to `Enabled`; set to `Disabled` to disable. + + - **`ignore:`** The header for ignore configuration + - **`sha:`** A sequence of SHAs to be excluded from the version calculations. Useful when there is a rogue commit in history yielding a bad version. + - **`commits-before:`** Allows to setup an exclusion range. Effectively any commit < `commits-before` will be ignored. ## Branch configuration diff --git a/src/GitVersionCore.Tests/ConfigProviderTests.CanWriteOutEffectiveConfiguration.approved.txt b/src/GitVersionCore.Tests/ConfigProviderTests.CanWriteOutEffectiveConfiguration.approved.txt index 62737ebfaa..e8bce0cdb1 100644 --- a/src/GitVersionCore.Tests/ConfigProviderTests.CanWriteOutEffectiveConfiguration.approved.txt +++ b/src/GitVersionCore.Tests/ConfigProviderTests.CanWriteOutEffectiveConfiguration.approved.txt @@ -1,4 +1,4 @@ -assembly-versioning-scheme: MajorMinorPatch +assembly-versioning-scheme: MajorMinorPatch mode: ContinuousDelivery tag-prefix: '[vV]' continuous-delivery-fallback-tag: ci @@ -53,3 +53,5 @@ branches: increment: Minor prevent-increment-of-merged-branch-version: false track-merge-target: true +ignore: + sha: [] diff --git a/src/GitVersionCore.Tests/Configuration/IgnoreConfigTests.cs b/src/GitVersionCore.Tests/Configuration/IgnoreConfigTests.cs new file mode 100644 index 0000000000..aae3807a23 --- /dev/null +++ b/src/GitVersionCore.Tests/Configuration/IgnoreConfigTests.cs @@ -0,0 +1,84 @@ +using System; +using System.IO; +using GitVersion; +using NUnit.Framework; +using Shouldly; +using YamlDotNet.Core; + +namespace GitVersionCore.Tests.Configuration +{ + [TestFixture] + public class IgnoreConfigTests + { + [Test] + public void CanDeserialize() + { + var yaml = @" +ignore: + sha: [b6c0c9fda88830ebcd563e500a5a7da5a1658e98] + commits-before: 2015-10-23T12:23:15 +"; + + using (var reader = new StringReader(yaml)) + { + var config = ConfigSerialiser.Read(reader); + + config.Ignore.ShouldNotBeNull(); + config.Ignore.SHAs.ShouldNotBeEmpty(); + config.Ignore.SHAs.ShouldBe(new[] { "b6c0c9fda88830ebcd563e500a5a7da5a1658e98" }); + config.Ignore.Before.ShouldBe(DateTimeOffset.Parse("2015-10-23T12:23:15")); + } + } + + [Test] + public void ShouldSupportsOtherSequenceFormat() + { + var yaml = @" +ignore: + sha: + - b6c0c9fda88830ebcd563e500a5a7da5a1658e98 + - 6c19c7c219ecf8dbc468042baefa73a1b213e8b1 +"; + + using (var reader = new StringReader(yaml)) + { + var config = ConfigSerialiser.Read(reader); + + config.Ignore.ShouldNotBeNull(); + config.Ignore.SHAs.ShouldNotBeEmpty(); + config.Ignore.SHAs.ShouldBe(new[] { "b6c0c9fda88830ebcd563e500a5a7da5a1658e98", "6c19c7c219ecf8dbc468042baefa73a1b213e8b1" }); + } + } + + [Test] + public void WhenNotInConfigShouldHaveDefaults() + { + var yaml = @" +next-version: 1.0 +"; + + using (var reader = new StringReader(yaml)) + { + var config = ConfigSerialiser.Read(reader); + + config.Ignore.ShouldNotBeNull(); + config.Ignore.SHAs.ShouldBeEmpty(); + config.Ignore.Before.ShouldBeNull(); + } + } + + [Test] + public void WhenBadDateFormatShouldFail() + { + var yaml = @" +ignore: + commits-before: bad format date +"; + + using (var reader = new StringReader(yaml)) + { + Should.Throw(() => ConfigSerialiser.Read(reader)); + } + } + } +} \ No newline at end of file diff --git a/src/GitVersionCore.Tests/GitVersionCore.Tests.csproj b/src/GitVersionCore.Tests/GitVersionCore.Tests.csproj index add8a6ad6c..333da370c3 100644 --- a/src/GitVersionCore.Tests/GitVersionCore.Tests.csproj +++ b/src/GitVersionCore.Tests/GitVersionCore.Tests.csproj @@ -107,6 +107,7 @@ + @@ -160,6 +161,8 @@ + + diff --git a/src/GitVersionCore.Tests/Init/InitScenarios.CanSetNextVersion.approved.txt b/src/GitVersionCore.Tests/Init/InitScenarios.CanSetNextVersion.approved.txt index bc5d6b1c34..4d1763fcf8 100644 --- a/src/GitVersionCore.Tests/Init/InitScenarios.CanSetNextVersion.approved.txt +++ b/src/GitVersionCore.Tests/Init/InitScenarios.CanSetNextVersion.approved.txt @@ -1,2 +1,4 @@ -next-version: 2.0.0 +next-version: 2.0.0 branches: {} +ignore: + sha: [] diff --git a/src/GitVersionCore.Tests/TestEffectiveConfiguration.cs b/src/GitVersionCore.Tests/TestEffectiveConfiguration.cs index c9ad3b5d4c..1d445f77d7 100644 --- a/src/GitVersionCore.Tests/TestEffectiveConfiguration.cs +++ b/src/GitVersionCore.Tests/TestEffectiveConfiguration.cs @@ -1,14 +1,17 @@ namespace GitVersionCore.Tests { + using System.Collections.Generic; + using System.Linq; using GitVersion; + using GitVersion.VersionFilters; public class TestEffectiveConfiguration : EffectiveConfiguration { public TestEffectiveConfiguration( - AssemblyVersioningScheme assemblyVersioningScheme = AssemblyVersioningScheme.MajorMinorPatch, + AssemblyVersioningScheme assemblyVersioningScheme = AssemblyVersioningScheme.MajorMinorPatch, string assemblyInformationalFormat = null, - VersioningMode versioningMode = VersioningMode.ContinuousDelivery, - string gitTagPrefix = "v", + VersioningMode versioningMode = VersioningMode.ContinuousDelivery, + string gitTagPrefix = "v", string tag = "", string nextVersion = null, string branchPrefixToTrim = "", @@ -22,12 +25,15 @@ public TestEffectiveConfiguration( CommitMessageIncrementMode commitMessageMode = CommitMessageIncrementMode.Enabled, int legacySemVerPadding = 4, int buildMetaDataPadding = 4, - int commitsSinceVersionSourcePadding = 4) : - base(assemblyVersioningScheme, assemblyInformationalFormat, versioningMode, gitTagPrefix, tag, nextVersion, IncrementStrategy.Patch, + int commitsSinceVersionSourcePadding = 4, + IEnumerable versionFilters = null + ) : + base(assemblyVersioningScheme, assemblyInformationalFormat, versioningMode, gitTagPrefix, tag, nextVersion, IncrementStrategy.Patch, branchPrefixToTrim, preventIncrementForMergedBranchVersion, tagNumberPattern, continuousDeploymentFallbackTag, trackMergeTarget, majorMessage, minorMessage, patchMessage, - commitMessageMode, legacySemVerPadding, buildMetaDataPadding, commitsSinceVersionSourcePadding) + commitMessageMode, legacySemVerPadding, buildMetaDataPadding, commitsSinceVersionSourcePadding, + versionFilters ?? Enumerable.Empty()) { } } diff --git a/src/GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs b/src/GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs index 4bb2ffe965..46b2e0256a 100644 --- a/src/GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs +++ b/src/GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs @@ -6,6 +6,7 @@ using GitVersion; using GitVersion.VersionCalculation; using GitVersion.VersionCalculation.BaseVersionCalculators; + using GitVersion.VersionFilters; using LibGit2Sharp; using NUnit.Framework; using Shouldly; @@ -84,5 +85,82 @@ public override IEnumerable GetVersions(GitVersionContext context) yield return new BaseVersion("Source 2", true, new SemanticVersion(2), when, null); } } + + [Test] + public void ShouldNotFilterVersion() + { + var fakeIgnoreConfig = new TestIgnoreConfig(new ExcludeSourcesContainingExclude()); + var context = new GitVersionContextBuilder().WithConfig(new Config() { Ignore = fakeIgnoreConfig }).Build(); + var version = new BaseVersion("dummy", false, new SemanticVersion(2), new MockCommit(), null); + var sut = new BaseVersionCalculator(new TestVersionStrategy(version)); + + var baseVersion = sut.GetBaseVersion(context); + + baseVersion.Source.ShouldBe(version.Source); + baseVersion.ShouldIncrement.ShouldBe(version.ShouldIncrement); + baseVersion.SemanticVersion.ShouldBe(version.SemanticVersion); + } + + [Test] + public void ShouldFilterVersion() + { + var fakeIgnoreConfig = new TestIgnoreConfig(new ExcludeSourcesContainingExclude()); + var context = new GitVersionContextBuilder().WithConfig(new Config() { Ignore = fakeIgnoreConfig }).Build(); + var higherVersion = new BaseVersion("exclude", false, new SemanticVersion(2), new MockCommit(), null); + var lowerVersion = new BaseVersion("dummy", false, new SemanticVersion(1), new MockCommit(), null); + var sut = new BaseVersionCalculator(new TestVersionStrategy(higherVersion, lowerVersion)); + + var baseVersion = sut.GetBaseVersion(context); + + baseVersion.Source.ShouldNotBe(higherVersion.Source); + baseVersion.SemanticVersion.ShouldNotBe(higherVersion.SemanticVersion); + baseVersion.Source.ShouldBe(lowerVersion.Source); + baseVersion.SemanticVersion.ShouldBe(lowerVersion.SemanticVersion); + } + + internal class TestIgnoreConfig : IgnoreConfig + { + private readonly IVersionFilter filter; + + public TestIgnoreConfig(IVersionFilter filter) + { + this.filter = filter; + } + + public override IEnumerable ToFilters() + { + yield return filter; + } + } + + internal class ExcludeSourcesContainingExclude : IVersionFilter + { + public bool Exclude(BaseVersion version, out string reason) + { + reason = null; + + if (version.Source.Contains("exclude")) + { + reason = "was excluded"; + return true; + } + return false; + } + } + + class TestVersionStrategy : BaseVersionStrategy + { + private readonly IEnumerable versions; + + public TestVersionStrategy(params BaseVersion[] versions) + { + this.versions = versions; + } + + public override IEnumerable GetVersions(GitVersionContext context) + { + return versions; + } + } } } \ No newline at end of file diff --git a/src/GitVersionCore.Tests/VersionFilters/MinDateVersionFilterTests.cs b/src/GitVersionCore.Tests/VersionFilters/MinDateVersionFilterTests.cs new file mode 100644 index 0000000000..8a5b7c9c7d --- /dev/null +++ b/src/GitVersionCore.Tests/VersionFilters/MinDateVersionFilterTests.cs @@ -0,0 +1,64 @@ +using System; +using GitVersion; +using GitVersion.VersionCalculation.BaseVersionCalculators; +using GitVersion.VersionFilters; +using LibGit2Sharp; +using NUnit.Framework; +using Shouldly; + +namespace GitVersionCore.Tests.VersionFilters +{ + [TestFixture] + public class MinDateVersionFilterTests + { + [Test] + public void VerifyNullGuard() + { + var commit = new MockCommit(); + var dummy = DateTimeOffset.UtcNow.AddSeconds(1.0); + var sut = new MinDateVersionFilter(dummy); + + string reason; + Should.Throw(() => sut.Exclude(null, out reason)); + } + + [Test] + public void WhenCommitShouldExcludeWithReason() + { + var commit = new MockCommit(); //when = UtcNow + var version = new BaseVersion("dummy", false, new SemanticVersion(1), commit, string.Empty); + var futureDate = DateTimeOffset.UtcNow.AddYears(1); + var sut = new MinDateVersionFilter(futureDate); + + string reason; + sut.Exclude(version, out reason).ShouldBeTrue(); + reason.ShouldNotBeNullOrWhiteSpace(); + } + + [Test] + public void WhenShaMismatchShouldNotExclude() + { + var commit = new MockCommit(); //when = UtcNow + var version = new BaseVersion("dummy", false, new SemanticVersion(1), commit, string.Empty); + var pastDate = DateTimeOffset.UtcNow.AddYears(-1); + var sut = new MinDateVersionFilter(pastDate); + + string reason; + sut.Exclude(version, out reason).ShouldBeFalse(); + reason.ShouldBeNull(); + } + + [Test] + public void ExcludeShouldAcceptVersionWithNullCommit() + { + Commit nullCommit = null; + var version = new BaseVersion("dummy", false, new SemanticVersion(1), nullCommit, string.Empty); + var futureDate = DateTimeOffset.UtcNow.AddYears(1); + var sut = new MinDateVersionFilter(futureDate); + + string reason; + sut.Exclude(version, out reason).ShouldBeFalse(); + reason.ShouldBeNull(); + } + } +} diff --git a/src/GitVersionCore.Tests/VersionFilters/ShaVersionFilterTests.cs b/src/GitVersionCore.Tests/VersionFilters/ShaVersionFilterTests.cs new file mode 100644 index 0000000000..120fd6dd9d --- /dev/null +++ b/src/GitVersionCore.Tests/VersionFilters/ShaVersionFilterTests.cs @@ -0,0 +1,66 @@ +using System; +using GitVersion; +using GitVersion.VersionCalculation.BaseVersionCalculators; +using GitVersion.VersionFilters; +using LibGit2Sharp; +using NUnit.Framework; +using Shouldly; + +namespace GitVersionCore.Tests.VersionFilters +{ + [TestFixture] + public class ShaVersionFilterTests + { + [Test] + public void VerifyNullGuard() + { + Should.Throw(() => new ShaVersionFilter(null)); + } + + [Test] + public void VerifyNullGuard2() + { + var commit = new MockCommit(); + var sut = new ShaVersionFilter(new[] { commit.Sha }); + + string reason; + Should.Throw(() => sut.Exclude(null, out reason)); + } + + [Test] + public void WhenShaMatchShouldExcludeWithReason() + { + var commit = new MockCommit(); + var version = new BaseVersion("dummy", false, new SemanticVersion(1), commit, string.Empty); + var sut = new ShaVersionFilter(new[] { commit.Sha }); + + string reason; + sut.Exclude(version, out reason).ShouldBeTrue(); + reason.ShouldNotBeNullOrWhiteSpace(); + } + + [Test] + public void WhenShaMismatchShouldNotExclude() + { + var commit = new MockCommit(); + var version = new BaseVersion("dummy", false, new SemanticVersion(1), commit, string.Empty); + var sut = new ShaVersionFilter(new[] { "mismatched" }); + + string reason; + sut.Exclude(version, out reason).ShouldBeFalse(); + reason.ShouldBeNull(); + } + + [Test] + public void ExcludeShouldAcceptVersionWithNullCommit() + { + Commit nullCommit = null; + var version = new BaseVersion("dummy", false, new SemanticVersion(1), nullCommit, string.Empty); + var sut = new ShaVersionFilter(new[] { "mismatched" }); + + string reason; + sut.Exclude(version, out reason).ShouldBeFalse(); + reason.ShouldBeNull(); + } + } +} diff --git a/src/GitVersionCore/Configuration/Config.cs b/src/GitVersionCore/Configuration/Config.cs index 14d12f0e86..4c492f77a0 100644 --- a/src/GitVersionCore/Configuration/Config.cs +++ b/src/GitVersionCore/Configuration/Config.cs @@ -10,6 +10,11 @@ public class Config Dictionary branches = new Dictionary(); string nextVersion; + public Config() + { + Ignore = new IgnoreConfig(); + } + [YamlMember(Alias = "assembly-versioning-scheme")] public AssemblyVersioningScheme? AssemblyVersioningScheme { get; set; } @@ -82,11 +87,14 @@ private T MergeObjects(T target, T source) { typeof(T).GetProperties() .Where(prop => prop.CanRead && prop.CanWrite) - .Select(_ => new {prop = _, value =_.GetValue(source, null) } ) + .Select(_ => new { prop = _, value = _.GetValue(source, null) }) .Where(_ => _.value != null) .ToList() .ForEach(_ => _.prop.SetValue(target, _.value, null)); return target; } + + [YamlMember(Alias = "ignore")] + public IgnoreConfig Ignore { get; set; } } } \ No newline at end of file diff --git a/src/GitVersionCore/Configuration/IgnoreConfig.cs b/src/GitVersionCore/Configuration/IgnoreConfig.cs new file mode 100644 index 0000000000..df4d45fa17 --- /dev/null +++ b/src/GitVersionCore/Configuration/IgnoreConfig.cs @@ -0,0 +1,28 @@ +namespace GitVersion +{ + using System; + using System.Collections.Generic; + using System.Linq; + using GitVersion.VersionFilters; + using YamlDotNet.Serialization; + + public class IgnoreConfig + { + public IgnoreConfig() + { + SHAs = Enumerable.Empty(); + } + + [YamlMember(Alias = "commits-before")] + public DateTimeOffset? Before { get; set; } + + [YamlMember(Alias = "sha")] + public IEnumerable SHAs { get; set; } + + public virtual IEnumerable ToFilters() + { + if (SHAs.Any()) yield return new ShaVersionFilter(SHAs); + if (Before.HasValue) yield return new MinDateVersionFilter(Before.Value); + } + } +} \ No newline at end of file diff --git a/src/GitVersionCore/EffectiveConfiguration.cs b/src/GitVersionCore/EffectiveConfiguration.cs index 23ddce5db7..3f99ca0fa8 100644 --- a/src/GitVersionCore/EffectiveConfiguration.cs +++ b/src/GitVersionCore/EffectiveConfiguration.cs @@ -1,4 +1,7 @@ -namespace GitVersion +using System.Collections.Generic; +using GitVersion.VersionFilters; + +namespace GitVersion { /// /// Configuration can be applied to different things, effective configuration is the result after applying the appropriate configuration @@ -6,14 +9,14 @@ public class EffectiveConfiguration { public EffectiveConfiguration( - AssemblyVersioningScheme assemblyVersioningScheme, + AssemblyVersioningScheme assemblyVersioningScheme, string assemblyInformationalFormat, - VersioningMode versioningMode, string gitTagPrefix, - string tag, string nextVersion, IncrementStrategy increment, - string branchPrefixToTrim, - bool preventIncrementForMergedBranchVersion, + VersioningMode versioningMode, string gitTagPrefix, + string tag, string nextVersion, IncrementStrategy increment, + string branchPrefixToTrim, + bool preventIncrementForMergedBranchVersion, string tagNumberPattern, - string continuousDeploymentFallbackTag, + string continuousDeploymentFallbackTag, bool trackMergeTarget, string majorVersionBumpMessage, string minorVersionBumpMessage, @@ -21,7 +24,8 @@ public EffectiveConfiguration( CommitMessageIncrementMode commitMessageIncrementing, int legacySemVerPaddding, int buildMetaDataPadding, - int commitsSinceVersionSourcePadding + int commitsSinceVersionSourcePadding, + IEnumerable versionFilters ) { AssemblyVersioningScheme = assemblyVersioningScheme; @@ -43,6 +47,7 @@ int commitsSinceVersionSourcePadding LegacySemVerPadding = legacySemVerPaddding; BuildMetaDataPadding = buildMetaDataPadding; CommitsSinceVersionSourcePadding = commitsSinceVersionSourcePadding; + VersionFilters = versionFilters; } public VersioningMode VersioningMode { get; private set; } @@ -75,16 +80,18 @@ int commitsSinceVersionSourcePadding public bool TrackMergeTarget { get; private set; } public string MajorVersionBumpMessage { get; private set; } - + public string MinorVersionBumpMessage { get; private set; } public string PatchVersionBumpMessage { get; private set; } public int LegacySemVerPadding { get; private set; } - public int BuildMetaDataPadding { get; private set; } + public int BuildMetaDataPadding { get; private set; } public int CommitsSinceVersionSourcePadding { get; private set; } public CommitMessageIncrementMode CommitMessageIncrementing { get; private set; } + + public IEnumerable VersionFilters { get; private set; } } } \ No newline at end of file diff --git a/src/GitVersionCore/GitVersionContext.cs b/src/GitVersionCore/GitVersionContext.cs index 952066e838..1ede21235a 100644 --- a/src/GitVersionCore/GitVersionContext.cs +++ b/src/GitVersionCore/GitVersionContext.cs @@ -100,7 +100,7 @@ void CalculateEffectiveConfiguration() var incrementStrategy = currentBranchConfig.Value.Increment.Value; var preventIncrementForMergedBranchVersion = currentBranchConfig.Value.PreventIncrementOfMergedBranchVersion.Value; var trackMergeTarget = currentBranchConfig.Value.TrackMergeTarget.Value; - + var nextVersion = configuration.NextVersion; var assemblyVersioningScheme = configuration.AssemblyVersioningScheme.Value; var assemblyInformationalFormat = configuration.AssemblyInformationalFormat; @@ -111,17 +111,20 @@ void CalculateEffectiveConfiguration() var commitMessageVersionBump = currentBranchConfig.Value.CommitMessageIncrementing ?? configuration.CommitMessageIncrementing.Value; + var versionFilter = Configuration = new EffectiveConfiguration( - assemblyVersioningScheme, assemblyInformationalFormat, versioningMode, gitTagPrefix, - tag, nextVersion, incrementStrategy, currentBranchConfig.Key, - preventIncrementForMergedBranchVersion, + assemblyVersioningScheme, assemblyInformationalFormat, versioningMode, gitTagPrefix, + tag, nextVersion, incrementStrategy, currentBranchConfig.Key, + preventIncrementForMergedBranchVersion, tagNumberPattern, configuration.ContinuousDeploymentFallbackTag, trackMergeTarget, majorMessage, minorMessage, patchMessage, commitMessageVersionBump, configuration.LegacySemVerPadding.Value, configuration.BuildMetaDataPadding.Value, - configuration.CommitsSinceVersionSourcePadding.Value); + configuration.CommitsSinceVersionSourcePadding.Value, + configuration.Ignore.ToFilters() + ); } } } diff --git a/src/GitVersionCore/GitVersionCore.csproj b/src/GitVersionCore/GitVersionCore.csproj index 599be843c9..be7f72c2c6 100644 --- a/src/GitVersionCore/GitVersionCore.csproj +++ b/src/GitVersionCore/GitVersionCore.csproj @@ -86,6 +86,7 @@ + @@ -125,6 +126,9 @@ + + + diff --git a/src/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs b/src/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs index 8747649830..80b1d1599d 100644 --- a/src/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs +++ b/src/GitVersionCore/VersionCalculation/BaseVersionCalculator.cs @@ -21,13 +21,21 @@ public BaseVersion GetBaseVersion(GitVersionContext context) .SelectMany(s => s.GetVersions(context)) .Where(v => { - if (v != null) + if (v == null) return false; + + Logger.WriteInfo(v.ToString()); + + foreach (var filter in context.Configuration.VersionFilters) { - Logger.WriteInfo(v.ToString()); - return true; + string reason; + if (filter.Exclude(v, out reason)) + { + Logger.WriteInfo(reason); + return false; + } } - return false; + return true; }) .Select(v => new { diff --git a/src/GitVersionCore/VersionFilters/IVersionFilter.cs b/src/GitVersionCore/VersionFilters/IVersionFilter.cs new file mode 100644 index 0000000000..3e9b5407f9 --- /dev/null +++ b/src/GitVersionCore/VersionFilters/IVersionFilter.cs @@ -0,0 +1,9 @@ +using GitVersion.VersionCalculation.BaseVersionCalculators; + +namespace GitVersion.VersionFilters +{ + public interface IVersionFilter + { + bool Exclude(BaseVersion version, out string reason); + } +} diff --git a/src/GitVersionCore/VersionFilters/MinDateVersionFilter.cs b/src/GitVersionCore/VersionFilters/MinDateVersionFilter.cs new file mode 100644 index 0000000000..d8df5fce8f --- /dev/null +++ b/src/GitVersionCore/VersionFilters/MinDateVersionFilter.cs @@ -0,0 +1,31 @@ +using System; +using GitVersion.VersionCalculation.BaseVersionCalculators; + +namespace GitVersion.VersionFilters +{ + public class MinDateVersionFilter : IVersionFilter + { + private readonly DateTimeOffset minimum; + + public MinDateVersionFilter(DateTimeOffset minimum) + { + this.minimum = minimum; + } + + public bool Exclude(BaseVersion version, out string reason) + { + if (version == null) throw new ArgumentNullException("version"); + + reason = null; + + if (version.BaseVersionSource != null && + version.BaseVersionSource.When() < minimum) + { + reason = "Source was ignored due to commit date being outside of configured range"; + return true; + } + + return false; + } + } +} diff --git a/src/GitVersionCore/VersionFilters/ShaVersionFilter.cs b/src/GitVersionCore/VersionFilters/ShaVersionFilter.cs new file mode 100644 index 0000000000..1f33e214c0 --- /dev/null +++ b/src/GitVersionCore/VersionFilters/ShaVersionFilter.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using GitVersion.VersionCalculation.BaseVersionCalculators; + +namespace GitVersion.VersionFilters +{ + public class ShaVersionFilter : IVersionFilter + { + private readonly IEnumerable shas; + + public ShaVersionFilter(IEnumerable shas) + { + if (shas == null) throw new ArgumentNullException("shas"); + this.shas = shas; + } + + public bool Exclude(BaseVersion version, out string reason) + { + if (version == null) throw new ArgumentNullException("version"); + + reason = null; + + if (version.BaseVersionSource != null && + shas.Any(sha => version.BaseVersionSource.Sha.StartsWith(sha, StringComparison.OrdinalIgnoreCase))) + { + reason = "Source was ignored due to commit having been excluded by configuration"; + return true; + } + + return false; + } + } +}