/// <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); }
/********* ** Public methods *********/ /// <summary>Construct an instance.</summary> /// <param name="release">The underlying GitHub release.</param> /// <param name="asset">The underlying download asset.</param> /// <param name="version">The SMAPI version.</param> /// <param name="isBeta">Whether this is a beta download.</param> /// <param name="isForDevs">Whether this is a 'for developers' download.</param> public ReleaseVersion(GitRelease release, GitAsset asset, SemanticVersionImpl version, bool isBeta, bool isForDevs) { this.Release = release; this.Asset = asset; this.Version = version; this.IsBeta = isBeta; this.IsForDevs = isForDevs; }
/// <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)); } }
/********* ** Private methods *********/ /// <summary>Construct an instance.</summary> /// <param name="version">The underlying semantic version implementation.</param> private SemanticVersion(SemanticVersionImpl version) { this.Version = version; }