Skip to content

Commit 9b19750

Browse files
committed
Change SemanticVersion's PreReleaseTag and BuildMetaData to a non-nullable type
Because they are always set in SemanticVersion's constructor. They can be null only if explicitly set by the client of the class and there are plans to forbid this functionality.
1 parent 4d510b2 commit 9b19750

File tree

8 files changed

+51
-59
lines changed

8 files changed

+51
-59
lines changed

src/GitVersion.Core.Tests/VersionCalculation/SemanticVersionTests.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,9 @@ public void ValidateVersionParsing(
5151
Assert.AreEqual(major, version.Major);
5252
Assert.AreEqual(minor, version.Minor);
5353
Assert.AreEqual(patch, version.Patch);
54-
version.PreReleaseTag.ShouldNotBeNull();
5554
Assert.AreEqual(tag, version.PreReleaseTag.Name);
5655
Assert.AreEqual(tagNumber, version.PreReleaseTag.Number);
5756

58-
version.BuildMetaData.ShouldNotBeNull();
5957
Assert.AreEqual(numberOfBuilds, version.BuildMetaData.CommitsSinceTag);
6058
Assert.AreEqual(branchName, version.BuildMetaData.Branch);
6159
Assert.AreEqual(sha, version.BuildMetaData.Sha);

src/GitVersion.Core.Tests/VersionCalculation/VersionSourceTests.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ public void VersionSourceSha()
2626

2727
var nextVersion = nextVersionCalculator.FindVersion();
2828

29-
nextVersion.IncrementedVersion.BuildMetaData.ShouldNotBeNull();
3029
nextVersion.IncrementedVersion.BuildMetaData.VersionSourceSha.ShouldBeNull();
3130
nextVersion.IncrementedVersion.BuildMetaData.CommitsSinceVersionSource.ShouldBe(3);
3231
}
@@ -41,7 +40,6 @@ public void VersionSourceShaOneCommit()
4140

4241
var nextVersion = nextVersionCalculator.FindVersion();
4342

44-
nextVersion.IncrementedVersion.BuildMetaData.ShouldNotBeNull();
4543
nextVersion.IncrementedVersion.BuildMetaData.VersionSourceSha.ShouldBeNull();
4644
nextVersion.IncrementedVersion.BuildMetaData.CommitsSinceVersionSource.ShouldBe(1);
4745
}
@@ -62,7 +60,6 @@ public void VersionSourceShaUsingTag()
6260

6361
var nextVersion = nextVersionCalculator.FindVersion();
6462

65-
nextVersion.IncrementedVersion.BuildMetaData.ShouldNotBeNull();
6663
nextVersion.IncrementedVersion.BuildMetaData.VersionSourceSha.ShouldBe(secondCommit.Sha);
6764
nextVersion.IncrementedVersion.BuildMetaData.CommitsSinceVersionSource.ShouldBe(1);
6865
}

src/GitVersion.Core/Extensions/AssemblyVersionsGeneratorExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ public static class AssemblyVersionsGeneratorExtensions
88
AssemblyVersioningScheme.Major => $"{sv.Major}.0.0.0",
99
AssemblyVersioningScheme.MajorMinor => $"{sv.Major}.{sv.Minor}.0.0",
1010
AssemblyVersioningScheme.MajorMinorPatch => $"{sv.Major}.{sv.Minor}.{sv.Patch}.0",
11-
AssemblyVersioningScheme.MajorMinorPatchTag => $"{sv.Major}.{sv.Minor}.{sv.Patch}.{sv.PreReleaseTag?.Number ?? 0}",
11+
AssemblyVersioningScheme.MajorMinorPatchTag => $"{sv.Major}.{sv.Minor}.{sv.Patch}.{sv.PreReleaseTag.Number ?? 0}",
1212
AssemblyVersioningScheme.None => null,
1313
_ => throw new ArgumentException($"Unexpected value ({scheme}).", nameof(scheme))
1414
};
@@ -19,7 +19,7 @@ public static class AssemblyVersionsGeneratorExtensions
1919
AssemblyFileVersioningScheme.Major => $"{sv.Major}.0.0.0",
2020
AssemblyFileVersioningScheme.MajorMinor => $"{sv.Major}.{sv.Minor}.0.0",
2121
AssemblyFileVersioningScheme.MajorMinorPatch => $"{sv.Major}.{sv.Minor}.{sv.Patch}.0",
22-
AssemblyFileVersioningScheme.MajorMinorPatchTag => $"{sv.Major}.{sv.Minor}.{sv.Patch}.{sv.PreReleaseTag?.Number ?? 0}",
22+
AssemblyFileVersioningScheme.MajorMinorPatchTag => $"{sv.Major}.{sv.Minor}.{sv.Patch}.{sv.PreReleaseTag.Number ?? 0}",
2323
AssemblyFileVersioningScheme.None => null,
2424
_ => throw new ArgumentException($"Unexpected value ({scheme}).", nameof(scheme))
2525
};

