diff --git a/src/GitVersion.Core/VersionCalculation/SemanticVersioning/SemanticVersion.cs b/src/GitVersion.Core/VersionCalculation/SemanticVersioning/SemanticVersion.cs index 3975a634f8..7bd2bf9463 100644 --- a/src/GitVersion.Core/VersionCalculation/SemanticVersioning/SemanticVersion.cs +++ b/src/GitVersion.Core/VersionCalculation/SemanticVersioning/SemanticVersion.cs @@ -147,10 +147,10 @@ public static SemanticVersion Parse(string version, string tagPrefixRegex) public static bool TryParse(string version, string tagPrefixRegex, out SemanticVersion semanticVersion) { var match = Regex.Match(version, $"^({tagPrefixRegex})?(?.*)$"); + semanticVersion = null; if (!match.Success) { - semanticVersion = null; return false; } @@ -159,7 +159,6 @@ public static bool TryParse(string version, string tagPrefixRegex, out SemanticV if (!parsed.Success) { - semanticVersion = null; return false; } @@ -167,15 +166,32 @@ public static bool TryParse(string version, string tagPrefixRegex, out SemanticV var fourthPart = parsed.Groups["FourthPart"]; if (fourthPart.Success && semanticVersionBuildMetaData.CommitsSinceTag == null) { - semanticVersionBuildMetaData.CommitsSinceTag = int.Parse(fourthPart.Value); + semanticVersionBuildMetaData.CommitsSinceTag = Int32.Parse(fourthPart.Value); + } + + int major = 0, minor = 0, patch = 0; + + if (!parsed.Groups["Major"].Success || !Int32.TryParse(parsed.Groups["Major"].Value, out major)) + { + return false; + } + + if (parsed.Groups["Minor"].Success && !Int32.TryParse(parsed.Groups["Minor"].Value, out minor)) + { + return false; + } + + if (parsed.Groups["Patch"].Success && !Int32.TryParse(parsed.Groups["Patch"].Value, out patch)) + { + return false; } semanticVersion = new SemanticVersion { - Major = int.Parse(parsed.Groups["Major"].Value), - Minor = parsed.Groups["Minor"].Success ? int.Parse(parsed.Groups["Minor"].Value) : 0, - Patch = parsed.Groups["Patch"].Success ? int.Parse(parsed.Groups["Patch"].Value) : 0, - PreReleaseTag = SemanticVersionPreReleaseTag.Parse(parsed.Groups["Tag"].Value), + Major = major, + Minor = minor, + Patch = patch, + PreReleaseTag = SemanticVersionPreReleaseTag.TryParse(parsed.Groups["Tag"].Value), BuildMetaData = semanticVersionBuildMetaData }; diff --git a/src/GitVersion.Core/VersionCalculation/SemanticVersioning/SemanticVersionPreReleaseTag.cs b/src/GitVersion.Core/VersionCalculation/SemanticVersioning/SemanticVersionPreReleaseTag.cs index 9bfd838b38..8b5b7b5941 100644 --- a/src/GitVersion.Core/VersionCalculation/SemanticVersioning/SemanticVersionPreReleaseTag.cs +++ b/src/GitVersion.Core/VersionCalculation/SemanticVersioning/SemanticVersionPreReleaseTag.cs @@ -84,10 +84,10 @@ public static implicit operator string(SemanticVersionPreReleaseTag preReleaseTa public static implicit operator SemanticVersionPreReleaseTag(string preReleaseTag) { - return Parse(preReleaseTag); + return TryParse(preReleaseTag); } - public static SemanticVersionPreReleaseTag Parse(string preReleaseTag) + public static SemanticVersionPreReleaseTag TryParse(string preReleaseTag) { if (string.IsNullOrEmpty(preReleaseTag)) { @@ -103,7 +103,8 @@ public static SemanticVersionPreReleaseTag Parse(string preReleaseTag) } var value = match.Groups["name"].Value; - var number = match.Groups["number"].Success ? int.Parse(match.Groups["number"].Value) : (int?)null; + var number = (match.Groups["number"].Success && int.TryParse(match.Groups["number"].Value, out int parsedNumber)) ? (int?)parsedNumber : null; + if (value.EndsWith("-")) return new SemanticVersionPreReleaseTag(preReleaseTag, null);