=== Languages updated in 1.30 ===
* Support for kbp (Kabɩyɛ / Kabiyè) was added.
+* Support for skr (Saraiki, سرائیکی) was added.
=== External library changes in 1.30 ===
if ( $limit > -1 ) {
$options['LIMIT'] = $limit;
}
- $this->mSubpages = TitleArray::newFromResult(
+ return TitleArray::newFromResult(
$dbr->select( 'page',
[ 'page_id', 'page_namespace', 'page_title', 'page_is_redirect' ],
$conds,
$options
)
);
- return $this->mSubpages;
}
/**
$rc->mAttribs['rc_timestamp'],
$this->getUser()
);
+ if ( $this->lastdate === '' ) {
+ $this->lastdate = $date;
+ }
$ret = '';
- # If it's a new day, add the headline and flush the cache
- if ( $date != $this->lastdate ) {
- # Process current cache
+ # If it's a new day, flush the cache and update $this->lastdate
+ if ( $date !== $this->lastdate ) {
+ # Process current cache (uses $this->lastdate to generate a heading)
$ret = $this->recentChangesBlock();
$this->rc_cache = [];
- $ret .= Xml::element( 'h4', null, $date ) . "\n";
$this->lastdate = $date;
}
}
}
- return '<div>' . $blockOut . '</div>';
+ if ( $blockOut === '' ) {
+ return '';
+ }
+ // $this->lastdate is kept up to date by recentChangesLine()
+ return Xml::element( 'h4', null, $this->lastdate ) . "\n<div>" . $blockOut . '</div>';
}
/**
$opts = parent::getDefaultOptions();
$user = $this->getUser();
- $opts->add( 'days', $user->getIntOption( 'rcdays' ) );
+ $opts->add( 'days', $user->getIntOption( 'rcdays' ), FormOptions::FLOAT );
$opts->add( 'limit', $user->getIntOption( 'rclimit' ) );
$opts->add( 'from', '' );
if ( preg_match( '/^limit=(\d+)$/', $bit, $m ) ) {
$opts['limit'] = $m[1];
}
- if ( preg_match( '/^days=(\d+)$/', $bit, $m ) ) {
+ if ( preg_match( '/^days=(\d+(?:\.\d+)?)$/', $bit, $m ) ) {
$opts['days'] = $m[1];
}
if ( preg_match( '/^namespace=(.*)$/', $bit, $m ) ) {
// Calculate cutoff
$cutoff_unixtime = time() - ( $opts['days'] * 86400 );
- $cutoff_unixtime = $cutoff_unixtime - ( $cutoff_unixtime % 86400 );
$cutoff = $dbr->timestamp( $cutoff_unixtime );
$fromValid = preg_match( '/^[0-9]{14}$/', $opts['from'] );
'si' => 'සිංහල', # Sinhalese
'simple' => 'Simple English', # Simple English
'sk' => 'slovenčina', # Slovak
+ 'skr' => 'سرائیکی', # Saraiki (multiple scripts - defaults to Arabic)
+ 'skr-arab' => 'سرائیکی', # Saraiki (Arabic script)
'sl' => 'slovenščina', # Slovenian
'sli' => 'Schläsch', # Lower Selisian
'sm' => 'Gagana Samoa', # Samoan
--- /dev/null
+<?php
+/** Saraiki (multiple scripts)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$fallback = 'skr-arab';
--- /dev/null
+<?php
+/** Saraiki (Arabic script) (سرائیکی)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$fallback = 'ur, pnb';
+
+$rtl = true;
'default': '7',
filters: [
// Hours (1, 2, 6, 12)
- // TEMPORARY: Hide hours temporarily
- // 0.04166, 0.0833, 0.25, 0.5,
+ 0.04166, 0.0833, 0.25, 0.5,
// Days
1, 3, 7, 14, 30
].map( function ( num ) {
uriValue,
// In this case we don't want to round because it can be arbitrary
// weird numbers but we want to round to 2 decimal digits
-
- // HACK: Temporarily remove hours from UI
- // Number( uriValue ) < 1 ?
- // ( Number( uriValue ) * 24 ).toFixed( 2 ) :
- // Number( uriValue )
- Number( uriValue )
+ Number( uriValue ) < 1 ?
+ ( Number( uriValue ) * 24 ).toFixed( 2 ) :
+ Number( uriValue )
) );
} else {
groupData.filters.push( createFilterDataFromNumber( uriValue, uriValue ) );
if ( item ) {
this.button.setLabel(
mw.msg(
- // Number( item.getParamName() ) < 1 ?
- // 'rcfilters-days-show-hours' : 'rcfilters-days-show-days',
-
- // Temporarily hide the functionality for hours, use days only
- 'rcfilters-days-show-days',
+ Number( item.getParamName() ) < 1 ?
+ 'rcfilters-days-show-hours' : 'rcfilters-days-show-days',
item.getLabel()
)
);
this.model = model;
- /*
- // HACK: Temporarily remove hours from UI
this.hoursValuePicker = new mw.rcfilters.ui.ValuePickerWidget(
this.model,
{
label: mw.msg( 'rcfilters-hours-title' ),
itemFilter: function ( itemModel ) { return Number( itemModel.getParamName() ) < 1; }
}
- );*/
+ );
this.daysValuePicker = new mw.rcfilters.ui.ValuePickerWidget(
this.model,
{
classes: [ 'mw-rcfilters-ui-datePopupWidget-days' ],
- label: mw.msg( 'rcfilters-days-title' )
- // HACK: Temporarily remove hours from UI
- // itemFilter: function ( itemModel ) { return Number( itemModel.getParamName() ) >= 1; }
+ label: mw.msg( 'rcfilters-days-title' ),
+ itemFilter: function ( itemModel ) { return Number( itemModel.getParamName() ) >= 1; }
}
);
// Events
- // HACK: Temporarily remove hours from UI
- // this.hoursValuePicker.connect( this, { choose: [ 'emit', 'days' ] } );
+ this.hoursValuePicker.connect( this, { choose: [ 'emit', 'days' ] } );
this.daysValuePicker.connect( this, { choose: [ 'emit', 'days' ] } );
// Initialize
this.$element
.addClass( 'mw-rcfilters-ui-datePopupWidget' )
.append(
- // HACK: Temporarily remove hours from UI
- // this.hoursValuePicker.$element,
+ this.hoursValuePicker.$element,
this.daysValuePicker.$element
);
};
);
}
- protected function assertLastSqlDb( $sqlText, $db ) {
+ protected function assertLastSqlDb( $sqlText, DatabaseTestHelper $db ) {
$this->assertEquals( $sqlText, $db->getLastSqls() );
}
/**
* @dataProvider provideSelect
* @covers Wikimedia\Rdbms\Database::select
+ * @covers Wikimedia\Rdbms\Database::selectSQLText
+ * @covers Wikimedia\Rdbms\Database::tableNamesWithIndexClauseOrJOIN
+ * @covers Wikimedia\Rdbms\Database::makeSelectOptions
+ * @covers Wikimedia\Rdbms\Database::makeOrderBy
+ * @covers Wikimedia\Rdbms\Database::makeGroupByWithHaving
*/
public function testSelect( $sql, $sqlText ) {
$this->database->select(
"FROM table " .
"WHERE alias = 'text'"
],
+ [
+ [
+ // 'tables' with space prepended indicates pre-escaped table name
+ 'tables' => ' table LEFT JOIN table2',
+ 'fields' => [ 'field' ],
+ 'conds' => [ 'field' => 'text' ],
+ ],
+ "SELECT field FROM table LEFT JOIN table2 WHERE field = 'text'"
+ ],
+ [
+ [
+ // Empty 'tables' is allowed
+ 'tables' => '',
+ 'fields' => [ 'SPECIAL_QUERY()' ],
+ ],
+ "SELECT SPECIAL_QUERY()"
+ ],
[
[
'tables' => 'table',
"FROM table " .
"WHERE alias IN ('1','2','3','4')"
],
+ [
+ [
+ 'tables' => 'table',
+ 'fields' => [ 'field' ],
+ 'options' => [ 'DISTINCT', 'LOCK IN SHARE MODE' ],
+ ],
+ "SELECT DISTINCT field FROM table LOCK IN SHARE MODE"
+ ],
+ [
+ [
+ 'tables' => 'table',
+ 'fields' => [ 'field' ],
+ 'options' => [ 'EXPLAIN' => true ],
+ ],
+ 'EXPLAIN SELECT field FROM table'
+ ],
+ [
+ [
+ 'tables' => 'table',
+ 'fields' => [ 'field' ],
+ 'options' => [ 'FOR UPDATE' ],
+ ],
+ "SELECT field FROM table FOR UPDATE"
+ ],
];
}
/**
* @dataProvider provideUpdate
* @covers Wikimedia\Rdbms\Database::update
+ * @covers Wikimedia\Rdbms\Database::makeUpdateOptions
+ * @covers Wikimedia\Rdbms\Database::makeUpdateOptionsArray
*/
public function testUpdate( $sql, $sqlText ) {
$this->database->update(
/**
* @dataProvider provideInsert
* @covers Wikimedia\Rdbms\Database::insert
+ * @covers Wikimedia\Rdbms\Database::makeInsertOptions
*/
public function testInsert( $sql, $sqlText ) {
$this->database->insert(
/**
* @dataProvider provideInsertSelect
* @covers Wikimedia\Rdbms\Database::insertSelect
+ * @covers Wikimedia\Rdbms\Database::nativeInsertSelect
*/
public function testInsertSelect( $sql, $sqlTextNative, $sqlSelect, $sqlInsert ) {
$this->database->insertSelect(
/**
* @dataProvider provideBuildLike
* @covers Wikimedia\Rdbms\Database::buildLike
+ * @covers Wikimedia\Rdbms\Database::escapeLikeInternal
*/
public function testBuildLike( $array, $sqlText ) {
$this->assertEquals( trim( $this->database->buildLike(
/**
* @covers Wikimedia\Rdbms\Database::commit
+ * @covers Wikimedia\Rdbms\Database::doCommit
*/
public function testTransactionCommit() {
$this->database->begin( __METHOD__ );
/**
* @covers Wikimedia\Rdbms\Database::rollback
+ * @covers Wikimedia\Rdbms\Database::doRollback
*/
public function testTransactionRollback() {
$this->database->begin( __METHOD__ );
];
}
+ /**
+ * @covers Wikimedia\Rdbms\Database::registerTempTableOperation
+ */
public function testSessionTempTables() {
$temp1 = $this->database->tableName( 'tmp_table_1' );
$temp2 = $this->database->tableName( 'tmp_table_2' );
[ 'days=3', [ 'days' => '3' ] ],
+ [ 'days=0.25', [ 'days' => '0.25'] ],
+
[ 'namespace=5', [ 'namespace' => '5' ] ],
[ 'namespace=5|3', [ 'namespace' => '5|3' ] ],