Problem/Motivation

The base: scheme is specifically intended for internal, base-relative, non-routed URLs used in code, e.g. base:robots.txt. There are 70-80 non-documentation uses in core. In some of these cases, it's unclear why base: is used (vs. a route, entity:, user-path:, etc.)

Proposed resolution

Review all the uses. In each case, evaluate whether it actually must be base:, and if so, document why.

Beta phase evaluation

Reference: https://www.drupal.org/core/beta-changes
Unfrozen changes Unfrozen because only documentation should be changed in this issue. (Individual child issues may be bugs, etc.)

Remaining tasks

For each use:

  • Review it and determine if a route, entity URI, or user-entered URI is appropriate instead, or if there's a different usecase.
  • If it should indeed be base:, document why.
  • If it should be something, else, file a separate issue to fix it.

User interface changes

None.

API changes

None.

CommentFileSizeAuthor
#11 base-082a601.txt12.19 KBmpdonadio

Comments

xjm’s picture

Issue summary: View changes
xjm’s picture

Issue summary: View changes
xjm’s picture

Issue summary: View changes
xjm’s picture

Here are the instances of the string in PHP files in core:

[mandelbrot:core | Sun 11:53:56] $ grep -r "\bbase:" * | grep -v "vendor"| grep "php"
includes/common.inc: * $installer_url = \Drupal\Core\Url::fromUri('base:core/install.php')->toString();
includes/common.inc: * $installer_url = \Drupal\Core\Url::fromUri('base:core/install.php')->toString();
includes/install.core.inc:      $url = Url::fromUri('base:install.php', ['query' => $install_state['parameters'], 'script' => '']);
lib/Drupal/Core/Url.php:   * path (like robots.txt) use Url::fromUri() with the base: scheme.
lib/Drupal/Core/Url.php:   *   like base:robots.txt
lib/Drupal/Core/Url.php:   *   static files), use base: for the scheme to get a link relative to the
lib/Drupal/Core/Url.php:      throw new \InvalidArgumentException(String::format('The URI "@uri" is invalid. You must use a valid URI scheme. Use base: for items like a static file that needs the base path. Use user-path: for user input without a scheme. Use entity: for referencing the canonical route of a content entity.', ['@uri' => $uri]));
lib/Drupal/Core/Url.php:      ->getUrlIfValidWithoutAccessCheck($uri_reference) ?: static::fromUri('base:' . $uri_reference);
lib/Drupal/Core/Utility/UnroutedUrlAssembler.php:    throw new \InvalidArgumentException(String::format('The URI "@uri" is invalid. You must use a valid URI scheme. Use base: for a path, e.g., to a Drupal file that needs the base path. Do not use this for internal paths controlled by Drupal.', ['@uri' => $uri]));
lib/Drupal/Core/Utility/UnroutedUrlAssembler.php:    // Remove the base: scheme.
lib/Drupal/Core/Utility/UnroutedUrlAssemblerInterface.php:   *   A local URI or an external URL being linked to, such as "base:foo"
lib/Drupal/Core/Utility/UnroutedUrlAssemblerInterface.php:   *   - If you provide only a local URI (e.g. "base:foo"), it will be
lib/Drupal.php:   * base: scheme.
modules/hal/src/Tests/DenormalizeTest.php:          'href' => Url::fromUri('base:rest/type/entity_test/entity_test', array('absolute' => TRUE))->toString(),
modules/hal/src/Tests/DenormalizeTest.php:            'href' => Url::fromUri('base:rest/types/foo', array('absolute' => TRUE))->toString(),
modules/hal/src/Tests/DenormalizeTest.php:            'href' => Url::fromUri('base:rest/type/entity_test/entity_test', array('absolute' => TRUE))->toString(),
modules/hal/src/Tests/DenormalizeTest.php:          'href' => Url::fromUri('base:rest/types/foo', array('absolute' => TRUE))->toString(),
modules/hal/src/Tests/DenormalizeTest.php:          'href' => Url::fromUri('base:rest/type/entity_test/entity_test', array('absolute' => TRUE))->toString(),
modules/hal/src/Tests/DenormalizeTest.php:          'href' => Url::fromUri('base:rest/type/entity_test/entity_test', array('absolute' => TRUE))->toString(),
modules/hal/src/Tests/DenormalizeTest.php:          'href' => Url::fromUri('base:rest/type/entity_test/entity_test', array('absolute' => TRUE))->toString(),
modules/hal/src/Tests/DenormalizeTest.php:          'href' => Url::fromUri('base:rest/type/entity_test/entity_test', array('absolute' => TRUE))->toString(),
modules/hal/src/Tests/NormalizeTest.php:    $type_uri = Url::fromUri('base:rest/type/entity_test/entity_test', array('absolute' => TRUE))->toString();
modules/hal/src/Tests/NormalizeTest.php:    $relation_uri = Url::fromUri('base:rest/relation/entity_test/entity_test/field_test_entity_reference', array('absolute' => TRUE))->toString();
modules/image/src/Entity/ImageStyle.php:      return Url::fromUri('base:' . $directory_path . '/' . file_uri_target($uri), array('absolute' => TRUE, 'query' => $token_query))->toString();
modules/image/src/Tests/ImageThemeFunctionTest.php:      '#url' => Url::fromUri('base:' . $path),
modules/link/src/Plugin/Field/FieldWidget/LinkWidget.php:      // Disallow unrouted internal URLs (i.e. disallow 'base:' URIs).
modules/path/src/Controller/PathController.php:      $row['data']['alias'] = $this->l(Unicode::truncate($data->alias, 50, FALSE, TRUE), Url::fromUri('base:' . $data->source, array(
modules/path/src/Controller/PathController.php:      $row['data']['source'] = $this->l(Unicode::truncate($data->source, 50, FALSE, TRUE), Url::fromUri('base:' . $data->source, array(
modules/rest/src/LinkManager/RelationLinkManager.php:    return $this->urlAssembler->assemble("base:rest/relation/$entity_type/$bundle/$field_name", array('absolute' => TRUE));
modules/rest/src/LinkManager/TypeLinkManager.php:    return $this->urlAssembler->assemble("base:rest/type/$entity_type/$bundle", array('absolute' => TRUE));
modules/rest/src/Tests/NodeTest.php:          'href' => Url::fromUri('base:rest/type/node/resttest', array('absolute' => TRUE))->toString(),
modules/serialization/src/Tests/EntityResolverTest.php:    $field_uri = Url::fromUri('base:rest/relation/entity_test_mulrev/entity_test_mulrev/field_test_entity_reference', array('absolute' => TRUE))->toString();
modules/serialization/src/Tests/EntityResolverTest.php:          'href' => Url::fromUri('base:rest/type/entity_test_mulrev/entity_test_mulrev', array('absolute' => TRUE))->toString(),
modules/simpletest/src/Tests/SimpleTestBrowserTest.php:    $this->drupalGet(Url::fromUri('base:core/install.php', array('external' => TRUE, 'absolute' => TRUE))->toString());
modules/statistics/statistics.module:    $settings = array('data' => array('nid' => $node->id()), 'url' => Url::fromUri('base:' . drupal_get_path('module', 'statistics') . '/statistics.php')->toString());
modules/system/src/Tests/Common/AddFeedTest.php:    $fully_qualified_local_url = Url::fromUri('base:' . $this->randomMachineName(12), array('absolute' => TRUE))->toString();
modules/system/src/Tests/Common/AddFeedTest.php:    $fully_qualified_for_title = Url::fromUri('base:' . $this->randomMachineName(12), array('absolute' => TRUE))->toString();
modules/system/src/Tests/Common/AddFeedTest.php:        'url' => Url::fromUri('base:' . $path, array('absolute' => TRUE))->toString(),
modules/system/src/Tests/Common/AddFeedTest.php:        'url' => Url::fromUri('base:' . $path_for_title, array('absolute' => TRUE))->toString(),
modules/system/src/Tests/Common/UrlTest.php:    $sanitized_path = check_url(Url::fromUri('base:' . $path)->toString());
modules/system/src/Tests/Common/UrlTest.php:    $link = Url::fromUri('base:' . $path)->toString();
modules/system/src/Tests/Common/UrlTest.php:    $sanitized_path = check_url(Url::fromUri('base:' . $path)->toString());
modules/system/src/Tests/Menu/AssertBreadcrumbTrait.php:        // Url::fromUri('base:')->toString() to get correct the base
modules/system/src/Tests/Menu/AssertBreadcrumbTrait.php:          $url = Url::fromUri('base:' . $path)->toString();
modules/system/src/Tests/Menu/AssertMenuActiveTrailTrait.php:          ':href' => Url::fromUri('base:' . $link_path)->toString(),
modules/system/src/Tests/Menu/AssertMenuActiveTrailTrait.php:      ':href' => Url::fromUri('base:' . $active_link_path)->toString(),
modules/system/src/Tests/Menu/BreadcrumbTest.php:        ':href' => Url::fromUri('base:' . $link_path)->toString(),
modules/system/src/Tests/Menu/LocalTasksTest.php:      $expected = Url::fromUri('base:' . $hrefs[$index])->toString();
modules/system/src/Tests/Theme/FunctionsTest.php:        'url' => Url::fromUri('base:a/link'),
modules/system/src/Tests/Theme/FunctionsTest.php:    $expected_links .= '<li class="a-link"><a href="' . Url::fromUri('base:a/link')->toString() . '">' . String::checkPlain('A <link>') . '</a></li>';
modules/system/src/Tests/Theme/FunctionsTest.php:    $expected_links .= '<li class="a-link"><a href="' . Url::fromUri('base:a/link')->toString() . '">' . String::checkPlain('A <link>') . '</a></li>';
modules/system/src/Tests/Theme/FunctionsTest.php:    $expected_links .= '<li class="a-link"><a href="' . Url::fromUri('base:a/link')->toString() . '">' . String::checkPlain('A <link>') . '</a></li>';
modules/system/system.module:  $url = Url::fromUri('base:core/authorize.php');
modules/update/src/Tests/UpdateTestBase.php:    $this->config('update.settings')->set('fetch.url', Url::fromUri('base:' . $url, array('absolute' => TRUE))->toString())->save();
modules/views/src/Plugin/views/display/PathPluginBase.php:    if (!parse_url('base:' . $path)) {
modules/views/src/Plugin/views/field/Links.php:        'url' => $path ? UrlObject::fromUri('base:' . $path) : $url,
modules/views/src/Plugin/views/query/QueryPluginBase.php:   * - base: The actual base table (i.e. "user" for an author relationship).
modules/views/src/Plugin/views/relationship/RelationshipPluginBase.php: * - base: The new base table this relationship will be adding. This does not
modules/views/src/Tests/Handler/FieldUrlTest.php:    $this->assertEqual(\Drupal::l('John', Url::fromUri('base:John')), $view->field['name']->advancedRender($view->result[0]));
modules/views/src/Tests/Wizard/MenuTest.php:    $this->assertLinkByHref(Url::fromUri('base:' . $view['page[path]'])->toString());
modules/views_ui/src/Tests/DefaultViewsTest.php:    $this->assertNoLinkByHref(Url::fromUri('base:test_route_with_suffix/%/suffix')->toString());
modules/views_ui/src/ViewEditForm.php:      $form_state->setRedirectUrl(Url::fromUri("base:$destination"));
modules/views_ui/src/ViewEditForm.php:              '#url' => Url::fromUri("base:$path"),
tests/Drupal/Tests/Core/UnroutedUrlTest.php:  protected $unroutedInternal = 'base:robots.txt';
tests/Drupal/Tests/Core/UnroutedUrlTest.php:      ['base:robots.txt', FALSE],
tests/Drupal/Tests/Core/UnroutedUrlTest.php:      ['base:AKI@&hO@', FALSE],
tests/Drupal/Tests/Core/UnroutedUrlTest.php:      ['base:(:;2&+h^', FALSE],
tests/Drupal/Tests/Core/UnroutedUrlTest.php:      ['base://AKI@&hO@'],
tests/Drupal/Tests/Core/UnroutedUrlTest.php:      ['base://(:;2&+h^'],
tests/Drupal/Tests/Core/UrlTest.php:    $this->assertSame('base:invalid-path', $url->getUri());
tests/Drupal/Tests/Core/UrlTest.php:    $url = TestUrl::fromUri('base:kittens');
tests/Drupal/Tests/Core/Utility/UnroutedUrlAssemblerTest.php:      ['base:example', [], FALSE, '/example'],
tests/Drupal/Tests/Core/Utility/UnroutedUrlAssemblerTest.php:      ['base:example', ['query' => ['foo' => 'bar']], FALSE, '/example?foo=bar'],
tests/Drupal/Tests/Core/Utility/UnroutedUrlAssemblerTest.php:      ['base:example', ['fragment' => 'example', ], FALSE, '/example#example'],
tests/Drupal/Tests/Core/Utility/UnroutedUrlAssemblerTest.php:      ['base:example', [], TRUE, '/subdir/example'],
tests/Drupal/Tests/Core/Utility/UnroutedUrlAssemblerTest.php:      ['base:example', ['query' => ['foo' => 'bar']], TRUE, '/subdir/example?foo=bar'],
tests/Drupal/Tests/Core/Utility/UnroutedUrlAssemblerTest.php:      ['base:example', ['fragment' => 'example', ], TRUE, '/subdir/example#example'],
tests/Drupal/Tests/Core/Utility/UnroutedUrlAssemblerTest.php:    $result = $this->unroutedUrlAssembler->assemble('base:test-uri', []);
tests/Drupal/Tests/Core/Utility/UnroutedUrlAssemblerTest.php:    $result = $this->unroutedUrlAssembler->assemble('base:test-uri', ['path_processing' => TRUE]);
tests/Drupal/Tests/Core/Validation/Plugin/Validation/Constraint/PrimitiveTypeConstraintValidatorTest.php:    $data[] = [$this->getMock('Drupal\Core\TypedData\Type\UriInterface'), 'base:', TRUE];
tests/Drupal/Tests/Core/Validation/Plugin/Validation/Constraint/PrimitiveTypeConstraintValidatorTest.php:    $data[] = [$this->getMock('Drupal\Core\TypedData\Type\UriInterface'), 'base:node', TRUE];
pwolanin’s picture

Searching with ack, I find these non-comment uses:

core/modules/hal/src/Tests/DenormalizeTest.php
28:          'href' => Url::fromUri('base:rest/type/entity_test/entity_test', array('absolute' => TRUE))->toString(),
40:            'href' => Url::fromUri('base:rest/types/foo', array('absolute' => TRUE))->toString(),
43:            'href' => Url::fromUri('base:rest/type/entity_test/entity_test', array('absolute' => TRUE))->toString(),
55:          'href' => Url::fromUri('base:rest/types/foo', array('absolute' => TRUE))->toString(),
88:          'href' => Url::fromUri('base:rest/type/entity_test/entity_test', array('absolute' => TRUE))->toString(),
98:          'href' => Url::fromUri('base:rest/type/entity_test/entity_test', array('absolute' => TRUE))->toString(),
116:          'href' => Url::fromUri('base:rest/type/entity_test/entity_test', array('absolute' => TRUE))->toString(),
186:          'href' => Url::fromUri('base:rest/type/entity_test/entity_test', array('absolute' => TRUE))->toString(),

core/modules/hal/src/Tests/NormalizeTest.php
64:    $type_uri = Url::fromUri('base:rest/type/entity_test/entity_test', array('absolute' => TRUE))->toString();
65:    $relation_uri = Url::fromUri('base:rest/relation/entity_test/entity_test/field_test_entity_reference', array('absolute' => TRUE))->toString();

core/modules/image/src/Entity/ImageStyle.php
228:      return Url::fromUri('base:' . $directory_path . '/' . file_uri_target($uri), array('absolute' => TRUE, 'query' => $token_query))->toString();

core/modules/image/src/Tests/ImageThemeFunctionTest.php
90:      '#url' => Url::fromUri('base:' . $path),


core/modules/menu_link_content/src/Tests/PathAliasMenuLinkContentTest.php
87:    $this->assertEqual('base:my-blog', $tree[$menu_link_content->getPluginId()]->link->getUrlObject()->getUri());

core/modules/path/src/Controller/PathController.php
89:      $row['data']['alias'] = $this->l(Unicode::truncate($data->alias, 50, FALSE, TRUE), Url::fromUri('base:' . $data->source, array(
93:      $row['data']['source'] = $this->l(Unicode::truncate($data->source, 50, FALSE, TRUE), Url::fromUri('base:' . $data->source, array(

core/modules/rest/src/LinkManager/RelationLinkManager.php
57:    return $this->urlAssembler->assemble("base:rest/relation/$entity_type/$bundle/$field_name", array('absolute' => TRUE));

core/modules/rest/src/LinkManager/TypeLinkManager.php
56:    return $this->urlAssembler->assemble("base:rest/type/$entity_type/$bundle", array('absolute' => TRUE));

core/modules/rest/src/Tests/NodeTest.php
73:          'href' => Url::fromUri('base:rest/type/node/resttest', array('absolute' => TRUE))->toString(),

core/modules/serialization/src/Tests/EntityResolverTest.php
66:    $field_uri = Url::fromUri('base:rest/relation/entity_test_mulrev/entity_test_mulrev/field_test_entity_reference', array('absolute' => TRUE))->toString();
71:          'href' => Url::fromUri('base:rest/type/entity_test_mulrev/entity_test_mulrev', array('absolute' => TRUE))->toString(),

core/modules/simpletest/src/Tests/SimpleTestBrowserTest.php
80:    $this->drupalGet(Url::fromUri('base:core/install.php', array('external' => TRUE, 'absolute' => TRUE))->toString());

core/modules/statistics/statistics.module
43:    $settings = array('data' => array('nid' => $node->id()), 'url' => Url::fromUri('base:' . drupal_get_path('module', 'statistics') . '/statistics.php')->toString());

core/modules/system/src/Tests/Common/AddFeedTest.php
26:    $fully_qualified_local_url = Url::fromUri('base:' . $this->randomMachineName(12), array('absolute' => TRUE))->toString();
30:    $fully_qualified_for_title = Url::fromUri('base:' . $this->randomMachineName(12), array('absolute' => TRUE))->toString();
34:        'url' => Url::fromUri('base:' . $path, array('absolute' => TRUE))->toString(),
46:        'url' => Url::fromUri('base:' . $path_for_title, array('absolute' => TRUE))->toString(),

core/modules/system/src/Tests/Common/UrlTest.php
35:    $sanitized_path = check_url(Url::fromUri('base:' . $path)->toString());
39:    $link = Url::fromUri('base:' . $path)->toString();
40:    $sanitized_path = check_url(Url::fromUri('base:' . $path)->toString());

core/modules/system/src/Tests/Menu/AssertBreadcrumbTrait.php
80:          $url = Url::fromUri('base:' . $path)->toString();

core/modules/system/src/Tests/Menu/AssertMenuActiveTrailTrait.php
40:          ':href' => Url::fromUri('base:' . $link_path)->toString(),
60:      ':href' => Url::fromUri('base:' . $active_link_path)->toString(),

core/modules/system/src/Tests/Menu/BreadcrumbTest.php
281:        ':href' => Url::fromUri('base:' . $link_path)->toString(),

core/modules/system/src/Tests/Menu/LocalTasksTest.php
38:      $expected = Url::fromUri('base:' . $hrefs[$index])->toString();

core/modules/system/src/Tests/Theme/FunctionsTest.php
194:        'url' => Url::fromUri('base:a/link'),
218:    $expected_links .= '<li class="a-link"><a href="' . Url::fromUri('base:a/link')->toString() . '">' . String::checkPlain('A <link>') . '</a></li>';
257:    $expected_links .= '<li class="a-link"><a href="' . Url::fromUri('base:a/link')->toString() . '">' . String::checkPlain('A <link>') . '</a></li>';
272:    $expected_links .= '<li class="a-link"><a href="' . Url::fromUri('base:a/link')->toString() . '">' . String::checkPlain('A <link>') . '</a></li>';

core/modules/system/system.module
424:  $url = Url::fromUri('base:core/authorize.php');

core/modules/update/src/Tests/UpdateTestBase.php
47:    $this->config('update.settings')->set('fetch.url', Url::fromUri('base:' . $url, array('absolute' => TRUE))->toString())->save();

core/modules/views/src/Plugin/views/display/PathPluginBase.php
461:    if (!parse_url('base:' . $path)) {

core/modules/views/src/Plugin/views/field/Links.php
88:        'url' => $path ? UrlObject::fromUri('base:' . $path) : $url,

core/modules/views/src/Tests/Handler/FieldUrlTest.php
74:    $this->assertEqual(\Drupal::l('John', Url::fromUri('base:John')), $view->field['name']->advancedRender($view->result[0]));

core/modules/views/src/Tests/Wizard/MenuTest.php
44:    $this->assertLinkByHref(Url::fromUri('base:' . $view['page[path]'])->toString());

core/modules/views_ui/src/Tests/DefaultViewsTest.php
173:    $this->assertNoLinkByHref(Url::fromUri('base:test_route_with_suffix/%/suffix')->toString());

core/modules/views_ui/src/ViewEditForm.php
321:      $form_state->setRedirectUrl(Url::fromUri("base:$destination"));
427:              '#url' => Url::fromUri("base:$path"),

core/tests/Drupal/Tests/Core/UnroutedUrlTest.php
48:  protected $unroutedInternal = 'base:robots.txt';
91:      ['base:robots.txt', FALSE],
93:      ['base:AKI@&hO@', FALSE],
94:      ['base:(:;2&+h^', FALSE],
96:      ['base:node/[token]', FALSE],
97:      ['base:node/%', FALSE],
98:      ['base:node/[token:token]', FALSE],
99:      ['base:node/{{ token }}', FALSE],
131:      ['base://(:;2&+h^'],
132:      ['base://AKI@&hO@'],

core/tests/Drupal/Tests/Core/UrlTest.php
185:    $this->assertSame('base:invalid-path', $url->getUri());
445:    $url = TestUrl::fromUri('base:kittens');

core/tests/Drupal/Tests/Core/Utility/UnroutedUrlAssemblerTest.php
112:      ['base:example', [], FALSE, '/example'],
113:      ['base:example', ['query' => ['foo' => 'bar']], FALSE, '/example?foo=bar'],
114:      ['base:example', ['fragment' => 'example', ], FALSE, '/example#example'],
115:      ['base:example', [], TRUE, '/subdir/example'],
116:      ['base:example', ['query' => ['foo' => 'bar']], TRUE, '/subdir/example?foo=bar'],
117:      ['base:example', ['fragment' => 'example', ], TRUE, '/subdir/example#example'],
128:    $result = $this->unroutedUrlAssembler->assemble('base:test-uri', []);
141:    $result = $this->unroutedUrlAssembler->assemble('base:test-uri', ['path_processing' => TRUE]);

core/tests/Drupal/Tests/Core/Validation/Plugin/Validation/Constraint/PrimitiveTypeConstraintValidatorTest.php
74:    $data[] = [$this->getMock('Drupal\Core\TypedData\Type\UriInterface'), 'base:', TRUE];
75:    $data[] = [$this->getMock('Drupal\Core\TypedData\Type\UriInterface'), 'base:node', TRUE];
pwolanin’s picture

LocalTasksTest usage is not needed for sure.
#2419015: Remove use of base: scheme in LocalTasksTest

effulgentsia’s picture

mpdonadio’s picture

core/authorize.php is unrouted, so `Url::fromUri('base:core/authorize.php')` is appropriate: #2423953: Properly comment use of Url::fromUri('base:core/authorize.php')

joelpittet’s picture

@mpdonadio et al: We were digging into the uninstaller issues and authorize.php and we noticed since around the Feb 8th 2015 the redirect path has busted for that Url generation.

@SebCorbin noticed it here:
#2042447-82: Install a module user interface does not install modules (or themes)

It's reproducible with the following circumstances:

Use a path prefix install or a language prefix and run this in drush:

drush ev "use Drupal\Core\Url; echo  Url::fromUri('user-path:/core/authorize.php');"
drush ev "use Drupal\Core\Url; echo  Url::fromUri('base:core/authorize.php');"

Without the path prefix/language prefix you will get what you expect:
/core/authorize.php

@SebCorbin was getting this with or without path prefixing:
/index.php/core/authorize.php

Which seems to think that it's a path and not a file.

And as you can see in the issue above we were getting the following after the batch redirect:
@SebCorbin: http://localhost:8080/d8-sandbox/core/authorize.php/en/%3Cnone%3E
@joelpittet: http://d8.dev/core/authorize.php/%3Cnone%3E

Both are incorrect so I thought I'd ask here before opening a new issue as I know you all are working hard on straightening this out.

mpdonadio’s picture

StatusFileSize
new12.19 KB

core/install.php is an unrouted URL, but its use throughout core is inconsistent: #2429885: Inconsistent usage of core/install.php

Also attaching uses of base: as of `git rev-parse --short HEAD == '082a601'`

wim leers’s picture

Ideally, we would still do this.

joelpittet’s picture

Version: 8.0.x-dev » 8.1.x-dev
Issue tags: +Documentation

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.

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.

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.

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.

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.

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.

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.

smustgrave’s picture

Status: Active » Postponed (maintainer needs more info)
Issue tags: +stale-issue-cleanup

Thank you for creating this issue to improve Drupal.

We are working to decide if this task is still relevant to a currently supported version of Drupal. There hasn't been any discussion here for over 8 years which suggests that this has either been implemented or is no longer relevant. Your thoughts on this will allow a decision to be made.

Since we need more information to move forward with this issue, the status is now Postponed (maintainer needs more info). If we don't receive additional information to help with the issue, it may be closed after three months.

Thanks!

smustgrave’s picture

Status: Postponed (maintainer needs more info) » Active

Probably still valid.

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.