Problem/Motivation

The only usage of theme handler in \Drupal\Core\Config\ConfigImporter::processExtension() related to install/uninstall operations which should be delegated to theme installer - see #2776031: Properly deprecate ThemeHandlerInterface install() and uninstall() also replace usage

Proposed resolution

replace constructor dependency and usage with theme installer

Remaining tasks

User interface changes

API changes

Data model changes

Release notes snippet

Comments

andypost created an issue. See original summary.

andypost’s picture

Status: Active » Needs review
Issue tags: +Needs change record
StatusFileSize
new14.8 KB

There's a usage of constructor in drush & config_installer so probably there's no way to make it BC compatible

andypost’s picture

StatusFileSize
new487 bytes
new14.85 KB

minor fix

The last submitted patch, 2: 3017360-2.patch, failed testing. View results
- codesniffer_fixes.patch Interdiff of automated coding standards fixes only.

Status: Needs review » Needs work

The last submitted patch, 3: 3017360-3.patch, failed testing. View results
- codesniffer_fixes.patch Interdiff of automated coding standards fixes only.

andypost’s picture

Status: Needs work » Needs review
StatusFileSize
new2.48 KB
new16.73 KB

Fix form

Version: 8.7.x-dev » 8.8.x-dev

Drupal 8.7.0-alpha1 will be released the week of March 11, 2019, which means new developments and disruptive changes should now be targeted against the 8.8.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.8.x-dev » 8.9.x-dev

Drupal 8.8.0-alpha1 will be released the week of October 14th, 2019, which means new developments and disruptive changes should now be targeted against the 8.9.x-dev branch. (Any changes to 8.9.x will also be committed to 9.0.x in preparation for Drupal 9’s release, but some changes like significant feature additions will be deferred to 9.1.x.). For more information see the Drupal 8 and 9 minor version schedule and the Allowed changes during the Drupal 8 and 9 release cycles.

andypost’s picture

Version: 8.9.x-dev » 9.1.x-dev
kristen pol’s picture

Thanks for the patch.

1) In reviewing the code in the patch, I found one item that needs addressing in the code.

+++ b/core/modules/config/src/Form/ConfigSingleImportForm.php
@@ -15,6 +15,7 @@
 use Drupal\Core\Extension\ThemeHandlerInterface;

This should be removed.

2) I also checked the D9 dev codebase for the creation of ConfigImporter instances to see if anything was missing from the patch.

For reference:

These are the files updated in the patch:

  • core/includes/install.core.inc
  • core/lib/Drupal/Core/Config/ConfigImporter.php
  • core/modules/config/src/Form/ConfigSingleImportForm.php
  • core/modules/config/src/Form/ConfigSync.php
  • core/modules/config/tests/src/Kernel/ConfigUninstallViaCliImportTest.php
  • core/modules/content_translation/tests/src/Kernel/ContentTranslationConfigImportTest.php
  • core/tests/Drupal/KernelTests/Core/Config/ConfigImportRecreateTest.php
  • core/tests/Drupal/KernelTests/Core/Config/ConfigImportRenameValidationTest.php
  • core/tests/Drupal/KernelTests/Core/Config/ConfigImporterMissingContentTest.php
  • core/tests/Drupal/KernelTests/Core/Config/ConfigImporterTest.php
  • core/tests/Drupal/KernelTests/Core/Entity/ContentEntityNullStorageTest.php
  • core/tests/Drupal/Tests/ConfigTestTrait.php

These are the files in D9 dev code that create a ConfigImporter:

These are included in the patch:

  • core/includes/install.core.inc
  • core/lib/Drupal/Core/Config/ConfigImporter.php
  • core/modules/config/src/Form/ConfigSingleImportForm.php
  • core/modules/config/src/Form/ConfigSync.php
  • core/modules/config/tests/src/Kernel/ConfigUninstallViaCliImportTest.php
  • core/modules/content_translation/tests/src/Kernel/ContentTranslationConfigImportTest.php
  • core/tests/Drupal/KernelTests/Core/Config/ConfigImportRecreateTest.php
  • core/tests/Drupal/KernelTests/Core/Config/ConfigImportRenameValidationTest.php
  • core/tests/Drupal/KernelTests/Core/Config/ConfigImporterMissingContentTest.php
  • core/tests/Drupal/KernelTests/Core/Config/ConfigImporterTest.php
  • core/tests/Drupal/KernelTests/Core/Entity/ContentEntityNullStorageTest.php
  • core/tests/Drupal/Tests/ConfigTestTrait.php

