-
Notifications
You must be signed in to change notification settings - Fork 654
/
Copy pathNextVersionCalculator.cs
140 lines (120 loc) · 5.93 KB
/
NextVersionCalculator.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
namespace GitVersion.VersionCalculation
{
using System.Linq;
using System.Text.RegularExpressions;
using BaseVersionCalculators;
public class NextVersionCalculator
{
IBaseVersionCalculator baseVersionFinder;
IMetaDataCalculator metaDataCalculator;
public NextVersionCalculator(IBaseVersionCalculator baseVersionCalculator = null, IMetaDataCalculator metaDataCalculator = null)
{
this.metaDataCalculator = metaDataCalculator ?? new MetaDataCalculator();
baseVersionFinder = baseVersionCalculator ??
new BaseVersionCalculator(
new FallbackBaseVersionStrategy(),
new ConfigNextVersionBaseVersionStrategy(),
new TaggedCommitVersionStrategy(),
new MergeMessageBaseVersionStrategy(),
new VersionInBranchNameBaseVersionStrategy(),
new TrackReleaseBranchesVersionStrategy());
}
public SemanticVersion FindVersion(GitVersionContext context)
{
SemanticVersion taggedSemanticVersion = null;
// If current commit is tagged, don't do anything except add build metadata
if (context.IsCurrentCommitTagged)
{
// Will always be 0, don't bother with the +0 on tags
var semanticVersionBuildMetaData = metaDataCalculator.Create(context.CurrentCommit, context);
semanticVersionBuildMetaData.CommitsSinceTag = null;
var semanticVersion = new SemanticVersion(context.CurrentCommitTaggedVersion)
{
BuildMetaData = semanticVersionBuildMetaData
};
taggedSemanticVersion = semanticVersion;
}
var baseVersion = baseVersionFinder.GetBaseVersion(context);
SemanticVersion semver;
if (context.Configuration.VersioningMode == VersioningMode.Mainline)
{
var mainlineMode = new MainlineVersionCalculator(metaDataCalculator);
semver = mainlineMode.FindMainlineModeVersion(baseVersion, context);
}
else
{
semver = PerformIncrement(context, baseVersion);
semver.BuildMetaData = metaDataCalculator.Create(baseVersion.BaseVersionSource, context);
}
var hasPreReleaseTag = semver.PreReleaseTag.HasTag();
var branchConfigHasPreReleaseTagConfigured = !string.IsNullOrEmpty(context.Configuration.Tag);
var preReleaseTagDoesNotMatchConfiguration = hasPreReleaseTag && branchConfigHasPreReleaseTagConfigured && semver.PreReleaseTag.Name != context.Configuration.Tag;
if (!semver.PreReleaseTag.HasTag() && branchConfigHasPreReleaseTagConfigured || preReleaseTagDoesNotMatchConfiguration)
{
UpdatePreReleaseTag(context, semver, baseVersion.BranchNameOverride);
}
if (taggedSemanticVersion != null)
{
// set the commit count on the tagged ver
taggedSemanticVersion.BuildMetaData.CommitsSinceVersionSource = semver.BuildMetaData.CommitsSinceVersionSource;
}
return taggedSemanticVersion ?? semver;
}
private static SemanticVersion PerformIncrement(GitVersionContext context, BaseVersion baseVersion)
{
var semver = baseVersion.SemanticVersion;
var increment = IncrementStrategyFinder.DetermineIncrementedField(context, baseVersion);
if (increment != null)
{
semver = semver.IncrementVersion(increment.Value);
}
else Logger.WriteInfo("Skipping version increment");
return semver;
}
void UpdatePreReleaseTag(GitVersionContext context, SemanticVersion semanticVersion, string branchNameOverride)
{
var tagToUse = GetBranchSpecificTag(context.Configuration, context.CurrentBranch.FriendlyName, branchNameOverride);
int? number = null;
var lastTag = context.RepositoryMetadataProvider
.GetVersionTagsOnBranch(context.CurrentBranch, context.Configuration.GitTagPrefix)
.FirstOrDefault(v => v.PreReleaseTag.Name == tagToUse);
if (lastTag != null &&
MajorMinorPatchEqual(lastTag, semanticVersion) &&
lastTag.PreReleaseTag.HasTag())
{
number = lastTag.PreReleaseTag.Number + 1;
}
if (number == null)
{
number = 1;
}
semanticVersion.PreReleaseTag = new SemanticVersionPreReleaseTag(tagToUse, number);
}
public static string GetBranchSpecificTag(EffectiveConfiguration configuration, string branchFriendlyName, string branchNameOverride)
{
var tagToUse = configuration.Tag;
if (tagToUse == "useBranchName")
{
tagToUse = "{BranchName}";
}
if (tagToUse.Contains("{BranchName}"))
{
Logger.WriteInfo("Using branch name to calculate version tag");
var branchName = branchNameOverride ?? branchFriendlyName;
if (!string.IsNullOrWhiteSpace(configuration.BranchPrefixToTrim))
{
branchName = branchName.RegexReplace(configuration.BranchPrefixToTrim, string.Empty, RegexOptions.IgnoreCase);
}
branchName = branchName.RegexReplace("[^a-zA-Z0-9-]", "-");
tagToUse = tagToUse.Replace("{BranchName}", branchName);
}
return tagToUse;
}
static bool MajorMinorPatchEqual(SemanticVersion lastTag, SemanticVersion baseVersion)
{
return lastTag.Major == baseVersion.Major &&
lastTag.Minor == baseVersion.Minor &&
lastTag.Patch == baseVersion.Patch;
}
}
}