Skip to content

Commit 2e0323d

Browse files
committed
Avoid filling VersionOracle with public properties used for msbuild task diagnostics
1 parent 00a9b3c commit 2e0323d

File tree

3 files changed

+55
-51
lines changed

3 files changed

+55
-51
lines changed

src/NerdBank.GitVersioning/VersionOracle.cs

Lines changed: 2 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,6 @@
1414
/// </summary>
1515
public class VersionOracle
1616
{
17-
/// <summary>
18-
/// A regex that matches on numeric identifiers for prerelease or build metadata.
19-
/// </summary>
20-
private static readonly Regex NumericIdentifierRegex = new Regex(@"(?<![\w-])(\d+)(?![\w-])");
21-
2217
/// <summary>
2318
/// The 0.0 version.
2419
/// </summary>
@@ -177,7 +172,7 @@ public IEnumerable<string> BuildMetadataWithCommitId
177172
/// <summary>
178173
/// Gets the version options used to initialize this instance.
179174
/// </summary>
180-
private VersionOptions VersionOptions { get; }
175+
public VersionOptions VersionOptions { get; }
181176

182177
/// <summary>
183178
/// Gets the version string to use for the <see cref="System.Reflection.AssemblyVersionAttribute"/>.
@@ -385,22 +380,6 @@ public IDictionary<string, string> CloudBuildVersionVars
385380
/// </summary>
386381
public int SemVer1NumericIdentifierPadding => this.VersionOptions?.SemVer1NumericIdentifierPaddingOrDefault ?? 4;
387382

388-
/// <summary>
389-
/// Gets the SemVer 1 format without padding or the build metadata.
390-
/// </summary>
391-
public string SemVer1WithoutPaddingOrBuildMetadata =>
392-
$"{this.Version.ToStringSafe(3)}{MakePrereleaseSemVer1Compliant(this.PrereleaseVersion, 0)}";
393-
394-
/// <summary>
395-
/// Determines if it was likely the user misconfigured their the prerelease version options and
396-
/// their semver setting.
397-
/// </summary>
398-
/// <returns>False when NuGet SemVer 1 explicitly set but the prerelease does not match.</returns>
399-
public bool MisconfiguredPrereleaseAndSemVer1()
400-
{
401-
return this.VersionOptions != null && this.VersionOptions.NuGetPackageVersion != null && this.VersionOptions.NuGetPackageVersion.SemVer == 1 && this.PrereleaseVersion != MakePrereleaseSemVer1Compliant(this.PrereleaseVersion, 0);
402-
}
403-
404383
/// <summary>
405384
/// Gets the build metadata, compliant to the NuGet-compatible subset of SemVer 1.0.
406385
/// </summary>
@@ -437,7 +416,7 @@ public bool MisconfiguredPrereleaseAndSemVer1()
437416
private string SemVer2BuildMetadata =>
438417
(this.PublicRelease ? string.Empty : this.GitCommitIdShortForNonPublicPrereleaseTag) + FormatBuildMetadata(this.BuildMetadata);
439418

440-
private string PrereleaseVersionSemVer1 => MakePrereleaseSemVer1Compliant(this.PrereleaseVersion, this.SemVer1NumericIdentifierPadding);
419+
private string PrereleaseVersionSemVer1 => SemanticVersionExtensions.MakePrereleaseSemVer1Compliant(this.PrereleaseVersion, this.SemVer1NumericIdentifierPadding);
441420

442421
private string GitCommitIdShortForNonPublicPrereleaseTag => (string.IsNullOrEmpty(this.PrereleaseVersion) ? "-" : ".") + this.GitCommitIdShort;
443422

@@ -474,32 +453,6 @@ private static Version GetAssemblyVersion(Version version, VersionOptions versio
474453
/// <returns>The specified string, with macros substituted for actual values.</returns>
475454
private string ReplaceMacros(string prereleaseOrBuildMetadata) => prereleaseOrBuildMetadata?.Replace("{height}", this.VersionHeightWithOffset.ToString(CultureInfo.InvariantCulture));
476455

477-
/// <summary>
478-
/// Converts a semver 2 compliant "-beta.5" prerelease tag to a semver 1 compatible one.
479-
/// </summary>
480-
/// <param name="prerelease">The semver 2 prerelease tag, including its leading hyphen.</param>
481-
/// <param name="paddingSize">The minimum number of digits to use for any numeric identifier.</param>
482-
/// <returns>A semver 1 compliant prerelease tag. For example "-beta-0005".</returns>
483-
private static string MakePrereleaseSemVer1Compliant(string prerelease, int paddingSize)
484-
{
485-
if (string.IsNullOrEmpty(prerelease))
486-
{
487-
return prerelease;
488-
}
489-
490-
string paddingFormatter = "{0:" + new string('0', paddingSize) + "}";
491-
492-
string semver1 = prerelease;
493-
494-
// Identify numeric identifiers and pad them.
495-
Assumes.True(prerelease.StartsWith("-"));
496-
semver1 = "-" + NumericIdentifierRegex.Replace(semver1.Substring(1), m => string.Format(CultureInfo.InvariantCulture, paddingFormatter, int.Parse(m.Groups[1].Value)));
497-
498-
semver1 = semver1.Replace('.', '-');
499-
500-
return semver1;
501-
}
502-
503456
private static int CalculateVersionHeight(string relativeRepoProjectDirectory, LibGit2Sharp.Commit headCommit, VersionOptions committedVersion, VersionOptions workingVersion)
504457
{
505458
var headCommitVersion = committedVersion?.Version?.Version ?? Version0;

src/Nerdbank.GitVersioning.Tasks/GetBuildVersion.cs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,9 +202,9 @@ protected override bool ExecuteInner()
202202
oracle.BuildMetadata.AddRange(this.BuildMetadata);
203203
}
204204

205-
if (oracle.MisconfiguredPrereleaseAndSemVer1())
205+
if (IsMisconfiguredPrereleaseAndSemVer1(oracle))
206206
{
207-
this.Log.LogWarning("The 'nugetPackageVersion' is explicitly set to 'semVer': 1 but the prerelease version '{0}' is not SemVer1 compliant. Change the 'nugetPackageVersion'.'semVer' value to 2 or chagne the 'version' member to follow SemVer1 (like: '{1}').", oracle.PrereleaseVersion, oracle.SemVer1WithoutPaddingOrBuildMetadata);
207+
this.Log.LogWarning("The 'nugetPackageVersion' is explicitly set to 'semVer': 1 but the prerelease version '{0}' is not SemVer1 compliant. Change the 'nugetPackageVersion'.'semVer' value to 2 or change the 'version' member to follow SemVer1 rules (e.g.: '{1}').", oracle.PrereleaseVersion, GetSemVer1WithoutPaddingOrBuildMetadata(oracle));
208208
}
209209

210210
this.PublicRelease = oracle.PublicRelease;
@@ -261,5 +261,23 @@ protected override bool ExecuteInner()
261261
return false;
262262
}
263263
}
264+
265+
/// <summary>
266+
/// Gets the SemVer v1 format without padding or the build metadata.
267+
/// </summary>
268+
private static string GetSemVer1WithoutPaddingOrBuildMetadata(VersionOracle oracle)
269+
{
270+
Requires.NotNull(oracle, nameof(oracle));
271+
return $"{oracle.Version.ToStringSafe(3)}{SemanticVersionExtensions.MakePrereleaseSemVer1Compliant(oracle.PrereleaseVersion, 0)}";
272+
}
273+
274+
/// <summary>
275+
/// Gets a value indicating whether the user wants SemVer v1 compliance yet specified a non-v1 compliant prerelease tag.
276+
/// </summary>
277+
private static bool IsMisconfiguredPrereleaseAndSemVer1(VersionOracle oracle)
278+
{
279+
Requires.NotNull(oracle, nameof(oracle));
280+
return oracle.VersionOptions?.NuGetPackageVersion?.SemVer == 1 && oracle.PrereleaseVersion != SemanticVersionExtensions.MakePrereleaseSemVer1Compliant(oracle.PrereleaseVersion, 0);
281+
}
264282
}
265283
}

