app/classes/ReleaseInsights/ESR.php (68 lines of code) (raw):
<?php
declare(strict_types=1);
namespace ReleaseInsights;
class ESR
{
/**
* @var array<int> $esr_releases
*/
public static array $esr_releases = [10, 17, 24, 31, 38, 45, 52, 60, 68, 78, 91, 102, 115, 128, 140];
/**
* Get the ESR release that corresponds to the Rapid release version.
* Return null if there is none.
*/
public static function getVersion(int $version): ?string
{
// We don't have an older ESR than the first ESR
if ($version < 10) {
return null;
}
// For very future versions, safeguard to ESR + 13 versions
if ($version > self::$esr_releases[count(self::$esr_releases)-1] + 13) {
return null;
}
$match = self::$esr_releases[0];
foreach (self::$esr_releases as $esr) {
if ($esr > $version) {
break;
}
if ($esr <= $version) {
$match = $esr;
}
}
return (string) $match . '.' . ($version - $match) . '.0';
}
/**
* Get the previous ESR release that corresponds to the Rapid release version
* and that is still supported. Return null if there is none.
*/
public static function getOlderSupportedVersion(int $version): ?string
{
$current_ESR = self::getVersion($version);
// We can't find a matching ESR, return now to avoid PHP warnings
if (is_null($current_ESR)) {
return null;
}
$current_ESR = Version::getMajor($current_ESR);
// We don't have an older ESR than the first ESR
if (self::$esr_releases[0] == $current_ESR) {
return null;
}
$previous_ESR = self::$esr_releases[
array_search(
$current_ESR,
self::$esr_releases
)-1
];
/*
1. We support 2 ESR branches for 3 releases only since Version 68.
2. Before that, we had 2 cycles only with 2 ESR branches as cycles lasted longer
3. We extended the 115 ESR cycle because of a still large Windows 7/8.1 population
*/
$esr_minor_releases = match(true) {
$version < 78 => 1,
$current_ESR === 128 => 11,
default => 2,
};
if (($version - $current_ESR) > $esr_minor_releases) {
return null;
}
return (string) $previous_ESR . '.' . ($version - $previous_ESR) . '.0';
}
/**
* Get the ESR 115 release that corresponds to the Rapid release version
* and that is still supported. Return an empty string if there is none.
* This method should be removed when we stop supporting the ESR 115 branch
*/
public static function getWin7SupportedVersion(int $version): string
{
/*
We should ship our last ESR 115 with Firefox 142
*/
if ($version > 142) {
return '';
}
return (string) '115.' . ($version - 115) . '.0';
}
/**
* Get a XX.YY version number from a full ESR number like 91.4.1esr
* We drop the dot release part
*/
public static function getMainDotVersion(?string $version): string
{
// This is a safety net as we may loop on a range with a version we didn't ship
if (is_null($version)) {
return '';
}
$version = explode('.', $version);
array_pop($version);
return implode('.', $version);
}
}