These are not included in the patch:

  1. core/lib/Drupal/Core/Config/Entity/ConfigEntityStorage.php - Does not include the theme handler
  2. core/modules/language/tests/src/Kernel/OverriddenConfigImportTest.php - Does include the theme handler

Reviewing the code in OverriddenConfigImportTest.php, it looks like this needs to be changed:

$this->container->get('theme_handler'),

to

$this->container->get('theme_installer'),

3) Tried to apply the patch to check that theme_handler and themeHandler*/ThemeHandler* were updated as expected in those files but the patch failed so needs a re-roll

[mac:kristen:drupal-9.0.x-dev]$ patch -p1 < 3017360-6.patch 
patching file core/includes/install.core.inc
Hunk #1 FAILED at 2348.
Hunk #2 FAILED at 2419.
2 out of 2 hunks FAILED -- saving rejects to file core/includes/install.core.inc.rej
patching file core/lib/Drupal/Core/Config/ConfigImporter.php
Hunk #1 succeeded at 6 with fuzz 1 (offset 1 line).
Hunk #2 succeeded at 114 (offset 1 line).
Hunk #3 FAILED at 177.
Hunk #4 succeeded at 200 (offset 11 lines).
Hunk #5 FAILED at 822.
2 out of 5 hunks FAILED -- saving rejects to file core/lib/Drupal/Core/Config/ConfigImporter.php.rej
patching file core/modules/config/src/Form/ConfigSingleImportForm.php
Hunk #1 succeeded at 17 (offset 2 lines).
Hunk #2 succeeded at 91 with fuzz 1 (offset 2 lines).
Hunk #3 FAILED at 139.
Hunk #4 FAILED at 154.
Hunk #5 FAILED at 171.
Hunk #6 FAILED at 356.
4 out of 6 hunks FAILED -- saving rejects to file core/modules/config/src/Form/ConfigSingleImportForm.php.rej
patching file core/modules/config/src/Form/ConfigSync.php
Hunk #1 succeeded at 10 with fuzz 1 (offset 2 lines).
Hunk #2 succeeded at 86 (offset 2 lines).
Hunk #3 FAILED at 127.
Hunk #4 succeeded at 160 with fuzz 2 (offset 20 lines).
Hunk #5 FAILED at 178.
Hunk #6 FAILED at 347.
3 out of 6 hunks FAILED -- saving rejects to file core/modules/config/src/Form/ConfigSync.php.rej
patching file core/modules/config/tests/src/Kernel/ConfigUninstallViaCliImportTest.php
Hunk #1 FAILED at 48.
1 out of 1 hunk FAILED -- saving rejects to file core/modules/config/tests/src/Kernel/ConfigUninstallViaCliImportTest.php.rej
patching file core/modules/content_translation/tests/src/Kernel/ContentTranslationConfigImportTest.php
Hunk #1 FAILED at 50.
1 out of 1 hunk FAILED -- saving rejects to file core/modules/content_translation/tests/src/Kernel/ContentTranslationConfigImportTest.php.rej
patching file core/tests/Drupal/KernelTests/Core/Config/ConfigImportRecreateTest.php
Hunk #1 FAILED at 49.
1 out of 1 hunk FAILED -- saving rejects to file core/tests/Drupal/KernelTests/Core/Config/ConfigImportRecreateTest.php.rej
patching file core/tests/Drupal/KernelTests/Core/Config/ConfigImportRenameValidationTest.php
Hunk #1 FAILED at 54.
1 out of 1 hunk FAILED -- saving rejects to file core/tests/Drupal/KernelTests/Core/Config/ConfigImportRenameValidationTest.php.rej
patching file core/tests/Drupal/KernelTests/Core/Config/ConfigImporterMissingContentTest.php
Hunk #1 FAILED at 54.
1 out of 1 hunk FAILED -- saving rejects to file core/tests/Drupal/KernelTests/Core/Config/ConfigImporterMissingContentTest.php.rej
patching file core/tests/Drupal/KernelTests/Core/Config/ConfigImporterTest.php
Hunk #1 FAILED at 59.
1 out of 1 hunk FAILED -- saving rejects to file core/tests/Drupal/KernelTests/Core/Config/ConfigImporterTest.php.rej
patching file core/tests/Drupal/KernelTests/Core/Entity/ContentEntityNullStorageTest.php
Hunk #1 FAILED at 62.
1 out of 1 hunk FAILED -- saving rejects to file core/tests/Drupal/KernelTests/Core/Entity/ContentEntityNullStorageTest.php.rej
patching file core/tests/Drupal/Tests/ConfigTestTrait.php
Hunk #1 FAILED at 32.
1 out of 1 hunk FAILED -- saving rejects to file core/tests/Drupal/Tests/ConfigTestTrait.php.rej
kristen pol’s picture

