def satisfying(list_versions, versionexpr, result): """ returns the maximum version that satisfies the expression if some version cannot be converted to loose SemVer, it is discarded with a msg This provides some workaround for failing comparisons like "2.1" not matching "<=2.1" """ from semver import SemVer, Range, max_satisfying version_range, loose, include_prerelease = _parse_versionexpr(versionexpr, result) # Check version range expression try: act_range = Range(version_range, loose) except ValueError: raise ConanException("version range expression '%s' is not valid" % version_range) # Validate all versions candidates = {} for v in list_versions: try: ver = SemVer(v, loose=loose) candidates[ver] = v except (ValueError, AttributeError): result.append("WARN: Version '%s' is not semver, cannot be compared with a range" % str(v)) # Search best matching version in range result = max_satisfying(candidates, act_range, loose=loose, include_prerelease=include_prerelease) return candidates.get(result)
def check_required_conan_version(cache_folder, out): """ Check if the required Conan version in config file matches to the current Conan version When required_conan_version is not configured, it's skipped When required_conan_version is configured, Conan's version must matches the required version When it doesn't match, an ConanException is raised :param cache_folder: Conan cache folder :param out: Output stream :return: None """ cache = ClientCache(cache_folder, out) required_version = cache.config.required_conan_version if required_version: try: Range(required_version, False) except ValueError: raise ConanException( "The required version expression '{}' is not valid.".format( required_version)) result = satisfies(client_version, required_version) if not result: raise ConanException( "The current Conan version ({}) does not match to the required" " version ({}).".format(client_version, required_version))