Skip to content

Commit 45cb384

Browse files
authored
fix(em): skip incompatible extension updates (#4176)
1 parent b028314 commit 45cb384

File tree

2 files changed

+64
-1
lines changed

2 files changed

+64
-1
lines changed

extensions/package-manager/src/Command/CheckForUpdatesHandler.php

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,15 @@
99

1010
namespace Flarum\ExtensionManager\Command;
1111

12+
use Composer\Semver\Semver;
1213
use Flarum\Extension\ExtensionManager;
1314
use Flarum\ExtensionManager\Composer\ComposerAdapter;
1415
use Flarum\ExtensionManager\Composer\ComposerJson;
1516
use Flarum\ExtensionManager\Exception\ComposerCommandFailedException;
1617
use Flarum\ExtensionManager\Settings\LastUpdateCheck;
1718
use Flarum\ExtensionManager\Support\Util;
19+
use Flarum\Foundation\Application;
20+
use GuzzleHttp\Client;
1821
use Illuminate\Support\Collection;
1922
use Symfony\Component\Console\Input\ArrayInput;
2023

@@ -40,12 +43,20 @@ class CheckForUpdatesHandler
4043
*/
4144
protected $composerJson;
4245

43-
public function __construct(ComposerAdapter $composer, LastUpdateCheck $lastUpdateCheck, ExtensionManager $extensions, ComposerJson $composerJson)
46+
/**
47+
* @var Client
48+
*/
49+
protected $http;
50+
51+
protected $meta = [];
52+
53+
public function __construct(ComposerAdapter $composer, LastUpdateCheck $lastUpdateCheck, ExtensionManager $extensions, ComposerJson $composerJson, Client $http)
4454
{
4555
$this->composer = $composer;
4656
$this->lastUpdateCheck = $lastUpdateCheck;
4757
$this->extensions = $extensions;
4858
$this->composerJson = $composerJson;
59+
$this->http = $http;
4960
}
5061

5162
/**
@@ -116,6 +127,10 @@ public function handle(CheckForUpdates $command)
116127

117128
$mainPackageUpdate['required-as'] = $composerJson['require'][$mainPackageUpdate['name']] ?? null;
118129

130+
if (! $this->compatibleWithCurrentFlarumVersion($mainPackageUpdate)) {
131+
continue;
132+
}
133+
119134
$updates->push($mainPackageUpdate);
120135
}
121136

@@ -155,4 +170,49 @@ protected function runComposerCommand(bool $minorOnly, CheckForUpdates $command)
155170

156171
return $output->getContents();
157172
}
173+
174+
private function compatibleWithCurrentFlarumVersion(array $mainPackageUpdate): bool
175+
{
176+
if (empty($mainPackageUpdate['latest-major']) || str_contains($mainPackageUpdate['latest-major'], 'dev-')) {
177+
return true;
178+
}
179+
180+
if (! empty($this->meta[$mainPackageUpdate['name']])) {
181+
$json = $this->meta[$mainPackageUpdate['name']];
182+
} else {
183+
$response = $this->http->get("https://repo.packagist.org/p2/{$mainPackageUpdate['name']}.json");
184+
185+
$body = $response->getBody()->getContents();
186+
187+
if ($response->getStatusCode() > 299 || $response->getStatusCode() < 200) {
188+
return true;
189+
}
190+
191+
$json = json_decode($body, true);
192+
193+
$this->meta[$mainPackageUpdate['name']] = $json;
194+
}
195+
196+
$packages = Collection::make($json['packages'][$mainPackageUpdate['name']] ?? []);
197+
198+
if ($packages->isEmpty()) {
199+
return true;
200+
}
201+
202+
$package = $packages->firstWhere('version', $mainPackageUpdate['latest-major']);
203+
204+
if (! $package) {
205+
return true;
206+
}
207+
208+
$flarumVersion = Application::VERSION;
209+
210+
$require = $package['require']['flarum/core'] ?? null;
211+
212+
if (! $require || str_contains($require, 'dev-')) {
213+
return true;
214+
}
215+
216+
return Semver::satisfies($flarumVersion, $require);
217+
}
158218
}

extensions/package-manager/src/Support/Util.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ public static function isMajorUpdate(string $currentVersion, string $latestVersi
2929
if (str_starts_with($currentVersion, 'v')) {
3030
$currentVersion = substr($currentVersion, 1);
3131
}
32+
if (str_starts_with($latestVersion, 'v')) {
33+
$latestVersion = substr($latestVersion, 1);
34+
}
3235

3336
$currentVersion = explode('.', $currentVersion);
3437
$latestVersion = explode('.', $latestVersion);

0 commit comments

Comments
 (0)