Parser::extensionSubstitution() Don't run substr() on null
[mediawiki.git] / RELEASE-NOTES-1.39
blobfeab069d99bd38de9c8d47da6a44bec5a9899d59
1 = MediaWiki 1.39 =
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
8 for use in production.
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:
17 * …
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
24   $wgLocalFileRepo.
25 * The DBO_SSL flag in $wgDBservers and $wgLBFactoryConf has been deprecated in
26   favour of a boolean "ssl" parameter.
27 * …
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.
34 * …
36 ==== Changed configuration ====
37 * $wgInvalidUsernameCharacters now contains the char '>',
38   reserved delimiter for external user names.
39 * …
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,
54   see T296430.
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.
65 * …
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.
77 * …
79 === New developer features in 1.39 ===
80 * …
82 === External library changes in 1.39 ===
84 ==== New external libraries ====
85 * Added Codex v0.1.0-alpha.8
86 * …
88 ===== New development-only external libraries =====
89 * Updated QUnit from 2.18.0 to 2.18.2.
90 * …
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.
103 * …
105 ===== Changed development-only external libraries =====
106 * Updated composer/spdx-licenses from 1.5.5 to 1.5.6.
107 * …
109 ==== Removed external libraries ====
110 * …
112 === Bug fixes in 1.39 ===
113 * …
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.
118 * …
120 === Action API internal changes in 1.39 ===
121 * …
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
135   was added only now.)
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
149   - ::fetchObject()
150   - ::fetchRow()
151   - ::numRows()
152   - ::freeResult()
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.
186 * Changes to skins:
187   - Skin::getCopyrightIcon(), ::getPoweredBy(), deprecated in 1.37 have been
188     removed.
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
194     instead.
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
202     removed.
203   - The following SkinTemplate template data, deprecated in 1.37,
204     have been removed:
205      - poweredbyico
206      - copyrightico
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
224   extensions.
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,
246   have been removed.
247 * The $context parameter to `new HTMLForm( … )` and `HTMLForm::factory( … )`
248   is now required.
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
282   service container.
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
298   internal in 1.35.
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
310   removed.
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()
315   - ::selectSQLText()
316   - ::bitNot()
317   - ::bitAnd()
318   - ::bitOr()
319   - ::buildConcat()
320   - ::buildGreatest()
321   - ::buildLeast()
322   - ::buildSubstring()
323   - ::buildStringCast()
324   - ::buildIntegerCast()
325   - ::tableName()
326   - ::addIdentifierQuotes()
327   - ::buildLike()
328   - ::limitResult()
329   - ::unionSupportsOrderAndLimit()
330   - ::unionQueries()
331   - ::conditional()
332   - ::strreplace()
333   - ::timestamp()
334   - ::getInfinity()
335   - ::setTableAliases()
336   - ::setIndexAliases()
337   - ::buildGroupConcatField()
338 * SpecialUnblock::processUnblock(), deprecated in 1.36, has been removed. Use
339   UnblockUser instead.
340 * wfLocalFile() and wfFindFile(), deprecated in 1.34, have been removed.
341 * …
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
348   is hard deprecated.
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
353   instead.
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
364   methods.
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
376      applicable);
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
386   warnings (T296430).
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()
391   instead.
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:
395   - .animation()
396   - .animation-delay()
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
427   warnings.
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
434   warnings.
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
440   warnings.
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
450   warnings.
451 * ManualLogEntry::setTags(), deprecated in 1.33, now emits deprecation warnings.
452 * WikiRevision::downloadSource(), deprecated in 1.31, now emits deprecation
453   warnings.
454 * DifferenceEngine::textDiff(), deprecated in 1.32, now emits deprecation
455   warnings.
456 * FormatMetadata::flattenArrayContentLang(), deprecated in 1.36, now emits
457   deprecation warnings.
458 * …
460 === Other changes in 1.39 ===
461 * …
463 == Compatibility ==
465 MediaWiki 1.39 requires PHP 7.3.19 or later and the following PHP extensions:
467 * ctype
468 * dom
469 * fileinfo
470 * iconv
471 * intl
472 * json
473 * mbstring
474 * xml
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
493 == Mailing list ==
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.
505 == IRC help ==
506 There's usually someone online in #mediawiki on irc.libera.chat.