commit 5c44ae7da8dcf44a52c8984a78db2a3f72453d7e Author: Erik Stielstra Date: Mon Feb 11 14:20:50 2013 +0100 WIP diff --git a/core/includes/install.core.inc b/core/includes/install.core.inc index ec5ec0e..aa38a8d 100644 --- a/core/includes/install.core.inc +++ b/core/includes/install.core.inc @@ -1522,37 +1522,85 @@ function install_check_localization_server($uri) { /** * Gets the core release version for localization. * + * @todo Modify description. * In case core has a development version we fall back to the latest stable * release. e.g. 8.2-dev falls back to 8.1. 8.0-dev falls back to 7.0. Fallback * is required because the localization server only provides translation files * for stable releases. * * @return array - * Associative array containing 'core' and 'version' of the release. + * Array of releases each is an associative array containing: + * "core": Core compatibility version. e.g.. 8.x + * "version": Release version. e.g. 8.1 */ function install_get_localization_release() { - if (strpos(VERSION, 'dev')) { - list($version, ) = explode('-', VERSION); - list($major, $minor) = explode('.', $version); - - // Calculate the major and minor release numbers to fall back to. - // E.g. 8.0-dev falls back to 7.0 and 8.2-dev falls back to 8.1. - if ($minor == 0) { - $major--; - } - else { - $minor--; + $extra_text = $extra_number = ''; + $releases = array(); + + // Examples of supported versions: + // 8.0-unstable1, 8.0-alpha2, 8.0-beta3, 8.0-rc4 + // 8.0, 8.0-dev + list($version, $extra) = explode('-', VERSION); + list($major, $minor) = explode('.', $version); + + // Extra may contain an index number. E.g. dev, alpha2, rc1 + if ($extra) { + $matches = array(); + preg_match('/([a-z])+([0-9]*)/', $extra, $matches); + $extra_text = $matches[1]; + $extra_number = $matches[2]; + } + + // Stable point releases (no 'rc', 'beta', etc.): + // 8.2 -> 8.2 (no fallback, use current release) + // 8.2 -> 8.1 + if (empty($extra)) { + $releases[] = array( + 'core' => "$major.x", + 'version' => "$major.$minor", + ); + if ($minor >= 1) { + $releases[] = array( + 'core' => "$major.x", + 'version' => "$major." . $minor - 1, + ); } - $release = "$major.$minor"; } else { - $release = VERSION; + // Dev releases: + // 8.2-dev -> 8.1 + // 8.0-dev -> none (falls back to 7.0, see final fallback below). + if ($extra_text == 'dev') { + if ($minor >= 1) { + $releases[] = array( + 'core' => "$major.x", + 'version' => "$major." . $minor - 1, + ); + } + } + // Release candidate releases: + // 8.0-rc2 -> 8.0-rc1 + // 8.0-rc1 -> none (falls back to 7.0, see final fallback below). + elseif ($extra_text == 'rc') { + if ($extra_number >= 2) { + $releases[] = array( + 'core' => "$major.x", + 'version' => "$major.$minor-rc" . $extra_number - 1, + ); + } + } + // Other releases (unstable, alpha, beta) only fall back to the final + // fallback. } - return array( - 'core' => "$major.x", - 'version' => $release, + // All releases have a final fallback in the first previous major release. + // E.g. 8.1 falls back to 7.0 + $releases[] = array( + 'core' => $major - 1 . '.x', + 'version' => $major - 1 . '.0', ); + + return $releases; } /**