tbd @

MW 1.41.0

Core

bugfix, resources/src/jquery.tablesorter/jquery.tablesorter.js
(sort number in wde:Vorlage:Datum works as expected, see 2962272)
search replace
numeric: true
numeric: false
bugfix, /pygments/pygmentize
(enables extension, see MediaWiki)

change file permissions from 644 to 744 (script needs to be executable by owner)

adjustment, /UserStats/includes/UserStats.php
(points start with 0; ideally this should be a configuration variable)
search replace
			$stats['points'] = '1000';
			$stats['points'] = '0';
Adjustment, /modules/ext.quiz.css
(correct/incorrect should not be colored green/red, because of Congenital red–green color blindness; ideally this should be a configuration variable)
search replace
#14866d #0000ff
Adjustment, /includes/specials/SpecialPatroller.php
(in our wiki there are not many edits we have to patrol, so edits which were taken but not marked as patrolled should be available faster; ideally this should be a configuration variable)
search replace
		if ( mt_rand( 0, 499 ) == 0 ) {
		if ( mt_rand( 0, 9 ) == 0 ) {
Adjustment, /includes/specials/SpecialPatroller.php
(we do want to patrol all changes to one page, not only the last one; ideally this should be a configuration variable)
search replace
		'rc_this_oldid = page_latest',
Bugfix, /includes/Hooks.php
(no more error because of a link to the diff of a new page, see phabricator)
search replace
$parts['50_ve-init-mw-diffPage-diffMode'] = '<div class="ve-init-mw-diffPage-diffMode">' .
		$output->addModuleStyles( [
			'ext.visualEditor.diffPage.init.styles',
			'oojs-ui.styles.icons-accessibility',
			'oojs-ui.styles.icons-editing-advanced'
		] );
		// T344596: Must load this module unconditionally. The TextSlotDiffRendererTablePrefix hook
		// below doesn't run when the diff is e.g. a log entry with no change to the content.
		$output->addModules( 'ext.visualEditor.diffPage.init' );
		$output->enableOOUI();
		$parts['50_ve-init-mw-diffPage-diffMode'] = '<div class="ve-init-mw-diffPage-diffMode">' .
Bugfix, NamespaceRelations.php
(corrects initialization of variable, see MediaWiki)
search replace
$namespaceInfo = MediaWikiServices::getInstance()->getNamespaceInfo();
move it to:
$namespaceInfo = MediaWikiServices::getInstance()->getNamespaceInfo();
if ( array_key_exists( $subjectNS, $this->namespacesToNamespace ) ) {
Feature by Orci, includes/Hooks.php
(we only want content between pre and nowiki)
search replace
	$editPage->textbox1 = $content;
    $content = preg_replace( '#<pre>(.*?)</pre>#ims', '$1', $content );
    $content = preg_replace( '#<nowiki>(.*?)</nowiki>#ims', '$1', $content );
	$editPage->textbox1 = $content;
Bugfixes by Stip, MultiCategorySearch_body.php
(replaced deprecated functions)
search replace
list( $this->limit, $this->offset ) = $wgRequest->getLimitOffset( 100, 'searchlimit' );
list( $this->limit, $this->offset ) = $wgRequest->getLimitOffsetForUser( RequestContext::getMain()->getUser(), 100, 'searchlimit' );
$dbr = wfGetDB( DB_SLAVE );
$dbr = wfGetDB( DB_REPLICA );
(multiples)
$dbr->numRows($res)
$res->numRows()
(multiples)
$dbr->fetchObject( $res )
$res->fetchObject()
$catView->AddPage( $titleObj, $titleObj->mTextform, 10000 );
$catView->AddPage( $titleObj, $titleObj->getText(), 10000 );
$dbr->freeResult( $res );
$res->free();
(multiples)
addWikiText
addWikiTextAsInterface
$catView->formatList
$this->multcatList
				$htresults .= '<p>' . wfShowingResults( $this->offset, $this->limit ) . "</p>\n";
				if( function_exists( 'wfViewPrevNext' ) ) {
					$jumpLinks = wfViewPrevNext(
						$this->offset, $this->limit, 'Special:MultiCategorySearch', $queryStr,
						($dbr->numRows($res) <= $this->offset + $this->limit) ? true : false );
				} else {
					$jumpLinks = $wgLang->viewPrevNext(
						$wgTitle, $this->offset, $this->limit, wfCgiToArray( $queryStr ),
						($dbr->numRows($res) <= $this->offset + $this->limit) ? true : false );
				}
				$jumpLinks = SpecialPage::buildPrevNextNavigation(
					$this->offset, $this->limit, wfCgiToArray( $queryStr ),
					($res->numRows() <= $this->offset + $this->limit) ? true : false );
(add)
// taken from core (CategoryViewer.php), because marked as private there
     function multcatList(
        $articles,
        $articles_start_char,
        $cssClasses = 'mw-category mw-category-columns'
    ) {
        $columns = array_combine( $articles, $articles_start_char );

        $ret = Html::openElement( 'div', [ 'class' => $cssClasses ] );

        $colContents = [];

        # Kind of like array_flip() here, but we keep duplicates in an
        # array instead of dropping them.
        foreach ( $columns as $article => $char ) {
            $colContents[$char][] = $article;
        }

        foreach ( $colContents as $char => $articles ) {
            # Change space to non-breaking space to keep headers aligned
            $h3char = $char === ' ' ? "\u{00A0}" : htmlspecialchars( $char );

            $ret .= Html::openElement( 'div', [ 'class' => 'mw-category-group' ] );
            $ret .= Html::rawElement( 'h3', [], $h3char ) . "\n";
            $ret .= Html::openElement( 'ul' );
            $ret .= implode(
                "\n",
                array_map(
                    static function ( $article ) {
                        return Html::rawElement( 'li', [], $article );
                    },
                    $articles
                )
            );
            $ret .= Html::closeElement( 'ul' ) . Html::closeElement( 'div' );

        }

        $ret .= Html::closeElement( 'div' );
        return $ret;
    }