private async Task <PackageInfo> GetBestMatchPackageVersionsAsync(string registry, bool includePrerelease, string packageId, SemVer.Range range) { PackageOption option = new PackageOption { packageId = packageId, includePrerelease = includePrerelease, registry = registry }; Console.WriteLine($"Try to find best match: {packageId}: {range.ToString()}"); IEnumerable <string> versionValues = await GetPackageVersionAsync(option.packageId, option.registry, option.includePrerelease); IEnumerable <SemVer.Version> versions = versionValues?.Select(x => new SemVer.Version(x, true)); if (versions == null) { return(null); } SemVer.Version bestMatchVersion = range.MaxSatisfying(versions); if (bestMatchVersion == null) { bestMatchVersion = versions.OrderByDescending(x => x).FirstOrDefault(); } return(new PackageInfo { packageId = packageId, packageVersion = bestMatchVersion }); }
public static int GetSatisfiedVersionIndex(this SemVer.Range versionRange, IList <SemVer.Version> versions) { if (versions.Count == 0) { return(-1); } var highest = (versionRange.ToString().Contains("*") || versionRange.ToString().Contains("x")); var selected = -1; for (int i = 0; i < versions.Count; i++) { if (versionRange.IsSatisfied(versions[i])) { if (selected == -1) { selected = i; } else if (highest) { if (versions[selected] < versions[i]) { selected = i; } } else { if (versions[selected] > versions[i]) { selected = i; } } } } return(selected); }