Index: .gitignore
===================================================================
--- .gitignore	(revision 60662)
+++ .gitignore	(working copy)
@@ -50,7 +50,8 @@
 /src/wp-content/fonts
 /src/wp-content/languages
 /src/wp-content/mu-plugins
-/src/wp-content/plugins
+/src/wp-content/plugins/*
+!/src/wp-content/plugins/hello-dolly
 /src/wp-content/themes/*
 !/src/wp-content/themes/twentyten
 !/src/wp-content/themes/twentyeleven
Index: Gruntfile.js
===================================================================
--- Gruntfile.js	(revision 60662)
+++ Gruntfile.js	(working copy)
@@ -28,7 +28,7 @@
 			'wp-content/themes/index.php',
 			'wp-content/themes/twenty*/**',
 			'wp-content/plugins/index.php',
-			'wp-content/plugins/hello.php',
+			'wp-content/plugins/hello-dolly/**',
 			'wp-content/plugins/akismet/**',
 			'!wp-content/themes/twenty*/node_modules/**',
 		],
Index: src/wp-admin/includes/plugin.php
===================================================================
--- src/wp-admin/includes/plugin.php	(revision 60662)
+++ src/wp-admin/includes/plugin.php	(working copy)
@@ -153,8 +153,6 @@
 					load_plugin_textdomain( $textdomain, false, dirname( $plugin_file ) );
 				}
 			}
