Commit graph

809 commits

Author SHA1 Message Date
Umherirrender
e04d3a28f6 Replace internal Hooks::runner
The Hooks class contains deprecated functions and the whole class is
going to get removed, so remove the convenience function and inline the
code.

Bug: T335536
Change-Id: I8ef3468a64a0199996f26ef293543fcacdf2797f
2023-05-11 06:17:38 +00:00
daniel
38cf45a747 parserTests: ensure test classes get auto-loaded.
This introduces the MW_AUTOLOAD_TEST_CLASSES switch to tell Setup.php
to enable auto-loading for test classes.

This switch can be set in file scope by core maintenance scripts that
need access to test classes. This is consistent with the mechanism used
by maintenance scripts to control other aspects of Setup.php

This is an alternative solution to the fix proposed in I17ff5867c5f57c524.

Change-Id: I2a0000f6a885c1ce1b28b748e8cc762af5584c2c
2023-03-27 20:38:53 +02:00
Tim Starling
317b460500 Fix even more PHPStorm inspections (#3)
* Inappropriate @inheritDoc usage. Arguably all @inheritDoc is
  inappropriate but these are the ones PHPStorm flags as misleading
  due to the method not being inherited.
* Doc comment type does not match actual argument/return type.
* I replaced "@return void|never" with "@return void" since never means
  never, it doesn't make sense for it to be conditional. If a method
  can return (even if that is unlikely) then @return contains the type
  that it returns. "@return never" means that there is no such type
  because the method never returns.
* Incomplete/partial/broken doc tags

Change-Id: Ide86bd6d2b44387f37d234c2b059d6fbc42ec962
2023-03-25 00:30:15 +00:00
Arlo Breault
1f5c50462d Fix typo in Setup.php
Unless this isn't a typo and I'm about to learn something.

Introduced in I157abfd9049fb8382da53005a084ab86f47e8d8a

Change-Id: Ic2f77071696a914f4aa388e020d4e7417cd9f898
2023-03-23 15:50:01 -04:00
Tim Starling
89fef0ef93 Fix total breakage of wgCanonicalServer fallback
wgCanonicalServer is false by default. Setup.php tried to set it to the
result of a wfExpandUrl() call, which initialised the UrlUtils
service with the current value of wgCanonicalServer, i.e. false.
UrlUtils had a fallback for null but not false. So subsequent calls to
wfExpandUrl() would always use the empty string for the canonical
server. Probably since 472a914c63.

So, have UrlUtils handle the fallback, and have Setup.php ask UrlUtils
for the final value.

Bug: T325529
Change-Id: I99329e75bd53049ae84a8ae7a2536ad12cfeeb3b
2023-03-17 14:11:16 +00:00
Brian Wolff
67d13660a4 registration: Add a friendly error message for missing extension
Based on Project:Support_desk, this seems to be a very common error.
Many more novice users seem to get confused by the technical message
involving "stat failed". Given that this might be the first user's
first experience with MW, I think its prudent to make it friendly
as possible.

This error message does not do i18n. I didn't do i18n to avoid
dependencies on MW stuff as it is very early in the setup process,
exceptions aren't usually i18n'd, and its entirely possible that
this error happens before a language is even set.

This does not respect $wgShowExceptionDetails. I think that can
be justified because this error happens during setup and not during
normal operation and there would be no user controlled values in
the backtrace just paths.

Bug: T321363
Change-Id: I4ed0d333d57626d05c361d08f1bf4a919115d550
2023-03-15 08:00:22 -07:00
daniel
db729e46f6 Treat $wgHooks as a regular setting
$wgHooks should be treated like a regular setting, which cannot be
manipulated after bootstrapping is complete. This will allow us to
greatly simplify the logic in HookContainer.

Replacing $wgHooks with a fake array after bootstrapping allows us to
detect any remaining live access to $wgHooks without breaking
functionality.

The plan is to have the fake array emit deprecation warnings in the 1.40
release, and make it throw exceptions in later releases.
See Iddcb760cf8961316d6527e81b9aa968657d8354c for the deprecation
warnings.

Bug: T331602
Change-Id: I0ebba9a29f81b0d86ad8fd84d478fb244f9e9c15
2023-03-09 10:20:44 +01:00
jenkins-bot
a04e191f42 Merge "Reorg: Namespace the Title class" 2023-03-02 18:40:46 +00:00
James D. Forrester
ad06527fb4 Reorg: Namespace the Title class
This is moderately messy.

Process was principally:

* xargs rg --files-with-matches '^use Title;' | grep 'php$' | \
  xargs -P 1 -n 1 sed -i -z 's/use Title;/use MediaWiki\\Title\\Title;/1'
* rg --files-without-match 'MediaWiki\\Title\\Title;' . | grep 'php$' | \
  xargs rg --files-with-matches 'Title\b' | \
  xargs -P 1 -n 1 sed -i -z 's/\nuse /\nuse MediaWiki\\Title\\Title;\nuse /1'
* composer fix

Then manual fix-ups for a few files that don't have any use statements.

Bug: T166010
Follows-Up: Ia5d8cb759dc3bc9e9bbe217d0fb109e2f8c4101a
Change-Id: If8fc9d0d95fc1a114021e282a706fc3e7da3524b
2023-03-02 08:46:53 -05:00
daniel
0a54ca1526 Remove support for MW_USE_LEGACY_DEFAULT_SETTINGS
The purpose of MW_USE_LEGACY_DEFAULT_SETTINGS was to allow Setup.php to
load default values from DefaultSettings.php, instead of using
MainConfigSchema. It was put into place for the benefit of third-party
installations that encounter issues with using MainConfigSchema. No such
issues have been reported, so we can remove the compatibility switch in
1.40.

The use of DefaultSettings.php as been deprecated since 1.39, but there
are still several extensions that rely on loading it. It remains a stub
for MainConfigSchema::listDefaultValues() for now.

Change-Id: I280f80e5be15fbcd809596087b299add5f83af1f
2023-03-02 13:39:17 +00:00
daniel
180f0a6468 Introduce run.php for running maintenance scripts
Maintenance scripts can now be run like this:

    maintenance/run.php <class>

NOTE: This introduces a new callback into Setup.php,
MW_FINAL_SETUP_CALLBACK. In contrast to MW_SETUP_CALLBACK, it is
called after extensions have been initialized.

Bug: T99268
Change-Id: Ia221f72d6b7d23df74623d60ade7fe3e5d913074
2022-12-21 06:52:04 +00:00
daniel
455e7686bf SettingsBuilder: introduce a "registration" stage
Previously, SettingsBuilder would allow configuration to be loaded
and modified until it was "finalized", at which point configuration
became read only. This patch introduces an intermediate stage where
registration dynamic manipulation of config values can be performed,
after all extensions have been loaded and all config schemas are known.

Motivation:
Extension registration callbacks are typically used to dynamically set
config variables, often based on other configuration. This should be
done using SettingsBuilder rather than global variables. But previously,
we could only be sure that all extensions are known after SettingsBuilder
was "finalized", at which point it would be impossible to change config
values.

Change-Id: I6f8f9f3f7252f0024282d7b005671f28a5b3acc3
2022-12-16 15:47:05 +00:00
jenkins-bot
22e62b9fda Merge "Miscellaneous PHP version related cleanups" 2022-11-20 23:59:47 +00:00
Tim Starling
28750729bd Miscellaneous PHP version related cleanups
MediaWikiTitleCodec: I removed the comment about dbkey being
"conveniently nullified" since that is no longer correct. The first
preg_replace() can return null, and that is guarded. The second
preg_replace() hopefully can't return null, because if it does, trim()
will generate a deprecation notice on PHP 8.1.

Some other self-explanatory changes.

Change-Id: Iad0ace821eba782c3033ec8abfeac461ac4e8ace
2022-11-21 10:11:53 +11:00
daniel
f517783c5f Settings: Introduce SettingsBuilder::getInstance to avoid $wgSettings
While accessing a SettingsBuilder instance via global state should not
be encouraged, we still need it sometimes. So use a static getter
instead of a global variable. That way, we can emit deprecation warnings
when we have proper alternatives available.

Change-Id: I0013bdab474710fd521532dd2653b3789e2ede34
2022-11-17 20:06:39 +00:00
Timo Tijhof
41333fa512 profiler: Inject $wgProfiler from Setup.php to Profiler
Follows-up I58ff3c193190d78a. Small step toward not run-time reading
the global (and using Config here is non-trivial/unsafe).

Change-Id: Ic527e493baabe700c50f75fadaa5b51615a5e597
2022-11-09 02:58:19 +00:00
Amir Sarabadani
7690ab4e33 Reorg: Move HeaderCallback to Request directory
Cleaning root of includes/

Bug: T321882
Change-Id: I1844da95d4fd79824646fdf4b6063cb771ca3000
2022-11-08 10:53:27 +01:00
Amir Sarabadani
0fff5089ba Reorg: Move StubObject classes in includes to its own directory
Bug: T166010
Change-Id: Idcf0e9dc6e0841e4f132207bce0f96774dad898c
2022-10-25 16:04:48 -04:00
Tim Starling
43a93d9782 Use the null coalescing assignment operator
Available since PHP 7.4.

Automated search, manual replacement.

Change-Id: Ibb163141526e799bff08cfeb4037b52144bb39fa
2022-10-21 13:26:49 +11:00
TheSandDoctor
da38639658 Remove deprecated $wgParser
$wgParser, deprecated in 1.32, has been removed.

Bug: T160811
Change-Id: Iaf09d3e158e1fee8c0f541695b6d9b4233033c81
2022-08-03 14:40:16 +02:00
daniel
cf39a40f16 SettingsBuilder: report warnings
This adds functionality to SettingsBuilder for collecting warnings to be
logged later, when the logging mechanism has been set up.

This also adds a validation step to update.php that aborts the update
if any warnings have been registered in SettingsBuilder, or the settings
fail to validate against the settings schema.

Change-Id: I387905289fb93591f79b96bf4c6cb5ec692b2aff
2022-07-15 12:24:20 +02:00
daniel
5e928f39e8 Dynamic defaults: fix $wgLocaltimezone being empty
Apparently, $wgLocaltimezone is set to the empty string in many
existing LocalSettings.php file, presumably because the installer
failed to detect the correct time zone.

The new code for handling automatic defaults will only trigger if
$wgLocaltimezone is null, not when it is otherwise empty.

This adds fallback code in strategic places to ensure that the empty
string is handled correctly.

Bug: T305093
Change-Id: I39226466f2bb6a36823ae9032fc62f981eabc64a
2022-07-09 18:59:32 +02:00
Aryeh Gregor
b72b9a8c43 Move dynamic defaults into MainConfigSchema
The goal is to keep the actual default values for settings in the same
place as the setting is declared, and applied using the regular means
for loading the settings -- not in a separate piece of code that needs
to be loaded through some entirely different mechanism.

SetupDynamicConfig.php now contains a few categories of things:

* Post-processing of configuration settings, where already-set settings
  are altered. This could be moved to MainConfigSchema too as a separate
  set of methods.
* Processing of old aliases of settings (blacklist, slave) that are not
  registered as settings anymore and therefore are not available to
  MainConfigSchema. This could perhaps be moved to LocalSettings
  processing somehow?
* Setting $wgUseEnotif, which is also not registered as a setting.
  Easiest would be just to declare it as a setting and have it set
  unconditionally.
* Setting the actual timezone to $wgLocaltimezone. This is not related
  to configuration and should just be in Setup.php.

Bug: T305093
Change-Id: Ia5c23b52dbbfcb3d07ffcf5d3b7f2d7befba2a26
2022-07-07 09:55:48 +10:00
Timo Tijhof
30fe871e82 exception: Inject wgShowExceptionDetails from Setup.php
Follows-up I8520d8cb16 and Ib941c22d6b7ec5f1b9, and adds an internal
setter for use by Setup.php, and for wmf-config:rpc/RunSingleJob.php
which is a use case for setting it after Setup.php but before most
code execution. Interact with a component owner instead of directly
maintaining state and providing a shared API through the Config object.

Change-Id: I5c3d4b11f4e0eb3906ccb5b5fe3979e026459859
2022-05-22 19:46:18 +00:00
daniel
237bbf089f Turn DefaultSettings.php into a deprecated stub
DefaultSettings.php has been replaced by MainConfigSchema.
Loading DefaultSettings.php is deprecated.

Code that needs to have access to configuration defaults should use the
ConfigSchema service object.

Bug: T300129
Change-Id: I7b2c0ca95a78990be1cdb9dd9ace92f6dcf1af15
2022-05-17 16:50:56 +02:00
jenkins-bot
5029306c80 Merge "Remove access to config globals from includes/exception" 2022-05-16 01:47:20 +00:00
Timo Tijhof
4f4f283d1d Setup.php: Remove internal use of $IP
Follows-up bedd996fe6 (I157abfd9049fb838).

Change-Id: Ib7a7e26f564ca996f1de3edd37b2359c5abec9d2
2022-05-13 16:32:09 +00:00
daniel
05b0937bdf Remove access to config globals from includes/exception
Allow callers of MWExceptionHandler::getStructuredExceptionData() and
jsonSerializeException() to explicitly control whether a backtrace is
included in the return value. This avoids the need to rely on the
LogExceptionBacktrace setting in static methods.

Bug: T294739
Change-Id: Ib941c22d6b7ec5f1b984bf5ded90652e42ad7b67
2022-05-12 20:33:15 +02:00
jenkins-bot
6308d67121 Merge "Setup.php: allow loading config schema from MainConfigSchema." 2022-05-04 23:41:13 +00:00
jenkins-bot
654ccb3a4c Merge "Setup.php: clarify the use of $IP." 2022-05-04 18:10:39 +00:00
daniel
bedd996fe6 Setup.php: clarify the use of $IP.
The global variable $IP has been replaced by the MW_INSTALL_PATH
constant. Clarify the continued use of $IP on Setup.php.

Change-Id: I157abfd9049fb8382da53005a084ab86f47e8d8a
2022-05-03 11:53:05 +02:00
daniel
cd774c99bc Setup.php: allow loading config schema from MainConfigSchema.
Loading the config schema from MainConfigSchema using reflection is
slow, so we don't want to do it when serving traffic. But when
re-generating DefaultSettings.php or config-schema.php, we want to load
the schema from the canonical source. That way, these scripts can still
be used if DefaultSettings.php and config-schema.php are broken.

Change-Id: Idc0d8ca0f4a700b771e6182d53ef4a0efab7110c
2022-05-02 21:46:38 +02:00
Aryeh Gregor
246ac2af0c Autoload vendor from AutoLoader, not Setup
Nothing in vendor can depend on anything in our classes, whereas the
reverse dependency could exist, so it makes sense to load vendor first.
This ensures that vendor facilities are available in anything loaded
from our autoloader, for instance polyfills like
str_starts_with()/str_ends_with.

Change-Id: I7407bf7a5b201836fde24db97be2dab2856738b5
2022-04-28 20:36:44 +03:00
jenkins-bot
9a8db00711 Merge "Use MainConfigNames instead of string literals, #4" 2022-04-27 10:25:59 +00:00
Aryeh Gregor
50ba5f034f Don't use $wgCommandLineMode uninitialized
Caused by I535aa31699d99cd08579b235c48784029c5d04b6, which removed the
global declaration for $wgCommandLineMode. This made $wgCommandLineMode
uninitialized if not on the command line, which of course meant unit
tests didn't catch it.

Change-Id: I260bfaa91e7ec58043ee33d0467e0f76885f5d16
2022-04-26 19:10:07 +03:00
Aryeh Gregor
7b791474a5 Use MainConfigNames instead of string literals, #4
Now largely automated:

VARS=$(grep -o "'[A-Za-z0-9_]*'" includes/MainConfigNames.php | \
  tr "\n" '|' | sed "s/|$/\n/;s/'//g")
sed -i -E "s/'($VARS)'/MainConfigNames::\1/g" \
  $(grep -ERIl "'($VARS)'" includes/)

Then git add -p with lots of error-prone manual checking. Then
semi-manually add all the necessary "use" lines:

vim $(grep -L 'use MediaWiki\\MainConfigNames;' \
  $(git diff --cached --name-only --diff-filter=M HEAD^))

I didn't bother fixing lines that were over 100 characters unless they
were over 120 and triggered phpcs.

Bug: T305805
Change-Id: I74e0ab511abecb276717ad4276a124760a268147
2022-04-26 19:03:37 +03:00
Aryeh Gregor
0e7d6f214f Make globals global, don't just extract values
This was causing a fatal error when running some integration tests on
PHP 8.1: "FatalError: $wgBaseDirectory must not be modified in settings
files! Use the MW_INSTALL_PATH environment variable to override the
installation root directory." It seems it caused other (less obviously
related) errors as well.

