public string GetSatisfyingSdkVersion()

in src/BuildScriptGenerator/DotNetCore/GlobalJsonSdkResolver.cs [81:185]


        public string GetSatisfyingSdkVersion(GlobalJsonModel globalJson, IEnumerable<string> availableSdks)
        {
            /*
                From spec:
                If no global.json file is found, or global.json doesn't specify an SDK version nor an
                allowPrerelease value, the highest installed SDK version is used (equivalent to setting rollForward
                to latestMajor).
            */
            if (globalJson?.Sdk == null)
            {
                globalJson = new GlobalJsonModel();
                globalJson.Sdk = new SdkModel
                {
                    Version = "0.0.000",
                    RollForward = RollForwardPolicy.LatestMajor,
                };

                _logger.LogDebug(
                    $"No 'sdk' provided in global.json. Choosing a version using the " +
                    $"default 'rollForward' policy: {globalJson.Sdk.RollForward}");
            }

            var sdkNodeInGlobalJson = globalJson.Sdk;

            if (!SdkVersionInfo.TryParse(sdkNodeInGlobalJson.Version, out var sdkVersionInGlobalJson))
            {
                throw new InvalidUsageException($"Invalid version format '{sdkNodeInGlobalJson}' in global.json");
            }

            var parsedSdkVersions = new List<SdkVersionInfo>();
            var unparsedSdkVersions = new List<string>();
            foreach (var sdkVersion in availableSdks)
            {
                if (SdkVersionInfo.TryParse(sdkVersion, out var parsedSdkVersion))
                {
                    parsedSdkVersions.Add(parsedSdkVersion);
                }
                else
                {
                    unparsedSdkVersions.Add(sdkVersion);
                }
            }

            if (unparsedSdkVersions.Count > 0)
            {
                _logger.LogDebug(
                    "Unable to parse sdk versions: {unparsedSdkVersions}",
                    string.Join(", ", unparsedSdkVersions));
            }

            var availableSdkVersions = parsedSdkVersions.AsEnumerable();

            if (!sdkNodeInGlobalJson.AllowPreRelease)
            {
                availableSdkVersions = availableSdkVersions.Where(sdk => !sdk.IsPrerelease);
            }

            string resolvedVersion = null;
            switch (sdkNodeInGlobalJson.RollForward)
            {
                case RollForwardPolicy.Disable:
                    resolvedVersion = GetDisable(availableSdkVersions, sdkVersionInGlobalJson);
                    break;
                case RollForwardPolicy.Patch:
                    resolvedVersion = GetPatch(availableSdkVersions, sdkVersionInGlobalJson);
                    break;
                case RollForwardPolicy.Feature:
                    resolvedVersion = GetFeature(availableSdkVersions, sdkVersionInGlobalJson);
                    break;
                case RollForwardPolicy.Minor:
                    resolvedVersion = GetMinor(availableSdkVersions, sdkVersionInGlobalJson);
                    break;
                case RollForwardPolicy.Major:
                    resolvedVersion = GetMajor(availableSdkVersions, sdkVersionInGlobalJson);
                    break;
                case RollForwardPolicy.LatestPatch:
                    resolvedVersion = GetLatestPatch(availableSdkVersions, sdkVersionInGlobalJson);
                    break;
                case RollForwardPolicy.LatestFeature:
                    resolvedVersion = GetLatestFeature(availableSdkVersions, sdkVersionInGlobalJson);
                    break;
                case RollForwardPolicy.LatestMinor:
                    resolvedVersion = GetLatestMinor(availableSdkVersions, sdkVersionInGlobalJson);
                    break;
                case RollForwardPolicy.LatestMajor:
                    resolvedVersion = GetLatestMajor(availableSdkVersions, sdkVersionInGlobalJson);
                    break;
                default:
                    _logger.LogDebug(
                        "Value {invalidRollForwardPolicy} is invalid for 'rollFoward' policy.",
                        sdkNodeInGlobalJson.RollForward.ToString());
                    return null;
            }

            if (resolvedVersion == null)
            {
                _logger.LogDebug(
                    "Could not resolve a version using roll forward policy {rollForwardPolicy} and available sdk " +
                    "versions {availableSdkVersions}",
                    sdkNodeInGlobalJson.RollForward.ToString(),
                    string.Join(", ", availableSdks));
            }

            return resolvedVersion;
        }