Problem/Motivation

Currently the notification of entity type creation/deletion is hard-coded in the module handler. The reason is that this needs happen right after module schema has been installed, but before hook_install is called.

Proposed resolution

Introduce an event to which the Entity Manager can subscribe and react and decouple the module handler from the entity manager.

Remaining tasks

  • Agree on the solution
  • Write a patch
  • Reviews

User interface changes

None

API changes

None

CommentFileSizeAuthor
#76 2350111-76.patch15.02 KBjofitz
#76 interdiff-75-76.txt5.04 KBjofitz
#75 2350111-75.patch14.69 KBjofitz
#69 2350111-67.patch14.71 KBjibran
#69 interdiff-d00b80.txt3.83 KBjibran
#69 rebase-2350111-54.txt5.1 KBjibran
#61 2350111_61.patch7.38 KBsaltednut
#54 interdiff.txt1005 bytessaltednut
#54 2350111_54.patch14.89 KBsaltednut
#46 2350111_46.patch14.6 KBMile23
#34 interdiff-2350111-32-34.txt411 bytesmartin107
#34 drupal_2350111_34.patch14.61 KBmartin107
#32 drupal_2350111_32.patch14.68 KBXano
#32 interdiff.txt9.18 KBXano
#30 interdiff.txt10.52 KBtimmillwood
#30 introduce_an_event_to-2350111-30.patch14.59 KBtimmillwood
#27 2350111-27.patch15.95 KBdawehner
#20 interdiff.txt950 bytesdawehner
#20 2350111-20.patch14.73 KBdawehner
#18 interdiff.txt913 bytesdawehner
#18 2350111-18.patch14.69 KBdawehner
#16 interdiff.txt1.59 KBdawehner
#16 2350111-16.patch14.69 KBdawehner
#14 interdiff.txt4.11 KBdawehner
#14 2350111-14.patch15.04 KBdawehner
#12 2350111-12.patch13.26 KBdawehner
#12 interdiff.txt1.81 KBdawehner
#9 interdiff.txt867 bytesdawehner
#9 2350111-9.patch12.88 KBdawehner
#7 interdiff.txt2.24 KBdawehner
#7 2350111-7.patch12.59 KBdawehner
#4 2350111-4.patch11.74 KBdawehner
Support from Acquia helps fund testing for Drupal Acquia logo

Comments

plach’s picture

Title: Introduce a post_schema_install event to decouple module handler and the entity managerIntroduce an event to decouple the module handler from the entity manager » Introduce an event to decouple the module handler from the entity manager
plach’s picture

Issue summary: View changes
Issue tags: +API addition
tim.plunkett’s picture

Version: 8.0.x-dev » 8.1.x-dev

+1, #2561639: Wrong placeholder for exception shown when new fields are created during module installation was very strange to see entity field code directly in ModuleInstaller

dawehner’s picture

Status: Active » Needs review
FileSize
11.74 KB

Let's see how much breaks

Status: Needs review » Needs work

The last submitted patch, 4: 2350111-4.patch, failed testing.

