/// <summary>Get the latest beta download for a SMAPI release.</summary> /// <param name="release">The SMAPI release.</param> private IndexVersionModel GetBetaDownload(GitRelease release) { // get download with the latest version SemanticVersionImpl latestVersion = null; string latestUrl = null; foreach (GitAsset asset in release.Assets ?? new GitAsset[0]) { // parse version Match versionMatch = Regex.Match(asset.FileName, @"SMAPI-([\d\.]+(?:-.+)?)-installer.zip"); if (!versionMatch.Success || !SemanticVersionImpl.TryParse(versionMatch.Groups[1].Value, out SemanticVersionImpl version)) { continue; } // save latest version if (latestVersion == null || latestVersion.CompareTo(version) < 0) { latestVersion = version; latestUrl = asset.DownloadUrl; } } // return if prerelease return(latestVersion?.Tag != null ? new IndexVersionModel(latestVersion.ToString(), release.Body, latestUrl, null) : null); }
/// <summary>Parse a version string without throwing an exception if it fails.</summary> /// <param name="version">The version string.</param> /// <param name="parsed">The parsed representation.</param> /// <returns>Returns whether parsing the version succeeded.</returns> internal static bool TryParse(string version, out ISemanticVersion parsed) { if (SemanticVersionImpl.TryParse(version, out SemanticVersionImpl versionImpl)) { parsed = new SemanticVersion(versionImpl); return(true); } parsed = null; return(false); }
/// <summary>Get a parsed list of SMAPI downloads for a release.</summary> /// <param name="release">The GitHub release.</param> private IEnumerable <ReleaseVersion> ParseReleaseVersions(GitRelease release) { if (release?.Assets == null) { yield break; } foreach (GitAsset asset in release.Assets) { Match match = Regex.Match(asset.FileName, @"SMAPI-(?<version>[\d\.]+(?:-.+)?)-installer(?<forDevs>-for-developers)?.zip"); if (!match.Success || !SemanticVersionImpl.TryParse(match.Groups["version"].Value, out SemanticVersionImpl version)) { continue; } bool isBeta = version.Tag != null; bool isForDevs = match.Groups["forDevs"].Success; yield return(new ReleaseVersion(release, asset, version, isBeta, isForDevs)); } }