Skip to content

Commit 5767382

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 e1bd3a9 commit 5767382

File tree

9 files changed

+159
-167
lines changed

9 files changed

+159
-167
lines changed

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,9 @@ public void ValidateVersionParsing(
4949
Assert.AreEqual(major, version.Major);
5050
Assert.AreEqual(minor, version.Minor);
5151
Assert.AreEqual(patch, version.Patch);
52-
version.PreReleaseTag.ShouldNotBeNull();
5352
Assert.AreEqual(tag, version.PreReleaseTag.Name);
5453
Assert.AreEqual(tagNumber, version.PreReleaseTag.Number);
5554

56-
version.BuildMetaData.ShouldNotBeNull();
5755
Assert.AreEqual(numberOfBuilds, version.BuildMetaData.CommitsSinceTag);
5856
Assert.AreEqual(branchName, version.BuildMetaData.Branch);
5957
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
@@ -23,7 +23,6 @@ public void VersionSourceSha()
2323

2424
var nextVersion = nextVersionCalculator.FindVersion();
2525

26-
nextVersion.IncrementedVersion.BuildMetaData.ShouldNotBeNull();
2726
nextVersion.IncrementedVersion.BuildMetaData.VersionSourceSha.ShouldBeNull();
2827
nextVersion.IncrementedVersion.BuildMetaData.CommitsSinceVersionSource.ShouldBe(3);
2928
}
@@ -38,7 +37,6 @@ public void VersionSourceShaOneCommit()
3837

3938
var nextVersion = nextVersionCalculator.FindVersion();
4039

41-
nextVersion.IncrementedVersion.BuildMetaData.ShouldNotBeNull();
4240
nextVersion.IncrementedVersion.BuildMetaData.VersionSourceSha.ShouldBeNull();
4341
nextVersion.IncrementedVersion.BuildMetaData.CommitsSinceVersionSource.ShouldBe(1);
4442
}
@@ -59,7 +57,6 @@ public void VersionSourceShaUsingTag()
5957

6058
var nextVersion = nextVersionCalculator.FindVersion();
6159

62-
nextVersion.IncrementedVersion.BuildMetaData.ShouldNotBeNull();
6360
nextVersion.IncrementedVersion.BuildMetaData.VersionSourceSha.ShouldBe(secondCommit.Sha);
6461
nextVersion.IncrementedVersion.BuildMetaData.CommitsSinceVersionSource.ShouldBe(1);
6562
}

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/PublicAPI.Shipped.txt

Lines changed: 108 additions & 108 deletions
Large diffs are not rendered by default.

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
@@ -56,7 +56,7 @@ public virtual NextVersion FindVersion()
5656
{
5757
var baseVersionBuildMetaData = this.mainlineVersionCalculator.CreateVersionBuildMetaData(baseVersion.BaseVersionSource);
5858

59-
if (baseVersionBuildMetaData.Sha != nextVersion.IncrementedVersion.BuildMetaData?.Sha)
59+
if (baseVersionBuildMetaData.Sha != nextVersion.IncrementedVersion.BuildMetaData.Sha)
6060
{
6161
semver = nextVersion.IncrementedVersion;
6262
}
@@ -69,8 +69,8 @@ public virtual NextVersion FindVersion()
6969

7070
var lastPrefixedSemver = this.repositoryStore
7171
.GetVersionTagsOnBranch(Context.CurrentBranch, Context.Configuration.LabelPrefix, Context.Configuration.SemanticVersionFormat)
72-
.Where(v => MajorMinorPatchEqual(v, semver) && v.PreReleaseTag?.HasTag() == true)
73-
.FirstOrDefault(v => v.PreReleaseTag?.Name?.IsEquivalentTo(preReleaseTagName) == true);
72+
.Where(v => MajorMinorPatchEqual(v, semver) && v.PreReleaseTag.HasTag() == true)
73+
.FirstOrDefault(v => v.PreReleaseTag.Name?.IsEquivalentTo(preReleaseTagName) == true);
7474

7575
if (lastPrefixedSemver != null)
7676
{
@@ -87,7 +87,7 @@ public virtual NextVersion FindVersion()
8787
{
8888
long? number;
8989

90-
if (semver.PreReleaseTag?.Name == preReleaseTagName)
90+
if (semver.PreReleaseTag.Name == preReleaseTagName)
9191
{
9292
number = semver.PreReleaseTag.Number + 1;
9393
}
@@ -214,7 +214,7 @@ private IEnumerable<NextVersion> GetNextVersions(IBranch branch, GitVersionConfi
214214

215215
if (configuration.VersioningMode == VersioningMode.Mainline)
216216
{
217-
if (incrementedVersion.PreReleaseTag?.HasTag() == true)
217+
if (!(incrementedVersion.PreReleaseTag.HasTag() != true))
218218
{
219219
continue;
220220
}

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)