Problem/Motivation

Working on #2531564: Fix leaky and brittle container serialization solution it was found that some classes using settings as injected service which leads to issues when this objects are serialized

Steps to reproduce

\Drupal\Core\Cache\CacheFactory::$settings, \Drupal\Core\EventSubscriber\ExcludedModulesEventSubscriber::$settings and more

Proposed resolution

- stop using Settings object as service and declare public API to use it
- ensure runtime still fail when settings (like database) are serialized

Remaining tasks

- review patch with BC deprecations
- commit clean-up to 9.5 and 10.*
- deprecate in 10.1.x branch via #3307190: [PP-1] Deprecate settings service

User interface changes

no

API changes

Core's classes no longer accept settings service

Data model changes

no

Release notes snippet

no

CommentFileSizeAuthor
#65 3299828-nr-bot.txt147 bytesneeds-review-queue-bot
#53 3299828-52-10.patch46.52 KBandypost
#53 3299828-52-9.patch46.21 KBandypost
#53 interdiff.txt1.1 KBandypost
#49 interdiff.txt927 bytesandypost
#49 3299828-49-10.patch46.11 KBandypost
#49 3299828-49-9.patch45.8 KBandypost
#41 3299828-41-9.patch45.84 KBandypost
#41 3299828-41-10.patch46.33 KBandypost
#41 interdiff.txt5.03 KBandypost
#39 3299828-39-10.patch46.21 KBandypost
#39 3299828-39-9.patch45.73 KBandypost
#39 interdiff.txt1005 bytesandypost
#38 3299828-38-10.patch46.21 KBandypost
#38 3299828-38-9.patch45.73 KBandypost
#38 interdiff.txt743 bytesandypost
#35 3299828-35-9.patch45.73 KBandypost
#35 3299828-35-10.patch46.04 KBandypost
#35 interdiff.txt1.71 KBandypost
#34 3299828-33-10.patch45.19 KBandypost
#34 interdiff-10.txt5.79 KBandypost
#33 3299828-32-9.5.patch44.88 KBandypost
#33 interdiff.txt4.91 KBandypost
#32 3299828-31-9.5.patch44.87 KBandypost
#32 interdiff.txt5.79 KBandypost
#30 3299828-30-10.0.patch44.21 KBandypost
#28 3299828-28-9.5.patch43.9 KBandypost
#28 interdiff-9.5.txt2.42 KBandypost
#28 3299828-25-10.0.patch42.67 KBandypost
#28 interdiff.txt1.53 KBandypost
#25 3299828-25-10.0.patch42.67 KBandypost
#25 3299828-25-9.5.patch41.47 KBandypost
#25 interdiff.txt913 bytesandypost
#24 3299828-24-9.5.patch41.47 KBandypost
#22 3299828-22.patch41.78 KBandypost
#22 interdiff.txt554 bytesandypost
#20 3299828-20.patch41.45 KBandypost
#20 interdiff.txt504 bytesandypost
#19 3299828-19.patch41.18 KBandypost
#19 interdiff.txt1.18 KBandypost
#18 3299828-18.patch40.71 KBandypost
#18 interdiff.txt3.94 KBandypost
#15 3299828-15.patch36.76 KBandypost
#15 interdiff.txt802 bytesandypost
#14 3299828-14.patch36.67 KBandypost
#14 interdiff.txt2.85 KBandypost
#10 3299828-10.patch33.82 KBandypost
#10 interdiff.txt1.68 KBandypost
#9 3299828-9.patch33.41 KBandypost

Comments

andypost created an issue. See original summary.

longwave’s picture

I do wonder many how much of settings.php should really be container parameters, if we are to follow Symfony more closely. We have too many places to store configuration :)

e.g.

# $settings['http_client_config']['proxy']['http'] = 'http://proxy_user:proxy_pass@example.com:8080';
# $settings['http_client_config']['proxy']['https'] = 'http://proxy_user:proxy_pass@example.com:8080';
# $settings['http_client_config']['proxy']['no'] = ['127.0.0.1', 'localhost'];

This is only used in \Drupal\Core\Http\ClientFactory so could just be injected from the container.

Similarly the reverse proxy settings could be injected into the relevant services as container parameters, omit_vary_cookie is only used in one event subscriber, cache_ttl_4xx could even be config for the page_cache module, file_public_base_url could be injected into the PublicStream wrapper, etc.

