diff --git a/core/lib/Drupal/Core/Extension/Exception/ObsoleteExtensionException.php b/core/lib/Drupal/Core/Extension/Exception/ObsoleteExtensionException.php new file mode 100644 index 0000000000..6c2829d16a --- /dev/null +++ b/core/lib/Drupal/Core/Extension/Exception/ObsoleteExtensionException.php @@ -0,0 +1,8 @@ +info['core_incompatible'])) { throw new MissingDependencyException("Unable to install modules: module '$module' is incompatible with this version of Drupal core."); } + if ($module_data[$module]->info['status'] === ExtensionStatus::OBSOLETE) { + throw new ObsoleteExtensionException("Unable to install modules: module '$module' is obsolete."); + } } if ($enable_dependencies) { $module_list = $module_list ? array_combine($module_list, $module_list) : []; diff --git a/core/modules/field_layout/field_layout.info.yml b/core/modules/field_layout/field_layout.info.yml index f4b676f25b..8f3047dbb6 100644 --- a/core/modules/field_layout/field_layout.info.yml +++ b/core/modules/field_layout/field_layout.info.yml @@ -1,7 +1,8 @@ name: 'Field Layout' type: module description: 'Allows users to configure the display and form display by arranging fields in several columns.' -package: Core (Experimental) +package: Core +status: experimental version: VERSION dependencies: - drupal:layout_discovery diff --git a/core/modules/help/src/Controller/HelpController.php b/core/modules/help/src/Controller/HelpController.php index 2c925a6557..fcce9401b1 100644 --- a/core/modules/help/src/Controller/HelpController.php +++ b/core/modules/help/src/Controller/HelpController.php @@ -4,6 +4,7 @@ use Drupal\Core\Cache\CacheableMetadata; use Drupal\Core\Controller\ControllerBase; +use Drupal\Core\Extension\ExtensionStatus; use Drupal\Core\Extension\ModuleExtensionList; use Drupal\Core\Routing\RouteMatchInterface; use Drupal\help\HelpSectionManager; @@ -132,7 +133,7 @@ public function helpPage($name) { $build['#title'] = $module_name; $info = $this->moduleExtensionList->getExtensionInfo($name); - if ($info['package'] === 'Core (Experimental)') { + if ($info['status'] === ExtensionStatus::EXPERIMENTAL) { $this->messenger()->addWarning($this->t('This module is experimental. Experimental modules are provided for testing purposes only. Use at your own risk.', [':url' => 'https://www.drupal.org/core/experimental'])); } diff --git a/core/modules/help_topics/help_topics.info.yml b/core/modules/help_topics/help_topics.info.yml index 819aef1170..0b657b292f 100644 --- a/core/modules/help_topics/help_topics.info.yml +++ b/core/modules/help_topics/help_topics.info.yml @@ -1,7 +1,8 @@ name: Help Topics type: module description: 'Displays help topics provided by themes and modules.' -package: Core (Experimental) +package: Core +status: experimental version: VERSION dependencies: - drupal:help diff --git a/core/modules/jsonapi/tests/src/Functional/TestCoverageTest.php b/core/modules/jsonapi/tests/src/Functional/TestCoverageTest.php index 1a306bba74..2a5f6683a5 100644 --- a/core/modules/jsonapi/tests/src/Functional/TestCoverageTest.php +++ b/core/modules/jsonapi/tests/src/Functional/TestCoverageTest.php @@ -3,6 +3,7 @@ namespace Drupal\Tests\jsonapi\Functional; use Drupal\Core\Entity\EntityTypeInterface; +use Drupal\Core\Extension\ExtensionStatus; use Drupal\Tests\BrowserTestBase; /** @@ -38,7 +39,7 @@ protected function setUp(): void { && empty($module->info['hidden']) && $module->status == FALSE && $module->info['package'] !== 'Testing' - && $module->info['package'] !== 'Core (Experimental)'; + && $module->info['status'] !== ExtensionStatus::EXPERIMENTAL; }); $this->container->get('module_installer')->install(array_keys($stable_core_modules)); diff --git a/core/modules/migrate_drupal_multilingual/migrate_drupal_multilingual.info.yml b/core/modules/migrate_drupal_multilingual/migrate_drupal_multilingual.info.yml index 7f7b59e7e6..8a70432402 100644 --- a/core/modules/migrate_drupal_multilingual/migrate_drupal_multilingual.info.yml +++ b/core/modules/migrate_drupal_multilingual/migrate_drupal_multilingual.info.yml @@ -1,7 +1,8 @@ name: 'Migrate Drupal Multilingual' type: module description: 'Provides a requirement for multilingual migrations.' -package: 'Core (Experimental)' +package: 'Core' +status: experimental version: VERSION dependencies: - drupal:migrate_drupal diff --git a/core/modules/rest/tests/src/Functional/EntityResource/EntityResourceRestTestCoverageTest.php b/core/modules/rest/tests/src/Functional/EntityResource/EntityResourceRestTestCoverageTest.php index d84edf3842..c130b2f449 100644 --- a/core/modules/rest/tests/src/Functional/EntityResource/EntityResourceRestTestCoverageTest.php +++ b/core/modules/rest/tests/src/Functional/EntityResource/EntityResourceRestTestCoverageTest.php @@ -3,6 +3,7 @@ namespace Drupal\Tests\rest\Functional\EntityResource; use Drupal\Core\Entity\EntityTypeInterface; +use Drupal\Core\Extension\ExtensionStatus; use Drupal\Tests\BrowserTestBase; /** @@ -42,7 +43,7 @@ protected function setUp(): void { empty($module->info['hidden']) && $module->status == FALSE && $module->info['package'] !== 'Testing' && - $module->info['package'] !== 'Core (Experimental)'; + $module->info['status'] !== ExtensionStatus::EXPERIMENTAL; }); $this->container->get('module_installer')->install(array_keys($stable_core_modules)); diff --git a/core/modules/system/src/Form/ModulesListForm.php b/core/modules/system/src/Form/ModulesListForm.php index 66e0fbc806..5468923829 100644 --- a/core/modules/system/src/Form/ModulesListForm.php +++ b/core/modules/system/src/Form/ModulesListForm.php @@ -6,6 +6,7 @@ use Drupal\Core\Config\UnmetDependenciesException; use Drupal\Core\Access\AccessManagerInterface; use Drupal\Core\Extension\Extension; +use Drupal\Core\Extension\ExtensionStatus; use Drupal\Core\Extension\InfoParserException; use Drupal\Core\Extension\ModuleExtensionList; use Drupal\Core\Extension\ModuleHandlerInterface; @@ -404,7 +405,7 @@ protected function buildModuleList(FormStateInterface $form_state) { elseif (($checkbox = $form_state->getValue(['modules', $name], FALSE)) && $checkbox['enable']) { $modules['install'][$name] = $data[$name]->info['name']; // Identify experimental modules. - if ($data[$name]->info['package'] == 'Core (Experimental)') { + if ($data[$name]->info['status'] === ExtensionStatus::EXPERIMENTAL) { $modules['experimental'][$name] = $data[$name]->info['name']; } } @@ -418,7 +419,7 @@ protected function buildModuleList(FormStateInterface $form_state) { $modules['install'][$dependency] = $data[$dependency]->info['name']; // Identify experimental modules. - if ($data[$dependency]->info['package'] == 'Core (Experimental)') { + if ($data[$dependency]->info['status'] === ExtensionStatus::EXPERIMENTAL) { $modules['experimental'][$dependency] = $data[$dependency]->info['name']; } } diff --git a/core/modules/system/system.install b/core/modules/system/system.install index e4cb7cef7c..9e1fdeb522 100644 --- a/core/modules/system/system.install +++ b/core/modules/system/system.install @@ -15,6 +15,7 @@ use Drupal\Core\DrupalKernel; use Drupal\Core\Entity\Sql\SqlContentEntityStorage; use Drupal\Core\Entity\Sql\SqlContentEntityStorageSchema; +use Drupal\Core\Extension\ExtensionStatus; use Drupal\Core\File\FileSystemInterface; use Drupal\Core\Site\Settings; use Drupal\Core\StreamWrapper\PrivateStream; @@ -65,7 +66,7 @@ function system_requirements($phase) { $enabled_modules = \Drupal::moduleHandler()->getModuleList(); foreach ($enabled_modules as $module => $data) { $info = \Drupal::service('extension.list.module')->getExtensionInfo($module); - if (isset($info['package']) && $info['package'] === 'Core (Experimental)') { + if (isset($info['status']) && $info['status'] === ExtensionStatus::EXPERIMENTAL) { $experimental_modules[$module] = $info['name']; } } diff --git a/core/modules/system/tests/modules/experimental_module_requirements_test/experimental_module_requirements_test.info.yml b/core/modules/system/tests/modules/experimental_module_requirements_test/experimental_module_requirements_test.info.yml index 7d94791173..d25ae66481 100644 --- a/core/modules/system/tests/modules/experimental_module_requirements_test/experimental_module_requirements_test.info.yml +++ b/core/modules/system/tests/modules/experimental_module_requirements_test/experimental_module_requirements_test.info.yml @@ -1,5 +1,6 @@ name: 'Experimental Requirements Test' type: module description: 'Module in the experimental package to test hook_requirements() with an experimental module.' -package: Core (Experimental) +package: Core +status: experimental version: VERSION diff --git a/core/modules/system/tests/modules/experimental_module_test/experimental_module_test.info.yml b/core/modules/system/tests/modules/experimental_module_test/experimental_module_test.info.yml index c00a80070c..5b0dd5f7c0 100644 --- a/core/modules/system/tests/modules/experimental_module_test/experimental_module_test.info.yml +++ b/core/modules/system/tests/modules/experimental_module_test/experimental_module_test.info.yml @@ -1,5 +1,6 @@ name: 'Experimental Test' type: module description: 'Module in the experimental package to test experimental functionality.' -package: Core (Experimental) +package: Core +status: experimental version: 8.y.x-unstable diff --git a/core/modules/system/tests/src/Functional/Module/InstallUninstallTest.php b/core/modules/system/tests/src/Functional/Module/InstallUninstallTest.php index 00ecee704c..95902db2df 100644 --- a/core/modules/system/tests/src/Functional/Module/InstallUninstallTest.php +++ b/core/modules/system/tests/src/Functional/Module/InstallUninstallTest.php @@ -2,6 +2,7 @@ namespace Drupal\Tests\system\Functional\Module; +use Drupal\Core\Extension\ExtensionStatus; use Drupal\Core\Logger\RfcLogLevel; use Drupal\workspaces\Entity\Workspace; @@ -103,12 +104,12 @@ public function testInstallUninstall() { // Install the module. $edit = []; - $package = $module->info['package']; + $status = $module->info['status']; $edit['modules[' . $name . '][enable]'] = TRUE; $this->drupalPostForm('admin/modules', $edit, 'Install'); // Handle experimental modules, which require a confirmation screen. - if ($package == 'Core (Experimental)') { + if ($status === ExtensionStatus::EXPERIMENTAL) { $this->assertText('Are you sure you wish to enable experimental modules?'); if (count($modules_to_install) > 1) { // When there are experimental modules, needed dependencies do not diff --git a/core/modules/workspaces/workspaces.info.yml b/core/modules/workspaces/workspaces.info.yml index 11ac79a222..52d537aaab 100644 --- a/core/modules/workspaces/workspaces.info.yml +++ b/core/modules/workspaces/workspaces.info.yml @@ -2,7 +2,8 @@ name: Workspaces type: module description: 'Allows users to stage content or preview a full site by using multiple workspaces on a single site.' version: VERSION -package: Core (Experimental) +package: Core +status: experimental configure: entity.workspace.collection dependencies: - drupal:user diff --git a/core/profiles/demo_umami/modules/demo_umami_content/demo_umami_content.info.yml b/core/profiles/demo_umami/modules/demo_umami_content/demo_umami_content.info.yml index 9c97b0adf1..b5b1928d84 100644 --- a/core/profiles/demo_umami/modules/demo_umami_content/demo_umami_content.info.yml +++ b/core/profiles/demo_umami/modules/demo_umami_content/demo_umami_content.info.yml @@ -2,7 +2,8 @@ name: 'Umami demo: Content' description: Imports the content for the Umami demo. type: module version: VERSION -package: 'Core (Experimental)' +package: 'Core' +status: experimental hidden: true dependencies: - drupal:field diff --git a/core/tests/Drupal/KernelTests/Config/DefaultConfigTest.php b/core/tests/Drupal/KernelTests/Config/DefaultConfigTest.php index b8b4c61897..6480c4fde2 100644 --- a/core/tests/Drupal/KernelTests/Config/DefaultConfigTest.php +++ b/core/tests/Drupal/KernelTests/Config/DefaultConfigTest.php @@ -6,6 +6,7 @@ use Drupal\Core\Config\FileStorage; use Drupal\Core\Config\InstallStorage; use Drupal\Core\Config\StorageInterface; +use Drupal\Core\Extension\ExtensionStatus; use Drupal\KernelTests\AssertConfigTrait; use Drupal\KernelTests\FileSystemModuleDiscoveryDataProviderTrait; use Drupal\KernelTests\KernelTestBase; @@ -124,7 +125,7 @@ protected function doTestsOnConfigStorage(StorageInterface $default_config_stora } else { $info = $this->container->get('extension.list.module')->getExtensionInfo($module); - if (!isset($info['package']) || $info['package'] !== 'Core (Experimental)') { + if (!isset($info['status']) || $info['status'] !== ExtensionStatus::EXPERIMENTAL) { $this->fail("$config_name provided by $module does not exist after installing all dependencies"); } } diff --git a/core/tests/Drupal/KernelTests/Core/Theme/Stable9LibraryOverrideTest.php b/core/tests/Drupal/KernelTests/Core/Theme/Stable9LibraryOverrideTest.php index 073e0f41dc..3b4f5d9801 100644 --- a/core/tests/Drupal/KernelTests/Core/Theme/Stable9LibraryOverrideTest.php +++ b/core/tests/Drupal/KernelTests/Core/Theme/Stable9LibraryOverrideTest.php @@ -2,6 +2,7 @@ namespace Drupal\KernelTests\Core\Theme; +use Drupal\Core\Extension\ExtensionStatus; use Drupal\KernelTests\KernelTestBase; /** @@ -64,7 +65,7 @@ protected function setUp(): void { $all_modules = array_filter($all_modules, function ($module) { // Filter contrib, hidden, experimental, already enabled modules, and // modules in the Testing package. - if ($module->origin !== 'core' || !empty($module->info['hidden']) || $module->status == TRUE || $module->info['package'] == 'Testing' || $module->info['package'] == 'Core (Experimental)') { + if ($module->origin !== 'core' || !empty($module->info['hidden']) || $module->status == TRUE || $module->info['package'] == 'Testing' || $module->info['status'] === ExtensionStatus::EXPERIMENTAL) { return FALSE; } return TRUE; diff --git a/core/tests/Drupal/KernelTests/Core/Theme/Stable9TemplateOverrideTest.php b/core/tests/Drupal/KernelTests/Core/Theme/Stable9TemplateOverrideTest.php index 22fc651585..ca5477fcfa 100644 --- a/core/tests/Drupal/KernelTests/Core/Theme/Stable9TemplateOverrideTest.php +++ b/core/tests/Drupal/KernelTests/Core/Theme/Stable9TemplateOverrideTest.php @@ -2,6 +2,7 @@ namespace Drupal\KernelTests\Core\Theme; +use Drupal\Core\Extension\ExtensionStatus; use Drupal\Core\Theme\Registry; use Drupal\KernelTests\KernelTestBase; @@ -63,7 +64,7 @@ protected function installAllModules() { $all_modules = array_filter($all_modules, function ($module) { // Filter contrib, hidden, experimental, already enabled modules, and // modules in the Testing package. - if ($module->origin !== 'core' || !empty($module->info['hidden']) || $module->status == TRUE || $module->info['package'] == 'Testing' || $module->info['package'] == 'Core (Experimental)') { + if ($module->origin !== 'core' || !empty($module->info['hidden']) || $module->status == TRUE || $module->info['package'] == 'Testing' || $module->info['status'] === ExtensionStatus::EXPERIMENTAL) { return FALSE; } return TRUE; diff --git a/core/tests/Drupal/KernelTests/Core/Theme/StableLibraryOverrideTest.php b/core/tests/Drupal/KernelTests/Core/Theme/StableLibraryOverrideTest.php index e291cbe44f..80502d926b 100644 --- a/core/tests/Drupal/KernelTests/Core/Theme/StableLibraryOverrideTest.php +++ b/core/tests/Drupal/KernelTests/Core/Theme/StableLibraryOverrideTest.php @@ -2,6 +2,7 @@ namespace Drupal\KernelTests\Core\Theme; +use Drupal\Core\Extension\ExtensionStatus; use Drupal\KernelTests\KernelTestBase; /** @@ -64,7 +65,7 @@ protected function setUp(): void { $all_modules = array_filter($all_modules, function ($module) { // Filter contrib, hidden, experimental, already enabled modules, and // modules in the Testing package. - if ($module->origin !== 'core' || !empty($module->info['hidden']) || $module->status == TRUE || $module->info['package'] == 'Testing' || $module->info['package'] == 'Core (Experimental)') { + if ($module->origin !== 'core' || !empty($module->info['hidden']) || $module->status == TRUE || $module->info['package'] == 'Testing' || $module->info['status'] === ExtensionStatus::EXPERIMENTAL) { return FALSE; } return TRUE; diff --git a/core/tests/Drupal/KernelTests/Core/Theme/StableTemplateOverrideTest.php b/core/tests/Drupal/KernelTests/Core/Theme/StableTemplateOverrideTest.php index 6534baa635..f404d3b460 100644 --- a/core/tests/Drupal/KernelTests/Core/Theme/StableTemplateOverrideTest.php +++ b/core/tests/Drupal/KernelTests/Core/Theme/StableTemplateOverrideTest.php @@ -2,6 +2,7 @@ namespace Drupal\KernelTests\Core\Theme; +use Drupal\Core\Extension\ExtensionStatus; use Drupal\Core\Theme\Registry; use Drupal\KernelTests\KernelTestBase; @@ -61,7 +62,7 @@ protected function installAllModules() { $all_modules = array_filter($all_modules, function ($module) { // Filter contrib, hidden, experimental, already enabled modules, and // modules in the Testing package. - if ($module->origin !== 'core' || !empty($module->info['hidden']) || $module->status == TRUE || $module->info['package'] == 'Testing' || $module->info['package'] == 'Core (Experimental)') { + if ($module->origin !== 'core' || !empty($module->info['hidden']) || $module->status == TRUE || $module->info['package'] == 'Testing' || $module->info['status'] === ExtensionStatus::EXPERIMENTAL) { return FALSE; } return TRUE;