fix(em): skip incompatible extension updates (#4177)

This commit is contained in:
Sami Mazouz 2025-02-08 19:01:09 +01:00 committed by GitHub
parent 55cd0850c7
commit ce5feca140
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 59 additions and 1 deletions

View File

@ -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);
}
}

View File

@ -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);