Skip to content

Commit ec01335

Browse files
committed
fix(em): skip incompatible extension updates
1 parent 863d652 commit ec01335

File tree

2 files changed

+59
-1
lines changed

2 files changed

+59
-1
lines changed

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

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,29 @@
99

1010
namespace Flarum\ExtensionManager\Command;
1111

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

2225
class CheckForUpdatesHandler
2326
{
27+
protected array $meta = [];
28+
2429
public function __construct(
2530
protected ComposerAdapter $composer,
2631
protected LastUpdateCheck $lastUpdateCheck,
2732
protected ExtensionManager $extensions,
28-
protected ComposerJson $composerJson
33+
protected ComposerJson $composerJson,
34+
protected Client $http
2935
) {
3036
}
3137

@@ -97,6 +103,10 @@ public function handle(CheckForUpdates $command): array
97103

98104
$mainPackageUpdate['required-as'] = $composerJson['require'][$mainPackageUpdate['name']] ?? null;
99105

106+
if (! $this->compatibleWithCurrentFlarumVersion($mainPackageUpdate)) {
107+
continue;
108+
}
109+
100110
$updates->push($mainPackageUpdate);
101111
}
102112

@@ -136,4 +146,49 @@ protected function runComposerCommand(bool $minorOnly, CheckForUpdates $command)
136146

137147
return $output->getContents();
138148
}
149+
150+
private function compatibleWithCurrentFlarumVersion(array $mainPackageUpdate): bool
151+
{
152+
if (empty($mainPackageUpdate['latest-major']) || str_contains($mainPackageUpdate['latest-major'], 'dev-')) {
153+
return true;
154+
}
155+
156+
if (! empty($this->meta[$mainPackageUpdate['name']])) {
157+
$json = $this->meta[$mainPackageUpdate['name']];
158+
} else {
159+
$response = $this->http->get("https://repo.packagist.org/p2/{$mainPackageUpdate['name']}.json");
160+
161+
$body = $response->getBody()->getContents();
162+
163+
if ($response->getStatusCode() > 299 || $response->getStatusCode() < 200) {
164+
return true;
165+
}
166+
167+
$json = json_decode($body, true);
168+
169+
$this->meta[$mainPackageUpdate['name']] = $json;
170+
}
171+
172+
$packages = Collection::make($json['packages'][$mainPackageUpdate['name']] ?? []);
173+
174+
if ($packages->isEmpty()) {
175+
return true;
176+
}
177+
178+
$package = $packages->firstWhere('version', $mainPackageUpdate['latest-major']);
179+
180+
if (! $package) {
181+
return true;
182+
}
183+
184+
$flarumVersion = Application::VERSION;
185+
186+
$require = $package['require']['flarum/core'] ?? null;
187+
188+
if (! $require || str_contains($require, 'dev-')) {
189+
return true;
190+
}
191+
192+
return Semver::satisfies($flarumVersion, $require);
193+
}
139194
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ public static function isMajorUpdate(string $currentVersion, string $latestVersi
2121
if (str_starts_with($currentVersion, 'v')) {
2222
$currentVersion = substr($currentVersion, 1);
2323
}
24+
if (str_starts_with($latestVersion, 'v')) {
25+
$latestVersion = substr($latestVersion, 1);
26+
}
2427

2528
$currentVersion = explode('.', $currentVersion);
2629
$latestVersion = explode('.', $latestVersion);

0 commit comments

Comments
 (0)