示例#1
0
        public static CompatibilityResult GetCompatibilityResult(PackageDetailsWithApiIndices package, string apiMethodSignature, string version, string target = DEFAULT_TARGET, bool checkLesserPackage = false)
        {
            var compatiblityResult = new CompatibilityResult
            {
                Compatibility      = Compatibility.UNKNOWN,
                CompatibleVersions = new List <string>()
            };

            if (package == null || apiMethodSignature == null || !NuGetVersion.TryParse(version, out var targetversion))
            {
                return(compatiblityResult);
            }

            if (package.PackageDetails.IsDeprecated)
            {
                compatiblityResult.Compatibility = Compatibility.DEPRECATED;
                return(compatiblityResult);
            }

            var foundApi = GetApiDetails(package, apiMethodSignature);

            if (foundApi == null)
            {
                if (!checkLesserPackage || package.PackageDetails.Targets == null || !package.PackageDetails.Targets.TryGetValue(target, out var targetFramework))
                {
                    compatiblityResult.Compatibility = Compatibility.INCOMPATIBLE;
                    return(compatiblityResult);
                }

                compatiblityResult.Compatibility      = hasLesserTarget(version, targetFramework.ToArray()) ? Compatibility.COMPATIBLE : Compatibility.INCOMPATIBLE;
                compatiblityResult.CompatibleVersions = targetFramework.ToArray()
                                                        .Where(v =>
                {
                    if (!NuGetVersion.TryParse(v, out var semversion))
                    {
                        return(false);
                    }
                    return(semversion.CompareTo(targetversion) > 0);
                }).ToList();
                return(compatiblityResult);
            }

            if (!foundApi.Targets.TryGetValue(target, out var framework))
            {
                compatiblityResult.Compatibility = Compatibility.INCOMPATIBLE;
                return(compatiblityResult);
            }

            compatiblityResult.Compatibility      = hasLesserTarget(version, framework.ToArray()) ? Compatibility.COMPATIBLE : Compatibility.INCOMPATIBLE;
            compatiblityResult.CompatibleVersions = framework.ToArray()
                                                    .Where(v =>
            {
                if (!NuGetVersion.TryParse(v, out var semversion))
                {
                    return(false);
                }
                return(semversion.CompareTo(targetversion) > 0);
            }).ToList();
            return(compatiblityResult);
        }
示例#2
0
        private static IEnumerable <string> GetCompatiblePackageVersionsForTarget(
            ApiDetails apiDetails,
            PackageDetailsWithApiIndices package,
            string target,
            bool checkLesserPackage)
        {
            // If ApiDetails found, use them to get compatible versions
            if (apiDetails == null)
            {
                if (!checkLesserPackage ||
                    package.PackageDetails.Targets == null ||
                    !package.PackageDetails.Targets.TryGetValue(target, out var compatiblePackageVersionsForTarget))
                {
                    return(new List <string>());
                }

                return(compatiblePackageVersionsForTarget.ToList());
            }
            // If ApiDetails not found, fallback to using PackageDetails to get compatible versions
            else if (apiDetails.Targets.TryGetValue(target, out var compatiblePackageVersionsForTarget))
            {
                return(compatiblePackageVersionsForTarget.ToList());
            }

            return(new List <string>());
        }