src/GitVersion.Core/VersionCalculation/MainlineVersionCalculator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public MainlineVersionCalculator(ILog log, IRepositoryStore repositoryStore, Laz
2323

2424
public SemanticVersion FindMainlineModeVersion(BaseVersion baseVersion)
2525
{
26-
if (baseVersion.SemanticVersion.PreReleaseTag?.HasTag() == true)
26+
if (baseVersion.SemanticVersion.PreReleaseTag.HasTag() == true)
2727
{
2828
throw new NotSupportedException("Mainline development mode doesn't yet support pre-release tags on main");
2929
}

src/GitVersion.Core/VersionCalculation/NextVersionCalculator.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public virtual NextVersion FindVersion()
6060
{
6161
var baseVersionBuildMetaData = this.mainlineVersionCalculator.CreateVersionBuildMetaData(baseVersion.BaseVersionSource);
6262

63-
if (baseVersionBuildMetaData.Sha != nextVersion.IncrementedVersion.BuildMetaData?.Sha)
63+
if (baseVersionBuildMetaData.Sha != nextVersion.IncrementedVersion.BuildMetaData.Sha)
6464
{
6565
semver = nextVersion.IncrementedVersion;
6666
}
@@ -73,8 +73,8 @@ public virtual NextVersion FindVersion()
7373

7474
var lastPrefixedSemver = this.repositoryStore
7575
.GetVersionTagsOnBranch(Context.CurrentBranch, Context.Configuration.LabelPrefix)
76-
.Where(v => MajorMinorPatchEqual(v, semver) && v.PreReleaseTag?.HasTag() == true)
77-
.FirstOrDefault(v => v.PreReleaseTag?.Name?.IsEquivalentTo(preReleaseTagName) == true);
76+
.Where(v => MajorMinorPatchEqual(v, semver) && v.PreReleaseTag.HasTag() == true)
77+
.FirstOrDefault(v => v.PreReleaseTag.Name?.IsEquivalentTo(preReleaseTagName) == true);
7878

7979
if (lastPrefixedSemver != null)
8080
{
@@ -95,7 +95,7 @@ public virtual NextVersion FindVersion()
9595
{
9696
long? number;
9797

98-
if (semver.PreReleaseTag?.Name == preReleaseTagName)
98+
if (semver.PreReleaseTag.Name == preReleaseTagName)
9999
{
100100
number = semver.PreReleaseTag.Number + 1;
101101
}
@@ -227,7 +227,7 @@ private IEnumerable<NextVersion> GetNextVersions(IBranch branch, GitVersionConfi
227227

228228
if (configuration.VersioningMode == VersioningMode.Mainline)
229229
{
230-
if (!(incrementedVersion.PreReleaseTag?.HasTag() != true))
230+
if (!(incrementedVersion.PreReleaseTag.HasTag() != true))
231231
{
232232
continue;
233233
}

src/GitVersion.Core/VersionCalculation/SemanticVersioning/SemanticVersion.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ public class SemanticVersion : IFormattable, IComparable<SemanticVersion>, IEqua
2121
public long Major;
2222
public long Minor;
2323
public long Patch;
24-
public SemanticVersionPreReleaseTag? PreReleaseTag;
25-
public SemanticVersionBuildMetaData? BuildMetaData;
24+
public SemanticVersionPreReleaseTag PreReleaseTag;
25+
public SemanticVersionBuildMetaData BuildMetaData;
2626

27-
public bool HasPreReleaseTagWithLabel => PreReleaseTag?.HasTag() == true;
27+
public bool HasPreReleaseTagWithLabel => PreReleaseTag.HasTag() == true;
2828

2929
public SemanticVersion(long major = 0, long minor = 0, long patch = 0)
3030
{
@@ -76,8 +76,8 @@ public override int GetHashCode()
7676
var hashCode = this.Major.GetHashCode();
7777
hashCode = (hashCode * 397) ^ this.Minor.GetHashCode();
7878
hashCode = (hashCode * 397) ^ this.Patch.GetHashCode();
79-
hashCode = (hashCode * 397) ^ (this.PreReleaseTag != null ? this.PreReleaseTag.GetHashCode() : 0);
80-
hashCode = (hashCode * 397) ^ (this.BuildMetaData != null ? this.BuildMetaData.GetHashCode() : 0);
79+
hashCode = (hashCode * 397) ^ this.PreReleaseTag.GetHashCode();
80+
hashCode = (hashCode * 397) ^ this.BuildMetaData.GetHashCode();
8181
return hashCode;
8282
}
8383
}
@@ -278,18 +278,18 @@ public string ToString(string? format, IFormatProvider? formatProvider)
278278
case "j":
279279
return $"{this.Major}.{this.Minor}.{this.Patch}";
280280
case "s":
281-
return this.PreReleaseTag?.HasTag() == true ? $"{ToString("j")}-{this.PreReleaseTag}" : ToString("j");
281+
return this.PreReleaseTag.HasTag() == true ? $"{ToString("j")}-{this.PreReleaseTag}" : ToString("j");
282282
case "t":
283-
return this.PreReleaseTag?.HasTag() == true ? $"{ToString("j")}-{this.PreReleaseTag.ToString("t")}" : ToString("j");
283+
return this.PreReleaseTag.HasTag() == true ? $"{ToString("j")}-{this.PreReleaseTag.ToString("t")}" : ToString("j");
284284
case "f":
285285
{
286-
var buildMetadata = this.BuildMetaData?.ToString();
286+
var buildMetadata = this.BuildMetaData.ToString();
287287

288288
return !buildMetadata.IsNullOrEmpty() ? $"{ToString("s")}+{buildMetadata}" : ToString("s");
289289
}
290290
case "i":
291291
{
292-
var buildMetadata = this.BuildMetaData?.ToString("f");
292+
var buildMetadata = this.BuildMetaData.ToString("f");
293293

294294
return !buildMetadata.IsNullOrEmpty() ? $"{ToString("s")}+{buildMetadata}" : ToString("s");
295295
}
@@ -301,7 +301,7 @@ public string ToString(string? format, IFormatProvider? formatProvider)
301301
public SemanticVersion IncrementVersion(VersionField incrementStrategy)
302302
{
303303
var incremented = new SemanticVersion(this);
304-
if (incremented.PreReleaseTag?.HasTag() != true)
304+
if (incremented.PreReleaseTag.HasTag() != true)
305305
{
306306
switch (incrementStrategy)
307307
{

src/GitVersion.Core/VersionCalculation/SemanticVersioning/SemanticVersionFormatValues.cs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,19 @@ public SemanticVersionFormatValues(SemanticVersion semver, EffectiveConfiguratio
2323

2424
public string? PreReleaseTag => this.semver.PreReleaseTag;
2525

26-
public string? PreReleaseTagWithDash => this.semver.PreReleaseTag?.HasTag() == true ? "-" + this.semver.PreReleaseTag : null;
26+
public string? PreReleaseTagWithDash => this.semver.PreReleaseTag.HasTag() == true ? "-" + this.semver.PreReleaseTag : null;
2727

28-
public string? PreReleaseLabel => this.semver.PreReleaseTag?.HasTag() == true ? this.semver.PreReleaseTag.Name : null;
28+
public string? PreReleaseLabel => this.semver.PreReleaseTag.HasTag() == true ? this.semver.PreReleaseTag.Name : null;
2929

30-
public string? PreReleaseLabelWithDash => this.semver.PreReleaseTag?.HasTag() == true ? "-" + this.semver.PreReleaseTag.Name : null;
30+
public string? PreReleaseLabelWithDash => this.semver.PreReleaseTag.HasTag() == true ? "-" + this.semver.PreReleaseTag.Name : null;
3131

32-
public string? PreReleaseNumber => this.semver.PreReleaseTag?.HasTag() == true ? this.semver.PreReleaseTag.Number.ToString() : null;
32+
public string? PreReleaseNumber => this.semver.PreReleaseTag.HasTag() == true ? this.semver.PreReleaseTag.Number.ToString() : null;
3333

3434
public string WeightedPreReleaseNumber => GetWeightedPreReleaseNumber();
3535

3636
public string? BuildMetaData => this.semver.BuildMetaData;
3737

38-
public string? FullBuildMetaData => this.semver.BuildMetaData?.ToString("f");
38+
public string? FullBuildMetaData => this.semver.BuildMetaData.ToString("f");
3939

4040
public string MajorMinorPatch => $"{this.semver.Major}.{this.semver.Minor}.{this.semver.Patch}";
4141

@@ -47,28 +47,28 @@ public SemanticVersionFormatValues(SemanticVersion semver, EffectiveConfiguratio
4747

4848
public string FullSemVer => this.semver.ToString("f");
4949

50-
public string? BranchName => this.semver.BuildMetaData?.Branch;
50+
public string? BranchName => this.semver.BuildMetaData.Branch;
5151

52-
public string? EscapedBranchName => this.semver.BuildMetaData?.Branch?.RegexReplace("[^a-zA-Z0-9-]", "-");
52+
public string? EscapedBranchName => this.semver.BuildMetaData.Branch?.RegexReplace("[^a-zA-Z0-9-]", "-");
5353

54-
public string? Sha => this.semver.BuildMetaData?.Sha;
54+
public string? Sha => this.semver.BuildMetaData.Sha;
5555

56-
public string? ShortSha => this.semver.BuildMetaData?.ShortSha;
56+
public string? ShortSha => this.semver.BuildMetaData.ShortSha;
5757

58-
public string? CommitDate => this.semver.BuildMetaData?.CommitDate?.UtcDateTime.ToString(this.configuration.CommitDateFormat, CultureInfo.InvariantCulture);
58+
public string? CommitDate => this.semver.BuildMetaData.CommitDate?.UtcDateTime.ToString(this.configuration.CommitDateFormat, CultureInfo.InvariantCulture);
5959

6060
public string InformationalVersion => this.semver.ToString("i");
6161

62-
public string? VersionSourceSha => this.semver.BuildMetaData?.VersionSourceSha;
62+
public string? VersionSourceSha => this.semver.BuildMetaData.VersionSourceSha;
6363

64-
public string? CommitsSinceVersionSource => this.semver.BuildMetaData?.CommitsSinceVersionSource?.ToString(CultureInfo.InvariantCulture);
64+
public string? CommitsSinceVersionSource => this.semver.BuildMetaData.CommitsSinceVersionSource?.ToString(CultureInfo.InvariantCulture);
6565

66-
public string? UncommittedChanges => this.semver.BuildMetaData?.UncommittedChanges.ToString(CultureInfo.InvariantCulture);
66+
public string? UncommittedChanges => this.semver.BuildMetaData.UncommittedChanges.ToString(CultureInfo.InvariantCulture);
6767

6868
private string GetWeightedPreReleaseNumber()
6969
{
7070
var weightedPreReleaseNumber =
71-
this.semver.PreReleaseTag?.HasTag() == true ? (this.semver.PreReleaseTag.Number + this.configuration.PreReleaseWeight).ToString() : null;
71+
this.semver.PreReleaseTag.HasTag() == true ? (this.semver.PreReleaseTag.Number + this.configuration.PreReleaseWeight).ToString() : null;
7272

7373
return weightedPreReleaseNumber.IsNullOrEmpty()
7474
? $"{this.configuration.LabelPreReleaseWeight}"

src/GitVersion.Core/VersionCalculation/VariableProvider.cs

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ public VersionVariables GetVariablesFor(SemanticVersion semanticVersion, Effecti
2525
{
2626
semanticVersion = new SemanticVersion(semanticVersion);
2727
// Continuous Deployment always requires a pre-release tag unless the commit is tagged
28-
if (semanticVersion.PreReleaseTag != null && semanticVersion.PreReleaseTag.HasTag() != true)
28+
if (semanticVersion.PreReleaseTag.HasTag() != true)
2929
{
30-
semanticVersion.PreReleaseTag.Name = configuration.GetBranchSpecificTag(this.log, semanticVersion.BuildMetaData?.Branch, null);
30+
semanticVersion.PreReleaseTag.Name = configuration.GetBranchSpecificTag(this.log, semanticVersion.BuildMetaData.Branch, null);
3131
if (semanticVersion.PreReleaseTag.Name.IsNullOrEmpty())
3232
{
3333
// TODO: Why do we manipulating the semantic version here in the VariableProvider? The method name is GET not MANIPULATE.
@@ -38,14 +38,14 @@ public VersionVariables GetVariablesFor(SemanticVersion semanticVersion, Effecti
3838
}
3939

4040
// Evaluate tag number pattern and append to prerelease tag, preserving build metadata
41-
var appendTagNumberPattern = !configuration.LabelNumberPattern.IsNullOrEmpty() && semanticVersion.PreReleaseTag?.HasTag() == true;
41+
var appendTagNumberPattern = !configuration.LabelNumberPattern.IsNullOrEmpty() && semanticVersion.PreReleaseTag.HasTag() == true;
4242
if (appendTagNumberPattern)
4343
{
44-
if (semanticVersion.BuildMetaData?.Branch != null && configuration.LabelNumberPattern != null)
44+
if (semanticVersion.BuildMetaData.Branch != null && configuration.LabelNumberPattern != null)
4545
{
4646
var match = Regex.Match(semanticVersion.BuildMetaData.Branch, configuration.LabelNumberPattern);
4747
var numberGroup = match.Groups["number"];
48-
if (numberGroup.Success && semanticVersion.PreReleaseTag != null)
48+
if (numberGroup.Success)
4949
{
5050
// TODO: Why do we manipulating the semantic version here in the VariableProvider? The method name is GET not MANIPULATE.
5151
// What is about the separation of concern and single-responsibility principle?
@@ -101,29 +101,26 @@ public VersionVariables GetVariablesFor(SemanticVersion semanticVersion, Effecti
101101

102102
private static void PromoteNumberOfCommitsToTagNumber(SemanticVersion semanticVersion)
103103
{
104-
if (semanticVersion.PreReleaseTag != null && semanticVersion.BuildMetaData != null)
104+
// For continuous deployment the commits since tag gets promoted to the pre-release number
105+
if (!semanticVersion.BuildMetaData.CommitsSinceTag.HasValue)
105106
{
106-
// For continuous deployment the commits since tag gets promoted to the pre-release number
107-
if (!semanticVersion.BuildMetaData.CommitsSinceTag.HasValue)
107+
semanticVersion.PreReleaseTag.Number = null;
108+
semanticVersion.BuildMetaData.CommitsSinceVersionSource = 0;
109+
}
110+
else
111+
{
112+
// Number of commits since last tag should be added to PreRelease number if given. Remember to deduct automatic version bump.
113+
if (semanticVersion.PreReleaseTag.Number.HasValue)
108114
{
109-
semanticVersion.PreReleaseTag.Number = null;
110-
semanticVersion.BuildMetaData.CommitsSinceVersionSource = 0;
115+
semanticVersion.PreReleaseTag.Number += semanticVersion.BuildMetaData.CommitsSinceTag - 1;
111116
}
112117
else
113118
{
114-
// Number of commits since last tag should be added to PreRelease number if given. Remember to deduct automatic version bump.
115-
if (semanticVersion.PreReleaseTag.Number.HasValue)
116-
{
117-
semanticVersion.PreReleaseTag.Number += semanticVersion.BuildMetaData.CommitsSinceTag - 1;
118-
}
119-
else
120-
{
121-
semanticVersion.PreReleaseTag.Number = semanticVersion.BuildMetaData.CommitsSinceTag;
122-
semanticVersion.PreReleaseTag.PromotedFromCommits = true;
123-
}
124-
semanticVersion.BuildMetaData.CommitsSinceVersionSource = semanticVersion.BuildMetaData.CommitsSinceTag.Value;
125-
semanticVersion.BuildMetaData.CommitsSinceTag = null; // why is this set to null ?
119+
semanticVersion.PreReleaseTag.Number = semanticVersion.BuildMetaData.CommitsSinceTag;
120+
semanticVersion.PreReleaseTag.PromotedFromCommits = true;
126121
}
122+
semanticVersion.BuildMetaData.CommitsSinceVersionSource = semanticVersion.BuildMetaData.CommitsSinceTag.Value;
123+
semanticVersion.BuildMetaData.CommitsSinceTag = null; // why is this set to null ?
127124
}
128125
}
129126

0 commit comments

Comments
 (0)