src/NerdBank.GitVersioning/SemanticVersionExtensions.cs renamed to src/Shared/SemanticVersionExtensions.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
11
namespace Nerdbank.GitVersioning
22
{
33
using System;
4+
using System.Globalization;
5+
using System.Text.RegularExpressions;
46
using Validation;
57

68
/// <summary>
79
/// Extension methods for <see cref="SemanticVersion"/>
810
/// </summary>
911
internal static class SemanticVersionExtensions
1012
{
13+
/// <summary>
14+
/// A regex that matches on numeric identifiers for prerelease or build metadata.
15+
/// </summary>
16+
private static readonly Regex NumericIdentifierRegex = new Regex(@"(?<![\w-])(\d+)(?![\w-])");
17+
1118
/// <summary>
1219
/// Gets a new semantic with the specified version component (major/minor) incremented.
1320
/// </summary>
@@ -107,5 +114,31 @@ internal static SemanticVersion WithoutPrepreleaseTags(this SemanticVersion vers
107114
{
108115
return new SemanticVersion(version.Version, null, version.BuildMetadata);
109116
}
117+
118+
/// <summary>
119+
/// Converts a semver 2 compliant "-beta.5" prerelease tag to a semver 1 compatible one.
120+
/// </summary>
121+
/// <param name="prerelease">The semver 2 prerelease tag, including its leading hyphen.</param>
122+
/// <param name="paddingSize">The minimum number of digits to use for any numeric identifier.</param>
123+
/// <returns>A semver 1 compliant prerelease tag. For example "-beta-0005".</returns>
124+
internal static string MakePrereleaseSemVer1Compliant(string prerelease, int paddingSize)
125+
{
126+
if (string.IsNullOrEmpty(prerelease))
127+
{
128+
return prerelease;
129+
}
130+
131+
string paddingFormatter = "{0:" + new string('0', paddingSize) + "}";
132+
133+
string semver1 = prerelease;
134+
135+
// Identify numeric identifiers and pad them.
136+
Assumes.True(prerelease.StartsWith("-"));
137+
semver1 = "-" + NumericIdentifierRegex.Replace(semver1.Substring(1), m => string.Format(CultureInfo.InvariantCulture, paddingFormatter, int.Parse(m.Groups[1].Value)));
138+
139+
semver1 = semver1.Replace('.', '-');
140+
141+
return semver1;
142+
}
110143
}
111144
}

0 commit comments

Comments
 (0)