Skip to content

Commit b7f2386

Browse files
committed
Added MetaDataCalculator in and fixed up some other shortcomings in the design
1 parent e2fe74b commit b7f2386

15 files changed

+158
-20
lines changed

GitVersionCore.Tests/GitVersionCore.Tests.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,8 @@
121121
<Compile Include="GitVersionContextBuilder.cs" />
122122
<Compile Include="VersionCalculation\Strategies\LastTagBaseVersionStrategyTests.cs" />
123123
<Compile Include="VersionCalculation\Strategies\MergeMessageBaseVersionStrategyTests.cs" />
124+
<Compile Include="VersionCalculation\TestBaseVersionCalculator.cs" />
125+
<Compile Include="VersionCalculation\TestMetaDataCalculator.cs" />
124126
</ItemGroup>
125127
<ItemGroup>
126128
<None Include="packages.config" />

GitVersionCore.Tests/VersionCalculation/BaseVersionCalculatorTests.cs

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
namespace GitVersionCore.Tests.VersionCalculation
22
{
3+
using System;
34
using GitVersion;
45
using GitVersion.VersionCalculation;
56
using GitVersion.VersionCalculation.BaseVersionCalculators;
@@ -13,27 +14,71 @@ public class BaseVersionCalculatorTests
1314
public void ChoosesHighestVersionReturnedFromStrategies()
1415
{
1516
var context = new GitVersionContextBuilder().Build();
16-
var sut = new BaseVersionCalculator(new V1Strategy(), new V2Strategy());
17+
var dateTimeOffset = DateTimeOffset.Now;
18+
var sut = new BaseVersionCalculator(new V1Strategy(DateTimeOffset.Now), new V2Strategy(dateTimeOffset));
1719

1820
var baseVersion = sut.GetBaseVersion(context);
1921

2022
baseVersion.SemanticVersion.ToString().ShouldBe("2.0.0");
2123
baseVersion.ShouldIncrement.ShouldBe(true);
24+
baseVersion.BaseVersionWhenFrom.ShouldBe(dateTimeOffset);
25+
}
26+
27+
[Test]
28+
public void UsesWhenFromNextBestMatchIfHighestDoesntHaveWhen()
29+
{
30+
var context = new GitVersionContextBuilder().Build();
31+
var when = DateTimeOffset.Now;
32+
var sut = new BaseVersionCalculator(new V1Strategy(when), new V2Strategy(null));
33+
34+
var baseVersion = sut.GetBaseVersion(context);
35+
36+
baseVersion.SemanticVersion.ToString().ShouldBe("2.0.0");
37+
baseVersion.ShouldIncrement.ShouldBe(true);
38+
baseVersion.BaseVersionWhenFrom.ShouldBe(when);
39+
}
40+
41+
[Test]
42+
public void UsesWhenFromNextBestMatchIfHighestDoesntHaveWhenReversedOrder()
43+
{
44+
var context = new GitVersionContextBuilder().Build();
45+
var when = DateTimeOffset.Now;
46+
var sut = new BaseVersionCalculator(new V1Strategy(null), new V2Strategy(when));
47+
48+
var baseVersion = sut.GetBaseVersion(context);
49+
50+
baseVersion.SemanticVersion.ToString().ShouldBe("2.0.0");
51+
baseVersion.ShouldIncrement.ShouldBe(true);
52+
baseVersion.BaseVersionWhenFrom.ShouldBe(when);
2253
}
2354

2455
class V1Strategy : BaseVersionStrategy
2556
{
57+
readonly DateTimeOffset? when;
58+
59+
public V1Strategy(DateTimeOffset? when)
60+
{
61+
this.when = when;
62+
}
63+
2664
public override BaseVersion GetVersion(GitVersionContext context)
2765
{
28-
return new BaseVersion(false, new SemanticVersion(1));
66+
return new BaseVersion(false, new SemanticVersion(1), when);
2967
}
3068
}
3169

3270
class V2Strategy : BaseVersionStrategy
3371
{
72+
DateTimeOffset? when;
73+
74+
public V2Strategy(DateTimeOffset? when)
75+
{
76+
this.when = when;
77+
}
78+
3479
public override BaseVersion GetVersion(GitVersionContext context)
3580
{
36-
return new BaseVersion(true, new SemanticVersion(2));
81+
return new BaseVersion(true, new SemanticVersion(2), when);
3782
}
3883
}
3984
}