Status: Needs review » Needs work
kristen pol’s picture

Status: Needs work » Needs review
kristen pol’s picture

Status: Needs review » Needs work

Ok, done reviewing now. Sorry for the back and forth.

aleevas’s picture

Status: Needs work » Needs review
StatusFileSize
new18.03 KB
new22.97 KB

The #6 was re-rolled

kristen pol’s picture

Status: Needs review » Needs work

Thanks for the re-roll... it was successful. There are still some items to address in #10 so putting back to "Needs work".

[mac:kristen:drupal-9.0.x-dev]$ patch -p1 < 3017360-14.patch 
patching file core/includes/install.core.inc
patching file core/lib/Drupal/Core/Config/ConfigImporter.php
patching file core/modules/config/src/Form/ConfigSingleImportForm.php
Hunk #6 succeeded at 366 (offset -1 lines).
patching file core/modules/config/src/Form/ConfigSync.php
Hunk #7 succeeded at 352 (offset -2 lines).
patching file core/modules/config/tests/src/Kernel/ConfigUninstallViaCliImportTest.php
patching file core/modules/content_translation/tests/src/Kernel/ContentTranslationConfigImportTest.php
patching file core/tests/Drupal/KernelTests/Core/Config/ConfigImportRecreateTest.php
patching file core/tests/Drupal/KernelTests/Core/Config/ConfigImportRenameValidationTest.php
patching file core/tests/Drupal/KernelTests/Core/Config/ConfigImporterMissingContentTest.php
patching file core/tests/Drupal/KernelTests/Core/Config/ConfigImporterTest.php
patching file core/tests/Drupal/KernelTests/Core/Entity/ContentEntityNullStorageTest.php
patching file core/tests/Drupal/Tests/ConfigTestTrait.php
aleevas’s picture

Assigned: Unassigned » aleevas
aleevas’s picture

Status: Needs work » Needs review
StatusFileSize
new18.76 KB
new18.76 KB
new1.26 KB

Kristen thank you for review.
I've tried to fix last patch.
Hope this one will be more fit

aleevas’s picture

Assigned: aleevas » Unassigned
kristen pol’s picture

Status: Needs review » Reviewed & tested by the community

Thanks for the update.

1) I see the change added for ConfigSingleImportForm.php per #10 (1)

2) I see the change added for OverriddenConfigImportTest.php per #10 (2)

3) The patch applies cleanly to 9.0 and 9.1:

[mac:kristen:drupal-9.0.x-dev]$ patch -p1 < 3017360-9.0-16_0.patch 
patching file core/includes/install.core.inc
patching file core/lib/Drupal/Core/Config/ConfigImporter.php
patching file core/modules/config/src/Form/ConfigSingleImportForm.php
patching file core/modules/config/src/Form/ConfigSync.php
patching file core/modules/config/tests/src/Kernel/ConfigUninstallViaCliImportTest.php
patching file core/modules/content_translation/tests/src/Kernel/ContentTranslationConfigImportTest.php
patching file core/modules/language/tests/src/Kernel/OverriddenConfigImportTest.php
patching file core/tests/Drupal/KernelTests/Core/Config/ConfigImportRecreateTest.php
patching file core/tests/Drupal/KernelTests/Core/Config/ConfigImportRenameValidationTest.php
patching file core/tests/Drupal/KernelTests/Core/Config/ConfigImporterMissingContentTest.php
patching file core/tests/Drupal/KernelTests/Core/Config/ConfigImporterTest.php
patching file core/tests/Drupal/KernelTests/Core/Entity/ContentEntityNullStorageTest.php
patching file core/tests/Drupal/Tests/ConfigTestTrait.php
[mac:kristen:drupal-9.1.x-dev]$ patch -p1 < 3017360-9.0-16_0.patch 
patching file core/includes/install.core.inc
patching file core/lib/Drupal/Core/Config/ConfigImporter.php
patching file core/modules/config/src/Form/ConfigSingleImportForm.php
Hunk #6 succeeded at 367 (offset 1 line).
patching file core/modules/config/src/Form/ConfigSync.php
Hunk #7 succeeded at 354 (offset 2 lines).
patching file core/modules/config/tests/src/Kernel/ConfigUninstallViaCliImportTest.php
patching file core/modules/content_translation/tests/src/Kernel/ContentTranslationConfigImportTest.php
patching file core/modules/language/tests/src/Kernel/OverriddenConfigImportTest.php
patching file core/tests/Drupal/KernelTests/Core/Config/ConfigImportRecreateTest.php
patching file core/tests/Drupal/KernelTests/Core/Config/ConfigImportRenameValidationTest.php
patching file core/tests/Drupal/KernelTests/Core/Config/ConfigImporterMissingContentTest.php
patching file core/tests/Drupal/KernelTests/Core/Config/ConfigImporterTest.php
patching file core/tests/Drupal/KernelTests/Core/Entity/ContentEntityNullStorageTest.php
patching file core/tests/Drupal/Tests/ConfigTestTrait.php