-		} elseif ( 'hello.php' === basename( $plugin_file ) ) {
-			$textdomain = 'default';
 		}
 		if ( $textdomain ) {
 			foreach ( array( 'Name', 'PluginURI', 'Description', 'Author', 'AuthorURI', 'Version' ) as $field ) {
@@ -1008,10 +1006,6 @@
 
 		$plugin_slug = dirname( $plugin_file );
 
-		if ( 'hello.php' === $plugin_file ) {
-			$plugin_slug = 'hello-dolly';
-		}
-
 		// Remove language files, silently.
 		if ( '.' !== $plugin_slug && ! empty( $plugin_translations[ $plugin_slug ] ) ) {
 			$translations = $plugin_translations[ $plugin_slug ];
Index: src/wp-admin/includes/update-core.php
===================================================================
--- src/wp-admin/includes/update-core.php	(revision 60662)
+++ src/wp-admin/includes/update-core.php	(working copy)
@@ -841,6 +841,8 @@
 	'wp-includes/js/dist/undo-manager.min.js',
 	'wp-includes/js/dist/fields.min.js',
 	'wp-includes/js/dist/fields.js',
+	// 6.9
+	'wp-content/plugins/hello.php',
 );
 
 /**
@@ -973,6 +975,7 @@
 	'themes/twentytwentythree/' => '6.1',
 	'themes/twentytwentyfour/'  => '6.4',
 	'themes/twentytwentyfive/'  => '6.7',
+	'plugins/hello-dolly/'      => '6.9',
 );
 
 /**
Index: src/wp-admin/includes/upgrade.php
===================================================================
--- src/wp-admin/includes/upgrade.php	(revision 60662)
+++ src/wp-admin/includes/upgrade.php	(working copy)
@@ -880,6 +880,7 @@
 
 	if ( $wp_current_db_version < 58975 ) {
 		upgrade_670();
+		upgrade_690();
 	}
 
 	if ( $wp_current_db_version < 60421 ) {
@@ -2414,7 +2415,30 @@
 		wp_set_option_autoload_values( $autoload );
 	}
 }
+
 /**
+ * Executes changes made in WordPress 6.9.0.
+ *
+ * @ignore
+ * @since 6.9.0
+ *
+ * @global int $wp_current_db_version The old (current) database version.
+ */
+function upgrade_690() {
+	global $wp_current_db_version;
+
+	// Switch Hello Dolly from file to directory format. See #53323
+	$active_plugins = get_option( 'active_plugins' );
+	$old_plugin     = 'hello.php';
+	$new_plugin     = 'hello-dolly/hello.php';
+	$key            = array_search( $old_plugin, $active_plugins, true );
+
+	if ( $key ) {
+		$active_plugins[ $key ] = $new_plugin;
+		update_option( 'active_plugins', $active_plugins );
+	}
+}
+/**
  * Executes changes made in WordPress 6.7.0.
  *
  * @ignore
Index: src/wp-content/plugins/hello.php
===================================================================
--- src/wp-content/plugins/hello.php	(revision 60662)
+++ src/wp-content/plugins/hello.php	(working copy)
@@ -10,6 +10,7 @@
 Author: Matt Mullenweg
 Version: 1.7.2
 Author URI: http://ma.tt/
+Text Domain: hello-dolly
 */
 
 // Do not load directly.
Index: src/wp-includes/class-wp-plugin-dependencies.php
===================================================================
--- src/wp-includes/class-wp-plugin-dependencies.php	(revision 60662)
+++ src/wp-includes/class-wp-plugin-dependencies.php	(working copy)
@@ -870,9 +870,6 @@
 	 * @return string The plugin's slug.
 	 */
 	protected static function convert_to_slug( $plugin_file ) {
-		if ( 'hello.php' === $plugin_file ) {
-			return 'hello-dolly';
-		}
 		return str_contains( $plugin_file, '/' ) ? dirname( $plugin_file ) : str_replace( '.php', '', $plugin_file );
 	}
 }
Index: tests/phpunit/tests/admin/includesPlugin.php
===================================================================
--- tests/phpunit/tests/admin/includesPlugin.php	(revision 60662)
+++ tests/phpunit/tests/admin/includesPlugin.php	(working copy)
@@ -22,7 +22,7 @@
 	}
 
 	public function test_get_plugin_data() {
-		$data = get_plugin_data( DIR_TESTDATA . '/plugins/hello.php' );
+		$data = get_plugin_data( DIR_TESTDATA . '/plugins/hello-dolly/hello.php' );
 
 		$default_headers = array(
 			'Name'        => 'Hello Dolly',
@@ -374,31 +374,31 @@
 	}
 
 	public function test_is_plugin_active_true() {
-		activate_plugin( 'hello.php' );
-		$test = is_plugin_active( 'hello.php' );
+		activate_plugin( 'hello-dolly/hello.php' );
+		$test = is_plugin_active( 'hello-dolly/hello.php' );
 		$this->assertTrue( $test );
 
-		deactivate_plugins( 'hello.php' );
+		deactivate_plugins( 'hello-dolly/hello.php' );
 	}
 
 	public function test_is_plugin_active_false() {
-		deactivate_plugins( 'hello.php' );
-		$test = is_plugin_active( 'hello.php' );
+		deactivate_plugins( 'hello-dolly/hello.php' );
+		$test = is_plugin_active( 'hello-dolly/hello.php' );
 		$this->assertFalse( $test );
 	}
 
 	public function test_is_plugin_inactive_true() {
-		deactivate_plugins( 'hello.php' );
-		$test = is_plugin_inactive( 'hello.php' );
+		deactivate_plugins( 'hello-dolly/hello.php' );
+		$test = is_plugin_inactive( 'hello-dolly/hello.php' );
 		$this->assertTrue( $test );
 	}
 
 	public function test_is_plugin_inactive_false() {
-		activate_plugin( 'hello.php' );
-		$test = is_plugin_inactive( 'hello.php' );
+		activate_plugin( 'hello-dolly/hello.php' );
+		$test = is_plugin_inactive( 'hello-dolly/hello.php' );
 		$this->assertFalse( $test );
 
-		deactivate_plugins( 'hello.php' );
+		deactivate_plugins( 'hello-dolly/hello.php' );
 	}
 
 	/**
@@ -405,7 +405,7 @@
 	 * @covers ::get_plugin_files
 	 */
 	public function test_get_plugin_files_single() {
-		$name = 'hello.php';
+		$name = 'hello-dolly/hello.php';
 		$this->assertSame( array( $name ), get_plugin_files( $name ) );
 	}
 
@@ -550,7 +550,7 @@
 	 * @covers ::is_network_only_plugin
 	 */
 	public function test_is_network_only_plugin_hello() {
-		$this->assertFalse( is_network_only_plugin( 'hello.php' ) );
+		$this->assertFalse( is_network_only_plugin( 'hello-dolly/hello.php' ) );
 	}
 
 	/**
@@ -570,7 +570,7 @@
 	 * @covers ::activate_plugins
 	 */
 	public function test_activate_plugins_single_no_array() {
-		$name = 'hello.php';
+		$name = 'hello-dolly/hello.php';
 		activate_plugins( $name );
 		$this->assertTrue( is_plugin_active( $name ) );
 		deactivate_plugins( $name );
@@ -580,7 +580,7 @@
 	 * @covers ::activate_plugins
 	 */
 	public function test_activate_plugins_single_array() {
-		$name = 'hello.php';
+		$name = 'hello-dolly/hello.php';
 		activate_plugins( array( $name ) );
 		$this->assertTrue( is_plugin_active( $name ) );
 		deactivate_plugins( $name );
Index: tests/phpunit/tests/admin/plugin-dependencies/hasDependents.php
===================================================================
--- tests/phpunit/tests/admin/plugin-dependencies/hasDependents.php	(revision 60662)
+++ tests/phpunit/tests/admin/plugin-dependencies/hasDependents.php	(working copy)
@@ -53,6 +53,6 @@
 	 */
 	public function test_should_convert_hellophp_to_hello_dolly() {
 		$this->set_property_value( 'dependency_slugs', array( 'hello-dolly' ) );
-		$this->assertTrue( self::$instance::has_dependents( 'hello.php' ) );
+		$this->assertTrue( self::$instance::has_dependents( 'hello-dolly/hello.php' ) );
 	}
 }
Index: tests/phpunit/tests/admin/plugin-dependencies/initialize.php
===================================================================
--- tests/phpunit/tests/admin/plugin-dependencies/initialize.php	(revision 60662)
+++ tests/phpunit/tests/admin/plugin-dependencies/initialize.php	(working copy)
@@ -281,11 +281,7 @@
 		$expected_slugs = array();
 		foreach ( $plugins as $plugin_file => &$headers ) {
 			// Create the expected slugs.
-			if ( 'hello.php' === $plugin_file ) {
-				$slug = 'hello-dolly';
-			} else {
-				$slug = str_replace( '.php', '', explode( '/', $plugin_file )[0] );
-			}
+			$slug = str_replace( '.php', '', explode( '/', $plugin_file )[0] );
 
 			$expected_slugs[ $plugin_file ] = $slug;
 
Index: tests/phpunit/tests/ajax/wpAjaxUpdatePlugin.php
===================================================================
--- tests/phpunit/tests/ajax/wpAjaxUpdatePlugin.php	(revision 60662)
+++ tests/phpunit/tests/ajax/wpAjaxUpdatePlugin.php	(working copy)
@@ -138,7 +138,7 @@
 		$this->_setRole( 'administrator' );
 
 		$_POST['_ajax_nonce'] = wp_create_nonce( 'updates' );
-		$_POST['plugin']      = 'hello.php';
+		$_POST['plugin']      = 'hello-dolly/hello.php';
 		$_POST['slug']        = 'hello-dolly';
 
 		// Prevent wp_update_plugins() from running.
@@ -163,7 +163,7 @@
 				'slug'         => 'hello-dolly',
 				'oldVersion'   => 'Version 1.7.2',
 				'newVersion'   => '',
-				'plugin'       => 'hello.php',
+				'plugin'       => 'hello-dolly/hello.php',
 				'pluginName'   => 'Hello Dolly',
 				'debug'        => array( 'The plugin is at the latest version.' ),
 				'errorMessage' => 'The plugin is at the latest version.',
Index: tests/phpunit/tests/dependencies/scripts.php
===================================================================
--- tests/phpunit/tests/dependencies/scripts.php	(revision 60662)
+++ tests/phpunit/tests/dependencies/scripts.php	(working copy)
@@ -2624,7 +2624,7 @@
 	 * @covers ::wp_enqueue_code_editor
 	 */
 	public function test_wp_enqueue_code_editor_when_php_file_will_be_passed() {
-		$real_file              = WP_PLUGIN_DIR . '/hello.php';
+		$real_file              = WP_PLUGIN_DIR . '/hello-dolly/hello.php';
 		$wp_enqueue_code_editor = wp_enqueue_code_editor( array( 'file' => $real_file ) );
 		$this->assertNonEmptyMultidimensionalArray( $wp_enqueue_code_editor );
 
Index: tests/phpunit/tests/multisite/network.php
===================================================================
--- tests/phpunit/tests/multisite/network.php	(revision 60662)
+++ tests/phpunit/tests/multisite/network.php	(working copy)
@@ -269,7 +269,7 @@
 	}
 
 	public function test_active_network_plugins() {
-		$path = 'hello.php';
+		$path = 'hello-dolly/hello.php';
 
 		// Local activate, should be invisible for the network.
 		activate_plugin( $path ); // Enable the plugin for the current site.
@@ -281,7 +281,7 @@
 		// Activate the plugin sitewide.
 		activate_plugin( $path, '', true ); // Enable the plugin for all sites in the network.
 		$active_plugins = wp_get_active_network_plugins();
-		$this->assertSame( array( WP_PLUGIN_DIR . '/hello.php' ), $active_plugins );
+		$this->assertSame( array( WP_PLUGIN_DIR . '/hello-dolly/hello.php' ), $active_plugins );
 
 		// Deactivate the plugin.
 		deactivate_plugins( $path );
@@ -300,7 +300,7 @@
 	 * @ticket 28651
 	 */
 	public function test_duplicate_network_active_plugin() {
-		$path = 'hello.php';
+		$path = 'hello-dolly/hello.php';
 		$mock = new MockAction();
 		add_action( 'activate_' . $path, array( $mock, 'action' ) );
 
@@ -320,13 +320,13 @@
 	}
 
 	public function test_is_plugin_active_for_network_true() {
-		activate_plugin( 'hello.php', '', true );
-		$this->assertTrue( is_plugin_active_for_network( 'hello.php' ) );
+		activate_plugin( 'hello-dolly/hello.php', '', true );
+		$this->assertTrue( is_plugin_active_for_network( 'hello-dolly/hello.php' ) );
 	}
 
 	public function test_is_plugin_active_for_network_false() {
-		deactivate_plugins( 'hello.php', false, true );
-		$this->assertFalse( is_plugin_active_for_network( 'hello.php' ) );
+		deactivate_plugins( 'hello-dolly/hello.php', false, true );
+		$this->assertFalse( is_plugin_active_for_network( 'hello-dolly/hello.php' ) );
 	}
 
 	public function helper_deactivate_hook() {
Index: .
===================================================================
--- .	(revision 60662)
+++ .	(working copy)

Property changes on: .
___________________________________________________________________
Modified: svn:ignore
## -1,21 +1,22 ##
 # Configuration files with possibly sensitive information
+# Files and folders related to build/test tools
+# Files for local environment config
+.claude
+.env
+.git
 .htaccess
-# Files and folders related to build/test tools
+.phpcs.xml
 .phpunit.result.cache
-phpunit.xml
-phpcs.xml
-.phpcs.xml
+/docker-compose.override.yml
+artifacts
+build
+composer.lock
+coverage
+jsdoc
 node_modules
 npm-debug.log
-build
+packagehash.txt
+phpcs.xml
+phpunit.xml
+vendor
 wp-cli.local.yml
-.git
-jsdoc
-composer.lock
-vendor
-packagehash.txt
-artifacts
-# Files for local environment config
-/docker-compose.override.yml
-.env
-coverage
