. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU Affero General Public License version 3. * * In accordance with Section 7(b) of the GNU Affero General Public License version 3, * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ namespace Espo\Core\Upgrades\Migration; use RuntimeException; use const SORT_STRING; class VersionUtil { /** * @param string[] $fullList * @return string[] */ public static function extractSteps(string $from, string $to, array $fullList): array { sort($fullList, SORT_STRING); $isPatch = self::isPatch($from, $to); $list = []; foreach ($fullList as $item) { $a = self::split($item); $v1 = $a[0] . '.' . $a[1] . '.' . ($a[2] ?? '0'); if (version_compare($v1, $from) <= 0) { continue; } if (version_compare($v1, $to) > 0) { continue; } if (!$isPatch && $a[2] !== null) { continue; } $list[] = $item; } return $list; } /** * @return array{string, string, ?string} */ public static function split(string $version): array { $array = explode('.', $version, 3); if (count($array) === 2) { return [$array[0], $array[1], null]; } if (count($array) !== 3) { throw new RuntimeException("Bad version number $version."); } /** @var array{string, string, string} */ return $array; } public static function isPatch(string $from, string $to): bool { $aFrom = self::split($from); $aTo = self::split($to); return $aFrom[0] === $aTo[0] && $aFrom[1] === $aTo[1]; } }