diff --git a/extensions/package-manager/src/Listener/ReCheckForUpdates.php b/extensions/package-manager/src/Listener/ReCheckForUpdates.php index 6e43e2162c..80aedb80f7 100644 --- a/extensions/package-manager/src/Listener/ReCheckForUpdates.php +++ b/extensions/package-manager/src/Listener/ReCheckForUpdates.php @@ -13,7 +13,6 @@ use Flarum\ExtensionManager\Command\CheckForUpdates; use Flarum\ExtensionManager\Event\FlarumUpdated; use Flarum\ExtensionManager\Extension\Event\Updated; -use Flarum\ExtensionManager\Settings\LastUpdateCheck; use Flarum\ExtensionManager\Settings\LastUpdateRun; class ReCheckForUpdates @@ -22,20 +21,14 @@ class ReCheckForUpdates * @var LastUpdateRun */ private $lastUpdateRun; - /** - * @var LastUpdateCheck - */ - private $lastUpdateCheck; - /** * @var Dispatcher */ private $bus; - public function __construct(LastUpdateRun $lastUpdateRun, LastUpdateCheck $lastUpdateCheck, Dispatcher $bus) + public function __construct(LastUpdateRun $lastUpdateRun, Dispatcher $bus) { $this->lastUpdateRun = $lastUpdateRun; - $this->lastUpdateCheck = $lastUpdateCheck; $this->bus = $bus; } @@ -44,25 +37,19 @@ public function __construct(LastUpdateRun $lastUpdateRun, LastUpdateCheck $lastU */ public function handle($event): void { - $previousUpdateCheck = $this->lastUpdateCheck->get(); - - $lastUpdateCheck = $this->bus->dispatch( - new CheckForUpdates($event->actor) - ); - if ($event instanceof FlarumUpdated) { - $mapPackageName = function (array $package) { - return $package['name']; - }; - - $previousPackages = array_map($mapPackageName, $previousUpdateCheck['updates']['installed']); - $lastPackages = array_map($mapPackageName, $lastUpdateCheck['updates']['installed']); - + // Composer replaced vendor files, so this process's stale autoloader cannot safely load new dependency classes. $this->lastUpdateRun ->for($event->type) ->with('status', LastUpdateRun::SUCCESS) - ->with('limitedPackages', array_intersect($previousPackages, $lastPackages)) + ->with('limitedPackages', []) ->save(); + + return; } + + $this->bus->dispatch( + new CheckForUpdates($event->actor) + ); } } diff --git a/extensions/package-manager/tests/integration/api/MinorUpdateTest.php b/extensions/package-manager/tests/integration/api/MinorUpdateTest.php index 3cf9ddd344..217c9605ae 100644 --- a/extensions/package-manager/tests/integration/api/MinorUpdateTest.php +++ b/extensions/package-manager/tests/integration/api/MinorUpdateTest.php @@ -81,14 +81,12 @@ public function can_update_with_latest_ext_incompatible_with_latest_core() /** @var LastUpdateRun $lastUpdateRun */ $lastUpdateRun = $this->app()->getContainer()->make(LastUpdateRun::class); + $lastMinorUpdateRun = $lastUpdateRun->for(FlarumUpdated::MINOR)->get(); $this->assertEquals(201, $response->getStatusCode()); $this->assertPackageVersion('flarum/tags', '*'); $this->assertPackageVersion('flarum/dummy-extension', '*'); - $this->assertEquals([ - 'flarum/core', - 'flarum/lang-english', - 'flarum/tags' - ], $lastUpdateRun->for(FlarumUpdated::MINOR)->get()['limitedPackages']); + $this->assertEquals(LastUpdateRun::SUCCESS, $lastMinorUpdateRun['status']); + $this->assertEquals([], $lastMinorUpdateRun['limitedPackages']); } } diff --git a/extensions/package-manager/tests/unit/ReCheckForUpdatesTest.php b/extensions/package-manager/tests/unit/ReCheckForUpdatesTest.php new file mode 100644 index 0000000000..6a1b64117a --- /dev/null +++ b/extensions/package-manager/tests/unit/ReCheckForUpdatesTest.php @@ -0,0 +1,75 @@ +createMock(SettingsRepositoryInterface::class); + $settings->expects($this->once()) + ->method('set') + ->with(LastUpdateRun::key(), $this->callback(function (string $value) use ($updateType): bool { + $lastUpdateRun = json_decode($value, true)[$updateType]; + + return $lastUpdateRun['status'] === LastUpdateRun::SUCCESS + && $lastUpdateRun['limitedPackages'] === []; + })); + + $bus = $this->createMock(Dispatcher::class); + $bus->expects($this->never())->method('dispatch'); + + $listener = new ReCheckForUpdates(new LastUpdateRun($settings), $bus); + $listener->handle(new FlarumUpdated(new User(), $updateType)); + } + + public static function coreUpdateTypes(): array + { + return [ + 'global update' => [FlarumUpdated::GLOBAL], + 'minor update' => [FlarumUpdated::MINOR], + 'major update' => [FlarumUpdated::MAJOR], + ]; + } + + #[Test] + public function extension_update_still_rechecks_for_updates(): void + { + $actor = new User(); + $bus = $this->createMock(Dispatcher::class); + $bus->expects($this->once()) + ->method('dispatch') + ->with($this->callback(function (CheckForUpdates $command) use ($actor): bool { + return $command->actor === $actor; + })) + ->willReturn([]); + + $listener = new ReCheckForUpdates( + $this->createStub(LastUpdateRun::class), + $bus + ); + $listener->handle(new Updated($actor, new Extension(__DIR__, ['name' => 'acme/example']))); + } +}