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.
102 ===== Changed development-only external libraries =====
103 * Updated composer/spdx-licenses from 1.5.5 to 1.5.6.
106 ==== Removed external libraries ====
109 === Bug fixes in 1.39 ===
112 === Action API changes in 1.39 ===
113 * New `undeletetalk` parameter on action=undelete that allows you to restore
114 all revisions of the associated talk page.
117 === Action API internal changes in 1.39 ===
120 === Languages updated in 1.39 ===
121 MediaWiki supports over 350 languages. Many localisations are updated regularly.
122 Below only new and removed languages are listed, as well as changes to languages
123 because of Phabricator reports.
125 * (T307080) Added language support for Okinawan (ryu).
126 * (T307887) Added language support for Mooré (mos).
127 * (T308813) Added language support for Nigerian Pidgin (pcm).
128 * (T309763) Added language support for Tai Nüa (tdd).
129 * (T310040) Added language support for Fante (fat).
130 * (T310976) Added language support for Tumbuka (tum). (Actually, it was
131 in Names.php and even used for a Wikipedia, but actualy localization
133 * (T304920) In Swahili, The "Media" namespace is now "Media", as in English,
134 and the "File" namespace is now "Faili". The old name of the "File" namespace
135 was "Picha", and it's kept for backwards compatibility. If you manage a wiki
136 in Swahili, and you use "Faili:" as a namespace anywhere in wikitext, and
137 you mean to use it as "Media:", these need to be replaced to "Media:".
138 * (T309866) Some namespace translations were updated for Kyrgyz (ky). The old
139 ones are retained as aliases for backwards compatibility.
141 === Breaking changes in 1.39 ===
142 * Basic non-JavaScript (Grade C) support has been dropped for Internet Explorer
143 9-10, Firefox 27-38, and Android 4.3-4.4.
144 * The following methods, deprecated since 1.37, have been removed from IDatabase
149 * Title::getDefaultNamespace(), deprecated since 1.37, has been removed.
150 * The DBPrimaryPos class alias 'DBMasterPos' has been removed.
151 * The global function wfGetLB(), deprecated since 1.27, has been removed.
152 * Passing a db to BlockRestrictionStore::loadByBlockId() is no longer supported.
153 BlockRestrictionStoreFactory should be used to fetch a correct
154 BlockRestrictionStore instead. This was deprecated since 1.38.
155 * The global function wfGetCache(), deprecated since 1.32, has been removed. You
156 can use ObjectCache::getInstance() instead.
157 * The global function wfGetMainCache(), deprecated since 1.32, has been removed.
158 You can use ObjectCache::getLocalClusterInstance() instead.
159 * MovePage::__construct() now requires that all parameters be passed. The
160 fallback to MediaWikiServices emitted deprecation notices since 1.37.
161 * WikiPage::doEditContent(), deprecated since 1.32, was removed.
162 * WikiPage::prepareContentForEdit() now requires a UserIdentity parameter to be
163 provided. Not providing one has been deprecated since 1.37.
164 * EventRelayerKafka, deprecated in 1.38, was removed.
165 * MediaWiki\Logger\Monolog\KafkaHandler, deprecated in 1.38, was removed.
166 * The "trace" option of SectionProfiler, deprecated in 1.38, was removed.
167 * The global function wfWikiID(), deprecated since 1.35, has been removed.
168 * Database::wasKnownStatementRollbackError() was removed. Subclasses should
169 override isKnownStatementRollbackError() instead.
170 * Database::wasQueryTimeoutError() was removed. Subclasses should
171 override isQueryTimeoutError() instead.
172 * Database::buildSuperlative() has been removed without deprecation.
173 * The following methods, deprecated in 1.37, have been removed:
174 - Linker::setStubThreshold(), ::getStubThreshold().
175 - LinkRendererFactory::createForUser().
176 - ParserOptions::getStubThreshold(), ::setStubThreshold().
177 * Changes to ResourceLoader modules:
178 - The mediawiki.viewport module, deprecated in 1.37 has been
179 removed. Use IntersectionObserver instead.
180 * If you manage a wiki in Swahili, and you use "Faili:" as a namespace anywhere,
181 and you mean to use it as "Media:", replace it with "Media:". See T304920.
183 - Skin::getCopyrightIcon(), ::getPoweredBy(), deprecated in 1.37 have been
185 - Skin::bottomScripts soft deprecated in 1.37, was hard deprecated.
186 Skins using SkinTemplate must set bodyOnly as a skin option and
187 remove lines of code generating html, body and head elements.
188 - Skin::makeSearchButton and Skin::makeSearchInput were deprecated in 1.38.
189 Use SkinTemplate methods with the same name or Skin::getTemplateData
191 - Styles for the HTML classes `warningbox`, `errorbox` and `successbox` have
192 been removed in favor of Html class methods.
193 - The feature `legacy` used inside ResourceLoaderSkinModule,
194 deprecated in 1.37, will no longer ship any styles.
195 - Skin::getSkinStylePath, deprecated since 1.36, has been removed.
196 - Skin::getPortletData has been made private.
197 - SkinTemplate::getPersonalToolsList(), deprecated in 1.35 has been
199 * Experimental wiki farm support: Automatic detection of the requested site
200 within a wiki farm based on the requested domain has been removed.
201 Use the MW_WIKI_NAME environment variable to specify the name of the site
202 to load configuration for. Using the WIKI_NAME environment variable for this
203 purpose is deprecated. This is only relevant if you have been using
204 $wgWikiFarmSettingsDirectory to load wiki farm config.
205 * MWExceptionHandler::installHandler was marked @internal and had required
206 arguments added. This method is intended for use in bootstrap code and is
207 unused in known extensions.
208 * MWException::useOutputPage was made private without deprecation.
209 This method was apparently only public for testing and is unused in known
211 * Calling getId() on a User or UserIdentityValue from the wrong wiki, deprecated
212 since 1.36, now throws an exception.
213 * The following methods have been removed from ExtensionRegistry without
214 deprecation and without replacement. They had been introduced in 1.35 for use
215 in the testing framework, and were not in use by any known extension:
216 - exportAutoloadClassesAndNamespaces
217 - exportTestAutoloadClassesAndNamespaces
218 * The MWNamespace class, deprecated since 1.34, has been removed. Use the
219 NamespaceInfo service instead.
220 * The UnknownContent and UnknownContentHandler class aliases have been removed,
221 use FallbackContent and FallbackContentHandler instead.
222 * IResultWrapper::next() now returns void, to match the Iterator interface that
223 it implements. fetchObject() has the same behavior as next() used to.
224 * In HTMLForm HTMLAutoCompleteSelectFields, the parameters 'autocomplete' and
225 'autocomplete-messages', which were deprecated in MediaWiki 1.29, were
226 removed. Instead, use 'autocomplete-data' and 'autocomplete-data-messages'.
227 * ParserOutput::setText will now set the ParserOutput's text to null if
228 given null. Previously it did nothing if given null.
229 * The default value for the first argument to the ParserOutput constructor
230 is now null instead of ''.
231 * IDatabase::lockTables() and IDatabase::unlockTables(), deprecated since 1.38,
233 * The $context parameter to `new HTMLForm( … )` and `HTMLForm::factory( … )`
235 * The class alias for revision related classes in namespace MediaWiki\Storage
236 has been removed. Classes are IncompleteRevisionException,
237 MutableRevisionRecord, MutableRevisionSlots, RevisionAccessException,
238 RevisionArchiveRecord, RevisionFactory, RevisionLookup, RevisionRecord,
239 RevisionSlots, RevisionStore, RevisionStoreRecord, SlotRecord, and
240 SuppressedDataException.
241 * Calling getBy() on an AbstractBlock from the wrong wiki, deprecated since
242 1.38, now throws an exception.
243 * Passing a MediaWiki\Linker\LinkTarget to EditPage::makeTemplatesOnThisPageList
244 or TemplatesOnThisPageFormatter::format is no longer supported,
245 a MediaWiki\Page\PageIdentity is required.
246 * The deprecated class alias FakeConverter has been removed, use
247 TrivialLanguageConverter instead.
248 * The deprecated ApiQueryContributions class alias has been removed, use
249 ApiQueryUserContribs instead.
250 * The deprecated MediaWiki\Special\SpecialPageFactory class alias has been
251 removed, use MediaWiki\SpecialPage\SpecialPageFactory instead.
252 * The following skin modules, deprecated in 1.37, have been removed:
253 - mediawiki.skinning.elements
254 - mediawiki.skinning.content
255 - mediawiki.toc.styles
256 - mediawiki.legacy.config
257 - mediawiki.legacy.shared
258 - mediawiki.legacy.commonPrint
259 * FileModule::compileLessFile(), deprecated since 1.35, has been removed. Use
260 ::compileLessString() instead.
261 * LogFormatter::styleRestricedElement(), deprecated since 1.37, has been
262 removed. Use ::styleRestrictedElement() instead.
263 * Title::isNamespaceProtected(), deprecated in 1.34, has been removed.
264 * ApiStashEdit::parseAndStash(), deprecated in 1.34, has been removed.
265 * LinkCache::forUpdate(), deprecated in 1.34, has been removed.
266 * Passing null instead of a NamespaceInfo instance to LinkCache::__construct()
267 is not supported anymore. It is recommended to request an instance from the
269 * ApiQueryBase::showHiddenUsersAddBlockInfo(), deprecated in 1.34, has been
270 removed. Use ApiQueryBlockInfoTrait instead.
271 * ApiQueryBase::prefixedTitlePartToKey(), deprecated in 1.35, has been removed.
272 Use ::parsePrefixedTitlePart() instead.
273 * ExternalStoreDB::getSlave(), deprecated in 1.34, has been removed. Use
274 ExternalStoreDB::getReplica() instead.
275 * ChangesListSpecialPage::checkStructuredFilterUiEnabled() and
276 SpecialWatchlist::checkStructuredFilterUiEnabled() now support UserIdentity
277 as the only argument. Passing Config argument was deprecated in 1.34.
278 * DatabaseUpdater::ifNoActorTable(), deprecated in 1.35, has been removed. Use
279 ::ifTableNotExists() instead.
280 * MediaWiki\Revision\RevisionStoreFactory::getRevisionStore was documented
281 to allow passing bool true as a dbDomain, this is no longer possible,
282 because that is an invalid value for a dbDomain.
283 * LinkHolderArray::__construct() had its signature changed. The class was marked
285 * SpecialMute::isTargetBlacklisted(), deprecated in 1.35, has been removed. Use
286 ::isTargetMuted() instead.
287 * WebRequest::checkUrlExtension(), deprecated in 1.35, has been removed.
288 * ContentHandler::cleanupHandlersCache(), deprecated in 1.35, has been removed.
289 * SpecialVersion::getExtAuthorsFileName, deprecated in 1.35, has been removed.
290 Use MediaWiki\ExtensionInfo::getAuthorsFileName.
291 * SpecialVersion::getExtLicenseFileName, deprecated in 1.35, has been removed.
292 Use MediaWiki\ExtensionInfo::getLicenseFileNames.
293 * CategoryPage::getCategoryViewerClass and ::setCategoryViewerClass, deprecated
294 in 1.35, have been removed.
295 * SqlBlobStore::getLegacyEncodingConversionLang(), deprecated in 1.34, has been
297 * wfCanIPUseHTTPS(), deprecated in 1.37, has been removed.
298 * The following methods of Database class, are no longer stable to override:
299 - ::implicitOrderby()
308 - ::buildStringCast()
309 - ::buildIntegerCast()
311 - ::addIdentifierQuotes()
314 - ::unionSupportsOrderAndLimit()
320 - ::setTableAliases()
321 - ::setIndexAliases()
322 - ::buildGroupConcatField()
325 === Deprecations in 1.39 ===
326 * PageProps::getInstance(), deprecated since 1.38, emits deprecations warnings.
327 * The global function wfGetDB() has been deprecated. Use
328 LoadBalancer::getConnection() instead.
329 * SpecialRedirectWithAction::__construct without SearchEngineFactory argument
331 * Use of the SiteStatsUpdate constructor has been deprecated in favor of
332 the ::factory() method.
333 * AuthManager::checkAccountCreatePermissions has been deprecated. Use
334 AuthManager::authorizeCreateAccount or AuthManager::probablyCanCreateAccount
336 * Title::getSelectFields() has been deprecated in favor of
337 PageStore::newSelectQueryBuilder()
338 * Title::newFromTitleValue(), deprecated since in 1.34, now emits deprecation
339 warnings. Use ::newFromLinkTarget() instead.
340 * ExtensionRegistry::readFromQueue() has been marked @internal. Extensions
341 should use ExtensionProcessor instead.
342 * Processor::getExtraAutoloaderPaths() and
343 ExtensionProcessor::getExtraAutoloaderPaths() have been deprecated, use get
344 getExtractedAutoloadInfo() instead.
345 * The following global functions are deprecated in favor of the listed UrlUtils
347 - wfExpandUrl -> UrlUtils::expand
348 - wfGetServerUrl -> UrlUtils::getServer
349 - wfAssembleUrl -> UrlUtils::assemble
350 - wfRemoveDotSegments -> UrlUtils::removeDotSegments
351 - wfUrlProtocols -> UrlUtils::validProtocols
352 - wfUrlProtocolsWithoutProtRel -> UrlUtils::validAbsoluteProtocols
353 - wfParseUrl -> UrlUtils::parse
354 - wfExpandIRI -> UrlUtils::expandIRI
355 - wfMatchesDomainList -> UrlUtils::matchesDomainList
356 These methods are exact replacements except that
357 1) they return null instead of false or empty string on error (where
359 2) UrlUtils::validProtocols does not take a parameter (documentation said not
360 to pass one to wfUrlProtocols anyway);
361 3) they use type hints (don't try passing null instead of string, etc.).
362 * MaintainableDBConnRef is deprecated, use DBConnRef instead.
363 * Loading DefaultSettings.php is deprecated. To get default values of main
364 config settings, use MainConfigSchema::listDefaultValues() or
365 MainConfigSchema::getDefaultValue().
366 * AbstractContent::getRedirectChain() and
367 AbstractContent::getUltimateRedirectTarget() are now emitting deprecation
369 * (T244138) QueryPage::getSQL() is deprecated. Instead QueryPage::getQueryInfo()
370 should be overridden.
371 * Calling new JobRunner() directly without $serviceOptions now emits
372 deprecation warnings. Use MediaWikiServices::getInstance()->getJobRunner()
374 * Passing an array of targets to Article::getRedirectHeaderHtml() is
375 deprecated. Supply a single redirect target instead (T296430).
376 * The following Less mediawiki.mixins have been deprecated:
379 - .transform-rotate()
380 * Skin::getAction is deprecated. Use IContextSource::getActionName instead.
381 * ILBFactory::forEachLB() is deprecated. Use ::getAllLBs().
382 * LoadBalancer::forEachOpenConnection() and ::forEachOpenPrimaryConnection()
383 are deprecated without replacement.
384 * The following classes were moved from the root namespace to the
385 MediaWiki\ResourceLoader namespace, the old names becoming deprecated aliases:
386 ResourceLoader, MessageBlobStore, VueComponentParser.
387 * The following classes had the "ResourceLoader" prefix stripped while being
388 moved to the MediaWiki\ResourceLoader namespace, the old names becoming
389 deprecated aliases: DerivativeResourceLoaderContext,
390 ResourceLoaderCircularDependencyError, ResourceLoaderClientHtml,
391 ResourceLoaderCodexModule, ResourceLoaderContext, ResourceLoaderFileModule,
392 ResourceLoaderFilePath, ResourceLoaderForeignApiModule, ResourceLoaderImage,
393 ResourceLoaderImageModule, ResourceLoaderLanguageDataModule,
394 ResourceLoaderLessVarFileModule, ResourceLoaderModule,
395 ResourceLoaderMwUrlModule, ResourceLoaderOOUIFileModule,
396 ResourceLoaderOOUIIconPackModule, ResourceLoaderOOUIImageModule,
397 ResourceLoaderOOUIModule, ResourceLoaderSiteModule,
398 ResourceLoaderSiteStylesModule, ResourceLoaderSkinModule,
399 ResourceLoaderStartUpModule, ResourceLoaderUserModule,
400 ResourceLoaderUserOptionsModule, ResourceLoaderUserStylesModule,
401 ResourceLoaderWikiModule.
402 * The following methods in WikiRevision and their interfaces
403 ImportableUploadRevision and ImportableOldRevision are deprecated:
404 - ::getUserObj() → ::getUser()
405 - ::setUserObj() → ::setUsername()
406 - ::setUserIP() → ::setUsername()
407 * ObjectCache::addBusyCallback() is deprecated and non-functional.
408 * MWTimestamp::getHumanTimestamp(), deprecated in 1.26, now emits deprecation
410 * Article::viewRedirect(), deprecated in 1.30, now emits deprecation warnings.
411 * User::blockedFor(), deprecated in 1.35, now emits deprecation warnings.
412 * Access to previously public properties AbstractBlock::$mExpiry,
413 AbstractBlock::$mHideName, AbstractBlock::$mTimestamp, DatabaseBlock::$mAuto,
414 and DatabaseBlock::$mParentBlockId, deprecated in 1.34, now emits deprecation
416 * Access to previously public properties User::$mBlock, User::$mBlockedby, and
417 User::$mHideName, deprecated in 1.35, now emits deprecation warnings.
418 * JobQueueGroup::singleton() and ::destroySingletons(), deprecated in 1.37, now
419 emit deprecation warnings.
420 * Title::getNotificationTimestamp(), deprecated in 1.35, now emits deprecation
424 === Other changes in 1.39 ===
429 MediaWiki 1.39 requires PHP 7.3.19 or later and the following PHP extensions:
440 MariaDB is the recommended database software. MySQL, PostgreSQL, or SQLite can
441 be used instead, but support for them is somewhat less mature.
443 The supported versions are:
445 * MariaDB 10.3 or higher
446 * MySQL 5.7.0 or higher
447 * PostgreSQL 9.4 or later
448 * SQLite 3.8.0 or later
450 == Online documentation ==
451 Documentation for both end-users and site administrators is available on
452 MediaWiki.org, and is covered under the GNU Free Documentation License (except
453 for pages that explicitly state that their contents are in the public domain):
455 https://www.mediawiki.org/wiki/Special:MyLanguage/Documentation
458 A mailing list is available for MediaWiki user support and discussion:
460 https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
462 A low-traffic announcements-only list is also available:
464 https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
466 It's highly recommended that you sign up for one of these lists if you're
467 going to run a public MediaWiki, so you can be notified of security fixes.
470 There's usually someone online in #mediawiki on irc.libera.chat.