From d1effacdb1b8fdba8757276d85eb63593c01fd57 Mon Sep 17 00:00:00 2001 From: Max Semenik Date: Wed, 18 May 2016 17:40:56 -0700 Subject: [PATCH] Change the way installer overrides work Instead of "don't edit this file, edit that file", do it settings.d style where packagers can drop their stuff in mw-config/overrides. I propose to backport it to 1.27 because LTS. Bug: T135695 Change-Id: I2661ba2036b2887d31ab356751d731cc8b499f26 --- RELEASE-NOTES-1.27 | 2 + autoload.php | 3 +- includes/installer/Installer.php | 3 + .../installer/InstallerOverrides.php | 55 +++++++++---------- mw-config/overrides/README | 22 ++++++++ 5 files changed, 53 insertions(+), 32 deletions(-) rename mw-config/overrides.php => includes/installer/InstallerOverrides.php (63%) create mode 100644 mw-config/overrides/README diff --git a/RELEASE-NOTES-1.27 b/RELEASE-NOTES-1.27 index e644ae4011..3aa5d7cce8 100644 --- a/RELEASE-NOTES-1.27 +++ b/RELEASE-NOTES-1.27 @@ -536,6 +536,8 @@ changes to languages because of Phabricator reports. * User::isPasswordReminderThrottled() was deprecated. * Bot-oriented parameters to Special:UserLogin (wpCookieCheck, wpSkipCookieCheck) were removed. +* Installer can now be customized without patching MediaWiki code, see + mw-config/overrides/README for details. == Compatibility == diff --git a/autoload.php b/autoload.php index 27da2ca050..f40cc89434 100644 --- a/autoload.php +++ b/autoload.php @@ -603,7 +603,7 @@ $wgAutoloadLocalClasses = [ 'InitSiteStats' => __DIR__ . '/maintenance/initSiteStats.php', 'InstallDocFormatter' => __DIR__ . '/includes/installer/InstallDocFormatter.php', 'Installer' => __DIR__ . '/includes/installer/Installer.php', - 'InstallerOverrides' => __DIR__ . '/mw-config/overrides.php', + 'InstallerOverrides' => __DIR__ . '/includes/installer/InstallerOverrides.php', 'InstallerSessionProvider' => __DIR__ . '/includes/installer/InstallerSessionProvider.php', 'Interwiki' => __DIR__ . '/includes/interwiki/Interwiki.php', 'InvalidPassword' => __DIR__ . '/includes/password/InvalidPassword.php', @@ -936,7 +936,6 @@ $wgAutoloadLocalClasses = [ 'MutableConfig' => __DIR__ . '/includes/config/MutableConfig.php', 'MutableContext' => __DIR__ . '/includes/context/MutableContext.php', 'MwSql' => __DIR__ . '/maintenance/sql.php', - 'MyLocalSettingsGenerator' => __DIR__ . '/mw-config/overrides.php', 'MySQLField' => __DIR__ . '/includes/db/DatabaseMysqlBase.php', 'MySQLMasterPos' => __DIR__ . '/includes/db/DatabaseMysqlBase.php', 'MySqlLockManager' => __DIR__ . '/includes/filebackend/lockmanager/DBLockManager.php', diff --git a/includes/installer/Installer.php b/includes/installer/Installer.php index ae1a2a72fc..7c161ca77a 100644 --- a/includes/installer/Installer.php +++ b/includes/installer/Installer.php @@ -2,6 +2,9 @@ /** * Base code for MediaWiki installer. * + * DO NOT PATCH THIS FILE IF YOU NEED TO CHANGE INSTALLER BEHAVIOR IN YOUR PACKAGE! + * See mw-config/overrides/README for details. + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or diff --git a/mw-config/overrides.php b/includes/installer/InstallerOverrides.php similarity index 63% rename from mw-config/overrides.php rename to includes/installer/InstallerOverrides.php index 3dfecaa7b3..eba3a20d6c 100644 --- a/mw-config/overrides.php +++ b/includes/installer/InstallerOverrides.php @@ -1,11 +1,6 @@ values['wgDefaultSkin'] = 'vector'; - // add a new setting - $ls = parent::getText(); - return $ls . "\n\$wgUseTex = true;\n"; - } -} -*/ - /** * @since 1.20 */ class InstallerOverrides { + private static function getOverrides() { + global $IP; + static $overrides; + + if ( !$overrides ) { + $overrides = [ + 'LocalSettingsGenerator' => 'LocalSettingsGenerator', + 'WebInstaller' => 'WebInstaller', + 'CliInstaller' => 'CliInstaller', + ]; + foreach ( glob( "$IP/mw-config/overrides/*.php" ) as $file ) { + require $file; + } + } + + return $overrides; + } + /** * Instantiates and returns an instance of LocalSettingsGenerator or its descendant classes * @param Installer $installer * @return LocalSettingsGenerator */ public static function getLocalSettingsGenerator( Installer $installer ) { - return new LocalSettingsGenerator( $installer ); + $className = self::getOverrides()['LocalSettingsGenerator']; + return new $className( $installer ); } /** @@ -65,7 +58,8 @@ class InstallerOverrides { * @return WebInstaller */ public static function getWebInstaller( WebRequest $request ) { - return new WebInstaller( $request ); + $className = self::getOverrides()['WebInstaller']; + return new $className( $request ); } /** @@ -76,6 +70,7 @@ class InstallerOverrides { * @return CliInstaller */ public static function getCliInstaller( $siteName, $admin = null, array $options = [] ) { - return new CliInstaller( $siteName, $admin, $options ); + $className = self::getOverrides()['CliInstaller']; + return new $className( $siteName, $admin, $options ); } } diff --git a/mw-config/overrides/README b/mw-config/overrides/README new file mode 100644 index 0000000000..f2513301f8 --- /dev/null +++ b/mw-config/overrides/README @@ -0,0 +1,22 @@ +Don't modify the installer if you want to alter its behavior, including +the contents of generated LocalSettings.php in your package. Instead, +you can override classes used by the installer. + +You can override 3 classes: +* LocalSettingsGenerator - generates LocalSettings.php +* WebInstaller - web instller UI +* CliInstaller - command line installer + +Example override: + +$overrides['LocalSettingsGenerator'] = 'MyLocalSettingsGenerator'; + +class MyLocalSettingsGenerator extends LocalSettingsGenerator { + function getText() { + // Modify an existing setting + $this->values['wgDefaultSkin'] = 'vector'; + // add a new setting + $ls = parent::getText(); + return $ls . "\n\$wgMiserMode = true;\n"; + } +} -- 2.20.1