4) I reviewed the code and I realize there is a minor thing I didn't catch before.

  1. +++ b/core/lib/Drupal/Core/Config/ConfigImporter.php
    @@ -6,10 +6,10 @@
     use Drupal\Core\Extension\ModuleExtensionList;
     use Drupal\Core\Extension\ModuleHandlerInterface;
     use Drupal\Core\Extension\ModuleInstallerInterface;
    -use Drupal\Core\Extension\ThemeHandlerInterface;
     use Drupal\Core\Config\Entity\ImportableEntityStorageInterface;
     use Drupal\Core\DependencyInjection\DependencySerializationTrait;
     use Drupal\Core\Entity\EntityStorageException;
    +use Drupal\Core\Extension\ThemeInstallerInterface;
    

    The new line isn't grouped with the other Drupal\Core\Extension* lines but I see that it's alphabetical which is correct. This is probably ok since we aren't supposed to fix unrelated items in the patch.

  2. +++ b/core/modules/config/src/Form/ConfigSync.php
    @@ -10,8 +10,8 @@
     use Drupal\Core\Extension\ModuleExtensionList;
     use Drupal\Core\Extension\ModuleHandlerInterface;
     use Drupal\Core\Extension\ModuleInstallerInterface;
    -use Drupal\Core\Extension\ThemeHandlerInterface;
     use Drupal\Core\Config\ConfigManagerInterface;
    +use Drupal\Core\Extension\ThemeInstallerInterface;
    

    Same as above.

I don't see any issues and patch applies cleanly, so I'll mark this RTBC, but not sure how to test this manually.

alexpott’s picture

Status: Reviewed & tested by the community » Needs work

This change makes tonnes of sense but we need to do in a BC compatible manor. Which will be fun.

