From ce5feca1407ce63d27a2ea1316995069a4b22da5 Mon Sep 17 00:00:00 2001 From: Sami Mazouz Date: Sat, 8 Feb 2025 19:01:09 +0100 Subject: [PATCH] fix(em): skip incompatible extension updates (#4177) --- .../src/Command/CheckForUpdatesHandler.php | 57 ++++++++++++++++++- .../package-manager/src/Support/Util.php | 3 + 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/extensions/package-manager/src/Command/CheckForUpdatesHandler.php b/extensions/package-manager/src/Command/CheckForUpdatesHandler.php index f8adc88a1..e5dda3ed3 100755 --- a/extensions/package-manager/src/Command/CheckForUpdatesHandler.php +++ b/extensions/package-manager/src/Command/CheckForUpdatesHandler.php @@ -9,6 +9,7 @@ namespace Flarum\ExtensionManager\Command; +use Composer\Semver\Semver; use Flarum\Extension\Extension; use Flarum\Extension\ExtensionManager; use Flarum\ExtensionManager\Composer\ComposerAdapter; @@ -16,16 +17,21 @@ use Flarum\ExtensionManager\Composer\ComposerJson; use Flarum\ExtensionManager\Exception\ComposerCommandFailedException; use Flarum\ExtensionManager\Settings\LastUpdateCheck; use Flarum\ExtensionManager\Support\Util; +use Flarum\Foundation\Application; +use GuzzleHttp\Client; use Illuminate\Support\Collection; use Symfony\Component\Console\Input\ArrayInput; class CheckForUpdatesHandler { + protected array $meta = []; + public function __construct( protected ComposerAdapter $composer, protected LastUpdateCheck $lastUpdateCheck, protected ExtensionManager $extensions, - protected ComposerJson $composerJson + protected ComposerJson $composerJson, + protected Client $http ) { } @@ -97,6 +103,10 @@ class CheckForUpdatesHandler $mainPackageUpdate['required-as'] = $composerJson['require'][$mainPackageUpdate['name']] ?? null; + if (! $this->compatibleWithCurrentFlarumVersion($mainPackageUpdate)) { + continue; + } + $updates->push($mainPackageUpdate); } @@ -136,4 +146,49 @@ class CheckForUpdatesHandler return $output->getContents(); } + + private function compatibleWithCurrentFlarumVersion(array $mainPackageUpdate): bool + { + if (empty($mainPackageUpdate['latest-major']) || str_contains($mainPackageUpdate['latest-major'], 'dev-')) { + return true; + } + + if (! empty($this->meta[$mainPackageUpdate['name']])) { + $json = $this->meta[$mainPackageUpdate['name']]; + } else { + $response = $this->http->get("https://repo.packagist.org/p2/{$mainPackageUpdate['name']}.json"); + + $body = $response->getBody()->getContents(); + + if ($response->getStatusCode() > 299 || $response->getStatusCode() < 200) { + return true; + } + + $json = json_decode($body, true); + + $this->meta[$mainPackageUpdate['name']] = $json; + } + + $packages = new Collection($json['packages'][$mainPackageUpdate['name']] ?? []); + + if ($packages->isEmpty()) { + return true; + } + + $package = $packages->firstWhere('version', $mainPackageUpdate['latest-major']); + + if (! $package) { + return true; + } + + $flarumVersion = Application::VERSION; + + $require = $package['require']['flarum/core'] ?? null; + + if (! $require || str_contains($require, 'dev-')) { + return true; + } + + return Semver::satisfies($flarumVersion, $require); + } } diff --git a/extensions/package-manager/src/Support/Util.php b/extensions/package-manager/src/Support/Util.php index dddd0ea55..dd83bd556 100755 --- a/extensions/package-manager/src/Support/Util.php +++ b/extensions/package-manager/src/Support/Util.php @@ -21,6 +21,9 @@ class Util if (str_starts_with($currentVersion, 'v')) { $currentVersion = substr($currentVersion, 1); } + if (str_starts_with($latestVersion, 'v')) { + $latestVersion = substr($latestVersion, 1); + } $currentVersion = explode('.', $currentVersion); $latestVersion = explode('.', $latestVersion);