|
9 | 9 |
|
10 | 10 | namespace Flarum\ExtensionManager\Command;
|
11 | 11 |
|
| 12 | +use Composer\Semver\Semver; |
12 | 13 | use Flarum\Extension\Extension;
|
13 | 14 | use Flarum\Extension\ExtensionManager;
|
14 | 15 | use Flarum\ExtensionManager\Composer\ComposerAdapter;
|
15 | 16 | use Flarum\ExtensionManager\Composer\ComposerJson;
|
16 | 17 | use Flarum\ExtensionManager\Exception\ComposerCommandFailedException;
|
17 | 18 | use Flarum\ExtensionManager\Settings\LastUpdateCheck;
|
18 | 19 | use Flarum\ExtensionManager\Support\Util;
|
| 20 | +use Flarum\Foundation\Application; |
| 21 | +use GuzzleHttp\Client; |
19 | 22 | use Illuminate\Support\Collection;
|
20 | 23 | use Symfony\Component\Console\Input\ArrayInput;
|
21 | 24 |
|
22 | 25 | class CheckForUpdatesHandler
|
23 | 26 | {
|
| 27 | + protected array $meta = []; |
| 28 | + |
24 | 29 | public function __construct(
|
25 | 30 | protected ComposerAdapter $composer,
|
26 | 31 | protected LastUpdateCheck $lastUpdateCheck,
|
27 | 32 | protected ExtensionManager $extensions,
|
28 |
| - protected ComposerJson $composerJson |
| 33 | + protected ComposerJson $composerJson, |
| 34 | + protected Client $http |
29 | 35 | ) {
|
30 | 36 | }
|
31 | 37 |
|
@@ -97,6 +103,10 @@ public function handle(CheckForUpdates $command): array
|
97 | 103 |
|
98 | 104 | $mainPackageUpdate['required-as'] = $composerJson['require'][$mainPackageUpdate['name']] ?? null;
|
99 | 105 |
|
| 106 | + if (! $this->compatibleWithCurrentFlarumVersion($mainPackageUpdate)) { |
| 107 | + continue; |
| 108 | + } |
| 109 | + |
100 | 110 | $updates->push($mainPackageUpdate);
|
101 | 111 | }
|
102 | 112 |
|
@@ -136,4 +146,49 @@ protected function runComposerCommand(bool $minorOnly, CheckForUpdates $command)
|
136 | 146 |
|
137 | 147 | return $output->getContents();
|
138 | 148 | }
|
| 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 | + } |
139 | 194 | }
|
0 commit comments