We need to

  1. +++ b/core/lib/Drupal/Core/Config/ConfigImporter.php
    @@ -184,14 +184,14 @@ class ConfigImporter {
    -   * @param \Drupal\Core\Extension\ThemeHandlerInterface $theme_handler
    -   *   The theme handler
    +   * @param \Drupal\Core\Extension\ThemeInstallerInterface $theme_installer
    +   *   The theme installer.
    

    I think we should make this change as that documents what we expect.

  2. +++ b/core/lib/Drupal/Core/Config/ConfigImporter.php
    @@ -184,14 +184,14 @@ class ConfigImporter {
    -  public function __construct(StorageComparerInterface $storage_comparer, EventDispatcherInterface $event_dispatcher, ConfigManagerInterface $config_manager, LockBackendInterface $lock, TypedConfigManagerInterface $typed_config, ModuleHandlerInterface $module_handler, ModuleInstallerInterface $module_installer, ThemeHandlerInterface $theme_handler, TranslationInterface $string_translation, ModuleExtensionList $extension_list_module) {
    +  public function __construct(StorageComparerInterface $storage_comparer, EventDispatcherInterface $event_dispatcher, ConfigManagerInterface $config_manager, LockBackendInterface $lock, TypedConfigManagerInterface $typed_config, ModuleHandlerInterface $module_handler, ModuleInstallerInterface $module_installer, ThemeInstallerInterface $theme_installer, TranslationInterface $string_translation, ModuleExtensionList $extension_list_module) {
    

    We need to remove the typehint completely here so we can accept both ThemeHandlerInterface and ThemeInstallInterface objects.

  3. +++ b/core/lib/Drupal/Core/Config/ConfigImporter.php
    @@ -200,7 +200,7 @@ public function __construct(StorageComparerInterface $storage_comparer, EventDis
    -    $this->themeHandler = $theme_handler;
    +    $this->themeInstaller = $theme_installer;
    

    Here we need to detect what $theme_installer is. If it is a ThemeInstallerInterface do the assignment. If it is a ThemeHandlerInterface get the theme installer service from \Drupal::service(). If it is never we should throw an \InvalidArgumentException()

andypost’s picture

Status: Needs work » Needs review
Issue tags: -Needs change record
StatusFileSize
new2.2 KB
new19.12 KB

Filed CR https://www.drupal.org/node/3133243

Also attempt to address #20

kristen pol’s picture

Assigned: Unassigned » kristen pol

Assigning to myself to review.

kristen pol’s picture

Assigned: kristen pol » Unassigned
Status: Needs review » Needs work

Thanks for the update.

1) Updated the change record slightly to improve "discoverability" and clarity:

ConfigImporter using theme installer service instead of handler

to

ConfigImporter using theme installer service instead of theme handler

2) Reviewed interdiff and see changes for #20.2 and #20.3 but some comments:

  1. +++ b/core/lib/Drupal/Core/Config/ConfigImporter.php
    @@ -191,7 +191,7 @@ class ConfigImporter {
    +  public function __construct(StorageComparerInterface $storage_comparer, EventDispatcherInterface $event_dispatcher, ConfigManagerInterface $config_manager, LockBackendInterface $lock, TypedConfigManagerInterface $typed_config, ModuleHandlerInterface $module_handler, ModuleInstallerInterface $module_installer, $theme_installer, TranslationInterface $string_translation, ModuleExtensionList $extension_list_module) {
    

    What about the docblock still using ThemeInstallerInterface?

       * @param \Drupal\Core\Extension\ThemeInstallerInterface $theme_installer
       *   The theme installer.
    
  2. +++ b/core/lib/Drupal/Core/Config/ConfigImporter.php
    @@ -200,6 +200,10 @@ public function __construct(StorageComparerInterface $storage_comparer, EventDis
         $this->moduleInstaller = $module_installer;
    +    if (!$theme_installer instanceof ThemeInstallerInterface) {
    +      @trigger_error('Calling ConfigImporter::__construct() without the $theme_installer argument is deprecated in drupal:9.1.0. The $theme_installer argument will be required in drupal:10.0.0. See https://www.drupal.org/node/3133243', E_USER_DEPRECATED);
    +      $theme_installer = \Drupal::service('theme_installer');
    +    }
    

    This doesn't cover:

    "If it is never we should throw an \InvalidArgumentException()".

    Also, I'm unclear if not using extra parentheses for the "not" (!) is the standard. I searched core and see both used though I find the use without parentheses confusing myself.

    A few examples:

    ./core/tests/Drupal/Tests/Core/Render/BubbleableMetadataTest.php:    if (!$b instanceof BubbleableMetadata) {
    ./core/lib/Drupal/Core/Database/database.api.php:  if (!($query instanceof SelectInterface)) {
    ./core/lib/Drupal/Core/Access/CheckProvider.php:      if (!($check instanceof AccessInterface)) {
    ./core/lib/Drupal/Core/Access/AccessManager.php:    if (!$service_access instanceof AccessResultInterface) {
    ./core/lib/Drupal/Core/Config/ConfigImporter.php:    if (!$theme_installer instanceof ThemeInstallerInterface) {
    ./core/lib/Drupal/Core/Config/ConfigImporter.php:      if (!($entity_storage instanceof ImportableEntityStorageInterface)) {
    ./core/lib/Drupal/Core/Config/ConfigImporter.php:    if (!($entity_storage instanceof ImportableEntityStorageInterface)) {
    ./core/lib/Drupal/Core/Config/Entity/ConfigEntityUpdater.php:      if (!($entity_type instanceof ConfigEntityTypeInterface)) {
    ./core/lib/Drupal/Core/Config/Schema/SchemaCheckTrait.php:      if (!$element instanceof TraversableTypedDataInterface) {
    ./core/lib/Drupal/Core/TypedData/Validation/RecursiveValidator.php:    if (!$typed_data instanceof TypedDataInterface) {
    ./core/lib/Drupal/Core/TypedData/Validation/TypedDataAwareValidatorTrait.php:    if (!$data instanceof TypedDataInterface) {
    ./core/lib/Drupal/Core/TypedData/Validation/RecursiveContextualValidator.php:    if (!$data instanceof TypedDataInterface) {
    

3) Patch applies cleanly.

[mac:kristen:drupal-9.1.x-dev]$ patch -p1 < 3133243-21.patch
patching file core/includes/install.core.inc
patching file core/lib/Drupal/Core/Config/ConfigImporter.php
patching file core/modules/config/src/Form/ConfigSingleImportForm.php
patching file core/modules/config/src/Form/ConfigSync.php
patching file core/modules/config/tests/src/Kernel/ConfigUninstallViaCliImportTest.php
patching file core/modules/content_translation/tests/src/Kernel/ContentTranslationConfigImportTest.php
patching file core/modules/language/tests/src/Kernel/OverriddenConfigImportTest.php
patching file core/tests/Drupal/KernelTests/Core/Config/ConfigImportRecreateTest.php
patching file core/tests/Drupal/KernelTests/Core/Config/ConfigImportRenameValidationTest.php
patching file core/tests/Drupal/KernelTests/Core/Config/ConfigImporterMissingContentTest.php
patching file core/tests/Drupal/KernelTests/Core/Config/ConfigImporterTest.php
patching file core/tests/Drupal/KernelTests/Core/Entity/ContentEntityNullStorageTest.php
patching file core/tests/Drupal/Tests/ConfigTestTrait.php

4) Tests pass.

5) Back to "Needs work" to possibly address any of #2 above.

andypost’s picture

Re #23.3 operator precedence in PHP is tricky but instanceof is higher priority then negate

kristen pol’s picture

Thanks but mainly I'm curious if core is standardizing on one style or the other because I see both in the codebase.

jungle’s picture

Re #25, I would vote for if (!($blah instanceof Foo)) with clear intention, other than if (!$blah instanceof Foo), If we are going to standardize it.

Yes, isntanceof has higher precedence than !, see https://www.php.net/manual/en/language.operators.precedence.php

kristen pol’s picture

Same with me if there was a push to standardize it (assuming there isn't a standard yet).

andypost’s picture

I see no reason to write extra confusing "()" if language dictate its rules.
It will just confuse people familiar with PHP and will provide wrong (but " more readable") examples in core

kristen pol’s picture

I'm not sure why you say it's "wrong" as it isn't technically wrong. Also, we weren't the only ones that said we prefer using the parentheses. (I asked in Slack.)

This is stylistic though, similar to using curly braces for clarity when they technically aren't required.

That said, I don't have a strong enough opinion to care which way it goes. What does bother me is when the code isn't consistent. :)

Leaving that logic as is seems fine but there are still a couple different items mentioned in #23 that could be addressed: 1) docblock question, and 2) exception that @alexpott requested. Thanks.

Version: 9.1.x-dev » 9.2.x-dev

Drupal 9.1.0-alpha1 will be released the week of October 19, 2020, which means new developments and disruptive changes should now be targeted for the 9.2.x-dev branch. For more information see the Drupal 9 minor version schedule and the Allowed changes during the Drupal 9 release cycle.

Version: 9.2.x-dev » 9.3.x-dev

Drupal 9.2.0-alpha1 will be released the week of May 3, 2021, which means new developments and disruptive changes should now be targeted for the 9.3.x-dev branch. For more information see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

Version: 9.3.x-dev » 9.4.x-dev

Drupal 9.3.0-rc1 was released on November 26, 2021, which means new developments and disruptive changes should now be targeted for the 9.4.x-dev branch. For more information see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

Version: 9.4.x-dev » 9.5.x-dev

Drupal 9.4.0-alpha1 was released on May 6, 2022, which means new developments and disruptive changes should now be targeted for the 9.5.x-dev branch. For more information see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

Version: 9.5.x-dev » 10.1.x-dev

Drupal 9.5.0-beta2 and Drupal 10.0.0-beta2 were released on September 29, 2022, which means new developments and disruptive changes should now be targeted for the 10.1.x-dev branch. For more information see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

Version: 10.1.x-dev » 11.x-dev

Drupal core is moving towards using a “main” branch. As an interim step, a new 11.x branch has been opened, as Drupal.org infrastructure cannot currently fully support a branch named main. New developments and disruptive changes should now be targeted for the 11.x branch, which currently accepts only minor-version allowed changes. For more information, see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

Version: 11.x-dev » main

Drupal core is now using the main branch as the primary development branch. New developments and disruptive changes should now be targeted to the main branch.

Read more in the announcement.