diff --git a/core/modules/update/src/UpdateFetcher.php b/core/modules/update/src/UpdateFetcher.php index 2b03c9c101..05cce763a6 100644 --- a/core/modules/update/src/UpdateFetcher.php +++ b/core/modules/update/src/UpdateFetcher.php @@ -77,7 +77,7 @@ public function fetchProjectData(array $project, $site_key = '') { public function buildFetchUrl(array $project, $site_key = '') { $name = $project['name']; $url = $this->getFetchBaseUrl($project); - $url .= '/' . $name . '/' . \Drupal::CORE_COMPATIBILITY; + $url .= '/' . $name . '/current'; // Only append usage information if we have a site key and the project is // enabled. We do not want to record usage statistics for disabled projects. diff --git a/core/modules/update/src/UpdateProjectCoreCompatibility.php b/core/modules/update/src/UpdateProjectCoreCompatibility.php new file mode 100644 index 0000000000..0a57ace24c --- /dev/null +++ b/core/modules/update/src/UpdateProjectCoreCompatibility.php @@ -0,0 +1,127 @@ += ' . $core_data['existing_version']); + $possible_core_update_versions = Semver::sort($possible_core_update_versions); + $possible_core_update_versions = array_filter($possible_core_update_versions, function ($version) { + return VersionParser::parseStability($version) === 'stable'; + }); + return $possible_core_update_versions; + } + + /** + * @param $core_compatibility + * @param array $possible_core_update_versions + * + * @return array + */ + protected static function createCompatibilityRanges($core_compatibility, array $possible_core_update_versions) { + // @todo statically cache the results here because this will the same for many projects + // because they will likely use the same core_compatibility. + // For example "^8 || ^9" or "^8.8 || ^9" should be very common. + $compatibility_ranges = []; + $previous_version_satisfied = NULL; + $range = []; + foreach ($possible_core_update_versions as $possible_core_update_version) { + if (Semver::satisfies($possible_core_update_version, $core_compatibility)) { + if (empty($range)) { + $range[] = $possible_core_update_version; + } + else { + $range[1] = $possible_core_update_version; + } + + } + else { + if ($range) { + if ($previous_version_satisfied) { + // Make the previous version be the second item in the current + // range. + $range[] = $previous_version_satisfied; + } + $compatibility_ranges[] = $range; + } + // Start a new range. + $range = []; + } + + } + if ($range) { + $compatibility_ranges[] = $range; + } + return $compatibility_ranges; + } + + protected static function formatMessage(array $core_compatibility_ranges) { + $range_messages = []; + foreach ($core_compatibility_ranges as $core_compatibility_range) { + $range_message = $core_compatibility_range[0]; + if (count($core_compatibility_range) === 2) { + $range_message .= " to {$core_compatibility_range[1]}"; + } + $range_messages[] = $range_message; + } + return t('This module is compatible with Drupal core:') . ' ' . implode(', ', $range_messages); + } + +} diff --git a/core/modules/update/templates/update-version.html.twig b/core/modules/update/templates/update-version.html.twig index c21c4f0ba4..38587d1ab4 100644 --- a/core/modules/update/templates/update-version.html.twig +++ b/core/modules/update/templates/update-version.html.twig @@ -21,6 +21,9 @@
{{ version.version }} ({{ version.date|date('Y-M-d') }}) + {% if version.core_compatibility_message %} + {{ version.core_compatibility_message }} + {% endif %}