Skip to content

Commit cbfce46

Browse files
committed
Remove ReferenceNameExtensions and integrate functionality into ReferenceName.cs
1 parent 14d33d8 commit cbfce46

File tree

10 files changed

+97
-112
lines changed

10 files changed

+97
-112
lines changed

new-cli/GitVersion.Common/GitVersion.Common.csproj

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,5 +63,23 @@
6363
<Compile Include="..\..\src\GitVersion.Core\Git\RefSpecDirection.cs">
6464
<Link>Git\RefSpecDirection.cs</Link>
6565
</Compile>
66+
<Compile Include="..\..\src\GitVersion.Core\Git\SemanticVersion.cs">
67+
<Link>Git\SemanticVersion.cs</Link>
68+
</Compile>
69+
<Compile Include="..\..\src\GitVersion.Core\Git\SemanticVersionBuildMetaData.cs">
70+
<Link>Git\SemanticVersionBuildMetaData.cs</Link>
71+
</Compile>
72+
<Compile Include="..\..\src\GitVersion.Core\Git\SemanticVersionFormat.cs">
73+
<Link>Git\SemanticVersionFormat.cs</Link>
74+
</Compile>
75+
<Compile Include="..\..\src\GitVersion.Core\Git\SemanticVersionPreReleaseTag.cs">
76+
<Link>Git\SemanticVersionPreReleaseTag.cs</Link>
77+
</Compile>
78+
<Compile Include="..\..\src\GitVersion.Core\Git\VersionField.cs">
79+
<Link>Git\VersionField.cs</Link>
80+
</Compile>
81+
<Compile Include="..\..\src\GitVersion.Core\Git\WarningException.cs">
82+
<Link>Git\WarningException.cs</Link>
83+
</Compile>
6684
</ItemGroup>
6785
</Project>

src/GitVersion.Core/Git/ReferenceName.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
using System.Diagnostics.CodeAnalysis;
2+
using System.Diagnostics.Contracts;
3+
using System.Text.RegularExpressions;
24
using GitVersion.Extensions;
35
using GitVersion.Helpers;
46

@@ -76,6 +78,38 @@ public static ReferenceName FromBranchName(string branchName)
7678
public override int GetHashCode() => equalityHelper.GetHashCode(this);
7779
public override string ToString() => Friendly;
7880

81+
public bool TryGetSemanticVersion([NotNullWhen(true)] out (SemanticVersion Value, string? Name) result,
82+
Regex versionPatternRegex, string? labelPrefix, SemanticVersionFormat format)
83+
{
84+
result = default;
85+
86+
Contract.Assume(versionPatternRegex.ToString().StartsWith("^"));
87+
88+
int length = 0;
89+
foreach (var branchPart in WithoutOrigin.Split(GetBranchSeparator()))
90+
{
91+
if (string.IsNullOrEmpty(branchPart)) return false;
92+
93+
var match = versionPatternRegex.NotNull().Match(branchPart);
94+
if (match.Success)
95+
{
96+
var versionPart = match.Groups["version"].Value;
97+
if (SemanticVersion.TryParse(versionPart, labelPrefix, out var semanticVersion, format))
98+
{
99+
length += versionPart.Length;
100+
var name = WithoutOrigin[length..].Trim('-');
101+
result = new(semanticVersion, name == string.Empty ? null : name);
102+
return true;
103+
}
104+
}
105+
length += branchPart.Length + 1;
106+
}
107+
108+
return false;
109+
}
110+
111+
private char GetBranchSeparator() => WithoutOrigin.Contains('/') || !WithoutOrigin.Contains('-') ? '/' : '-';
112+
79113
public bool EquivalentTo(string? name) =>
80114
Canonical.Equals(name, StringComparison.OrdinalIgnoreCase)
81115
|| Friendly.Equals(name, StringComparison.OrdinalIgnoreCase)
Lines changed: 34 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -28,75 +28,67 @@ public class SemanticVersion : IFormattable, IComparable<SemanticVersion>, IEqua
2828