The root cause was that TestSetup::requireOnceInGlobalScope() was
copying the values of globals to local scope, but didn't make the local
name an alias for the global. This meant that when code outside of the
current scope changed global variables, it wasn't reflected locally. Now
we instead declare all existing global variables as globals. This still
doesn't help if the included file declares a new variable and then it's
changed by code outside the current scope -- the new value will not be
reflected in the current scope. Hopefully this doesn't happen.

I don't understand why this bug didn't happen in versions before 8.1.
Presumably it's related somehow to changes in global handling in 8.1.

It seems like the best solution is to edit these files so they don't
expect to be in global scope to begin with -- just access globals only
via $GLOBALS.

Change-Id: I535aa31699d99cd08579b235c48784029c5d04b6
2022-04-26 16:59:56 +03:00
Daimona Eaytoy
0a6ec1031a Move wfRequireOnceInGlobalScope to TestSetup
TestSetup seems a nice place for this function. This way, it can also be
reused in the other boostrap file whilst we migrate the entrypoint.
Also, replace the check in MediaWikiIntegrationTestCase with another
constant; this also makes it easier to understand when exactly that code
should run.

Bug: T90875
Change-Id: I7858d982378ab4b6f11c4e9bf955d83d1acbc85d
2022-04-25 12:52:58 +00:00
Aryeh Gregor
7fe63e48c5 Test dynamic configuration logic
To do so, we move the relevant parts to a separate include file that's
included both by Setup and the test.

