99
1010namespace Flarum \ExtensionManager \Command ;
1111
12+ use Composer \Semver \Semver ;
1213use Flarum \Extension \ExtensionManager ;
1314use Flarum \ExtensionManager \Composer \ComposerAdapter ;
1415use Flarum \ExtensionManager \Composer \ComposerJson ;
1516use Flarum \ExtensionManager \Exception \ComposerCommandFailedException ;
1617use Flarum \ExtensionManager \Settings \LastUpdateCheck ;
1718use Flarum \ExtensionManager \Support \Util ;
19+ use Flarum \Foundation \Application ;
20+ use GuzzleHttp \Client ;
1821use Illuminate \Support \Collection ;
1922use 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}
0 commit comments