diff --git a/extensions/package-manager/src/Command/MajorUpdateHandler.php b/extensions/package-manager/src/Command/MajorUpdateHandler.php index a1dd5d89f..7c9f1da2b 100644 --- a/extensions/package-manager/src/Command/MajorUpdateHandler.php +++ b/extensions/package-manager/src/Command/MajorUpdateHandler.php @@ -9,10 +9,9 @@ namespace Flarum\PackageManager\Command; -use Flarum\Foundation\Paths; use Flarum\PackageManager\Composer\ComposerAdapter; +use Flarum\PackageManager\Composer\ComposerJson; use Illuminate\Contracts\Events\Dispatcher; -use Illuminate\Support\Arr; use Flarum\PackageManager\Event\FlarumUpdated; use Flarum\PackageManager\Exception\ComposerUpdateFailedException; use Flarum\PackageManager\LastUpdateCheck; @@ -36,21 +35,22 @@ class MajorUpdateHandler protected $events; /** - * @var Paths - */ - protected $paths; - - /** - * @var array + * @var ComposerJson */ protected $composerJson; - public function __construct(ComposerAdapter $composer, LastUpdateCheck $lastUpdateCheck, Dispatcher $events, Paths $paths) + /** + * @param ComposerAdapter $composer + * @param LastUpdateCheck $lastUpdateCheck + * @param Dispatcher $events + * @param ComposerJson $composerJson + */ + public function __construct(ComposerAdapter $composer, LastUpdateCheck $lastUpdateCheck, Dispatcher $events, ComposerJson $composerJson) { $this->composer = $composer; $this->lastUpdateCheck = $lastUpdateCheck; $this->events = $events; - $this->paths = $paths; + $this->composerJson = $composerJson; } /** @@ -67,7 +67,7 @@ class MajorUpdateHandler { $command->actor->assertAdmin(); - $majorVersion = $this->getNewMajorVersion(); + $majorVersion = $this->lastUpdateCheck->getNewMajorVersion(); if (! $majorVersion) { return false; @@ -78,7 +78,7 @@ class MajorUpdateHandler $this->runCommand($command->dryRun); if ($command->dryRun) { - $this->revertComposerJson(); + $this->composerJson->revert(); return true; } @@ -92,36 +92,10 @@ class MajorUpdateHandler return true; } - protected function getNewMajorVersion(): ?string - { - $core = Arr::first($this->lastUpdateCheck->get()['updates']['installed'], function ($package) { - return $package['name'] === 'flarum/core'; - }); - - return $core ? $core['latest-major'] : null; - } - protected function updateComposerJson(string $majorVersion): void { - $composerJsonPath = $this->paths->base . '/composer.json'; - $this->composerJson = $newComposerJson = json_decode(file_get_contents($composerJsonPath), true); - - foreach ($newComposerJson['require'] as $name => &$version) { - if ($name === 'flarum/core') { - $version = '^'.str_replace('v', '', $majorVersion); - } else { - $version = '*'; - } - } - - file_put_contents($composerJsonPath, json_encode($newComposerJson)); - } - - protected function revertComposerJson(): void - { - $composerJsonPath = $this->paths->base . '/composer.json'; - // @todo use filesystem for all file_get_contents - file_put_contents($composerJsonPath, $this->composerJson); + $this->composerJson->require('*', '*'); + $this->composerJson->require('flarum/core', '^'.str_replace('v', '', $majorVersion)); } /** diff --git a/extensions/package-manager/src/Composer/ComposerJson.php b/extensions/package-manager/src/Composer/ComposerJson.php new file mode 100644 index 000000000..e0a56c020 --- /dev/null +++ b/extensions/package-manager/src/Composer/ComposerJson.php @@ -0,0 +1,83 @@ +paths = $paths; + $this->filesystem = $filesystem; + } + + public function require(string $packageName, string $version): void + { + $composerJson = $this->getComposerJson(); + + if (strpos($packageName, '*') === false) { + $composerJson['require'][$packageName] = $version; + } else { + foreach ($composerJson['require'] as $p => $v) { + if (preg_match(preg_quote(str_replace('*', '.*', $packageName), '/'), $p, $matches)) { + $composerJson['require'][$p] = $version; + } + } + } + + $this->setComposerJson($composerJson); + } + + public function revert(): void + { + $this->setComposerJson($this->initialJson); + } + + protected function getComposerJsonPath(): string + { + return $this->paths->base . '/composer.json'; + } + + /** + * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException + */ + protected function getComposerJson(): array + { + $json = json_decode($this->filesystem->get($this->getComposerJsonPath()), true); + + if (! $this->initialJson) { + $this->initialJson = $json; + } + + return $json; + } + + protected function setComposerJson(array $json): void + { + $this->filesystem->put($this->getComposerJsonPath(), json_encode($json, JSON_PRETTY_PRINT)); + } +} diff --git a/extensions/package-manager/src/Exception/ComposerCommandFailedException.php b/extensions/package-manager/src/Exception/ComposerCommandFailedException.php index 601ac859b..42c65502f 100755 --- a/extensions/package-manager/src/Exception/ComposerCommandFailedException.php +++ b/extensions/package-manager/src/Exception/ComposerCommandFailedException.php @@ -27,7 +27,7 @@ class ComposerCommandFailedException extends Exception public function guessCause(): ?string { - + return null; } protected function getRawPackageName(): string diff --git a/extensions/package-manager/src/LastUpdateCheck.php b/extensions/package-manager/src/LastUpdateCheck.php index aa93d2f42..8466c2f62 100755 --- a/extensions/package-manager/src/LastUpdateCheck.php +++ b/extensions/package-manager/src/LastUpdateCheck.php @@ -11,6 +11,7 @@ namespace Flarum\PackageManager; use Carbon\Carbon; use Flarum\Settings\SettingsRepositoryInterface; +use Illuminate\Support\Arr; use Illuminate\Support\Str; class LastUpdateCheck @@ -44,6 +45,15 @@ class LastUpdateCheck return json_decode($this->settings->get(self::KEY, '{}'), true); } + public function getNewMajorVersion(): ?string + { + $core = Arr::first($this->get()['updates']['installed'], function ($package) { + return $package['name'] === 'flarum/core'; + }); + + return $core ? $core['latest-major'] : null; + } + public function forget(string $name, bool $wildcard = false): void { $lastUpdateCheck = json_decode($this->settings->get(self::KEY, '{}'), true);