The --color-moved option is highly recommended when reviewing this patch
to verify correctness.

More tests to come.

Bug: T305093
Change-Id: I931b92357ec48db4665891c8546f86264885e881
2022-04-12 15:21:35 +03:00
jenkins-bot
f25a956966 Merge "Load defaults from config-schema.php." 2022-04-07 12:51:16 +00:00
daniel
552ec41814 Use name constants to access config settings.
Use name constants instead of string literals in calls to Config::get
and ServiceOptions::get, when referring to core configuration variables.
This protects against typos and makes the decumentation and schema
declaration of the config settings discoverable.

This is the first batch, only touching files directly under /includes/

Change-Id: I7252e636c7c86d950d9257b33491af492c6dd5eb
2022-04-07 13:02:28 +02:00
daniel
c3d472da28 Load defaults from config-schema.php.
Instead of loading global variabls from DefaultSettings.php, load the schema from config-schema.php.
For 1.38, keep a DefaultSettings.php and use it if MW_USE_LEGACY_DEFAULT_SETTINGS is set.

Additional changes:
* Removes timing stats collection. This was temporary, to make sure
  performance is OK in production.
* Removes loop to pull in config globals, when Setup is included in
  bootstrap.php. This is only the case when invoking phpunit tests
  with IDE integration. The code in Setup.php is buggy and redundant
  while bootstrap.php still pulls in DefaultSettings.php.
  This code will be put back in I7b2c0ca95a78990be.