示例#3
0
        public static CompatibilityResult GetCompatibilityResult(
            PackageDetailsWithApiIndices package,
            string apiMethodSignature,
            string packageVersion,
            string target           = "net6.0",
            bool checkLesserPackage = false)
        {
            var compatibilityResult = new CompatibilityResult
            {
                Compatibility      = Compatibility.UNKNOWN,
                CompatibleVersions = new List <string>()
            };

            // If necessary data to determine compatibility is missing, return unknown compatibility
            if (package == null ||
                apiMethodSignature == null ||
                !NuGetVersion.TryParse(packageVersion, out var validPackageVersion))
            {
                return(compatibilityResult);
            }

            if (package.PackageDetails.IsDeprecated)
            {
                compatibilityResult.Compatibility = Compatibility.DEPRECATED;
                return(compatibilityResult);
            }

            var apiDetails = GetApiDetails(package, apiMethodSignature);
            var compatiblePackageVersionsForTarget =
                GetCompatiblePackageVersionsForTarget(apiDetails, package, target, checkLesserPackage);

            // If package version is greater than the greatest compatible version, it is likely this latest version
            // has not been assessed and added to the compatibility datastore. If it has a lower version of the same
            // major that is compatible, then it will be marked as Compatible. It will be marked as Incompatible otherwise
            var maxCompatibleVersion = NugetVersionHelper.GetMaxVersion(compatiblePackageVersionsForTarget);

            if (maxCompatibleVersion != null &&
                !maxCompatibleVersion.IsZeroVersion() &&
                validPackageVersion.IsGreaterThan(maxCompatibleVersion))
            {
                compatibilityResult.Compatibility = validPackageVersion.HasSameMajorAs(maxCompatibleVersion)
                    ? Compatibility.COMPATIBLE
                    : Compatibility.INCOMPATIBLE;
            }
            // In all other cases, just check to see if the list of compatible versions for the target framework
            // contains the current package version
            else
            {
                compatibilityResult.Compatibility = validPackageVersion.HasLowerOrEqualCompatibleVersion(compatiblePackageVersionsForTarget)
                    ? Compatibility.COMPATIBLE
                    : Compatibility.INCOMPATIBLE;
            }

            // CompatibleVersions are recommended as potential upgrades from current version
            compatibilityResult.CompatibleVersions = validPackageVersion.FindGreaterCompatibleVersions(compatiblePackageVersionsForTarget).ToList();

            return(compatibilityResult);
        }
示例#4
0
        public static CompatibilityResult GetCompatibilityResult(PackageDetailsWithApiIndices package, CodeEntityDetails codeEntityDetails, string target = "net6.0", bool checkLesserPackage = false)
        {
            //If invocation, we will try to find it in a later package
            if (codeEntityDetails.CodeEntityType == CodeEntityType.Method)
            {
                if (string.IsNullOrEmpty(codeEntityDetails.Namespace))
                {
                    // codelyzer was not able to parse the symbol from the semantic model, so we can't accurately assess the compatibility.
                    return(new CompatibilityResult
                    {
                        Compatibility = Compatibility.UNKNOWN,
                        CompatibleVersions = new List <string>()
                    });
                }
                return(GetCompatibilityResult(package, codeEntityDetails.OriginalDefinition, codeEntityDetails.Package.Version, target, checkLesserPackage));
            }
            //If another node type, we will not try to find it. Compatibility will be based on the package compatibility
            else
            {
                var compatibilityResult = new CompatibilityResult
                {
                    Compatibility      = Compatibility.UNKNOWN,
                    CompatibleVersions = new List <string>()
                };

                if (package == null || !NuGetVersion.TryParse(codeEntityDetails.Package.Version, out var targetversion))
                {
                    return(compatibilityResult);
                }

                if (package.PackageDetails.IsDeprecated)
                {
                    compatibilityResult.Compatibility = Compatibility.DEPRECATED;
                    return(compatibilityResult);
                }

                //For other code entities, we just need to check if the package has a compatible target:
                if (package.PackageDetails.Targets.ContainsKey(target))
                {
                    compatibilityResult.Compatibility = Compatibility.COMPATIBLE;
                    return(compatibilityResult);
                }
                else
                {
                    compatibilityResult.Compatibility = Compatibility.INCOMPATIBLE;
                }

                return(compatibilityResult);
            }
        }
示例#5
0
        private static ApiDetails GetApiDetails(PackageDetailsWithApiIndices packageDetailsWithApiIndices, string apiMethodSignature)
        {
            if (packageDetailsWithApiIndices == null ||
                packageDetailsWithApiIndices.PackageDetails == null ||
                packageDetailsWithApiIndices.IndexDict == null ||
                packageDetailsWithApiIndices.PackageDetails.Api == null ||
                apiMethodSignature == null)
            {
                return(null);
            }

            var index = packageDetailsWithApiIndices.IndexDict.GetValueOrDefault(apiMethodSignature.Replace("?", ""), -1);

            if (index >= 0 && index < packageDetailsWithApiIndices.PackageDetails.Api.Count())
            {
                return(packageDetailsWithApiIndices.PackageDetails.Api[index]);
            }

            return(null);
        }