Skip to content

Commit 6ea71e1

Browse files
committed
fix last minor version finding
1 parent f548840 commit 6ea71e1

File tree

9 files changed

+152
-106
lines changed

9 files changed

+152
-106
lines changed

GitVersionCore.Tests/GitFlow/UncycloScenarios.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public void MinorReleaseExample()
7171
fixture.AssertFullSemver("1.3.0-beta.1+1");
7272

7373
// Apply beta.0 tag should be exact tag
74-
fixture.Repository.ApplyTag("1.3.0-beta.1");
74+
fixture.Repository. ApplyTag("1.3.0-beta.1");
7575
fixture.AssertFullSemver("1.3.0-beta.1+1");
7676

7777
// Make a commit after a tag should bump up the beta

GitVersionCore.Tests/Helpers/Constants.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ public static class Constants
55
{
66
public static Signature SignatureNow()
77
{
8-
return new Signature("A. U. Thor", "[email protected]", DateTimeOffset.Now);
8+
var dateTimeOffset = DateTimeOffset.Now;
9+
return Signature(dateTimeOffset);
10+
}
11+
12+
public static Signature Signature(DateTimeOffset dateTimeOffset)
13+
{
14+
return new Signature("A. U. Thor", "[email protected]", dateTimeOffset);
915
}
1016
}