Bug: T305176
Change-Id: I399df9e1ee678e525e37c172d0fd8e1e634436e5
2022-04-06 16:02:19 +00:00
Aryeh Gregor
45b34d4b2a Remove some dynamic config from Setup
The default value for GitInfoCacheDirectory doesn't seem to be necessary
outside of GitInfo.php, so move it from Setup to there.  Theoretically
this could break third-party code that uses this setting and was relying
on Setup.php to set a default value, but it doesn't seem very likely.

I didn't find any other dynamic configuration that could be moved out of
Setup so easily:

* MainWANCache isn't accessed outside of ServiceWiring, but Setup
  still needs to check it to initialize WANObjectCaches.
* ForeignFileRepos is only read in FileBackendGroup, but various tests
  (including in extensions) reset it and their behavior will be affected
  if they no longer override the various related settings like
  UseInstantCommons.
* ShortPagesNamespaceBlacklist handling could be moved to
  SpecialShortPages.php, but that would require re-adding it as a
  recognized configuration setting, which doesn't seem worth the tiny
  code simplification.

Bug: T305093
Change-Id: Iec8c391fec8396846216a9708d75df57f7d799a2
2022-04-05 14:03:53 +03:00
daniel
5fcedc88c9 Add wiki-farm support
Added support for an easy to configure multi-tenant ("wiki farm") mode:
Settings for each site can be placed in a directory specified by
$wgWikiFarmSettingsDirectory. Site detection is controlled by
$wgWikiFarmSiteDetector and defaults to the requested host name.

