Skip to content

Commit 6a28b87

Browse files
committed
Merge pull request #851 from Tungsten78/ignore-support
Allow ignoring part of history when calculating version (issue #538)
2 parents ab2ed68 + 72c3d90 commit 6a28b87

18 files changed

+469
-28
lines changed

docs/configuration.md

+4
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ The global configuration options are:
4141
- **`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`.
4242

4343
- **`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.
44+
45+
- **`ignore:`** The header for ignore configuration
46+
- **`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.
47+
- **`commits-before:`** Allows to setup an exclusion range. Effectively any commit < `commits-before` will be ignored.
4448

4549
## Branch configuration
4650

src/GitVersionCore.Tests/ConfigProviderTests.CanWriteOutEffectiveConfiguration.approved.txt

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
assembly-versioning-scheme: MajorMinorPatch
1+
assembly-versioning-scheme: MajorMinorPatch
22
mode: ContinuousDelivery
33
tag-prefix: '[vV]'
44
continuous-delivery-fallback-tag: ci
@@ -53,3 +53,5 @@ branches:
5353
increment: Minor
5454
prevent-increment-of-merged-branch-version: false
5555
track-merge-target: true
56+
ignore:
57+
sha: []
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
using System;
2+
using System.IO;
3+
using GitVersion;
4+
using NUnit.Framework;
5+
using Shouldly;
6+
using YamlDotNet.Core;
7+
8+
namespace GitVersionCore.Tests.Configuration
9+
{
10+
[TestFixture]
11+
public class IgnoreConfigTests
12+
{
13+
[Test]
14+
public void CanDeserialize()
15+
{
16+
var yaml = @"
17+
ignore:
18+
sha: [b6c0c9fda88830ebcd563e500a5a7da5a1658e98]
19+
commits-before: 2015-10-23T12:23:15
20+
";
21+
22+
using (var reader = new StringReader(yaml))
23+
{
24+
var config = ConfigSerialiser.Read(reader);
25+
26+
config.Ignore.ShouldNotBeNull();
27+
config.Ignore.SHAs.ShouldNotBeEmpty();
28+
config.Ignore.SHAs.ShouldBe(new[] { "b6c0c9fda88830ebcd563e500a5a7da5a1658e98" });
29+
config.Ignore.Before.ShouldBe(DateTimeOffset.Parse("2015-10-23T12:23:15"));
30+
}
31+
}
32+
33+
[Test]
34+
public void ShouldSupportsOtherSequenceFormat()
35+
{
36+
var yaml = @"
37+
ignore:
38+
sha:
39+
- b6c0c9fda88830ebcd563e500a5a7da5a1658e98
40+
- 6c19c7c219ecf8dbc468042baefa73a1b213e8b1
41+
";
42+
43+
using (var reader = new StringReader(yaml))
44+
{
45+
var config = ConfigSerialiser.Read(reader);
46+
47+
config.Ignore.ShouldNotBeNull();
48+
config.Ignore.SHAs.ShouldNotBeEmpty();
49+
config.Ignore.SHAs.ShouldBe(new[] { "b6c0c9fda88830ebcd563e500a5a7da5a1658e98", "6c19c7c219ecf8dbc468042baefa73a1b213e8b1" });
50+
}
51+
}
52+
53+
[Test]
54+
public void WhenNotInConfigShouldHaveDefaults()
55+
{
56+
var yaml = @"
57+
next-version: 1.0
58+
";
59+
60+
using (var reader = new StringReader(yaml))
61+
{
62+
var config = ConfigSerialiser.Read(reader);
63+
64+
config.Ignore.ShouldNotBeNull();
65+
config.Ignore.SHAs.ShouldBeEmpty();
66+
config.Ignore.Before.ShouldBeNull();
67+
}
68+
}
69+
70+
[Test]
71+
public void WhenBadDateFormatShouldFail()
72+
{
73+
var yaml = @"
74+
ignore:
75+
commits-before: bad format date
76+
";
77+
78+
using (var reader = new StringReader(yaml))
79+
{
80+
Should.Throw<YamlException>(() => ConfigSerialiser.Read(reader));
81+
}
82+
}
83+
}
84+
}

src/GitVersionCore.Tests/GitVersionCore.Tests.csproj

+3
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@
107107
<Compile Include="BuildServers\MyGetTests.cs" />
108108
<Compile Include="BuildServers\VsoAgentTests.cs" />
109109
<Compile Include="BuildServers\TeamCityTests.cs" />
110+
<Compile Include="Configuration\IgnoreConfigTests.cs" />
110111
<Compile Include="GitToolsTestingExtensions.cs" />
111112
<Compile Include="DocumentationTests.cs" />
112113
<Compile Include="ConfigProviderTests.cs" />
@@ -160,6 +161,8 @@
160161
<Compile Include="VersionCalculation\Strategies\VersionInBranchBaseVersionStrategyTests.cs" />
161162
<Compile Include="VersionCalculation\TestBaseVersionCalculator.cs" />
162163
<Compile Include="VersionCalculation\TestMetaDataCalculator.cs" />
164+
<Compile Include="VersionFilters\MinDateVersionFilterTests.cs" />
165+
<Compile Include="VersionFilters\ShaVersionFilterTests.cs" />
163166
</ItemGroup>
164167
<ItemGroup>
165168
<None Include="app.config" />
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
1-
next-version: 2.0.0
1+
next-version: 2.0.0
22
branches: {}
3+
ignore:
4+
sha: []

src/GitVersionCore.Tests/TestEffectiveConfiguration.cs

+12-6
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
namespace GitVersionCore.Tests
22
{
3+
using System.Collections.Generic;
4+
using System.Linq;
35
using GitVersion;
6+
using GitVersion.VersionFilters;
47

58
public class TestEffectiveConfiguration : EffectiveConfiguration
69
{
710
public TestEffectiveConfiguration(
8-
AssemblyVersioningScheme assemblyVersioningScheme = AssemblyVersioningScheme.MajorMinorPatch,
11+
AssemblyVersioningScheme assemblyVersioningScheme = AssemblyVersioningScheme.MajorMinorPatch,
912
string assemblyInformationalFormat = null,
10-
VersioningMode versioningMode = VersioningMode.ContinuousDelivery,
11-
string gitTagPrefix = "v",
13+
VersioningMode versioningMode = VersioningMode.ContinuousDelivery,
14+
string gitTagPrefix = "v",
1215
string tag = "",
1316
string nextVersion = null,
1417
string branchPrefixToTrim = "",
@@ -22,12 +25,15 @@ public TestEffectiveConfiguration(
2225
CommitMessageIncrementMode commitMessageMode = CommitMessageIncrementMode.Enabled,
2326
int legacySemVerPadding = 4,
2427
int buildMetaDataPadding = 4,
25-
int commitsSinceVersionSourcePadding = 4) :
26-
base(assemblyVersioningScheme, assemblyInformationalFormat, versioningMode, gitTagPrefix, tag, nextVersion, IncrementStrategy.Patch,
28+
int commitsSinceVersionSourcePadding = 4,
29+
IEnumerable<IVersionFilter> versionFilters = null
30+
) :
31+
base(assemblyVersioningScheme, assemblyInformationalFormat, versioningMode, gitTagPrefix, tag, nextVersion, IncrementStrategy.Patch,
2732
branchPrefixToTrim, preventIncrementForMergedBranchVersion, tagNumberPattern, continuousDeploymentFallbackTag,
2833
trackMergeTarget,
2934
majorMessage, minorMessage, patchMessage,
30-
commitMessageMode, legacySemVerPadding, buildMetaDataPadding, commitsSinceVersionSourcePadding)
35+
commitMessageMode, legacySemVerPadding, buildMetaDataPadding, commitsSinceVersionSourcePadding,
36+
versionFilters ?? Enumerable.Empty<IVersionFilter>())
3137
{
3238
}
3339
}

src/GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs

+78
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using GitVersion;
77
using GitVersion.VersionCalculation;
88
using GitVersion.VersionCalculation.BaseVersionCalculators;
9+
using GitVersion.VersionFilters;
910
using LibGit2Sharp;
1011
using NUnit.Framework;
1112
using Shouldly;
@@ -84,5 +85,82 @@ public override IEnumerable<BaseVersion> GetVersions(GitVersionContext context)
8485
yield return new BaseVersion("Source 2", true, new SemanticVersion(2), when, null);
8586
}
8687
}
88+
89+
[Test]
90+
public void ShouldNotFilterVersion()
91+
{
92+
var fakeIgnoreConfig = new TestIgnoreConfig(new ExcludeSourcesContainingExclude());
93+
var context = new GitVersionContextBuilder().WithConfig(new Config() { Ignore = fakeIgnoreConfig }).Build();
94+
var version = new BaseVersion("dummy", false, new SemanticVersion(2), new MockCommit(), null);
95+
var sut = new BaseVersionCalculator(new TestVersionStrategy(version));
96+
97+
var baseVersion = sut.GetBaseVersion(context);
98+
99+
baseVersion.Source.ShouldBe(version.Source);
100+
baseVersion.ShouldIncrement.ShouldBe(version.ShouldIncrement);
101+
baseVersion.SemanticVersion.ShouldBe(version.SemanticVersion);
102+
}
103+
104+
[Test]
105+
public void ShouldFilterVersion()
106+
{
107+
var fakeIgnoreConfig = new TestIgnoreConfig(new ExcludeSourcesContainingExclude());
108+
var context = new GitVersionContextBuilder().WithConfig(new Config() { Ignore = fakeIgnoreConfig }).Build();
109+
var higherVersion = new BaseVersion("exclude", false, new SemanticVersion(2), new MockCommit(), null);
110+
var lowerVersion = new BaseVersion("dummy", false, new SemanticVersion(1), new MockCommit(), null);
111+
var sut = new BaseVersionCalculator(new TestVersionStrategy(higherVersion, lowerVersion));
112+
113+
var baseVersion = sut.GetBaseVersion(context);
114+
115+
baseVersion.Source.ShouldNotBe(higherVersion.Source);
116+
baseVersion.SemanticVersion.ShouldNotBe(higherVersion.SemanticVersion);
117+
baseVersion.Source.ShouldBe(lowerVersion.Source);
118+
baseVersion.SemanticVersion.ShouldBe(lowerVersion.SemanticVersion);
119+
}
120+
121+
internal class TestIgnoreConfig : IgnoreConfig
122+
{
123+
private readonly IVersionFilter filter;
124+
125+
public TestIgnoreConfig(IVersionFilter filter)
126+
{
127+
this.filter = filter;
128+
}
129+
130+
public override IEnumerable<IVersionFilter> ToFilters()
131+
{
132+
yield return filter;
133+
}
134+
}
135+
136+
internal class ExcludeSourcesContainingExclude : IVersionFilter
137+
{
138+
public bool Exclude(BaseVersion version, out string reason)
139+
{
140+
reason = null;
141+
142+
if (version.Source.Contains("exclude"))
143+
{
144+
reason = "was excluded";
145+
return true;
146+
}
147+
return false;
148+
}
149+
}
150+
151+
class TestVersionStrategy : BaseVersionStrategy
152+
{
153+
private readonly IEnumerable<BaseVersion> versions;
154+
155+
public TestVersionStrategy(params BaseVersion[] versions)
156+
{
157+
this.versions = versions;
158+
}
159+
160+
public override IEnumerable<BaseVersion> GetVersions(GitVersionContext context)
161+
{
162+
return versions;
163+
}
164+
}
87165
}
88166
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
using System;
2+
using GitVersion;
3+
using GitVersion.VersionCalculation.BaseVersionCalculators;
4+
using GitVersion.VersionFilters;
5+
using LibGit2Sharp;
6+
using NUnit.Framework;
7+
using Shouldly;
8+
9+
namespace GitVersionCore.Tests.VersionFilters
10+
{
11+
[TestFixture]
12+
public class MinDateVersionFilterTests
13+
{
14+
[Test]
15+
public void VerifyNullGuard()
16+
{
17+
var commit = new MockCommit();
18+
var dummy = DateTimeOffset.UtcNow.AddSeconds(1.0);
19+
var sut = new MinDateVersionFilter(dummy);
20+
21+
string reason;
22+
Should.Throw<ArgumentNullException>(() => sut.Exclude(null, out reason));
23+
}
24+
25+
[Test]
26+
public void WhenCommitShouldExcludeWithReason()
27+
{
28+
var commit = new MockCommit(); //when = UtcNow
29+
var version = new BaseVersion("dummy", false, new SemanticVersion(1), commit, string.Empty);
30+
var futureDate = DateTimeOffset.UtcNow.AddYears(1);
31+
var sut = new MinDateVersionFilter(futureDate);
32+
33+
string reason;
34+
sut.Exclude(version, out reason).ShouldBeTrue();
35+
reason.ShouldNotBeNullOrWhiteSpace();
36+
}
37+
38+
[Test]
39+
public void WhenShaMismatchShouldNotExclude()
40+
{
41+
var commit = new MockCommit(); //when = UtcNow
42+
var version = new BaseVersion("dummy", false, new SemanticVersion(1), commit, string.Empty);
43+
var pastDate = DateTimeOffset.UtcNow.AddYears(-1);
44+
var sut = new MinDateVersionFilter(pastDate);
45+
46+
string reason;
47+
sut.Exclude(version, out reason).ShouldBeFalse();
48+
reason.ShouldBeNull();
49+
}
50+
51+
[Test]
52+
public void ExcludeShouldAcceptVersionWithNullCommit()
53+
{
54+
Commit nullCommit = null;
55+
var version = new BaseVersion("dummy", false, new SemanticVersion(1), nullCommit, string.Empty);
56+
var futureDate = DateTimeOffset.UtcNow.AddYears(1);
57+
var sut = new MinDateVersionFilter(futureDate);
58+
59+
string reason;
60+
sut.Exclude(version, out reason).ShouldBeFalse();
61+
reason.ShouldBeNull();
62+
}
63+
}
64+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
using System;
2+
using GitVersion;
3+
using GitVersion.VersionCalculation.BaseVersionCalculators;
4+
using GitVersion.VersionFilters;
5+
using LibGit2Sharp;
6+
using NUnit.Framework;
7+
using Shouldly;
8+
9+
namespace GitVersionCore.Tests.VersionFilters
10+
{
11+
[TestFixture]
12+
public class ShaVersionFilterTests
13+
{
14+
[Test]
15+
public void VerifyNullGuard()
16+
{
17+
Should.Throw<ArgumentNullException>(() => new ShaVersionFilter(null));
18+
}
19+
20+
[Test]
21+
public void VerifyNullGuard2()
22+
{
23+
var commit = new MockCommit();
24+
var sut = new ShaVersionFilter(new[] { commit.Sha });
25+
26+
string reason;
27+
Should.Throw<ArgumentNullException>(() => sut.Exclude(null, out reason));
28+
}
29+
30+
[Test]
31+
public void WhenShaMatchShouldExcludeWithReason()
32+
{
33+
var commit = new MockCommit();
34+
var version = new BaseVersion("dummy", false, new SemanticVersion(1), commit, string.Empty);
35+
var sut = new ShaVersionFilter(new[] { commit.Sha });
36+
37+
string reason;
38+
sut.Exclude(version, out reason).ShouldBeTrue();
39+
reason.ShouldNotBeNullOrWhiteSpace();
40+
}
41+
42+
[Test]
43+
public void WhenShaMismatchShouldNotExclude()
44+
{
45+
var commit = new MockCommit();
46+
var version = new BaseVersion("dummy", false, new SemanticVersion(1), commit, string.Empty);
47+
var sut = new ShaVersionFilter(new[] { "mismatched" });
48+
49+
string reason;
50+
sut.Exclude(version, out reason).ShouldBeFalse();
51+
reason.ShouldBeNull();
52+
}
53+
54+
[Test]
55+
public void ExcludeShouldAcceptVersionWithNullCommit()
56+
{
57+
Commit nullCommit = null;
58+
var version = new BaseVersion("dummy", false, new SemanticVersion(1), nullCommit, string.Empty);
59+
var sut = new ShaVersionFilter(new[] { "mismatched" });
60+
61+
string reason;
62+
sut.Exclude(version, out reason).ShouldBeFalse();
63+
reason.ShouldBeNull();
64+
}
65+
}
66+
}

0 commit comments

Comments
 (0)