tim.plunkett’s picture

  1. +++ b/core/core.services.yml
    @@ -544,6 +544,11 @@ services:
    +    arguments: ['@entity_type.manager', '@entity_field.manager', '@entity.definition_update_manager']
    
    +++ b/core/lib/Drupal/Core/EventSubscriber/ModuleInstallerEntitySubscriber.php
    @@ -0,0 +1,121 @@
    +class ModuleInstallerEntitySubscriber implements EventSubscriberInterface {
    

    Missing a constructor. Also, from what I remember, pulling each service from the container during each loop was important when installing a module that adds new entity types.

  2. +++ b/core/lib/Drupal/Core/EventSubscriber/ModuleInstallerEntitySubscriber.php
    @@ -0,0 +1,121 @@
    +  public function onModuleUnInstall(ModuleEvent $event) {
    

    onModuleUninstall

Also, isn't there a preUninstall portion too?

dawehner’s picture

Status: Needs work » Needs review
FileSize
12.59 KB
2.24 KB

So there is currently:

        $this->moduleHandler->invokeAll('module_preinstall', array($module));
        $this->moduleHandler->invoke($module, 'install');
      $this->moduleHandler->invokeAll('modules_installed', array($modules_installed));

so I guess we would have also pre, and after ideally?

Status: Needs review » Needs work

The last submitted patch, 7: 2350111-7.patch, failed testing.

dawehner’s picture

Status: Needs work » Needs review
FileSize
12.88 KB
867 bytes

There we go.

dawehner’s picture

Patch still applies. Anyone interested in a review exchance?

tim.plunkett’s picture

+++ b/core/lib/Drupal/Core/Extension/ModuleInstaller.php
@@ -212,36 +212,10 @@ public function install(array $module_list, $enable_dependencies = TRUE) {
+        $event_dispatcher = $this->kernel->getContainer()->get('event_dispatcher');

@@ -383,31 +357,10 @@ public function uninstall(array $module_list, $uninstall_dependents = TRUE) {
+      $event_dispatcher = $this->kernel->getContainer()->get('event_dispatcher');

$this->kernel->getContainer()?!
Why can't the event dispatcher be injected? If it's for a good reason, we should probably have a comment here so no one tries to inject it later.

dawehner’s picture

Good point!

znerol’s picture

There is ModuleInstaller::updateKernel() which is supposed to refresh dependencies injected into ModuleInstaller. Therefore it should be safe to inject the event dispatcher dependency and reuse the existing mechanism to refresh its reference where appropriate.

dawehner’s picture

Good point!

amateescu’s picture

+++ b/core/lib/Drupal/Core/Extension/ModuleInstaller.php
@@ -212,7 +223,8 @@ public function install(array $module_list, $enable_dependencies = TRUE) {
-        $event_dispatcher = $this->getEventDispatcher();
...
+        $event_dispatcher = $this->kernel->getContainer()->get('event_dispatcher');
...
         $event_dispatcher->dispatch(ModuleEvents::MODULE_INSTALLED, $event);

Hmm, is there any reason for not using the injected event dispatcher? Wasn't that the whole point of the change in #14? :)

dawehner’s picture

Ups, you are totally right.

amateescu’s picture

+++ b/core/lib/Drupal/Core/EventSubscriber/ModuleInstallerEntitySubscriber.php
@@ -0,0 +1,137 @@
+  public function onModuleUninstall(ModuleEvent $event) {
...
+        // The module being installed may be adding new fields to existing

I know this is just moved code but the comment here is wrong, we're in the "uninstall" part of the code :)

dawehner’s picture

I know this is just moved code but the comment here is wrong, we're in the "uninstall" part of the code :)

Sure, let's fix that.

amateescu’s picture

Status: Needs review » Reviewed & tested by the community
+++ b/core/lib/Drupal/Core/Extension/ModuleEvent.php
@@ -0,0 +1,41 @@
+   * The installed / uninstall module.
+   *
+   * @var string
+   */
+  protected $module;
...
+   * Returns the installed / uninstall module.
+   *
+   * @return string

Should we mention that this is actually the (machine) name of the module being installed / uninstalled?

Can't find anything else to complain about so let's do this :)

dawehner’s picture

Should we mention that this is actually the (machine) name of the module being installed / uninstalled?

Sure, we can do that.

tim.plunkett’s picture

+1 for RTBC, thanks @znerol for pointing out the ModuleInstaller::updateKernel() bit!

Status: Reviewed & tested by the community » Needs work

The last submitted patch, 20: 2350111-20.patch, failed testing.

tim.plunkett’s picture

Status: Reviewed & tested by the community » Needs work

The last submitted patch, 20: 2350111-20.patch, failed testing.

Version: 8.1.x-dev » 8.2.x-dev

Drupal 8.1.0-beta1 was released on March 2, 2016, which means new developments and disruptive changes should now be targeted against the 8.2.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

dawehner’s picture

Title: Introduce an event to decouple the module handler from the entity manager » Introduce an event to decouple the module installer from the entity manager
dawehner’s picture

Status: Needs work » Needs review
FileSize
15.95 KB

Let's try it again.

tim.plunkett’s picture

+++ b/core/core.services.yml
@@ -479,7 +479,7 @@ services:
-    arguments: ['@app.root', '@module_handler', '@kernel', '@config.factory', '@config.installer', '@plugin.cache_clearer', '@router.builder', '@stream_wrapper_manager', '@theme_handler', '@logger.channel.system', '@config.manager', '@keyvalue']
+    arguments: ['@app.root', '@module_handler', '@kernel', '@config.factory', '@config.installer', '@plugin.cache_clearer', '@router.builder', '@stream_wrapper_manager', '@theme_handler', '@logger.channel.system', '@config.manager', '@keyvalue', '@event_dispatcher']

+++ b/core/lib/Drupal/Core/Extension/ModuleInstaller.php
@@ -306,36 +317,8 @@ public function install(array $module_list, $enable_dependencies = TRUE) {
-        $entity_manager = \Drupal::entityManager();
-        $update_manager = \Drupal::entityDefinitionUpdateManager();

@@ -489,31 +472,8 @@ public function uninstall(array $module_list, $uninstall_dependents = TRUE) {
-      $update_manager = \Drupal::entityDefinitionUpdateManager();

Was wondering why we only add dependencies and not remove them, but I see we're removing \Drupal:: calls.

Are any of these other services viable to remove in this patch, or is that a follow-up?

Status: Needs review » Needs work

The last submitted patch, 27: 2350111-27.patch, failed testing.

timmillwood’s picture

Status: Needs work » Needs review
FileSize
14.59 KB
10.52 KB

Status: Needs review » Needs work

The last submitted patch, 30: introduce_an_event_to-2350111-30.patch, failed testing.

Xano’s picture

Status: Needs work » Needs review
FileSize
9.18 KB
14.68 KB

I fixed at least one test failure in CommentLanguageTest (and likely some others as well), and improved some docblocks.

timmillwood’s picture

Status: Needs review » Reviewed & tested by the community

Awesome @Xano!

martin107’s picture

Status: Reviewed & tested by the community » Needs review
FileSize
14.61 KB
411 bytes

Nothing significant, just removing a final stray @file tag

dawehner’s picture

Status: Needs review » Reviewed & tested by the community

Back to RTBC

Status: Reviewed & tested by the community » Needs work

The last submitted patch, 34: drupal_2350111_34.patch, failed testing.

jibran’s picture

Status: Needs work » Reviewed & tested by the community

Status: Reviewed & tested by the community » Needs work

The last submitted patch, 34: drupal_2350111_34.patch, failed testing.

The last submitted patch, 34: drupal_2350111_34.patch, failed testing.

The last submitted patch, 34: drupal_2350111_34.patch, failed testing.

The last submitted patch, 34: drupal_2350111_34.patch, failed testing.

daffie’s picture

Status: Needs work » Reviewed & tested by the community

The testbot failures are the same as those of the daily automatic testing. So back to RTBC.

daffie’s picture

Status: Reviewed & tested by the community » Needs work

My mistake: no failures with the daily automatic testing.

dawehner’s picture

Status: Needs work » Reviewed & tested by the community

Patch was green already.

Added a change record in the meantime.

Status: Reviewed & tested by the community » Needs work

The last submitted patch, 34: drupal_2350111_34.patch, failed testing.

Mile23’s picture

Status: Needs work » Needs review
FileSize
14.6 KB

Reroll of #34.

dawehner’s picture

Status: Needs review » Reviewed & tested by the community

RE-RTBC as of previous RTBCs

alexpott’s picture

Status: Reviewed & tested by the community » Needs work

We need to refresh the event dispatcher because if a module was being installed as part of a loop and listened to this event it wouldn't have it fired. See \Drupal\Core\Extension\ModuleInstaller::updateKernel()

There was an issue somewhere to add a trait to do this.

dawehner’s picture

Version: 8.2.x-dev » 8.3.x-dev

Drupal 8.2.0-beta1 was released on August 3, 2016, which means new developments and disruptive changes should now be targeted against the 8.3.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

saltednut’s picture

+++ b/core/lib/Drupal/Core/Extension/ModuleEvents.php
@@ -0,0 +1,17 @@
+  const MODULE_UNINSTALLED = 'core.modules.unstalled';

*uninstalled ?

saltednut’s picture

We need to refresh the event dispatcher...

Happy to work on this with a little more direction.

saltednut’s picture

+++ b/core/lib/Drupal/Core/EventSubscriber/ModuleInstallerEntitySubscriber.php
@@ -0,0 +1,149 @@
+use Drupal\Core\Extension\ModuleEvents;

This use statement is repeated.

My mistake. Patch addressing maintainer concerns forthcoming.

saltednut’s picture

Status: Needs work » Needs review
FileSize
14.89 KB
1005 bytes

Patch addresses #48 and #51

saltednut’s picture

I am seeing some memory errors when I run a site install using #54 - removing the $this->eventDispatcher = $container->get('event_dispatcher'); added resolves this, so maybe something else needs to be done?

saltednut’s picture

I am not certain this will work correctly with the UI-based installer, at least based on some testing we have done using this patch and the new event in the config_rewrite project. Do we currently have tests for the installer that ensure events are triggered?

Wim Leers’s picture

How does #54 address #48? Is the interdiff incomplete?

Wim Leers’s picture

+++ b/core/lib/Drupal/Core/EventSubscriber/ModuleInstallerEntitySubscriber.php
+++ b/core/lib/Drupal/Core/Extension/ModuleEvent.php

Why are these specific to modules — why are they not generic across all types of extensions?


I am seeing some memory errors when I run a site install using #54

The only thing I can think of is that this is somehow triggering a recursive loop, perhaps due to some PHP error that is caught/handled in a certain way. Have you already checked the PHP error log?

dawehner’s picture

Why are these specific to modules — why are they not generic across all types of extensions?

Well, at least as of now a module installation is a completly separate process to theme installation, like a container rebuild just happens on a module rebuild, sure that's worth to consider though.

Version: 8.3.x-dev » 8.4.x-dev

Drupal 8.3.0-alpha1 will be released the week of January 30, 2017, which means new developments and disruptive changes should now be targeted against the 8.4.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Status: Needs review » Needs work

The last submitted patch, 61: 2350111_61.patch, failed testing.

saltednut’s picture

Status: Needs work » Needs review

Testbot seems suspect. See results, need a manual review here if someone can run the tests locally.

https://www.drupal.org/pift-ci-job/600858

Mile23’s picture

You can restart the test run with the 'Add test/retest' link.

Doing that now.

Status: Needs review » Needs work

The last submitted patch, 61: 2350111_61.patch, failed testing.

saltednut’s picture

Thanks, Paul! It looks like its still having issues. Is there something we can do?

saltednut’s picture

There is a periodic failure on some environments, but not all:

The cache entry expiry time uses the cache_ttl_4xx setting. Expire: 1485617538 Created: 1485613944.835

Otherwise, there are instances of PHP 5.6 & MySQL 5.5 CI error

I am not sure how to address either of these issues with the testbot, but it seems strange the bot failing for *any* reason would immediately mark the issue as needs work.

I will not flip it back to Needs Review, but there is nothing in the test results that tells me the patch is the source of CI errors or random cache expiry time problems.

Version: 8.4.x-dev » 8.5.x-dev

Drupal 8.4.0-alpha1 will be released the week of July 31, 2017, which means new developments and disruptive changes should now be targeted against the 8.5.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

jibran’s picture

I realize that we don't need tests for event subscriber so removing the tag.

Other than the discussion on #59 I don't think anything else is pending.

Do we need profiling here?

Version: 8.5.x-dev » 8.6.x-dev

Drupal 8.5.0-alpha1 will be released the week of January 17, 2018, which means new developments and disruptive changes should now be targeted against the 8.6.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

jibran’s picture

Anyone up for review.

phenaproxima’s picture

Status: Needs review » Needs work

Looks pretty good to me. Nice work, @jibran et. al!

  1. +++ b/core/core.services.yml
    @@ -502,7 +502,7 @@ services:
    -    arguments: ['@app.root', '@module_handler', '@kernel', '@router.builder']
    +    arguments: ['@app.root', '@module_handler', '@kernel', '@event_dispatcher']
    

    Why was the router builder removed?

  2. +++ b/core/lib/Drupal/Core/EventSubscriber/ModuleInstallerEntitySubscriber.php
    @@ -0,0 +1,159 @@
    +  /**
    +   * Gets the entity definition update manager.
    +   *
    +   * The manager is retrieved dynamically, because the container is rebuilt
    +   * after module installation.
    +   *
    +   * @return \Drupal\Core\Entity\EntityFieldManagerInterface
    +   *   The entity definition update manager.
    +   */
    +  protected function getEntityFieldManager() {
    +    return $this->kernel->getContainer()->get('entity_field.manager');
    +  }
    

    The doc comment is inaccurate :)

  3. +++ b/core/lib/Drupal/Core/EventSubscriber/ModuleInstallerEntitySubscriber.php
    @@ -0,0 +1,159 @@
    +      if ($entity_type->getProvider() == $module) {
    

    Should probably use === here, and in other similar comparisons.

  4. +++ b/core/lib/Drupal/Core/Extension/ModuleEvent.php
    @@ -0,0 +1,39 @@
    +  /**
    +   * Constructs a new instance.
    +   *
    +   * @param string $module
    +   *   The module's machine name.
    +   */
    +  public function __construct($module) {
    +    $this->module = $module;
    +  }
    

    Is it possible to pass the entire Extension object, rather than just the name? If not, can we rename getModule() to getModuleName(), for clarity's sake?

  5. +++ b/core/lib/Drupal/Core/Extension/ModuleEvents.php
    @@ -0,0 +1,17 @@
    +  /**
    +   * This event is fired when modules are installed.
    +   */
    +  const MODULE_INSTALLED = 'core.modules.installed';
    +
    +  /**
    +   * This event is fired when modules are uninstalled.
    +   */
    +  const MODULE_UNINSTALLED = 'core.modules.uninstalled';
    

    Don't these doc comments need @Event? I've seen that elsewhere in core...

I would normally say this needs tests, but this is the sort of deep change that would break just about every single test in core if it didn't work...so honestly, I feel pretty good about it.

voleger’s picture

Issue tags: +Needs reroll
jofitz’s picture

Issue tags: -Needs reroll
FileSize
14.69 KB

Re-roll.

Now to address #73...

jofitz’s picture

Status: Needs work » Needs review
FileSize
5.04 KB
15.02 KB
  1. I suspect route builder was removed because it is redundant, it should have been deleted as art of #2380293: Properly inject services into ModuleInstaller. Technically it is beyond the scope of this ticket, but I see no harm in removing it.
  2. Corrected the comment.
  3. Replaced == with ===.
  4. The module object is not available, it is just the name that is being passed around, so changed the function to getModuleName().
  5. Added @Event to comment.
phenaproxima’s picture

Status: Needs review » Reviewed & tested by the community

Thanks, @Jo Fitzgerald.

This one seems extremely straightforward. The fact that the tests all pass with it solidly proves that it works, given how foundational the module installer is to the proper functioning of Drupal.

I see no reason to hold off on RTBC.

alexpott’s picture

Status: Reviewed & tested by the community » Needs work
+++ b/core/lib/Drupal/Core/EventSubscriber/ModuleInstallerEntitySubscriber.php
@@ -0,0 +1,159 @@
+    $this->kernel = $kernel;
...
+   * The manager is retrieved dynamically, because the container is rebuilt
+   * after module installation.
...
+    return $this->kernel->getContainer()->get('entity.definition_update_manager');

This kinda feels wrong and problematic. If we can't do proper injection this event is going to be fraught with trickiness. For example what happens if a module has a service that is subscribed to this event. Does it fire on its own install. Does it fire on its own uninstall? There's no test coverage of these type of complexities and there needs to be.

dawehner’s picture

+++ b/core/lib/Drupal/Core/EventSubscriber/ModuleInstallerEntitySubscriber.php
@@ -0,0 +1,159 @@
+  /**
+   * The application kernel to retrieve the rebuilt service container from.
+   *
+   * @var \Drupal\Core\DrupalKernelInterface
+   */
+  protected $kernel;
+

This feels fishy. I see there is code inside the module installer (at the end) to update the event subscriber, so shouldn't this allow stuff to continue working without having to go through the kernel? I could imagine people would make a lot of mistakes when they just inject services normally, instead of injecting the kernel. Did someone do the research to understand that this is the only possible option?

dawehner’s picture

+++ b/core/lib/Drupal/Core/Extension/ModuleEvent.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Drupal\Core\Extension;
+
+use Symfony\Component\EventDispatcher\Event;
+
+/**
+ * Describes a module-related event.
+ */
+class ModuleEvent extends Event {
+
+  /**
+   * The module's machine name.
+   *
+   * @var string
+   */
+  protected $module;
+
+  /**
+   * Constructs a new instance.
+   *
+   * @param string $module
+   *   The module's machine name.
+   */
+  public function __construct($module) {
+    $this->module = $module;
+  }
+
+
+  /**
+   * Returns the module's machine name.
+   *
+   * @return string
+   */
+  public function getModuleName() {
+    return $this->module;
+  }
+
+}

#2206347: Use event system in ModuleHandler, which is essential a duplicate, had a ExtensionEvent. I think this would be a good idea, given all of them could share that.

jibran’s picture

#2206347: Use event system in ModuleHandler is old but still relevant here. I think we should resocpe #2206347 and postpone on this. Once the events are in we can remove the cache bin code from ModuleInstaller as well.

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

Drupal 8.6.0-alpha1 will be released the week of July 16, 2018, which means new developments and disruptive changes should now be targeted against the 8.7.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.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.

saltednut’s picture

I'd like to see this continue somehow but I believe doing this on the extension level is the best approach? It'd be really good if install profiles, themes and modules all acted pretty much the same way and fired similar events during installation and otherwise.

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.

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

Drupal 8.9.0-beta1 was released on March 20, 2020. 8.9.x is the final, long-term support (LTS) minor release of Drupal 8, which means new developments and disruptive changes should now be targeted against the 9.1.x-dev branch. For more information see the Drupal 8 and 9 minor version schedule and the Allowed changes during the Drupal 8 and 9 release cycles.

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.