1
0
mirror of https://github.com/flarum/core.git synced 2025-08-02 22:47:33 +02:00

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

This commit is contained in:
Sami Mazouz
2025-02-07 09:49:17 +01:00
committed by GitHub
parent b028314ff8
commit 45cb384241
2 changed files with 64 additions and 1 deletions

View File

@@ -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 @@ class CheckForUpdatesHandler
$mainPackageUpdate['required-as'] = $composerJson['require'][$mainPackageUpdate['name']] ?? null;
if (! $this->compatibleWithCurrentFlarumVersion($mainPackageUpdate)) {
continue;
}
$updates->push($mainPackageUpdate);
}
@@ -155,4 +170,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 = 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);
}
}

View File

@@ -29,6 +29,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);