andypost’s picture

Title: Stop storing Settings singleton in object properties » [META] Stop storing Settings singleton in object properties
Category: Bug report » Plan
Issue summary: View changes

I think it should be a plan, I bet it will need for child issues to fix cache backend factories and other places, and not sure it needs more tests to catch it

bradjones1’s picture

I do wonder many how much of settings.php should really be container parameters

IMO this is a case of older-school Drupalism that we've hung on to, far too long. In my custom (and contrib, when I'm writing greenfield) code, it's all container parameters all the time. Paired with a module like services_env_parameter, this works really well. The challenge is that Drupal has its own version of the Yaml parser (which I've filed some issues relating to, elsewhere) so setting parameters in a 12-factor way akin to what Symfony core provides is a blocker to sunsetting $settings. But it's for sure a noble cause.

andypost’s picture

wondered if env parameters can take over serialized into container defaults

I think #3061535: Add settings from settings.php to the container as parameters may land in 10.1.x only as a feature

andypost’s picture

andypost’s picture

Status: Active » Needs review
StatusFileSize
new33.41 KB

That's all usage I found

andypost’s picture

StatusFileSize
new1.68 KB
new33.82 KB

bit more clean-up

catch’s picture

  1. +++ b/core/lib/Drupal/Core/Cache/CacheFactory.php
    @@ -36,14 +29,11 @@ class CacheFactory implements CacheFactoryInterface, ContainerAwareInterface {
       /**
        * Constructs CacheFactory object.
        *
    -   * @param \Drupal\Core\Site\Settings $settings
    -   *   The site settings.
        * @param array $default_bin_backends
        *   (optional) A mapping of bin to backend service name. Mappings in
        *   $settings take precedence over this.
        */
    -  public function __construct(Settings $settings, array $default_bin_backends = []) {
    -    $this->settings = $settings;
    +  public function __construct(array $default_bin_backends = []) {
         $this->defaultBinBackends = $default_bin_backends;
       }
     
    

    We'd normally ask for a 'best effort' bc layer for changes like this, but this is a tricky one.

    Would have to:

    - remove the type hint
    - check if it's a Settings object
    - get $default_bin_backends using func_get_args() if not.

    Maybe we can grep contrib for CacheFactory to see if anything's inheriting from it, and if not just leave it?

    Some more similar ones like this where it's not the last argument.

  2. +++ b/core/lib/Drupal/Core/Cache/DatabaseBackendFactory.php
    @@ -35,15 +28,12 @@ class DatabaseBackendFactory implements CacheFactoryInterface {
        *
        * @throws \BadMethodCallException
        */
    -  public function __construct(Connection $connection, CacheTagsChecksumInterface $checksum_provider, Settings $settings = NULL) {
    +  public function __construct(Connection $connection, CacheTagsChecksumInterface $checksum_provider) {
         $this->connection = $connection;
         $this->checksumProvider = $checksum_provider;
    -    $this->settings = $settings ?: Settings::getInstance();
       }
     
    

    Ones like this on the other hand we can just ignore entirely since it's the last argument.

Status: Needs review » Needs work

The last submitted patch, 10: 3299828-10.patch, failed testing. View results

andypost’s picture

Issue summary: View changes

Re #11

1. http://codcontrib.hank.vps-private.net/search?text=CacheFactory&filename= there's some wrappers in contrib (devel webprofiler for ex)
2. I gonna make patch green, then add BC

andypost’s picture

StatusFileSize
new2.85 KB
new36.67 KB

Fix few tests, mostly all failed test are because of FileSystem service failed to be created

andypost’s picture

Status: Needs work » Needs review
StatusFileSize
new802 bytes
new36.76 KB

Added BC for FileSystem as I can't find why it's instantiated with wrong argument in installer

The last submitted patch, 14: 3299828-14.patch, failed testing. View results

Status: Needs review » Needs work

The last submitted patch, 15: 3299828-15.patch, failed testing. View results

andypost’s picture

Status: Needs work » Needs review
StatusFileSize
new3.94 KB
new40.71 KB

fixed remaining tests
now needs work for BC and fix for FileSystem service

andypost’s picture

StatusFileSize
new1.18 KB
new41.18 KB

fixed last place, if get green I will work on BC

andypost’s picture

StatusFileSize
new504 bytes
new41.45 KB

fix cs

andypost’s picture

+++ b/core/core.services.yml
@@ -201,12 +201,11 @@ services:
   cache.backend.chainedfast:
     class: Drupal\Core\Cache\ChainedFastBackendFactory
-    arguments: ['@settings']
...
   cache.backend.database:
     class: Drupal\Core\Cache\DatabaseBackendFactory
-    arguments: ['@database', '@cache_tags.invalidator.checksum', '@settings']
+    arguments: ['@database', '@cache_tags.invalidator.checksum']

@@ -468,7 +467,6 @@ services:
   queue:
     class: Drupal\Core\Queue\QueueFactory
-    arguments: ['@settings']

@@ -765,7 +763,6 @@ services:
   http_middleware.reverse_proxy:
     class: Drupal\Core\StackMiddleware\ReverseProxyMiddleware
-    arguments: ['@settings']

@@ -814,7 +811,6 @@ services:
   string_translator.custom_strings:
     class: Drupal\Core\StringTranslation\Translator\CustomStrings
-    arguments: ['@settings']

@@ -1475,7 +1471,6 @@ services:
   session_manager.metadata_bag:
     class: Drupal\Core\Session\MetadataBag
-    arguments: ['@settings']

+++ b/core/lib/Drupal/Core/Queue/QueueFactory.php
@@ -20,20 +20,6 @@ class QueueFactory implements ContainerAwareInterface {
-   */

+++ b/core/modules/config/src/Form/ConfigImportForm.php
@@ -45,13 +38,10 @@ class ConfigImportForm extends FormBase {
-  public function __construct(StorageInterface $config_storage, FileSystemInterface $file_system, Settings $settings) {
+  public function __construct(StorageInterface $config_storage, FileSystemInterface $file_system) {

+++ b/core/modules/system/system.services.yml
@@ -58,7 +58,7 @@ services:
   system.sa_fetcher:
     class: Drupal\system\SecurityAdvisories\SecurityAdvisoriesFetcher
-    arguments: ['@config.factory', '@keyvalue.expirable', '@http_client', '@extension.list.module', '@extension.list.theme', '@extension.list.profile', '@logger.channel.system', '@settings']
+    arguments: ['@config.factory', '@keyvalue.expirable', '@http_client', '@extension.list.module', '@extension.list.theme', '@extension.list.profile', '@logger.channel.system']

+++ b/core/modules/system/tests/modules/error_service_test/error_service_test.services.yml
@@ -1,7 +1,6 @@
   http_middleware.monkeys:
     class: Drupal\error_service_test\MonkeysInTheControlRoom
-    arguments: ['@settings']

+++ b/core/modules/update/update.services.yml
@@ -1,7 +1,6 @@
   access_check.update.manager_access:
     class: Drupal\update\Access\UpdateManagerAccessCheck
-    arguments: ['@settings']

@@ -12,7 +11,7 @@ services:
   update.fetcher:
     class: Drupal\update\UpdateFetcher
-    arguments: ['@config.factory', '@http_client', '@settings']
+    arguments: ['@config.factory', '@http_client']

This changes does not need BC so could be splitted off from that

andypost’s picture

StatusFileSize
new554 bytes
new41.78 KB

Filed CR to deprecate settings service, hope it possible for 9.5 https://www.drupal.org/node/3306646

andypost’s picture

andypost’s picture

StatusFileSize
new41.47 KB

patch for 9.5

needs
- BC for constructors
- deprecation test or separate issue for deprecation settings service
- split of changes without BC (OTOH it may need deprecation from settings service)

andypost’s picture

StatusFileSize
new913 bytes
new41.47 KB
new42.67 KB

One more fix found

The last submitted patch, 24: 3299828-24-9.5.patch, failed testing. View results

Status: Needs review » Needs work

The last submitted patch, 25: 3299828-25-10.0.patch, failed testing. View results

andypost’s picture

Status: Needs work » Needs review
StatusFileSize
new1.53 KB
new42.67 KB
new2.42 KB
new43.9 KB

a couple of more usages found

The last submitted patch, 28: 3299828-25-10.0.patch, failed testing. View results

andypost’s picture

StatusFileSize
new44.21 KB

fixed patch for 10.0

andypost’s picture

Here's BC added for 9.5

Now it needs postponed follow-up to deprecate according to

we could potentially just remove all uses of the settings service in 9.5.x, with the constructor deprecations, and then deprecate the service itself in 10.1.x for removal in 11. But... this could mean contrib issues with PHP 8.2 compatibility.

andypost’s picture

StatusFileSize
new5.79 KB
new44.87 KB
andypost’s picture

StatusFileSize
new4.91 KB
new44.88 KB

fixed version string, now need to remove deprecation (left to make sure tests passed

andypost’s picture

StatusFileSize
new5.79 KB
new45.19 KB

Filed follow-up #3307190: [PP-1] Deprecate settings service

Here's interdiff and patch for 10.0.x

andypost’s picture

StatusFileSize
new1.71 KB
new46.04 KB
new45.73 KB

Fix CS

andypost’s picture

Title: [META] Stop storing Settings singleton in object properties » Stop storing Settings singleton in object properties
Category: Plan » Task
Issue summary: View changes

Update title as IS

catch’s picture

(reviewing the 10.x patch).

The bc layers all look good to me.

Main question is this mismatch in the deprecation versions:

  1. +++ b/core/core.services.yml
    @@ -463,12 +462,12 @@ services:
       settings:
         class: Drupal\Core\Site\Settings
         factory: Drupal\Core\Site\Settings::getInstance
    +    deprecated: The "%service_id%" service is deprecated in drupal:9.5.0 and is removed from drupal:10.0.0. Use \Drupal\Core\Site\Settings instead. See https://www.drupal.org/node/3306646
       state:
         class: Drupal\Core\State\State
    

    This says deprecated in drupal:9.5.0 and removed in drupal:10.0.0

  2. +++ b/core/lib/Drupal/Core/Cache/CacheFactory.php
    @@ -36,14 +29,16 @@ class CacheFactory implements CacheFactoryInterface, ContainerAwareInterface {
    -    $this->settings = $settings;
    +  public function __construct($default_bin_backends = []) {
    +    if ($default_bin_backends instanceof Settings) {
    +      @trigger_error('The settings service should not be passed to ' . __METHOD__ . ' since drupal:9.5.0. The service will be removed in drupal:11.0.0. See https://www.drupal.org/node/3306646', E_USER_DEPRECATED);
    +      $args = func_get_args();
    +      $default_bin_backends = $args[1];
    +    }
    

    But this says deprecated in 9.5.0 and removed in 11.0.0.

We broadly have three options I think:

1. Deprecate in 9.5.0 and removed in 10.0.0 - disadvantage is it will potentially break modules that are already marked compatible with 10.0.x if they inject the service themselves or modify one of the services if we remove the constructor bc in 10.x

2. Deprecate in 10.1.x and remove in 11.0.0 (but with all the other service/constructor changes committed to 9.5.x) - less likely to break modules but also means that modules could end up with issues on PHP 8.2 and without any useful notice from us what the problem is.

3. Deprecate in 9.5.x for removal in 11.x - IMO this is the least worst option. Modules that are already compatible with 10.0.x won't break, they'll just get a new deprecation, everyone gets as much warning as possible about the change to help with PHP 8.2 compatibility. Also means least churn between 9.5 and 10.x just before beta.

Will ping other committers to get additional opinions too.

andypost’s picture

StatusFileSize
new743 bytes
new45.73 KB
new46.21 KB

I think the best is deprecate in 9.5 for 11.0 because it will give more time to clean-up and BC will work

andypost’s picture

StatusFileSize
new1005 bytes
new45.73 KB
new46.21 KB

fix typo

andypost’s picture

+++ b/core/core.services.yml
@@ -463,12 +462,12 @@ services:
+    deprecated: The "%service_id%" service is deprecated in drupal:9.5.0 and is removed from drupal:11.0.0. Use \Drupal\Core\Site\Settings instead. See https://www.drupal.org/node/3306646

+++ b/core/lib/Drupal/Core/Cache/CacheFactory.php
@@ -36,14 +29,16 @@ class CacheFactory implements CacheFactoryInterface, ContainerAwareInterface {
+      @trigger_error('The settings service should not be passed to ' . __METHOD__ . ' since drupal:9.5.0. The service will be removed in drupal:11.0.0. See https://www.drupal.org/node/3306646', E_USER_DEPRECATED);

+++ b/core/lib/Drupal/Core/Database/ReplicaKillSwitch.php
@@ -38,15 +29,18 @@ class ReplicaKillSwitch implements EventSubscriberInterface {
+      @trigger_error('The settings service should not be passed to ' . __METHOD__ . ' since drupal:9.5.0. The service will be removed in drupal:11.0.0. See https://www.drupal.org/node/3306646', E_USER_DEPRECATED);

+++ b/core/lib/Drupal/Core/EventSubscriber/ExcludedModulesEventSubscriber.php
@@ -40,14 +34,16 @@ final class ExcludedModulesEventSubscriber implements EventSubscriberInterface {
+      @trigger_error('The settings service should not be passed to ' . __METHOD__ . ' since drupal:9.5.0. The service will be removed in drupal:11.0.0. See https://www.drupal.org/node/3306646', E_USER_DEPRECATED);

+++ b/core/lib/Drupal/Core/File/FileSystem.php
@@ -58,14 +50,16 @@ class FileSystem implements FileSystemInterface {
+      @trigger_error('The settings service should not be passed to ' . __METHOD__ . ' since drupal:9.5.0. The service will be removed in drupal:11.0.0. See https://www.drupal.org/node/3306646', E_USER_DEPRECATED);

+++ b/core/modules/language/src/LanguageNegotiator.php
@@ -79,16 +71,18 @@ class LanguageNegotiator implements LanguageNegotiatorInterface {
+      @trigger_error('The settings service should not be passed to ' . __METHOD__ . ' since drupal:9.5.0. The service will be removed in drupal:11.0.0. See https://www.drupal.org/node/3306646', E_USER_DEPRECATED);

maybe message could be improved, we have no standard about constructor messages

andypost’s picture

StatusFileSize
new5.03 KB
new46.33 KB
new45.84 KB

better wording

catch’s picture

Latest wording looks good to me for the constructor deprecations.

andypost’s picture

del

andypost’s picture

what's left here for RTBC?

kristen pol’s picture

Tagging

longwave’s picture

@andypost what are the actual issues with having this as a service? The IS doesn't explain, and the parent issue just says "after PM discussion with chx" but doesn't give an explanation either that I can see.

How does the BC promise work if we are removing arguments? If someone has subclassed one of these services and swapped it in, and then relies on @settings being passed in, or $this->settings being set correctly, what happens?

Also if we are going to convert settings to container parameters, I wonder if we should be removing the constructor arguments here, as maybe we could switch @settings for %some_container_parameter%? In that case maybe we should pass NULL in instead for now?

longwave’s picture

Status: Needs review » Needs work
  1. +++ b/core/modules/system/src/SecurityAdvisories/SecurityAdvisoriesFetcher.php
    @@ -311,7 +301,8 @@ protected function isApplicable(SecurityAdvisory $sa): bool {
    +    $withHttpFallback = Settings::get('update_fetch_with_http_fallback', FALSE);
    

    This variable should be snake_case (or just inline it into the if statement).

  2. +++ b/core/phpstan-baseline.neon
    @@ -1483,11 +1483,6 @@ parameters:
    diff --git a/core/phpstan-baseline.neon b/core/phpstan-baseline.neon.orig
    
    diff --git a/core/phpstan-baseline.neon b/core/phpstan-baseline.neon.orig
    similarity index 100%
    
    similarity index 100%
    copy from core/phpstan-baseline.neon
    
    copy from core/phpstan-baseline.neon
    copy to core/phpstan-baseline.neon.orig
    

    This shouldn't be in the patch.

andypost’s picture

@longwave I only recall test of ConfigImportForm which said serialisation of settings (in ignore issue)
Otoh maybe it's because of incomplete serviceId issue fix

At lest 3 tests been fixed

andypost’s picture

Status: Needs work » Needs review
StatusFileSize
new45.8 KB
new46.11 KB
new927 bytes

fixed #47

Still not sure passing NULL is good idea, anyway primary focus is on hard blocker #2531564: Fix leaky and brittle container serialization solution

andypost’s picture

@longwave one more test to catch it is \Drupal\FunctionalTests\Bootstrap\UncaughtExceptionTest::testMissingDependencyCustomErrorHandler

catch’s picture

Status: Needs review » Needs work
+++ b/core/lib/Drupal/Core/Cache/ChainedFastBackendFactory.php
@@ -44,10 +42,10 @@ class ChainedFastBackendFactory implements CacheFactoryInterface {
    */
-  public function __construct(Settings $settings = NULL, $consistent_service_name = NULL, $fast_service_name = NULL) {
+  public function __construct($consistent_service_name = NULL, $fast_service_name = NULL) {
     // Default the consistent backend to the site's default backend.
     if (!isset($consistent_service_name)) {
-      $cache_settings = isset($settings) ? $settings->get('cache') : [];
+      $cache_settings = Settings::get('cache', []);
       $consistent_service_name = $cache_settings['default'] ?? 'cache.backend.database';
     }

This looks like it also needs the func_get_args() treatment.

Apart from that, all looks great.

alexpott’s picture

If we did #3061535: Add settings from settings.php to the container as parameters first then we'd have way less constructor change. Because we could then use this issue to properly inject the container parameters.

andypost’s picture

Status: Needs work » Needs review
StatusFileSize
new1.1 KB
new46.21 KB
new46.52 KB

Fixed #51

catch’s picture

I'm not sure about #3061535: Add settings from settings.php to the container as parameters at least in its current state:

- has to special case hash_salt to avoid it getting written to the database, but there can be similar custom/contrib settings you might also not want to get into the db.

- it's not impossible that people put downright strange things into $settings that would break.

longwave’s picture

I think we have two possible approaches here:

  1. Keep settings.php in its current form and inject all (or almost all) settings into the container automatically
  2. Manually convert each setting into a separate container parameter and slowly deprecate (most of?) settings.php entirely

Not sure which is the best route.

longwave’s picture

Given that Symfony has explicit support for injecting environment vars as container parameters, and also when dumping a container it can dump the original reference to the env var name (instead of the env var value), we could leverage or duplicate this technique for injecting settings variables?

See https://github.com/symfony/dependency-injection/blob/c1831682d0a02ee2ce0...

andypost’s picture

+1 to convert partially settings to parameter because some contrib (redis for ex) still require additional settings

I think we should get rid of settings service anyway

Re #56 env vars should never contain secrets that's why we use settings.php (hash salt, file/config path)

Also db-connection settings could be tricky because of BC for prefixes

andypost’s picture

wim leers’s picture

I just learned that the Drupal 10 beta will likely be held up over this. So I'm trying to find my bearings.

I think it'd be helpful if somebody who's familiar with this area could suggest concrete next steps. I'm also fine with @catch and @alexpott as core committers simply deciding a direction given the very narrow timeframe before Drupal 10 beta.

andypost’s picture

I'm coming to DrupalConEur let's get consensus here)

longwave’s picture

Discussed this with @alexpott at Drupalcon. We talked about a number of issues:

  1. settings.php sometimes contains dynamic code, often to set something based on the environment. Modern web applications generally just inject environment variables to handle this, e.g via .env or into a container, so we should ensure that Symfony's container parameter injection can work in Drupal.
  2. services.yml files need to declare all child parameters inside a top level key. Ideally we would have a way of providing a fallback/default, allowing contrib to augment parameters, and then allowing the site owner to override these further in their site settings.yml. But merging YAML is non trivial, there is no easy way to remove keys, etc. - this is a difficult problem to solve.
  3. We should review all existing uses of Settings::get(), look at converting some of the easier ones to container parameters, and adding a deprecation layer where we can inform users of where to migrate their settings to.

@andypost we will be in the contribution room for most of today if you want to discuss this!

andypost’s picture

Version: 10.0.x-dev » 10.1.x-dev
Issue tags: -Drupal 10 beta should-have

I bet it 10.1 material as task

andypost’s picture

I don't think we should block the issue on environment variables as this approach considered as insecure in cloud based infra because it exposes secrets to all processes in containers.

This issue is just a clean-up and complimentary to #2443351: Ensure that settings can't be serialized by not injecting them / replace stuff with container parameters.

Moreover Settings contain secrets and errors in code may expose its properties in backtraces, so security++

needs-review-queue-bot’s picture

Status: Needs review » Needs work
StatusFileSize
new147 bytes

The Needs Review Queue Bot tested this issue. It either no longer applies to Drupal core, or fails the Drupal core commit checks. Therefore, this issue status is now "Needs work".

Apart from a re-roll or rebase, this issue may need more work to address feedback in the issue or MR comments. To progress an issue, incorporate this feedback as part of the process of updating the issue. This helps other contributors to know what is outstanding.

Consult the Drupal Contributor Guide to find step-by-step guides for working with issues.

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.