GitVersionCore.Tests/Helpers/GitHelper.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,16 @@
77
public static class GitHelper
88
{
99
public static Commit MakeACommit(this IRepository repository)
10+
{
11+
return MakeACommit(repository, DateTimeOffset.Now);
12+
}
13+
14+
public static Commit MakeACommit(this IRepository repository, DateTimeOffset dateTimeOffset)
1015
{
1116
var randomFile = Path.Combine(repository.Info.WorkingDirectory, Guid.NewGuid().ToString());
1217
File.WriteAllText(randomFile, string.Empty);
1318
repository.Index.Stage(randomFile);
14-
return repository.Commit("Test Commit", Constants.SignatureNow());
19+
return repository.Commit("Test Commit", Constants.Signature(dateTimeOffset), Constants.Signature(dateTimeOffset));
1520
}
1621

1722
public static void MergeNoFF(this IRepository repository, string branch, Signature sig)

GitVersionCore.Tests/LastVersionOnMasterFinderTests.cs

Lines changed: 68 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
 using System;
2+
using System.Diagnostics;
23
using GitVersion;
34
using LibGit2Sharp;
45
using NUnit.Framework;
@@ -7,6 +8,67 @@
78
[TestFixture]
89
public class LastVersionOnMasterFinderTests
910
{
11+
12+
[Test]
13+
public void WhenMasterHasPatchTagEnsureLastMinorTagIsUsed()
14+
{
15+
using (var fixture = new EmptyRepositoryFixture())
16+
{
17+
var stamp = new DateTimeOffset(2000, 1, 1, 1, 1, 1, TimeSpan.Zero);
18+
fixture.Repository.MakeACommit(stamp);
19+
fixture.Repository.ApplyTag("1.2.0");
20+
fixture.Repository.MakeACommit(stamp);
21+
fixture.Repository.ApplyTag("1.2.1");
22+
fixture.Repository.MakeACommit();
23+
24+
var dateTimeOffset = LastMinorVersionFinder.Execute(fixture.Repository, fixture.Repository.Head.Tip);
25+
Assert.AreEqual(stamp,dateTimeOffset);
26+
}
27+
}
28+
[Test]
29+
public void WhenSupportIsBranchedFromMasterEnsureLastMinorTagIsUsed()
30+
{
31+
using (var fixture = new EmptyRepositoryFixture())
32+
{
33+
var stamp = new DateTimeOffset(2000, 1, 1, 1, 1, 1, TimeSpan.Zero);
34+
fixture.Repository.MakeACommit(stamp);
35+
fixture.Repository.ApplyTag("1.2.0");
36+
fixture.Repository.CreateBranch("Support-1.2.0");
37+
fixture.Repository.Checkout("Support-1.2.0");
38+
fixture.Repository.MakeACommit();
39+
40+
var dateTimeOffset = LastMinorVersionFinder.Execute(fixture.Repository, fixture.Repository.Head.Tip);
41+
Assert.AreEqual(stamp,dateTimeOffset);
42+
}
43+
}
44+
45+
[Test]
46+
public void WhenSupportIsBranchedAndTaggedFromAnotherSupportEnsureNewMinorIsUsed()
47+
{
48+
using (var fixture = new EmptyRepositoryFixture())
49+
{
50+
fixture.Repository.MakeACommit();
51+
fixture.Repository.CreateBranch("Support-1.2.0");
52+
fixture.Repository.Checkout("Support-1.2.0");
53+
fixture.Repository.MakeACommit();
54+
fixture.Repository.ApplyTag("1.2.0");
55+
56+
fixture.Repository.CreateBranch("Support-1.3.0");
57+
fixture.Repository.Checkout("Support-1.3.0");
58+
var stamp = new DateTimeOffset(2000, 1, 1, 1, 1, 1, TimeSpan.Zero);
59+
var commit = fixture.Repository.MakeACommit(stamp);
60+
fixture.Repository.ApplyTag("1.3.0", commit.Sha);
61+
62+
//Move On
63+
fixture.Repository.MakeACommit();
64+
fixture.Repository.MakeACommit();
65+
66+
67+
var dateTimeOffset = LastMinorVersionFinder.Execute(fixture.Repository, fixture.Repository.Head.Tip);
68+
Assert.AreEqual(stamp,dateTimeOffset);
69+
}
70+
}
71+
1072
/*
1173
* hotfix-1.2.1 -----------C--
1274
* / \
@@ -39,13 +101,13 @@ public void CanCorrectlyDetectCommitCountsAndReleaseDataWhenThatApplies()
39101
EnsureMetaDataMatch(f, "develop");
40102

41103
ResetToN(f.Repository);
42-
EnsureMetaDataMatch(f, "master", r => (Commit) r.Tags["1.3.0"].Target);
104+
EnsureMetaDataMatch(f, "master", r => (Commit)r.Tags["1.3.0"].Target);
43105

44106
ResetToM(f.Repository);
45107
EnsureMetaDataMatch(f, "develop");
46108

47109
ResetToL(f.Repository);
48-
EnsureMetaDataMatch(f, "hotfix-1.3.1", r => (Commit) r.Tags["1.3.0"].Target);
110+
EnsureMetaDataMatch(f, "hotfix-1.3.1", r => (Commit)r.Tags["1.3.0"].Target);
49111

50112
ResetToK(f.Repository);
51113
EnsureMetaDataMatch(f, "feature");
@@ -57,13 +119,13 @@ public void CanCorrectlyDetectCommitCountsAndReleaseDataWhenThatApplies()
57119
EnsureMetaDataMatch(f, "develop");
58120

59121
ResetToH(f.Repository);
60-
EnsureMetaDataMatch(f, "master", r => (Commit) r.Tags["1.3.0"].Target);
122+
EnsureMetaDataMatch(f, "master", r => (Commit)r.Tags["1.3.0"].Target);
61123

62124
ResetToG(f.Repository);
63125
EnsureMetaDataMatch(f, "release-1.3.0");
64126

65127
ResetToF(f.Repository);
66-
EnsureMetaDataMatch(f, "master", r => (Commit) r.Tags["1.2.0"].Target);
128+
EnsureMetaDataMatch(f, "master", r => (Commit)r.Tags["1.2.0"].Target);
67129

68130
ResetToE(f.Repository);
69131
EnsureMetaDataMatch(f, "develop");
@@ -72,7 +134,7 @@ public void CanCorrectlyDetectCommitCountsAndReleaseDataWhenThatApplies()
72134
EnsureMetaDataMatch(f, "release-1.3.0");
73135

74136
ResetToC(f.Repository);
75-
EnsureMetaDataMatch(f, "hotfix-1.2.1", r => (Commit) r.Tags["1.2.0"].Target);
137+
EnsureMetaDataMatch(f, "hotfix-1.2.1", r => (Commit)r.Tags["1.2.0"].Target);
76138

77139
ResetToB(f.Repository);
78140
EnsureMetaDataMatch(f, "develop");
@@ -84,7 +146,7 @@ static void EnsureMetaDataMatch(CommitCountingRepoFixture fixture, string branch
84146
var referenceCommitFinder = commitFinder ?? (r => r.FindBranch(branchName).Tip);
85147

86148
var commit = referenceCommitFinder(fixture.Repository);
87-
var releaseDate = LastVersionOnMasterFinder.Execute(fixture.Repository, commit);
149+
var releaseDate = LastMinorVersionFinder.Execute(fixture.Repository, commit);
88150
releaseDate.ShouldBe(commit.When());
89151
}
90152

GitVersionCore/GitVersionCore.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
<Compile Include="BuildServers\TeamCity.cs" />
6666
<Compile Include="GitFlow\BranchFinders\BranchCommitDifferenceFinder.cs" />
6767
<Compile Include="GitFlow\BranchFinders\RecentTagVersionExtractor.cs" />
68-
<Compile Include="LastVersionOnMasterFinder.cs" />
68+
<Compile Include="LastMinorVersionFinder.cs" />
6969
<Compile Include="ShortVersion.cs" />
7070
<Compile Include="SemanticVersionExtensions.cs" />
7171
<Compile Include="WarningException.cs" />
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
using System.Linq;
2+
using LibGit2Sharp;
3+
4+
namespace GitVersion
5+
{
6+
using System;
7+
using System.Collections.Generic;
8+
9+
public class LastMinorVersionFinder
10+
{
11+
public static DateTimeOffset Execute(IRepository repo, Commit commit)
12+
{
13+
// Release/Develop = current
14+
// Hotfix/Master/Support = walk back current branch until previous commits till a merge commit (or tag) has a patch with a 0
15+
if (
16+
repo.Head.IsMaster() ||
17+
repo.Head.IsHotfix() ||
18+
repo.Head.IsSupport()
19+
)
20+
{
21+
var fromTag = GetTimeStampFromTag(repo, commit);
22+
23+
if (fromTag != DateTimeOffset.MinValue)
24+
{
25+
return fromTag;
26+
}
27+
}
28+
return commit.When();
29+
}
30+
31+
32+
static DateTimeOffset GetTimeStampFromTag(IRepository repository, Commit targetCommit)
33+
{
34+
var allMajorMinorTags = repository.Tags
35+
.Where(x => ShortVersionParser.IsMajorMinor(x.Name))
36+
.ToDictionary(x => x.PeeledTarget(), x => x);
37+
var olderThan = targetCommit.When();
38+
foreach (var commit in repository.Head.Commits.Where(x => x.When() <= olderThan))
39+
{
40+
if (IsMajorMinor(commit, allMajorMinorTags))
41+
{
42+
return commit.When();
43+
}
44+
}
45+
return DateTimeOffset.MinValue;
46+
}
47+
48+
static bool IsMajorMinor(Commit commit, Dictionary<GitObject, Tag> allMajorMinorTags)
49+
{
50+
ShortVersion version;
51+
if (MergeMessageParser.TryParse(commit, out version))
52+
{
53+
if (version.Patch == 0)
54+
{
55+
return true;
56+
}
57+
}
58+
return allMajorMinorTags.ContainsKey(commit);
59+
}
60+
}
61+
}

GitVersionCore/LastVersionOnMasterFinder.cs

Lines changed: 0 additions & 94 deletions
This file was deleted.

GitVersionCore/ShortVersionParser.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@ public static bool TryParseMajorMinor(string versionString, out ShortVersion sho
2525
return shortVersion.Patch == 0;
2626
}
2727

28+
public static bool IsMajorMinor(string versionString)
29+
{
30+
ShortVersion shortVersion;
31+
return TryParseMajorMinor(versionString, out shortVersion);
32+
}
33+
2834
public static bool TryParse(string versionString, out ShortVersion shortVersion)
2935
{
3036
versionString = versionString.TrimStart('v', 'V');

GitVersionTask/VersionCache.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public static CachedVersion GetVersion(string gitDirectory)
1818
{
1919
Logger.WriteInfo("Change detected. flushing cache.");
2020
cachedVersion.SemanticVersion = GitVersionFinder.GetSemanticVersion(repo);
21-
cachedVersion.MasterReleaseDate = LastVersionOnMasterFinder.Execute(repo, repo.Head.Tip);
21+
cachedVersion.MasterReleaseDate = LastMinorVersionFinder.Execute(repo, repo.Head.Tip);
2222
}
2323
return cachedVersion;
2424
}
@@ -32,7 +32,7 @@ public static CachedVersion GetVersion(string gitDirectory)
3232
return versionCacheVersions[key] = new CachedVersion
3333
{
3434
SemanticVersion = GitVersionFinder.GetSemanticVersion(repo),
35-
MasterReleaseDate = LastVersionOnMasterFinder.Execute(repo,repo.Head.Tip),
35+
MasterReleaseDate = LastMinorVersionFinder.Execute(repo,repo.Head.Tip),
3636
Timestamp = ticks
3737
};
3838

0 commit comments

Comments
 (0)