2929
public SemanticVersionBuildMetaData BuildMetaData { get; init; }
3030

31-
public bool IsLabeledWith(string value) => PreReleaseTag.HasTag() && PreReleaseTag.Name.IsEquivalentTo(value);
31+
public bool IsLabeledWith(string value) => PreReleaseTag.HasTag() && string.Equals(PreReleaseTag.Name, value, StringComparison.OrdinalIgnoreCase);
3232

3333
public bool IsMatchForBranchSpecificLabel(string? value)
3434
=> PreReleaseTag.Name == string.Empty || value is null || IsLabeledWith(value);
3535

3636
public SemanticVersion(long major = 0, long minor = 0, long patch = 0)
3737
{
38-
this.Major = major;
39-
this.Minor = minor;
40-
this.Patch = patch;
41-
this.PreReleaseTag = new SemanticVersionPreReleaseTag();
42-
this.BuildMetaData = new SemanticVersionBuildMetaData();
38+
Major = major;
39+
Minor = minor;
40+
Patch = patch;
41+
PreReleaseTag = new SemanticVersionPreReleaseTag();
42+
BuildMetaData = new SemanticVersionBuildMetaData();
4343
}
4444

4545
public SemanticVersion(SemanticVersion semanticVersion)
4646
{
4747
semanticVersion.NotNull();
4848

49-
this.Major = semanticVersion.Major;
50-
this.Minor = semanticVersion.Minor;
51-
this.Patch = semanticVersion.Patch;
49+
Major = semanticVersion.Major;
50+
Minor = semanticVersion.Minor;
51+
Patch = semanticVersion.Patch;
5252

53-
this.PreReleaseTag = new SemanticVersionPreReleaseTag(semanticVersion.PreReleaseTag);
54-
this.BuildMetaData = new SemanticVersionBuildMetaData(semanticVersion.BuildMetaData);
53+
PreReleaseTag = new SemanticVersionPreReleaseTag(semanticVersion.PreReleaseTag);
54+
BuildMetaData = new SemanticVersionBuildMetaData(semanticVersion.BuildMetaData);
5555
}
5656

5757
public bool Equals(SemanticVersion? obj)
5858
{
5959
if (obj == null)
60-
{
6160
return false;
62-
}
63-
return this.Major == obj.Major && this.Minor == obj.Minor && this.Patch == obj.Patch && this.PreReleaseTag == obj.PreReleaseTag && this.BuildMetaData == obj.BuildMetaData;
61+
return Major == obj.Major && Minor == obj.Minor && Patch == obj.Patch && PreReleaseTag == obj.PreReleaseTag && BuildMetaData == obj.BuildMetaData;
6462
}
6563

6664
public bool IsEmpty() => Equals(Empty);
6765

6866
public override bool Equals(object? obj)
6967
{
7068
if (obj is null)
71-
{
7269
return false;
73-
}
7470
if (ReferenceEquals(this, obj))
75-
{
7671
return true;
77-
}
7872
return obj.GetType() == GetType() && Equals((SemanticVersion)obj);
7973
}
8074

8175
public override int GetHashCode()
8276
{
8377
unchecked
8478
{
85-
var hashCode = this.Major.GetHashCode();
86-
hashCode = (hashCode * 397) ^ this.Minor.GetHashCode();
87-
hashCode = (hashCode * 397) ^ this.Patch.GetHashCode();
88-
hashCode = (hashCode * 397) ^ this.PreReleaseTag.GetHashCode();
89-
hashCode = (hashCode * 397) ^ this.BuildMetaData.GetHashCode();
79+
var hashCode = Major.GetHashCode();
80+
hashCode = hashCode * 397 ^ Minor.GetHashCode();
81+
hashCode = hashCode * 397 ^ Patch.GetHashCode();
82+
hashCode = hashCode * 397 ^ PreReleaseTag.GetHashCode();
83+
hashCode = hashCode * 397 ^ BuildMetaData.GetHashCode();
9084
return hashCode;
9185
}
9286
}
9387