GitVersionCore.Tests/VersionCalculation/NewNextVersionCalculatorTests.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
namespace GitVersionCore.Tests.VersionCalculation
22
{
3+
using System;
34
using GitVersion;
45
using GitVersion.VersionCalculation;
56
using NUnit.Framework;
@@ -10,8 +11,9 @@ public class NewNextVersionCalculatorTests
1011
[Test]
1112
public void ShouldIncrementVersionBasedOnConfig()
1213
{
13-
var baseCalculator = new TestBaseVersionCalculator(true, new SemanticVersion(1));
14-
var sut = new NewNextVersionCalculator(baseCalculator);
14+
var baseCalculator = new TestBaseVersionCalculator(true, new SemanticVersion(1), DateTimeOffset.Now);
15+
var semanticVersionBuildMetaData = new SemanticVersionBuildMetaData(1, "master", "b1a34e", DateTimeOffset.Now);
16+
var sut = new NewNextVersionCalculator(baseCalculator, new TestMetaDataCalculator(semanticVersionBuildMetaData));
1517
var config = new Config();
1618
config.Branches.Add("master", new BranchConfig
1719
{
@@ -27,8 +29,9 @@ public void ShouldIncrementVersionBasedOnConfig()
2729
[Test]
2830
public void DoesNotIncrementWhenBaseVersionSaysNotTo()
2931
{
30-
var baseCalculator = new TestBaseVersionCalculator(false, new SemanticVersion(1));
31-
var sut = new NewNextVersionCalculator(baseCalculator);
32+
var baseCalculator = new TestBaseVersionCalculator(false, new SemanticVersion(1), DateTimeOffset.Now);
33+
var semanticVersionBuildMetaData = new SemanticVersionBuildMetaData(1, "master", "b1a34e", DateTimeOffset.Now);
34+
var sut = new NewNextVersionCalculator(baseCalculator, new TestMetaDataCalculator(semanticVersionBuildMetaData));
3235
var config = new Config();
3336
config.Branches.Add("master", new BranchConfig
3437
{

GitVersionCore.Tests/VersionCalculation/Strategies/MergeMessageBaseVersionStrategyTests.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,11 @@ static void AssertMergeMessage(string message, string expectedVersion, List<Comm
7070
var context = new GitVersionContextBuilder()
7171
.WithRepository(new MockRepository
7272
{
73-
Head = new MockBranch("master") { commit }
73+
Head = new MockBranch("master")
74+
{
75+
commit,
76+
new MockCommit()
77+
}
7478
})
7579
.Build();
7680
var sut = new MergeMessageBaseVersionStrategy();
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
namespace GitVersionCore.Tests.VersionCalculation
22
{
3+
using System;
34
using GitVersion;
45
using GitVersion.VersionCalculation;
56
using GitVersion.VersionCalculation.BaseVersionCalculators;
@@ -8,16 +9,18 @@ public class TestBaseVersionCalculator : IBaseVersionCalculator
89
{
910
readonly SemanticVersion semanticVersion;
1011
bool shouldIncrement;
12+
DateTimeOffset? when;
1113

12-
public TestBaseVersionCalculator(bool shouldIncrement, SemanticVersion semanticVersion)
14+
public TestBaseVersionCalculator(bool shouldIncrement, SemanticVersion semanticVersion, DateTimeOffset? when)
1315
{
1416
this.semanticVersion = semanticVersion;
17+
this.when = when;
1518
this.shouldIncrement = shouldIncrement;
1619
}
1720

1821
public BaseVersion GetBaseVersion(GitVersionContext context)
1922
{
20-
return new BaseVersion(shouldIncrement, semanticVersion);
23+
return new BaseVersion(shouldIncrement, semanticVersion, when);
2124
}
2225
}
2326
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
namespace GitVersionCore.Tests.VersionCalculation
2+
{
3+
using System;
4+
using GitVersion;
5+
using GitVersion.VersionCalculation;
6+
7+
public class TestMetaDataCalculator : IMetaDataCalculator
8+
{
9+
SemanticVersionBuildMetaData metaData;
10+
11+
public TestMetaDataCalculator(SemanticVersionBuildMetaData metaData)
12+
{
13+
this.metaData = metaData;
14+
}
15+
16+
public SemanticVersionBuildMetaData Create(DateTimeOffset? baseVersionWhenFrom, GitVersionContext context)
17+
{
18+
return metaData;
19+
}
20+
}
21+
}

GitVersionCore/GitVersionCore.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@
9595
<Compile Include="VersionCalculation\BaseVersionCalculators\MergeMessageBaseVersionStrategy.cs" />
9696
<Compile Include="VersionCalculation\BaseVersionStrategy.cs" />
9797
<Compile Include="VersionCalculation\IBaseVersionCalculator.cs" />
98+
<Compile Include="VersionCalculation\IMetaDataCalculator.cs" />
99+
<Compile Include="VersionCalculation\MetaDataCalculator.cs" />
98100
<Compile Include="VersionCalculation\NewNextVersionCalculator.cs" />
99101
<Compile Include="VersioningModes\ContinuousDeliveryMode.cs" />
100102
<Compile Include="VersioningModes\ContinuousDeploymentMode.cs" />

GitVersionCore/VersionCalculation/BaseVersionCalculator.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,15 @@ public BaseVersion GetBaseVersion(GitVersionContext context)
1717
return strategies
1818
.Select(s => s.GetVersion(context))
1919
.Where(v => v != null)
20-
.Aggregate((v1, v2) => v1.SemanticVersion > v2.SemanticVersion ? v1 : v2);
20+
.Aggregate((v1, v2) =>
21+
{
22+
if (v1.SemanticVersion > v2.SemanticVersion)
23+
{
24+
return new BaseVersion(v1.ShouldIncrement, v1.SemanticVersion, v1.BaseVersionWhenFrom ?? v2.BaseVersionWhenFrom);
25+
}
26+
27+
return new BaseVersion(v2.ShouldIncrement, v2.SemanticVersion, v2.BaseVersionWhenFrom ?? v1.BaseVersionWhenFrom);
28+
});
2129
}
2230
}
2331
}
Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,25 @@
11
namespace GitVersion.VersionCalculation.BaseVersionCalculators
22
{
3+
using System;
4+
35
public class BaseVersion
46
{
5-
public BaseVersion(bool shouldIncrement, SemanticVersion semanticVersion)
7+
public BaseVersion(bool shouldIncrement, SemanticVersion semanticVersion, DateTimeOffset? baseVersionWhenFrom)
68
{
79
ShouldIncrement = shouldIncrement;
810
SemanticVersion = semanticVersion;
11+
BaseVersionWhenFrom = baseVersionWhenFrom;
912
}
1013

1114
public bool ShouldIncrement { get; private set; }
1215

1316
public SemanticVersion SemanticVersion { get; private set; }
17+
18+
/// <summary>
19+
/// Can be null even if the base version has a version
20+
///
21+
/// This happens when the base version doesn't have a time it came from
22+
/// </summary>
23+
public DateTimeOffset? BaseVersionWhenFrom { get; private set; }
1424
}
1525
}

GitVersionCore/VersionCalculation/BaseVersionCalculators/ConfigNextVersionBaseVersionStrategy.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ public override BaseVersion GetVersion(GitVersionContext context)
66
{
77
if (string.IsNullOrEmpty(context.Configuration.NextVersion))
88
return null;
9-
return new BaseVersion(false, SemanticVersion.Parse(context.Configuration.NextVersion, context.Configuration.GitTagPrefix));
9+
return new BaseVersion(false, SemanticVersion.Parse(context.Configuration.NextVersion, context.Configuration.GitTagPrefix), null);
1010
}
1111
}
1212
}

GitVersionCore/VersionCalculation/BaseVersionCalculators/LastTagBaseVersionStrategy.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ public override BaseVersion GetVersion(GitVersionContext context)
66
{
77
VersionTaggedCommit version;
88
if (new LastTaggedReleaseFinder(context).GetVersion(out version))
9-
return new BaseVersion(true, version.SemVer);
9+
return new BaseVersion(true, version.SemVer, version.Commit.When());
1010

1111
return null;
1212
}

GitVersionCore/VersionCalculation/BaseVersionCalculators/MergeMessageBaseVersionStrategy.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ public class MergeMessageBaseVersionStrategy : BaseVersionStrategy
44
{
55
public override BaseVersion GetVersion(GitVersionContext context)
66
{
7-
// TODO when this approach works, inline the other class into here
8-
SemanticVersion semanticVersion;
9-
if (MergeMessageParser.TryParse(context.CurrentCommit, context.Configuration, out semanticVersion))
10-
return new BaseVersion(true, semanticVersion);
11-
7+
foreach (var commit in context.CurrentBranch.CommitsPriorToThan(context.CurrentCommit.When()))
8+
{
9+
SemanticVersion semanticVersion;
10+
// TODO when this approach works, inline the other class into here
11+
if (MergeMessageParser.TryParse(context.CurrentCommit, context.Configuration, out semanticVersion))
12+
return new BaseVersion(true, semanticVersion, commit.When());
13+
}
1214
return null;
1315
}
1416
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
namespace GitVersion.VersionCalculation
2+
{
3+
using System;
4+
5+
public interface IMetaDataCalculator
6+
{
7+
SemanticVersionBuildMetaData Create(DateTimeOffset? baseVersionWhenFrom, GitVersionContext context);
8+
}
9+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
namespace GitVersion.VersionCalculation
2+
{
3+
using System;
4+
using System.Linq;
5+
using LibGit2Sharp;
6+
7+
public class MetaDataCalculator : IMetaDataCalculator
8+
{
9+
public SemanticVersionBuildMetaData Create(DateTimeOffset? baseVersionWhenFrom, GitVersionContext context)
10+
{
11+
var qf = new CommitFilter
12+
{
13+
Since = baseVersionWhenFrom,
14+
Until = context.CurrentCommit,
15+
SortBy = CommitSortStrategies.Topological | CommitSortStrategies.Time
16+
};
17+
18+
return new SemanticVersionBuildMetaData(
19+
context.Repository.Commits.QueryBy(qf).Count(),
20+
context.CurrentBranch.Name,
21+
context.CurrentCommit.Sha,
22+
context.CurrentCommit.When());
23+
}
24+
}
25+
}

GitVersionCore/VersionCalculation/NewNextVersionCalculator.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@
66
public class NewNextVersionCalculator
77
{
88
IBaseVersionCalculator baseVersionFinder;
9+
IMetaDataCalculator metaDataCalculator;
910

10-
public NewNextVersionCalculator(IBaseVersionCalculator baseVersionCalculator = null)
11+
public NewNextVersionCalculator(IBaseVersionCalculator baseVersionCalculator = null, IMetaDataCalculator metaDataCalculator = null)
1112
{
13+
this.metaDataCalculator = metaDataCalculator ?? new MetaDataCalculator();
1214
baseVersionFinder = baseVersionCalculator ??
1315
new BaseVersionCalculator(
1416
new ConfigNextVersionBaseVersionStrategy(),
@@ -22,6 +24,8 @@ public SemanticVersion FindVersion(GitVersionContext context)
2224

2325
if (baseVersion.ShouldIncrement) IncrementVersion(context, baseVersion);
2426

27+
baseVersion.SemanticVersion.BuildMetaData = metaDataCalculator.Create(baseVersion.BaseVersionWhenFrom, context);
28+
2529
return baseVersion.SemanticVersion;
2630
}
2731

0 commit comments

Comments
 (0)