diff --git a/extensions/package-manager/src/Command/CheckForUpdatesHandler.php b/extensions/package-manager/src/Command/CheckForUpdatesHandler.php index e7b4e2c5d5..26f2b949e3 100755 --- a/extensions/package-manager/src/Command/CheckForUpdatesHandler.php +++ b/extensions/package-manager/src/Command/CheckForUpdatesHandler.php @@ -9,12 +9,15 @@ namespace Flarum\ExtensionManager\Command; +use Composer\Semver\Semver; use Flarum\Extension\ExtensionManager; use Flarum\ExtensionManager\Composer\ComposerAdapter; 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; @@ -40,12 +43,20 @@ class CheckForUpdatesHandler */ protected $composerJson; - public function __construct(ComposerAdapter $composer, LastUpdateCheck $lastUpdateCheck, ExtensionManager $extensions, ComposerJson $composerJson) + /** + * @var Client + */ + protected $http; + + protected $meta = []; + + public function __construct(ComposerAdapter $composer, LastUpdateCheck $lastUpdateCheck, ExtensionManager $extensions, ComposerJson $composerJson, Client $http) { $this->composer = $composer; $this->lastUpdateCheck = $lastUpdateCheck; $this->extensions = $extensions; $this->composerJson = $composerJson; + $this->http = $http; } /** @@ -116,6 +127,10 @@ public function handle(CheckForUpdates $command) $mainPackageUpdate['required-as'] = $composerJson['require'][$mainPackageUpdate['name']] ?? null; + if (! $this->compatibleWithCurrentFlarumVersion($mainPackageUpdate)) { + continue; + } + $updates->push($mainPackageUpdate); } @@ -155,4 +170,49 @@ protected function runComposerCommand(bool $minorOnly, CheckForUpdates $command) 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 = Collection::make($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 426ef0a465..8b5f903ade 100755 --- a/extensions/package-manager/src/Support/Util.php +++ b/extensions/package-manager/src/Support/Util.php @@ -29,6 +29,9 @@ public static function isMajorUpdate(string $currentVersion, string $latestVersi 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);