*/
class InstallDocFormatter {
- static function format( $text ) {
+ public static function format( $text ) {
$obj = new self( $text );
return $obj->execute();
const TTL_LAGGED = 30;
/** Idiom for delete() for "no hold-off" */
const HOLDOFF_NONE = 0;
+ /** Idiom for set() for "do not augment the storage medium TTL" */
+ const STALE_TTL_NONE = 0;
+
/** Idiom for getWithSetCallback() for "no minimum required as-of timestamp" */
const MIN_TIMESTAMP_NONE = 0.0;
* they certainly should not see ones that ended up getting rolled back.
* Default: false
* - lockTSE : if excessive replication/snapshot lag is detected, then store the value
- * with this TTL and flag it as stale. This is only useful if the reads for
- * this key use getWithSetCallback() with "lockTSE" set.
+ * with this TTL and flag it as stale. This is only useful if the reads for this key
+ * use getWithSetCallback() with "lockTSE" set. Note that if "staleTTL" is set
+ * then it will still add on to this TTL in the excessive lag scenario.
* Default: WANObjectCache::TSE_NONE
* - staleTTL : Seconds to keep the key around if it is stale. The get()/getMulti()
* methods return such stale values with a $curTTL of 0, and getWithSetCallback()
* will call the regeneration callback in such cases, passing in the old value
* and its as-of time to the callback. This is useful if adaptiveTTL() is used
* on the old value's as-of time when it is verified as still being correct.
- * Default: 0.
+ * Default: WANObjectCache::STALE_TTL_NONE.
* @note Options added in 1.28: staleTTL
* @return bool Success
*/
final public function set( $key, $value, $ttl = 0, array $opts = [] ) {
$now = microtime( true );
$lockTSE = isset( $opts['lockTSE'] ) ? $opts['lockTSE'] : self::TSE_NONE;
+ $staleTTL = isset( $opts['staleTTL'] ) ? $opts['staleTTL'] : self::STALE_TTL_NONE;
$age = isset( $opts['since'] ) ? max( 0, $now - $opts['since'] ) : 0;
$lag = isset( $opts['lag'] ) ? $opts['lag'] : 0;
- $staleTTL = isset( $opts['staleTTL'] ) ? $opts['staleTTL'] : 0;
// Do not cache potentially uncommitted data as it might get rolled back
if ( !empty( $opts['pending'] ) ) {
/** @var bool|Title */
protected $rclTargetTitle;
+ protected $rclTarget;
+
function __construct() {
parent::__construct( 'Recentchangeslinked' );
}
public function parseParameters( $par, FormOptions $opts ) {
$opts['target'] = $par;
+ $this->rclTarget = $par;
}
/**
public function prefixSearchSubpages( $search, $limit, $offset ) {
return $this->prefixSearchString( $search, $limit, $offset );
}
+
+ /**
+ * Get a self-referential title object
+ * with consideration to the given subpage.
+ *
+ * @return Title
+ * @since 1.23
+ */
+ public function getPageTitle() {
+ return parent::getPageTitle( $this->rclTarget );
+ }
}
"private": true,
"scripts": {
"test": "grunt test",
+ "qunit": "grunt qunit",
"doc": "jsduck",
"postdoc": "grunt copy:jsduck",
"selenium": "killall -0 chromedriver 2>/dev/null || chromedriver --url-base=/wd/hub --port=4444 & grunt webdriver:test; killall chromedriver"
* @return {mw.Uri} Updated Uri
*/
mw.rcfilters.UriProcessor.prototype.getUpdatedUri = function ( uriQuery ) {
- var uri = new mw.Uri(),
+ var titlePieces,
+ uri = new mw.Uri(),
unrecognizedParams = this.getUnrecognizedParams( uriQuery || uri.query );
if ( uriQuery ) {
uri.query = uriQuery;
}
+ // Normalize subpage to use &target= so we are always
+ // consistent in Special:RecentChangesLinked between the
+ // ?title=Special:RecentChangesLinked/TargetPage and
+ // ?title=Special:RecentChangesLinked&target=TargetPage
+ if ( uri.query.title && uri.query.title.indexOf( '/' ) !== -1 ) {
+ titlePieces = uri.query.title.split( '/' );
+
+ unrecognizedParams.title = titlePieces.shift();
+ unrecognizedParams.target = titlePieces.join( '/' );
+ }
+
uri.query = this.filtersModel.getMinimizedParamRepresentation(
$.extend(
true,
// Reapply unrecognized params and url version
uri.query = $.extend( true, {}, uri.query, unrecognizedParams, { urlversion: '2' } );
-
return uri;
};
<?php
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
class InstallDocFormatterTest extends MediaWikiTestCase {
/**
- * @covers InstallDocFormatter::format
+ * @covers InstallDocFormatter
* @dataProvider provideDocFormattingTests
*/
public function testFormat( $expected, $unformattedText, $message = '' ) {