Instructions for manual testing: https://etherpad.wikimedia.org/p/T221535

Bug: T221535
Change-Id: I7581921b7d99ba1fe7e25523fde691d76b67a99c
2022-04-01 14:29:22 +02:00
jenkins-bot
b23e63f4d6 Merge "Allow LocalSettings.php to be loaded in function scope." 2022-03-28 14:29:19 +00:00
jenkins-bot
ae1bab6d27 Merge "Emit timing stats about loading default config." 2022-03-28 14:23:24 +00:00
daniel
33a3c3c687 Allow LocalSettings.php to be loaded in function scope.
This adds an experimental mode that loads LocalSettings.php in a
function, rather than in top level global scope. This is controlled
using the MW_USE_LOCAL_SETTINGS_LOADER environment variable.

This is not intended for use in production as this time.
The experimental mode should be available in the 1.38 release,
so people can try it out with different setups.

Bug: T304183
Depends-On: Ie6245ff8cd2bc7bab2af3b1450070185dbc2d824
Change-Id: I0f20024803336064ecb07b51fa56581af7b67a85
2022-03-28 14:10:42 +00:00
daniel
a55ffa573b Emit timing stats about loading default config.
Bug: T304460
Change-Id: I35d8695dfcc2133857e4a363de35b3311226ccf3
2022-03-25 09:21:20 +01:00
daniel
d83eddd818 Support MW_USE_CONFIG_SCHEMA constant.
This allows MW_USE_CONFIG_SCHEMA to be defined as a constant instead of
an environment variable. This is useful if we want to set it in
multiversion. We could use putenv, but its interaction with getenv is a
mess, see the warning on
<https://www.php.net/manual/en/function.getenv.php>.

Bug: T304460
Change-Id: I0bd87e2ddde70ba9fede65b8d607eec01b39aed5
2022-03-22 22:48:01 +01:00
jenkins-bot
e4a3b42ef2 Merge "Fix default value for $wgShowEXIF and $wgUSePathInfo." 2022-03-22 00:49:29 +00:00