3 == MediaWiki 1.39.0-PRERELEASE ==
5 THIS IS NOT A RELEASE YET
7 MediaWiki 1.39 is an alpha-quality development branch, and is not recommended
10 == Upgrading notes for 1.39 ==
11 Don't forget to always back up your database before upgrading!
13 See the file UPGRADE for more detailed per-version upgrade instructions from the
14 oldest supported upgrading version, MediaWiki 1.31.
16 Some specific notes for MediaWiki 1.39 upgrades are below:
19 For notes on 1.38.x and older releases, see HISTORY.
21 === Configuration changes for system administrators in 1.39 ===
22 * The default serialization method for file meta-data has been changed to JSON.
23 You can revert it to PHP by setting the 'useJsonMetadata' property to false in
25 * The DBO_SSL flag in $wgDBservers and $wgLBFactoryConf has been deprecated in
26 favour of a boolean "ssl" parameter.
29 ==== New configuration ====
30 * $wgAutoCreateTempUser – configures automatic user creation on page save.
31 * $wgCopyUploadAllowOnWikiDomainConfig – Configures if administrators can use
32 the MediaWiki:Copyupload-allowed-domains system message to define which
33 domains can be used with the upload-by-url tool.
36 ==== Changed configuration ====
37 * $wgInvalidUsernameCharacters now contains the char '>',
38 reserved delimiter for external user names.
41 ==== Removed configuration ====
42 * $wgMultiContentRevisionSchemaMigrationStage - Migration is over, was
43 deprecated since 1.35.
44 * $wgWikiFarmSiteDetector – experimental setting removed without replacement.
45 Use the MW_WIKI_NAME environment variable to specifiy the name of the site
46 to load configuration for. Using the WIKI_NAME environment variable for this
47 purpose is deprecated.
48 * $wgParserCacheUseJson - the ParserCache now always uses JSON serialization.
49 Reading old non-JSON cache entries is still supported. The setting had been
50 deprecated since 1.36.
51 * $wgAllowJavaUploads - To allow uploads of JAR files, remove application/java
52 from $wgMimeTypeExclusions.
53 * $wgMaxRedirects has been removed. This feature never worked as intended,
55 * $wgElementTiming has been removed. This feature was experimental,
56 and disabled by default.
57 * $wgPriorityHints and $wgPriorityHintsRatio have been removed.
58 This feature was experimental, and disabled by default.
59 * $wgActorTableSchemaMigrationStage has been removed. Migration is over.
60 * In $wgObjectCaches, globalKeyLB and localKeyLB are no longer supported.
61 * $wgLegacySchemaConversion - This global configuration has been
62 removed because it was unused.
63 * $wgInterwikiPrefixDisplayTypes - This global configuration has been
64 removed because it was unused.
67 === New user-facing features in 1.39 ===
68 * Optional automatic user creation on page save ($wgAutoCreateTempUser)
69 * Administrators now have the option to delete/undelete the associated "Talk"
70 page when they are (un)deleting a given page. `deletetalk` and `undeletetalk`
71 options were added to the 'delete' and 'undelete' action APIs in MW 1.38.
72 * `{{=}}` is now a wikitext built-in magic word, expanding to `=`. This is
73 conventionally used as an escape mechanism to allow the use of `=` in
74 unnamed template arguments. Defining [[Template:=]] to expand to something
75 other than `=` has been deprecated since 1.36, with affected pages put into
76 a special tracking category for migration.
79 === New developer features in 1.39 ===
82 === External library changes in 1.39 ===
84 ==== New external libraries ====
85 * Added Codex v0.1.0-alpha.8
88 ===== New development-only external libraries =====
89 * Updated QUnit from 2.18.0 to 2.18.2.
92 ==== Changed external libraries ====
93 * Updated OOUI from v0.43.2 to v0.44.0.
94 * Updated composer/semver from 3.2.6 to 3.3.2.
95 * Updated vue/compat from 3.2.23 to 3.2.31.
96 * Updated wikimedia/minify from 2.2.6 to 2.3.0.
97 * Updated wikimedia/ip-set from 3.0.0 to 3.1.0.
98 * Updated wikimedia/xmp-reader from 0.8.1 to 0.8.2.
99 * Updated wikimedia/timestamp from 3.0.0 to 4.0.0.
100 * Updated symfony/polyfill-php73 from 1.25.0 to 1.26.0.
101 * Updated symfony/polyfill-php80 from 1.25.0 to 1.26.0.
102 * Updated symfony/yaml from 5.4.3 to 5.4.10.
105 ===== Changed development-only external libraries =====
106 * Updated composer/spdx-licenses from 1.5.5 to 1.5.6.
109 ==== Removed external libraries ====
112 === Bug fixes in 1.39 ===
115 === Action API changes in 1.39 ===
116 * New `undeletetalk` parameter on action=undelete that allows you to restore
117 all revisions of the associated talk page.
120 === Action API internal changes in 1.39 ===
123 === Languages updated in 1.39 ===
124 MediaWiki supports over 350 languages. Many localisations are updated regularly.
125 Below only new and removed languages are listed, as well as changes to languages
126 because of Phabricator reports.
128 * (T307080) Added language support for Okinawan (ryu).
129 * (T307887) Added language support for Mooré (mos).
130 * (T308813) Added language support for Nigerian Pidgin (pcm).
131 * (T309763) Added language support for Tai Nüa (tdd).
132 * (T310040) Added language support for Fante (fat).
133 * (T310976) Added language support for Tumbuka (tum). (Actually, it was
134 in Names.php and even used for a Wikipedia, but actualy localization
136 * (T311034) Added language support for Campidanese Sardinian (sro).
137 * (T304920) In Swahili, The "Media" namespace is now "Media", as in English,
138 and the "File" namespace is now "Faili". The old name of the "File" namespace
139 was "Picha", and it's kept for backwards compatibility. If you manage a wiki
140 in Swahili, and you use "Faili:" as a namespace anywhere in wikitext, and
141 you mean to use it as "Media:", these need to be replaced to "Media:".
142 * (T309866) Some namespace translations were updated for Kyrgyz (ky). The old
143 ones are retained as aliases for backwards compatibility.
145 === Breaking changes in 1.39 ===
146 * Basic non-JavaScript (Grade C) support has been dropped for Internet Explorer
147 9-10, Firefox 27-38, and Android 4.3-4.4.
148 * The following methods, deprecated since 1.37, have been removed from IDatabase
153 * Title::getDefaultNamespace(), deprecated since 1.37, has been removed.
154 * The DBPrimaryPos class alias 'DBMasterPos' has been removed.
155 * The global function wfGetLB(), deprecated since 1.27, has been removed.
156 * Passing a db to BlockRestrictionStore::loadByBlockId() is no longer supported.
157 BlockRestrictionStoreFactory should be used to fetch a correct
158 BlockRestrictionStore instead. This was deprecated since 1.38.
159 * The global function wfGetCache(), deprecated since 1.32, has been removed. You
160 can use ObjectCache::getInstance() instead.
161 * The global function wfGetMainCache(), deprecated since 1.32, has been removed.
162 You can use ObjectCache::getLocalClusterInstance() instead.
163 * MovePage::__construct() now requires that all parameters be passed. The
164 fallback to MediaWikiServices emitted deprecation notices since 1.37.
165 * WikiPage::doEditContent(), deprecated since 1.32, was removed.
166 * WikiPage::prepareContentForEdit() now requires a UserIdentity parameter to be
167 provided. Not providing one has been deprecated since 1.37.
168 * EventRelayerKafka, deprecated in 1.38, was removed.
169 * MediaWiki\Logger\Monolog\KafkaHandler, deprecated in 1.38, was removed.
170 * The "trace" option of SectionProfiler, deprecated in 1.38, was removed.
171 * The global function wfWikiID(), deprecated since 1.35, has been removed.
172 * Database::wasKnownStatementRollbackError() was removed. Subclasses should
173 override isKnownStatementRollbackError() instead.
174 * Database::wasQueryTimeoutError() was removed. Subclasses should
175 override isQueryTimeoutError() instead.
176 * Database::buildSuperlative() has been removed without deprecation.
177 * The following methods, deprecated in 1.37, have been removed:
178 - Linker::setStubThreshold(), ::getStubThreshold().
179 - LinkRendererFactory::createForUser().
180 - ParserOptions::getStubThreshold(), ::setStubThreshold().
181 * Changes to ResourceLoader modules:
182 - The mediawiki.viewport module, deprecated in 1.37 has been
183 removed. Use IntersectionObserver instead.
184 * If you manage a wiki in Swahili, and you use "Faili:" as a namespace anywhere,
185 and you mean to use it as "Media:", replace it with "Media:". See T304920.
187 - Skin::getCopyrightIcon(), ::getPoweredBy(), deprecated in 1.37 have been
189 - Skin::bottomScripts soft deprecated in 1.37, was hard deprecated.
190 Skins using SkinTemplate must set bodyOnly as a skin option and
191 remove lines of code generating html, body and head elements.
192 - Skin::makeSearchButton and Skin::makeSearchInput were deprecated in 1.38.
193 Use SkinTemplate methods with the same name or Skin::getTemplateData
195 - Styles for the HTML classes `warningbox`, `errorbox` and `successbox` have
196 been removed in favor of Html class methods.
197 - The feature `legacy` used inside ResourceLoaderSkinModule,
198 deprecated in 1.37, will no longer ship any styles.
199 - Skin::getSkinStylePath, deprecated since 1.36, has been removed.
200 - Skin::getPortletData has been made private.
201 - SkinTemplate::getPersonalToolsList(), deprecated in 1.35 has been
203 - The following SkinTemplate template data, deprecated in 1.37,
207 - The following hooks, deprecated in 1.37, have been removed:
208 - SkinGetPoweredBy: SkinGetPoweredByHook
209 - The following hooks are deprecated and replaced with
210 SkinTemplateNavigation::Universal:
211 - SkinTemplateNavigation::SpecialPage
212 - SkinTemplateNavigation
213 * Experimental wiki farm support: Automatic detection of the requested site
214 within a wiki farm based on the requested domain has been removed.
215 Use the MW_WIKI_NAME environment variable to specify the name of the site
216 to load configuration for. Using the WIKI_NAME environment variable for this
217 purpose is deprecated. This is only relevant if you have been using
218 $wgWikiFarmSettingsDirectory to load wiki farm config.
219 * MWExceptionHandler::installHandler was marked @internal and had required
220 arguments added. This method is intended for use in bootstrap code and is
221 unused in known extensions.
222 * MWException::useOutputPage was made private without deprecation.
223 This method was apparently only public for testing and is unused in known
225 * Calling getId() on a User or UserIdentityValue from the wrong wiki, deprecated
226 since 1.36, now throws an exception.
227 * The following methods have been removed from ExtensionRegistry without
228 deprecation and without replacement. They had been introduced in 1.35 for use
229 in the testing framework, and were not in use by any known extension:
230 - exportAutoloadClassesAndNamespaces
231 - exportTestAutoloadClassesAndNamespaces
232 * The MWNamespace class, deprecated since 1.34, has been removed. Use the
233 NamespaceInfo service instead.
234 * The UnknownContent and UnknownContentHandler class aliases have been removed,
235 use FallbackContent and FallbackContentHandler instead.
236 * IResultWrapper::next() now returns void, to match the Iterator interface that
237 it implements. fetchObject() has the same behavior as next() used to.
238 * In HTMLForm HTMLAutoCompleteSelectFields, the parameters 'autocomplete' and
239 'autocomplete-messages', which were deprecated in MediaWiki 1.29, were
240 removed. Instead, use 'autocomplete-data' and 'autocomplete-data-messages'.
241 * ParserOutput::setText will now set the ParserOutput's text to null if
242 given null. Previously it did nothing if given null.
243 * The default value for the first argument to the ParserOutput constructor
244 is now null instead of ''.
245 * IDatabase::lockTables() and IDatabase::unlockTables(), deprecated since 1.38,
247 * The $context parameter to `new HTMLForm( … )` and `HTMLForm::factory( … )`
249 * The class alias for revision related classes in namespace MediaWiki\Storage
250 has been removed. Classes are IncompleteRevisionException,
251 MutableRevisionRecord, MutableRevisionSlots, RevisionAccessException,
252 RevisionArchiveRecord, RevisionFactory, RevisionLookup, RevisionRecord,
253 RevisionSlots, RevisionStore, RevisionStoreRecord, SlotRecord, and
254 SuppressedDataException.
255 * Calling getBy() on an AbstractBlock from the wrong wiki, deprecated since
256 1.38, now throws an exception.
257 * Passing a MediaWiki\Linker\LinkTarget to EditPage::makeTemplatesOnThisPageList
258 or TemplatesOnThisPageFormatter::format is no longer supported,
259 a MediaWiki\Page\PageIdentity is required.
260 * The deprecated class alias FakeConverter has been removed, use
261 TrivialLanguageConverter instead.
262 * The deprecated ApiQueryContributions class alias has been removed, use
263 ApiQueryUserContribs instead.
264 * The deprecated MediaWiki\Special\SpecialPageFactory class alias has been
265 removed, use MediaWiki\SpecialPage\SpecialPageFactory instead.
266 * The following skin modules, deprecated in 1.37, have been removed:
267 - mediawiki.skinning.elements
268 - mediawiki.skinning.content
269 - mediawiki.toc.styles
270 - mediawiki.legacy.config
271 - mediawiki.legacy.shared
272 - mediawiki.legacy.commonPrint
273 * FileModule::compileLessFile(), deprecated since 1.35, has been removed. Use
274 ::compileLessString() instead.
275 * LogFormatter::styleRestricedElement(), deprecated since 1.37, has been
276 removed. Use ::styleRestrictedElement() instead.
277 * Title::isNamespaceProtected(), deprecated in 1.34, has been removed.
278 * ApiStashEdit::parseAndStash(), deprecated in 1.34, has been removed.
279 * LinkCache::forUpdate(), deprecated in 1.34, has been removed.
280 * Passing null instead of a NamespaceInfo instance to LinkCache::__construct()
281 is not supported anymore. It is recommended to request an instance from the
283 * ApiQueryBase::showHiddenUsersAddBlockInfo(), deprecated in 1.34, has been
284 removed. Use ApiQueryBlockInfoTrait instead.
285 * ApiQueryBase::prefixedTitlePartToKey(), deprecated in 1.35, has been removed.
286 Use ::parsePrefixedTitlePart() instead.
287 * ExternalStoreDB::getSlave(), deprecated in 1.34, has been removed. Use
288 ExternalStoreDB::getReplica() instead.
289 * ChangesListSpecialPage::checkStructuredFilterUiEnabled() and
290 SpecialWatchlist::checkStructuredFilterUiEnabled() now support UserIdentity
291 as the only argument. Passing Config argument was deprecated in 1.34.
292 * DatabaseUpdater::ifNoActorTable(), deprecated in 1.35, has been removed. Use
293 ::ifTableNotExists() instead.
294 * MediaWiki\Revision\RevisionStoreFactory::getRevisionStore was documented
295 to allow passing bool true as a dbDomain, this is no longer possible,
296 because that is an invalid value for a dbDomain.
297 * LinkHolderArray::__construct() had its signature changed. The class was marked
299 * SpecialMute::isTargetBlacklisted(), deprecated in 1.35, has been removed. Use
300 ::isTargetMuted() instead.
301 * WebRequest::checkUrlExtension(), deprecated in 1.35, has been removed.
302 * ContentHandler::cleanupHandlersCache(), deprecated in 1.35, has been removed.
303 * SpecialVersion::getExtAuthorsFileName, deprecated in 1.35, has been removed.
304 Use MediaWiki\ExtensionInfo::getAuthorsFileName.
305 * SpecialVersion::getExtLicenseFileName, deprecated in 1.35, has been removed.
306 Use MediaWiki\ExtensionInfo::getLicenseFileNames.
307 * CategoryPage::getCategoryViewerClass and ::setCategoryViewerClass, deprecated
308 in 1.35, have been removed.
309 * SqlBlobStore::getLegacyEncodingConversionLang(), deprecated in 1.34, has been
311 * wfCanIPUseHTTPS(), deprecated in 1.37, has been removed.
312 * wfGetScriptUrl(), deprecated in 1.35, has been removed.
313 * The following methods of Database class, are no longer stable to override:
314 - ::implicitOrderby()
323 - ::buildStringCast()
324 - ::buildIntegerCast()
326 - ::addIdentifierQuotes()
329 - ::unionSupportsOrderAndLimit()
335 - ::setTableAliases()
336 - ::setIndexAliases()
337 - ::buildGroupConcatField()
338 * SpecialUnblock::processUnblock(), deprecated in 1.36, has been removed. Use
340 * wfLocalFile() and wfFindFile(), deprecated in 1.34, have been removed.
343 === Deprecations in 1.39 ===
344 * PageProps::getInstance(), deprecated since 1.38, emits deprecations warnings.
345 * The global function wfGetDB() has been deprecated. Use
346 LoadBalancer::getConnection() instead.
347 * SpecialRedirectWithAction::__construct without SearchEngineFactory argument
349 * Use of the SiteStatsUpdate constructor has been deprecated in favor of
350 the ::factory() method.
351 * AuthManager::checkAccountCreatePermissions has been deprecated. Use
352 AuthManager::authorizeCreateAccount or AuthManager::probablyCanCreateAccount
354 * Title::getSelectFields() has been deprecated in favor of
355 PageStore::newSelectQueryBuilder()
356 * Title::newFromTitleValue(), deprecated since in 1.34, now emits deprecation
357 warnings. Use ::newFromLinkTarget() instead.
358 * ExtensionRegistry::readFromQueue() has been marked @internal. Extensions
359 should use ExtensionProcessor instead.
360 * Processor::getExtraAutoloaderPaths() and
361 ExtensionProcessor::getExtraAutoloaderPaths() have been deprecated, use get
362 getExtractedAutoloadInfo() instead.
363 * The following global functions are deprecated in favor of the listed UrlUtils
365 - wfExpandUrl -> UrlUtils::expand
366 - wfGetServerUrl -> UrlUtils::getServer
367 - wfAssembleUrl -> UrlUtils::assemble
368 - wfRemoveDotSegments -> UrlUtils::removeDotSegments
369 - wfUrlProtocols -> UrlUtils::validProtocols
370 - wfUrlProtocolsWithoutProtRel -> UrlUtils::validAbsoluteProtocols
371 - wfParseUrl -> UrlUtils::parse
372 - wfExpandIRI -> UrlUtils::expandIRI
373 - wfMatchesDomainList -> UrlUtils::matchesDomainList
374 These methods are exact replacements except that
375 1) they return null instead of false or empty string on error (where
377 2) UrlUtils::validProtocols does not take a parameter (documentation said not
378 to pass one to wfUrlProtocols anyway);
379 3) they use type hints (don't try passing null instead of string, etc.).
380 * MaintainableDBConnRef is deprecated, use DBConnRef instead.
381 * Loading DefaultSettings.php is deprecated. To get default values of main
382 config settings, use MainConfigSchema::listDefaultValues() or
383 MainConfigSchema::getDefaultValue().
384 * AbstractContent::getRedirectChain() and
385 AbstractContent::getUltimateRedirectTarget() are now emitting deprecation
387 * (T244138) QueryPage::getSQL() is deprecated. Instead QueryPage::getQueryInfo()
388 should be overridden.
389 * Calling new JobRunner() directly without $serviceOptions now emits
390 deprecation warnings. Use MediaWikiServices::getInstance()->getJobRunner()
392 * Passing an array of targets to Article::getRedirectHeaderHtml() is
393 deprecated. Supply a single redirect target instead (T296430).
394 * The following Less mediawiki.mixins have been deprecated:
397 - .transform-rotate()
398 * Skin::getAction is deprecated. Use IContextSource::getActionName instead.
399 * ILBFactory::forEachLB() is deprecated. Use ::getAllLBs().
400 * LoadBalancer::forEachOpenConnection() and ::forEachOpenPrimaryConnection()
401 are deprecated without replacement.
402 * The following classes were moved from the root namespace to the
403 MediaWiki\ResourceLoader namespace, the old names becoming deprecated aliases:
404 ResourceLoader, MessageBlobStore, VueComponentParser.
405 * The following classes had the "ResourceLoader" prefix stripped while being
406 moved to the MediaWiki\ResourceLoader namespace, the old names becoming
407 deprecated aliases: DerivativeResourceLoaderContext,
408 ResourceLoaderCircularDependencyError, ResourceLoaderClientHtml,
409 ResourceLoaderCodexModule, ResourceLoaderContext, ResourceLoaderFileModule,
410 ResourceLoaderFilePath, ResourceLoaderForeignApiModule, ResourceLoaderImage,
411 ResourceLoaderImageModule, ResourceLoaderLanguageDataModule,
412 ResourceLoaderLessVarFileModule, ResourceLoaderModule,
413 ResourceLoaderMwUrlModule, ResourceLoaderOOUIFileModule,
414 ResourceLoaderOOUIIconPackModule, ResourceLoaderOOUIImageModule,
415 ResourceLoaderOOUIModule, ResourceLoaderSiteModule,
416 ResourceLoaderSiteStylesModule, ResourceLoaderSkinModule,
417 ResourceLoaderStartUpModule, ResourceLoaderUserModule,
418 ResourceLoaderUserOptionsModule, ResourceLoaderUserStylesModule,
419 ResourceLoaderWikiModule.
420 * The following methods in WikiRevision and their interfaces
421 ImportableUploadRevision and ImportableOldRevision are deprecated:
422 - ::getUserObj() → ::getUser()
423 - ::setUserObj() → ::setUsername()
424 - ::setUserIP() → ::setUsername()
425 * ObjectCache::addBusyCallback() is deprecated and non-functional.
426 * MWTimestamp::getHumanTimestamp(), deprecated in 1.26, now emits deprecation
428 * Article::viewRedirect(), deprecated in 1.30, now emits deprecation warnings.
429 * Parser::getFreshParser() is deprecated, use ParserFactory::getInstance().
430 * User::blockedFor(), deprecated in 1.35, now emits deprecation warnings.
431 * Access to previously public properties AbstractBlock::$mExpiry,
432 AbstractBlock::$mHideName, AbstractBlock::$mTimestamp, DatabaseBlock::$mAuto,
433 and DatabaseBlock::$mParentBlockId, deprecated in 1.34, now emits deprecation
435 * Access to previously public properties User::$mBlock, User::$mBlockedby, and
436 User::$mHideName, deprecated in 1.35, now emits deprecation warnings.
437 * JobQueueGroup::singleton() and ::destroySingletons(), deprecated in 1.37, now
438 emit deprecation warnings.
439 * Title::getNotificationTimestamp(), deprecated in 1.35, now emits deprecation
441 * Global functions wfReadOnly and wfReadOnlyReason, deprecated in 1.38, now
442 emit deprecation warnings.
443 * Overriding or calling DifferenceEngine::getDiffBodyCacheKey(), deprecated in
444 1.31, now emits deprecation warnings.
445 * Access to previously public property WikiRevision::$fileIsTemp, deprecated in
446 1.29, now emits deprecation warnings.
447 * wfQueriesMustScale() has been deprecated and emits deprecation warnings.
448 * ContextSource::getStats(), RequestContext::getStats(), and
449 DerivativeContext::getStats(), deprecated in 1.27, now emit deprecation
451 * ManualLogEntry::setTags(), deprecated in 1.33, now emits deprecation warnings.
452 * WikiRevision::downloadSource(), deprecated in 1.31, now emits deprecation
454 * DifferenceEngine::textDiff(), deprecated in 1.32, now emits deprecation
456 * FormatMetadata::flattenArrayContentLang(), deprecated in 1.36, now emits
457 deprecation warnings.
460 === Other changes in 1.39 ===
465 MediaWiki 1.39 requires PHP 7.3.19 or later and the following PHP extensions:
476 MariaDB is the recommended database software. MySQL, PostgreSQL, or SQLite can
477 be used instead, but support for them is somewhat less mature.
479 The supported versions are:
481 * MariaDB 10.3 or higher
482 * MySQL 5.7.0 or higher
483 * PostgreSQL 9.4 or later
484 * SQLite 3.8.0 or later
486 == Online documentation ==
487 Documentation for both end-users and site administrators is available on
488 MediaWiki.org, and is covered under the GNU Free Documentation License (except
489 for pages that explicitly state that their contents are in the public domain):
491 https://www.mediawiki.org/wiki/Special:MyLanguage/Documentation
494 A mailing list is available for MediaWiki user support and discussion:
496 https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
498 A low-traffic announcements-only list is also available:
500 https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
502 It's highly recommended that you sign up for one of these lists if you're
503 going to run a public MediaWiki, so you can be notified of security fixes.
506 There's usually someone online in #mediawiki on irc.libera.chat.