9488
public static bool operator ==(SemanticVersion? v1, SemanticVersion? v2)
9589
{
9690
if (v1 is null)
97-
{
9891
return v2 is null;
99-
}
10092
return v1.Equals(v2);
10193
}
10294

@@ -225,39 +217,29 @@ private static bool TryParseLoose(string version, [NotNullWhen(true)] out Semant
225217
public int CompareTo(SemanticVersion? value, bool includePrerelease)
226218
{
227219
if (value == null)
228-
{
229220
return 1;
230-
}
231-
if (this.Major != value.Major)
221+
if (Major != value.Major)
232222
{
233-
if (this.Major > value.Major)
234-
{
223+
if (Major > value.Major)
235224
return 1;
236-
}
237225
return -1;
238226
}
239-
if (this.Minor != value.Minor)
227+
if (Minor != value.Minor)
240228
{
241-
if (this.Minor > value.Minor)
242-
{
229+
if (Minor > value.Minor)
243230
return 1;
244-
}
245231
return -1;
246232
}
247-
if (this.Patch != value.Patch)
233+
if (Patch != value.Patch)
248234
{
249-
if (this.Patch > value.Patch)
250-
{
235+
if (Patch > value.Patch)
251236
return 1;
252-
}
253237
return -1;
254238
}
255-
if (includePrerelease && this.PreReleaseTag != value.PreReleaseTag)
239+
if (includePrerelease && PreReleaseTag != value.PreReleaseTag)
256240
{
257-
if (this.PreReleaseTag > value.PreReleaseTag)
258-
{
241+
if (PreReleaseTag > value.PreReleaseTag)
259242
return 1;
260-
}
261243
return -1;
262244
}
263245

@@ -277,7 +259,7 @@ public int CompareTo(SemanticVersion? value, bool includePrerelease)
277259
/// </summary>
278260
public string ToString(string? format, IFormatProvider? formatProvider)
279261
{
280-
if (format.IsNullOrEmpty())
262+
if (string.IsNullOrEmpty(format))
281263
format = "s";
282264

283265
if (formatProvider?.GetFormat(GetType()) is ICustomFormatter formatter)
@@ -288,22 +270,22 @@ public string ToString(string? format, IFormatProvider? formatProvider)
288270
switch (format)
289271
{
290272
case "j":
291-
return $"{this.Major}.{this.Minor}.{this.Patch}";
273+
return $"{Major}.{Minor}.{Patch}";
292274
case "s":
293-
return this.PreReleaseTag.HasTag() ? $"{ToString("j")}-{this.PreReleaseTag}" : ToString("j");
275+
return PreReleaseTag.HasTag() ? $"{ToString("j")}-{PreReleaseTag}" : ToString("j");
294276
case "t":
295-
return this.PreReleaseTag.HasTag() ? $"{ToString("j")}-{this.PreReleaseTag.ToString("t")}" : ToString("j");
277+
return PreReleaseTag.HasTag() ? $"{ToString("j")}-{PreReleaseTag.ToString("t")}" : ToString("j");
296278
case "f":
297279
{
298-
var buildMetadata = this.BuildMetaData.ToString();
280+
var buildMetadata = BuildMetaData.ToString();
299281

300-
return !buildMetadata.IsNullOrEmpty() ? $"{ToString("s")}+{buildMetadata}" : ToString("s");
282+
return !string.IsNullOrEmpty(buildMetadata) ? $"{ToString("s")}+{buildMetadata}" : ToString("s");
301283
}
302284
case "i":
303285
{
304-
var buildMetadata = this.BuildMetaData.ToString("f");
286+
var buildMetadata = BuildMetaData.ToString("f");
305287

306-
return !buildMetadata.IsNullOrEmpty() ? $"{ToString("s")}+{buildMetadata}" : ToString("s");
288+
return !string.IsNullOrEmpty(buildMetadata) ? $"{ToString("s")}+{buildMetadata}" : ToString("s");
307289
}
308290
default:
309291
throw new FormatException($"Unknown format '{format}'.");
@@ -343,10 +325,8 @@ public SemanticVersion IncrementVersion(VersionField incrementStrategy, string?
343325
var preReleaseTagNumber = PreReleaseTag.Number;
344326

345327
if (PreReleaseTag.HasTag())
346-
{
347328
preReleaseTagNumber++;
348-
}
349-
else if (!label.IsNullOrEmpty())
329+
else if (!string.IsNullOrEmpty(label))
350330
{
351331
preReleaseTagNumber = 1;
352332
preReleaseTagName = label;
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -87,15 +87,15 @@ public string ToString(string? format, IFormatProvider? formatProvider)
8787
if (formatProvider?.GetFormat(GetType()) is ICustomFormatter formatter)
8888
return formatter.Format(format, this, formatProvider);
8989

90-
if (format.IsNullOrEmpty())
90+
if (string.IsNullOrEmpty(format))
9191
format = "b";
9292

9393
format = format.ToLower();
9494
return format.ToLower() switch
9595
{
9696
"b" => $"{this.CommitsSinceTag}",
97-
"s" => $"{this.CommitsSinceTag}{(this.Sha.IsNullOrEmpty() ? null : ".Sha." + this.Sha)}".TrimStart('.'),
98-
"f" => $"{this.CommitsSinceTag}{(this.Branch.IsNullOrEmpty() ? null : ".Branch." + FormatMetaDataPart(this.Branch))}{(this.Sha.IsNullOrEmpty() ? null : ".Sha." + this.Sha)}{(this.OtherMetaData.IsNullOrEmpty() ? null : "." + FormatMetaDataPart(this.OtherMetaData))}".TrimStart('.'),
97+
"s" => $"{this.CommitsSinceTag}{(string.IsNullOrEmpty(this.Sha) ? null : ".Sha." + this.Sha)}".TrimStart('.'),
98+
"f" => $"{this.CommitsSinceTag}{(string.IsNullOrEmpty(this.Branch) ? null : ".Branch." + FormatMetaDataPart(this.Branch))}{(string.IsNullOrEmpty(this.Sha) ? null : ".Sha." + this.Sha)}{(string.IsNullOrEmpty(this.OtherMetaData) ? null : "." + FormatMetaDataPart(this.OtherMetaData))}".TrimStart('.'),
9999
_ => throw new FormatException($"Unknown format '{format}'.")
100100
};
101101
}
@@ -112,7 +112,7 @@ public string ToString(string? format, IFormatProvider? formatProvider)
112112

113113
public static SemanticVersionBuildMetaData Parse(string? buildMetaData)
114114
{
115-
if (buildMetaData.IsNullOrEmpty())
115+
if (string.IsNullOrEmpty(buildMetaData))
116116
return Empty;
117117

118118
var parsed = ParseRegex.Match(buildMetaData);
@@ -135,7 +135,7 @@ public static SemanticVersionBuildMetaData Parse(string? buildMetaData)
135135
buildMetaDataSha = parsed.Groups["Sha"].Value;
136136

137137
string? buildMetaDataOtherMetaData = null;
138-
if (parsed.Groups["Other"].Success && !parsed.Groups["Other"].Value.IsNullOrEmpty())
138+
if (parsed.Groups["Other"].Success && !string.IsNullOrEmpty(parsed.Groups["Other"].Value))
139139
buildMetaDataOtherMetaData = parsed.Groups["Other"].Value.TrimStart('.');
140140

141141
return new()
@@ -150,7 +150,7 @@ public static SemanticVersionBuildMetaData Parse(string? buildMetaData)
150150

151151
private static string FormatMetaDataPart(string value)
152152
{
153-
if (!value.IsNullOrEmpty())
153+
if (!string.IsNullOrEmpty(value))
154154
value = Regex.Replace(value, "[^0-9A-Za-z-.]", "-");
155155
return value;
156156
}
Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public SemanticVersionPreReleaseTag(SemanticVersionPreReleaseTag preReleaseTag)
7070

7171
public static SemanticVersionPreReleaseTag Parse(string? preReleaseTag)
7272
{
73-
if (preReleaseTag.IsNullOrEmpty())
73+
if (string.IsNullOrEmpty(preReleaseTag))
7474
{
7575
return new SemanticVersionPreReleaseTag();
7676
}
@@ -118,18 +118,17 @@ public string ToString(string? format, IFormatProvider? formatProvider)
118118
if (formatProvider?.GetFormat(GetType()) is ICustomFormatter formatter)
119119
return formatter.Format(format, this, formatProvider);
120120

121-
if (format.IsNullOrEmpty())
121+
if (string.IsNullOrEmpty(format))
122122
format = "t";
123123

124124
format = format.ToLower();
125125

126126
return format switch
127127
{
128-
"t" => (Number.HasValue ? Name.IsNullOrEmpty() ? $"{Number}" : $"{Name}.{Number}" : Name ?? string.Empty),
128+
"t" => (Number.HasValue ? string.IsNullOrEmpty(Name) ? $"{Number}" : $"{Name}.{Number}" : Name ?? string.Empty),
129129
_ => throw new FormatException($"Unknown format '{format}'.")
130130
};
131131
}
132132

133-
public bool HasTag() =>
134-
!Name.IsNullOrEmpty() || (Number.HasValue && PromotedFromCommits != true);
133+
public bool HasTag() => !string.IsNullOrEmpty(Name) || (Number.HasValue && PromotedFromCommits != true);
135134
}

src/GitVersion.Core/PublicAPI.Unshipped.txt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -557,7 +557,7 @@ GitVersion.OutputVariables.VersionVariablesJsonModel.WeightedPreReleaseNumber.ge
557557
GitVersion.OutputVariables.VersionVariablesJsonModel.WeightedPreReleaseNumber.set -> void
558558
GitVersion.OutputVariables.VersionVariablesJsonStringConverter
559559
GitVersion.OutputVariables.VersionVariablesJsonStringConverter.VersionVariablesJsonStringConverter() -> void
560-
GitVersion.ReferenceNameExtensions
560+
GitVersion.ReferenceName.TryGetSemanticVersion(out (GitVersion.SemanticVersion! Value, string? Name) result, System.Text.RegularExpressions.Regex! versionPatternRegex, string? labelPrefix, GitVersion.SemanticVersionFormat format) -> bool
561561
GitVersion.RefSpecDirection
562562
GitVersion.RefSpecDirection.Fetch = 0 -> GitVersion.RefSpecDirection
563563
GitVersion.RefSpecDirection.Push = 1 -> GitVersion.RefSpecDirection
@@ -887,7 +887,6 @@ static GitVersion.OutputVariables.VersionVariablesHelper.ToJsonString(this GitVe
887887
static GitVersion.ReferenceName.FromBranchName(string! branchName) -> GitVersion.ReferenceName!
888888
static GitVersion.ReferenceName.Parse(string! canonicalName) -> GitVersion.ReferenceName!
889889
static GitVersion.ReferenceName.TryParse(out GitVersion.ReferenceName? value, string! canonicalName) -> bool
890-
static GitVersion.ReferenceNameExtensions.TryGetSemanticVersion(this GitVersion.ReferenceName! source, out (GitVersion.SemanticVersion! Value, string? Name) result, System.Text.RegularExpressions.Regex! versionPatternRegex, string? labelPrefix, GitVersion.SemanticVersionFormat format) -> bool
891890
static GitVersion.SemanticVersion.Parse(string! version, string? tagPrefixRegex, GitVersion.SemanticVersionFormat versionFormat = GitVersion.SemanticVersionFormat.Strict) -> GitVersion.SemanticVersion!
892891
static GitVersion.SemanticVersion.TryParse(string! version, string? tagPrefixRegex, out GitVersion.SemanticVersion? semanticVersion, GitVersion.SemanticVersionFormat format = GitVersion.SemanticVersionFormat.Strict) -> bool
893892
static GitVersion.SemanticVersion.operator !=(GitVersion.SemanticVersion? v1, GitVersion.SemanticVersion? v2) -> bool

0 commit comments

Comments
 (0)