* (bug 57098) SpecialPasswordReset now obeys returnto parameter
* (bug 37812) ResourceLoader will notice when a module's definition changes and
recompile it accordingly.
+* (bug 57201) SpecialRecentChangesFilters hook is now executed for feeds.
=== API changes in 1.23 ===
* (bug 54884) action=parse&prop=categories now indicates hidden and missing
* action=parse&prop=languageshtml was deprecated in 1.18 and will be removed in
MediaWiki 1.24.
* action=parse now has disabletoc flag to disable table of contents in output.
+* SpecialRecentChanges::feedSetup() was removed.
-=== Languages updated in 1.23===
+=== Languages updated in 1.23 ===
MediaWiki supports over 350 languages. Many localisations are updated
regularly. Below only new and removed languages are listed, as well as
/**
* Initialize this object from a row from the user table.
*
- * @param array $row Row from the user table to load.
+ * @param stdClass $row Row from the user table to load.
* @param array $data Further user data to load into the object
*
* user_groups Array with groups out of the user_groups table
/**
* Simplified / Traditional Chinese conversion tables
*
- * Automatically generated using code and data in includes/zhtable/
+ * Automatically generated using code and data in maintenance/language/zhtable/
* Do not modify directly!
*
* @file
// 1.23
array( 'addField', 'recentchanges', 'rc_source', 'patch-rc_source.sql' ),
+ array( 'addIndex', 'logging', 'log_user_text_type_time', 'patch-logging_user_text_type_time_index.sql' ),
+ array( 'addIndex', 'logging', 'log_user_text_time', 'patch-logging_user_text_time_index.sql' ),
);
}
array( 'modifyField', 'user_former_groups', 'ufg_group',
'patch-ufg_group-length-increase-255.sql' ),
+ //1.23
+ array( 'addIndex', 'logging', 'i06', 'patch-logging_user_text_type_time_index.sql' ),
+ array( 'addIndex', 'logging', 'i07', 'patch-logging_user_text_time_index.sql' ),
+
// KEEP THIS AT THE BOTTOM!!
array( 'doRebuildDuplicateFunction' ),
array( 'addPgIndex', 'job', 'job_cmd_token', '(job_cmd, job_token, job_random)' ),
array( 'addPgIndex', 'job', 'job_cmd_token_id', '(job_cmd, job_token, job_id)' ),
array( 'addPgIndex', 'filearchive', 'fa_sha1', '(fa_sha1)' ),
+ array( 'addPgIndex', 'logging', 'logging_user_text_type_time', '(log_user_text, log_type, log_timestamp)' ),
+ array( 'addPgIndex', 'logging', 'logging_user_text_time', '(log_user_text, log_timestamp)' ),
array( 'checkIndex', 'pagelink_unique', array(
array( 'pl_from', 'int4_ops', 'btree', 0 ),
// 1.23
array( 'addField', 'recentchanges', 'rc_source', 'patch-rc_source.sql' ),
+ array( 'addIndex', 'logging', 'log_user_text_type_time', 'patch-logging_user_text_type_time_index.sql' ),
+ array( 'addIndex', 'logging', 'log_user_text_time', 'patch-logging_user_text_time_index.sql' ),
);
}
if ( $logBody ) {
if ( $msgKey[0] ) {
- $s = '<div class="mw-warning-with-logexcerpt">';
+ $dir = $context->getLanguage()->getDir();
+ $lang = $context->getLanguage()->getCode();
+
+ $s = Xml::openElement( 'div', array(
+ 'class' => "mw-warning-with-logexcerpt mw-content-$dir",
+ 'dir' => $dir,
+ 'lang' => $lang,
+ ) );
if ( count( $msgKey ) == 1 ) {
$s .= $context->msg( $msgKey[0] )->parseAsBlock();
$out->addHTML( $html );
$out->addHTML( Html::closeElement( 'div' ) );
}
+
+ protected function getGroupName() {
+ return 'wiki';
+ }
}
var $rcOptions, $rcSubpage;
protected $customFilters;
+ /**
+ * The feed format to output as (either 'rss' or 'atom'), or null if no
+ * feed output was requested
+ *
+ * @var string $feedFormat
+ */
+ protected $feedFormat;
+
public function __construct( $name = 'Recentchanges' ) {
parent::__construct( $name );
}
* Create a FormOptions object with options as specified by the user
*
* @param array $parameters
- *
* @return FormOptions
*/
public function setup( $parameters ) {
+ global $wgFeedLimit;
+
$opts = $this->getDefaultOptions();
foreach ( $this->getCustomFilters() as $key => $params ) {
$this->parseParameters( $parameters, $opts );
}
- $opts->validateIntBounds( 'limit', 0, 5000 );
+ $opts->validateIntBounds( 'limit', 0, $this->feedFormat ? $wgFeedLimit : 5000 );
return $opts;
}
return $this->customFilters;
}
- /**
- * Create a FormOptions object specific for feed requests and return it
- *
- * @return FormOptions
- */
- public function feedSetup() {
- global $wgFeedLimit;
- $opts = $this->getDefaultOptions();
- $opts->fetchValuesFromRequest( $this->getRequest() );
- $opts->validateIntBounds( 'limit', 0, $wgFeedLimit );
-
- return $opts;
- }
-
/**
* Get the current FormOptions for this request
*/
public function getOptions() {
if ( $this->rcOptions === null ) {
- if ( $this->including() ) {
- $isFeed = false;
- } else {
- $isFeed = (bool)$this->getRequest()->getVal( 'feed' );
- }
- $this->rcOptions = $isFeed ? $this->feedSetup() : $this->setup( $this->rcSubpage );
+ $this->rcOptions = $this->setup( $this->rcSubpage );
}
return $this->rcOptions;
*/
public function execute( $subpage ) {
$this->rcSubpage = $subpage;
- $feedFormat = $this->including() ? null : $this->getRequest()->getVal( 'feed' );
+ $this->feedFormat = $this->including() ? null : $this->getRequest()->getVal( 'feed' );
# 10 seconds server-side caching max
$this->getOutput()->setSquidMaxage( 10 );
# Check if the client has a cached version
- $lastmod = $this->checkLastModified( $feedFormat );
+ $lastmod = $this->checkLastModified( $this->feedFormat );
if ( $lastmod === false ) {
return;
}
return;
}
- if ( !$feedFormat ) {
+ if ( !$this->feedFormat ) {
$batch = new LinkBatch;
foreach ( $rows as $row ) {
$batch->add( NS_USER, $row->rc_user_text );
}
$batch->execute();
}
- if ( $feedFormat ) {
- list( $changesFeed, $formatter ) = $this->getFeedObject( $feedFormat );
+ if ( $this->feedFormat ) {
+ list( $changesFeed, $formatter ) = $this->getFeedObject( $this->feedFormat );
/** @var ChangesFeed $changesFeed */
$changesFeed->execute( $formatter, $rows, $lastmod, $opts );
} else {
$opts['target'] = $par;
}
- public function feedSetup() {
- $opts = parent::feedSetup();
- $opts['target'] = $this->getRequest()->getVal( 'target' );
- return $opts;
- }
-
public function getFeedObject( $feedFormat ) {
$feed = new ChangesFeed( $feedFormat, false );
$feedObj = $feed->getFeedObject(
--- /dev/null
+CREATE INDEX /*i*/log_user_text_time ON /*_*/logging (log_user_text, log_timestamp);
--- /dev/null
+CREATE INDEX /*i*/log_user_text_type_time ON /*_*/logging (log_user_text, log_type, log_timestamp);
CREATE INDEX /*$wgDBprefix*/times ON /*$wgDBprefix*/logging (log_timestamp);
CREATE INDEX /*$wgDBprefix*/log_user_type_time ON /*$wgDBprefix*/logging (log_user, log_type, log_timestamp);
CREATE INDEX /*$wgDBprefix*/log_page_id_time ON /*$wgDBprefix*/logging (log_page,log_timestamp);
+CREATE INDEX /*$wgDBprefix*/log_user_text_type_time ON /*$wgDBprefix*/logging (log_user_text, log_type, log_timestamp);
+CREATE INDEX /*$wgDBprefix*/log_user_text_time ON /*$wgDBprefix*/logging (log_user_text, log_timestamp);
CREATE TABLE /*$wgDBprefix*/log_search (
-- The type of ID (rev ID, log ID, rev timestamp, username)
--- /dev/null
+define mw_prefix='{$wgDBprefix}';
+
+CREATE INDEX &mw_prefix.logging_i07 ON &mw_prefix.logging (log_user_text, log_timestamp);
+
--- /dev/null
+define mw_prefix='{$wgDBprefix}';
+
+CREATE INDEX &mw_prefix.logging_i06 ON &mw_prefix.logging (log_user_text, log_type, log_timestamp);
+
CREATE INDEX &mw_prefix.logging_i03 ON &mw_prefix.logging (log_namespace, log_title, log_timestamp);
CREATE INDEX &mw_prefix.logging_i04 ON &mw_prefix.logging (log_timestamp);
CREATE INDEX &mw_prefix.logging_i05 ON &mw_prefix.logging (log_type, log_action, log_timestamp);
+CREATE INDEX &mw_prefix.logging_i06 ON &mw_prefix.logging (log_user_text, log_type, log_timestamp);
+CREATE INDEX &mw_prefix.logging_i07 ON &mw_prefix.logging (log_user_text, log_timestamp);
CREATE TABLE &mw_prefix.log_search (
ls_field VARCHAR2(32) NOT NULL,
CREATE INDEX logging_times ON logging (log_timestamp);
CREATE INDEX logging_user_type_time ON logging (log_user, log_type, log_timestamp);
CREATE INDEX logging_page_id_time ON logging (log_page, log_timestamp);
+CREATE INDEX logging_user_text_type_time ON logging (log_user_text, log_type, log_timestamp);
+CREATE INDEX logging_user_text_time ON logging (log_user_text, log_timestamp);
CREATE TABLE log_search (
ls_field TEXT NOT NULL,
CREATE INDEX /*i*/log_user_type_time ON /*_*/logging (log_user, log_type, log_timestamp);
CREATE INDEX /*i*/log_page_id_time ON /*_*/logging (log_page,log_timestamp);
CREATE INDEX /*i*/type_action ON /*_*/logging (log_type, log_action, log_timestamp);
+CREATE INDEX /*i*/log_user_text_type_time ON /*_*/logging (log_user_text, log_type, log_timestamp);
+CREATE INDEX /*i*/log_user_text_time ON /*_*/logging (log_user_text, log_timestamp);
CREATE TABLE /*_*/log_search (
collapsible: 'li.collapsible',
shifting: false,
expandCondition: function ( eleWidth ) {
- // If there's at least eleWidth pixels free space, expand.
- return calculateTabDistance() >= eleWidth;
+ // If there are at least eleWidth + 1 pixels of free space, expand.
+ // We add 1 because .width() will truncate fractional values
+ // but .offset() will not.
+ return calculateTabDistance() >= (eleWidth + 1);
},
collapseCondition: function () {
// If there's an overlap, collapse.