From 98a3f0d3ffd343ab1127ca811be4f6d421ea83fe Mon Sep 17 00:00:00 2001 From: Kevin Meijer Date: Thu, 23 Jan 2025 13:40:32 +0100 Subject: [PATCH 1/6] Select specific repositories for Eloquent Driver install command --- .../Commands/InstallEloquentDriver.php | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/Console/Commands/InstallEloquentDriver.php b/src/Console/Commands/InstallEloquentDriver.php index 31c4f85fc2..6bcba157e0 100644 --- a/src/Console/Commands/InstallEloquentDriver.php +++ b/src/Console/Commands/InstallEloquentDriver.php @@ -30,6 +30,7 @@ class InstallEloquentDriver extends Command */ protected $signature = 'statamic:install:eloquent-driver { --all : Configures all repositories to use the database } + { --repositories= : Comma separated list of repositories to migrate } { --import : Whether existing data should be imported } { --without-messages : Disables output messages }'; @@ -86,6 +87,31 @@ protected function repositories(): array return $this->availableRepositories()->keys()->all(); } + if ($repositories = $this->option('repositories')) { + $requestedRepositories = collect(explode(',', $repositories)) + ->map(fn($repo) => trim(strtolower($repo))) + ->unique(); + + $availableRepositories = $this->availableRepositories(); + + $validRepositories = $requestedRepositories->filter( + fn($repo) => $availableRepositories->has($repo) + ); + + $invalidRepositories = $requestedRepositories->diff($validRepositories); + + if ($invalidRepositories->isNotEmpty()) { + $this->components->warn( + "The following repositories are invalid: " . + $invalidRepositories->implode(', ') + ); + } + + return $validRepositories + ->values() + ->all(); + } + return multiselect( label: 'Which repositories would you like to migrate?', options: $this->availableRepositories()->all(), From ac11842830ae00f34745e8bf26b4e1db31978a1b Mon Sep 17 00:00:00 2001 From: Kevin Meijer Date: Thu, 23 Jan 2025 14:00:30 +0100 Subject: [PATCH 2/6] Ran Pint --- src/Console/Commands/InstallEloquentDriver.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Console/Commands/InstallEloquentDriver.php b/src/Console/Commands/InstallEloquentDriver.php index 6bcba157e0..f2ef6a5468 100644 --- a/src/Console/Commands/InstallEloquentDriver.php +++ b/src/Console/Commands/InstallEloquentDriver.php @@ -89,20 +89,20 @@ protected function repositories(): array if ($repositories = $this->option('repositories')) { $requestedRepositories = collect(explode(',', $repositories)) - ->map(fn($repo) => trim(strtolower($repo))) + ->map(fn ($repo) => trim(strtolower($repo))) ->unique(); $availableRepositories = $this->availableRepositories(); $validRepositories = $requestedRepositories->filter( - fn($repo) => $availableRepositories->has($repo) + fn ($repo) => $availableRepositories->has($repo) ); $invalidRepositories = $requestedRepositories->diff($validRepositories); if ($invalidRepositories->isNotEmpty()) { $this->components->warn( - "The following repositories are invalid: " . + 'The following repositories are invalid: '. $invalidRepositories->implode(', ') ); } From 45b77c07af89a4bb4445212949df6a624f09bac1 Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Fri, 31 Jan 2025 14:50:53 +0000 Subject: [PATCH 3/6] Throw an error instead of a warning --- src/Console/Commands/InstallEloquentDriver.php | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/Console/Commands/InstallEloquentDriver.php b/src/Console/Commands/InstallEloquentDriver.php index f2ef6a5468..a481224867 100644 --- a/src/Console/Commands/InstallEloquentDriver.php +++ b/src/Console/Commands/InstallEloquentDriver.php @@ -88,26 +88,22 @@ protected function repositories(): array } if ($repositories = $this->option('repositories')) { - $requestedRepositories = collect(explode(',', $repositories)) + $repositories = collect(explode(',', $repositories)) ->map(fn ($repo) => trim(strtolower($repo))) ->unique(); $availableRepositories = $this->availableRepositories(); - $validRepositories = $requestedRepositories->filter( - fn ($repo) => $availableRepositories->has($repo) - ); - - $invalidRepositories = $requestedRepositories->diff($validRepositories); + $invalidRepositories = $repositories->reject(fn ($repo) => $availableRepositories->has($repo)); if ($invalidRepositories->isNotEmpty()) { - $this->components->warn( - 'The following repositories are invalid: '. - $invalidRepositories->implode(', ') - ); + $this->components->error("Some of the repositories you provided are invalid: {$invalidRepositories->implode(', ')}"); + + exit(1); } - return $validRepositories + return $repositories + ->filter(fn ($repo) => $availableRepositories->has($repo)) ->values() ->all(); } From 13075bad6a612690b282baf79cb1dbc1982de51c Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Fri, 31 Jan 2025 14:53:24 +0000 Subject: [PATCH 4/6] Only throw an error when the repo doesn't exist --- src/Console/Commands/InstallEloquentDriver.php | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/Console/Commands/InstallEloquentDriver.php b/src/Console/Commands/InstallEloquentDriver.php index a481224867..b3ba746dcd 100644 --- a/src/Console/Commands/InstallEloquentDriver.php +++ b/src/Console/Commands/InstallEloquentDriver.php @@ -92,9 +92,7 @@ protected function repositories(): array ->map(fn ($repo) => trim(strtolower($repo))) ->unique(); - $availableRepositories = $this->availableRepositories(); - - $invalidRepositories = $repositories->reject(fn ($repo) => $availableRepositories->has($repo)); + $invalidRepositories = $repositories->reject(fn ($repo) => $this->allRepositories()->has($repo)); if ($invalidRepositories->isNotEmpty()) { $this->components->error("Some of the repositories you provided are invalid: {$invalidRepositories->implode(', ')}"); @@ -103,7 +101,7 @@ protected function repositories(): array } return $repositories - ->filter(fn ($repo) => $availableRepositories->has($repo)) + ->filter(fn ($repo) => $this->allRepositories()->has($repo)) ->values() ->all(); } @@ -118,7 +116,7 @@ protected function repositories(): array ); } - protected function availableRepositories(): Collection + protected function allRepositories(): Collection { return collect([ 'asset_containers' => 'Asset Containers', @@ -139,7 +137,12 @@ protected function availableRepositories(): Collection 'taxonomies' => 'Taxonomies', 'terms' => 'Terms', 'tokens' => 'Tokens', - ])->reject(function ($value, $key) { + ]); + } + + protected function availableRepositories(): Collection + { + return $this->allRepositories()->reject(function ($value, $key) { switch ($key) { case 'asset_containers': return config('statamic.eloquent-driver.asset_containers.driver') === 'eloquent'; From 25d4b0b4f3b64a79a9f38d61a730a15b019cdc58 Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Fri, 31 Jan 2025 14:55:35 +0000 Subject: [PATCH 5/6] Display a warning when the repo is already eloquent-driven --- src/Console/Commands/InstallEloquentDriver.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Console/Commands/InstallEloquentDriver.php b/src/Console/Commands/InstallEloquentDriver.php index b3ba746dcd..6a8b144a82 100644 --- a/src/Console/Commands/InstallEloquentDriver.php +++ b/src/Console/Commands/InstallEloquentDriver.php @@ -76,6 +76,12 @@ public function handle() $repositories = $this->repositories(); foreach ($repositories as $repository) { + if (! $this->availableRepositories()->has($repository)) { + $this->components->warn("Skipping. The {$repository} repository is already using the Eloquent Driver."); + + continue; + } + $method = 'migrate'.Str::studly($repository); $this->$method(); } From af65ca9fe28e06b4cc0a1695265f6044daade542 Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Fri, 31 Jan 2025 15:17:32 +0000 Subject: [PATCH 6/6] Refactor a little --- .../Commands/InstallEloquentDriver.php | 90 +++++++++---------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/src/Console/Commands/InstallEloquentDriver.php b/src/Console/Commands/InstallEloquentDriver.php index 6a8b144a82..ae59e76e15 100644 --- a/src/Console/Commands/InstallEloquentDriver.php +++ b/src/Console/Commands/InstallEloquentDriver.php @@ -69,14 +69,14 @@ public function handle() return $this->components->error('Failed to connect to the configured database. Please check your database configuration and try again.'); } - if ($this->availableRepositories()->isEmpty()) { + if ($this->allRepositories()->reject(fn ($value, $key) => $this->repositoryHasBeenMigrated($key))->isEmpty()) { return $this->components->warn("No repositories left to migrate. You're already using the Eloquent Driver for all repositories."); } $repositories = $this->repositories(); foreach ($repositories as $repository) { - if (! $this->availableRepositories()->has($repository)) { + if ($this->repositoryHasBeenMigrated($repository)) { $this->components->warn("Skipping. The {$repository} repository is already using the Eloquent Driver."); continue; @@ -114,7 +114,9 @@ protected function repositories(): array return multiselect( label: 'Which repositories would you like to migrate?', - options: $this->availableRepositories()->all(), + options: $this->allRepositories() + ->reject(fn ($value, $key) => $this->repositoryHasBeenMigrated($key)) + ->all(), validate: fn (array $values) => count($values) === 0 ? 'You must select at least one repository to migrate.' : null, @@ -146,66 +148,64 @@ protected function allRepositories(): Collection ]); } - protected function availableRepositories(): Collection + protected function repositoryHasBeenMigrated(string $repository): bool { - return $this->allRepositories()->reject(function ($value, $key) { - switch ($key) { - case 'asset_containers': - return config('statamic.eloquent-driver.asset_containers.driver') === 'eloquent'; + switch ($repository) { + case 'asset_containers': + return config('statamic.eloquent-driver.asset_containers.driver') === 'eloquent'; - case 'assets': - return config('statamic.eloquent-driver.assets.driver') === 'eloquent'; + case 'assets': + return config('statamic.eloquent-driver.assets.driver') === 'eloquent'; - case 'blueprints': - return config('statamic.eloquent-driver.blueprints.driver') === 'eloquent'; + case 'blueprints': + return config('statamic.eloquent-driver.blueprints.driver') === 'eloquent'; - case 'collections': - return config('statamic.eloquent-driver.collections.driver') === 'eloquent'; + case 'collections': + return config('statamic.eloquent-driver.collections.driver') === 'eloquent'; - case 'collection_trees': - return config('statamic.eloquent-driver.collection_trees.driver') === 'eloquent'; + case 'collection_trees': + return config('statamic.eloquent-driver.collection_trees.driver') === 'eloquent'; - case 'entries': - return config('statamic.eloquent-driver.entries.driver') === 'eloquent'; + case 'entries': + return config('statamic.eloquent-driver.entries.driver') === 'eloquent'; - case 'fieldsets': - return config('statamic.eloquent-driver.fieldsets.driver') === 'eloquent'; + case 'fieldsets': + return config('statamic.eloquent-driver.fieldsets.driver') === 'eloquent'; - case 'forms': - return config('statamic.eloquent-driver.forms.driver') === 'eloquent'; + case 'forms': + return config('statamic.eloquent-driver.forms.driver') === 'eloquent'; - case 'form_submissions': - return config('statamic.eloquent-driver.form_submissions.driver') === 'eloquent'; + case 'form_submissions': + return config('statamic.eloquent-driver.form_submissions.driver') === 'eloquent'; - case 'globals': - return config('statamic.eloquent-driver.global_sets.driver') === 'eloquent'; + case 'globals': + return config('statamic.eloquent-driver.global_sets.driver') === 'eloquent'; - case 'global_variables': - return config('statamic.eloquent-driver.global_set_variables.driver') === 'eloquent'; + case 'global_variables': + return config('statamic.eloquent-driver.global_set_variables.driver') === 'eloquent'; - case 'navs': - return config('statamic.eloquent-driver.navigations.driver') === 'eloquent'; + case 'navs': + return config('statamic.eloquent-driver.navigations.driver') === 'eloquent'; - case 'nav_trees': - return config('statamic.eloquent-driver.navigation_trees.driver') === 'eloquent'; + case 'nav_trees': + return config('statamic.eloquent-driver.navigation_trees.driver') === 'eloquent'; - case 'revisions': - return ! config('statamic.revisions.enabled') - || config('statamic.eloquent-driver.revisions.driver') === 'eloquent'; + case 'revisions': + return ! config('statamic.revisions.enabled') + || config('statamic.eloquent-driver.revisions.driver') === 'eloquent'; - case 'sites': - return config('statamic.eloquent-driver.sites.driver') === 'eloquent'; + case 'sites': + return config('statamic.eloquent-driver.sites.driver') === 'eloquent'; - case 'taxonomies': - return config('statamic.eloquent-driver.taxonomies.driver') === 'eloquent'; + case 'taxonomies': + return config('statamic.eloquent-driver.taxonomies.driver') === 'eloquent'; - case 'terms': - return config('statamic.eloquent-driver.terms.driver') === 'eloquent'; + case 'terms': + return config('statamic.eloquent-driver.terms.driver') === 'eloquent'; - case 'tokens': - return config('statamic.eloquent-driver.tokens.driver') === 'eloquent'; - } - }); + case 'tokens': + return config('statamic.eloquent-driver.tokens.driver') === 'eloquent'; + } } protected function migrateAssetContainers(): void