Let SemVer handle four-digit version numbers

This commit is contained in:
Nikolay Kuznetsov 2021-07-16 01:54:08 +02:00
parent 88c987d714
commit a6321a9ecc

View file

@ -46,6 +46,7 @@ namespace VRCMelonAssistant.Libs
new Regex(@"^(?<major>\d+)" + new Regex(@"^(?<major>\d+)" +
@"(?>\.(?<minor>\d+))?" + @"(?>\.(?<minor>\d+))?" +
@"(?>\.(?<patch>\d+))?" + @"(?>\.(?<patch>\d+))?" +
@"(?>\.(?<extra>\d+))?" +
@"(?>\-(?<pre>[0-9A-Za-z\-\.]+))?" + @"(?>\-(?<pre>[0-9A-Za-z\-\.]+))?" +
@"(?>\+(?<build>[0-9A-Za-z\-\.]+))?$", @"(?>\+(?<build>[0-9A-Za-z\-\.]+))?$",
#if NETSTANDARD #if NETSTANDARD
@ -82,11 +83,12 @@ namespace VRCMelonAssistant.Libs
/// <param name="patch">The patch version.</param> /// <param name="patch">The patch version.</param>
/// <param name="prerelease">The prerelease version (e.g. "alpha").</param> /// <param name="prerelease">The prerelease version (e.g. "alpha").</param>
/// <param name="build">The build metadata (e.g. "nightly.232").</param> /// <param name="build">The build metadata (e.g. "nightly.232").</param>
public SemVersion(int major, int minor = 0, int patch = 0, string prerelease = "", string build = "") public SemVersion(int major, int minor = 0, int patch = 0, int extra = 0, string prerelease = "", string build = "")
{ {
Major = major; Major = major;
Minor = minor; Minor = minor;
Patch = patch; Patch = patch;
Extra = extra;
Prerelease = prerelease ?? ""; Prerelease = prerelease ?? "";
Build = build ?? ""; Build = build ?? "";
@ -151,10 +153,17 @@ namespace VRCMelonAssistant.Libs
else if (strict) else if (strict)
throw new InvalidOperationException("Invalid version (no patch version given in strict mode)"); throw new InvalidOperationException("Invalid version (no patch version given in strict mode)");
var extraMatch = match.Groups["extra"];
int extra = 0;
if (extraMatch.Success)
extra = int.Parse(extraMatch.Value, CultureInfo.InvariantCulture);
var prerelease = match.Groups["pre"].Value; var prerelease = match.Groups["pre"].Value;
var build = match.Groups["build"].Value; var build = match.Groups["build"].Value;
return new SemVersion(major, minor, patch, prerelease, build);
return new SemVersion(major, minor, patch, extra, prerelease, build);
} }
/// <summary> /// <summary>
@ -197,10 +206,18 @@ namespace VRCMelonAssistant.Libs
} }
else if (strict) return false; else if (strict) return false;
var extraMatch = match.Groups["extra"];
int extra = 0;
if (extraMatch.Success)
{
if (!int.TryParse(extraMatch.Value, NumberStyles.Integer, CultureInfo.InvariantCulture, out extra))
return false;
}
var prerelease = match.Groups["pre"].Value; var prerelease = match.Groups["pre"].Value;
var build = match.Groups["build"].Value; var build = match.Groups["build"].Value;
semver = new SemVersion(major, minor, patch, prerelease, build); semver = new SemVersion(major, minor, patch, extra, prerelease, build);
return true; return true;
} }
@ -248,13 +265,14 @@ namespace VRCMelonAssistant.Libs
/// To change only the patch version: /// To change only the patch version:
/// <code>version.Change(patch: 4)</code> /// <code>version.Change(patch: 4)</code>
/// </example> /// </example>
public SemVersion Change(int? major = null, int? minor = null, int? patch = null, public SemVersion Change(int? major = null, int? minor = null, int? patch = null, int? extra = null,
string prerelease = null, string build = null) string prerelease = null, string build = null)
{ {
return new SemVersion( return new SemVersion(
major ?? Major, major ?? Major,
minor ?? Minor, minor ?? Minor,
patch ?? Patch, patch ?? Patch,
extra ?? Extra,
prerelease ?? Prerelease, prerelease ?? Prerelease,
build ?? Build); build ?? Build);
} }
@ -283,6 +301,11 @@ namespace VRCMelonAssistant.Libs
/// </value> /// </value>
public int Patch { get; } public int Patch { get; }
/// <summary>
/// Handles the fourth number present in assembly versions
/// </summary>
public int Extra { get; }
/// <summary> /// <summary>
/// Gets the prerelease version. /// Gets the prerelease version.
/// </summary> /// </summary>
@ -316,6 +339,12 @@ namespace VRCMelonAssistant.Libs
version.Append(Minor); version.Append(Minor);
version.Append('.'); version.Append('.');
version.Append(Patch); version.Append(Patch);
if (Extra != 0)
{
version.Append('.');
version.Append(Extra);
}
if (Prerelease.Length > 0) if (Prerelease.Length > 0)
{ {
version.Append('-'); version.Append('-');
@ -409,6 +438,9 @@ namespace VRCMelonAssistant.Libs
r = Patch.CompareTo(other.Patch); r = Patch.CompareTo(other.Patch);
if (r != 0) return r; if (r != 0) return r;
r = Extra.CompareTo(other.Extra);
if (r != 0) return r;
return CompareComponent(Prerelease, other.Prerelease, true); return CompareComponent(Prerelease, other.Prerelease, true);
} }