Setup: Move wgRCLinkDays logic from Setup to ChangesListSpecialPage

This is only needed when viewing SpecialRecentChanges (or a related
page). Move the consuming logic to that class, where it can be
maintained as part of the rest of the code. This also makes it
more testable and makes config easier to work with or load from
elsewhere in the future. Aside from some dynamic default values,
configuration should generally not mutate. If there is some domain-
specific way to consume it, the relevant component should be
responsible for doing so. This also means we defer such logic to
where it is needed, instead of unconditionally for all possible
features that might be used.

Bug: T189966
Change-Id: If17608909711d98ac560b6d64f72ba7913a561a9
This commit is contained in:
Timo Tijhof 2019-08-25 23:19:48 +01:00
parent 360adff28f
commit 743547c20b
4 changed files with 31 additions and 15 deletions

View file

@ -6844,6 +6844,8 @@ $wgRCLinkLimits = [ 50, 100, 250, 500 ];
/**
* List of Days options to list in the Special:Recentchanges and
* Special:Recentchangeslinked pages.
*
* @see ChangesListSpecialPage::getLinkDays
*/
$wgRCLinkDays = [ 1, 3, 7, 14, 30 ];

View file

@ -368,19 +368,6 @@ foreach ( $wgForeignFileRepos as &$repo ) {
unset( $repo ); // no global pollution; destroy reference
$rcMaxAgeDays = $wgRCMaxAge / ( 3600 * 24 );
if ( $wgRCFilterByAge ) {
// Trim down $wgRCLinkDays so that it only lists links which are valid
// as determined by $wgRCMaxAge.
// Note that we allow 1 link higher than the max for things like 56 days but a 60 day link.
sort( $wgRCLinkDays );
foreach ( $wgRCLinkDays as $i => $days ) {
if ( $days >= $rcMaxAgeDays ) {
array_splice( $wgRCLinkDays, $i + 1 );
break;
}
}
}
// Ensure that default user options are not invalid, since that breaks Special:Preferences
$wgDefaultUserOptions['rcdays'] = min(
$wgDefaultUserOptions['rcdays'],

View file

@ -766,6 +766,33 @@ abstract class ChangesListSpecialPage extends SpecialPage {
}
}
/**
* @see $wgRCLinkDays in DefaultSettings.php.
* @see $wgRCFilterByAge in DefaultSettings.php.
* @return int[]
*/
protected function getLinkDays() {
$linkDays = $this->getConfig()->get( 'RCLinkDays' );
$filterByAge = $this->getConfig()->get( 'RCFilterByAge' );
$maxAge = $this->getConfig()->get( 'RCMaxAge' );
if ( $filterByAge ) {
// Trim it to only links which are within $wgRCMaxAge.
// Note that we allow one link higher than the max for things like
// "age 56 days" being accessible through the "60 days" link.
sort( $linkDays );
$maxAgeDays = $maxAge / ( 3600 * 24 );
foreach ( $linkDays as $i => $days ) {
if ( $days >= $maxAgeDays ) {
array_splice( $linkDays, $i + 1 );
break;
}
}
}
return $linkDays;
}
/**
* Include the modules and configuration for the RCFilters app.
* Conditional on the user having the feature enabled.
@ -798,7 +825,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
'maxDays' => (int)$this->getConfig()->get( 'RCMaxAge' ) / ( 24 * 3600 ), // Translate to days
'limitArray' => $this->getConfig()->get( 'RCLinkLimits' ),
'limitDefault' => $this->getDefaultLimit(),
'daysArray' => $this->getConfig()->get( 'RCLinkDays' ),
'daysArray' => $this->getLinkDays(),
'daysDefault' => $this->getDefaultDays(),
]
);

View file

@ -847,7 +847,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
sort( $linkLimits );
$linkLimits = array_unique( $linkLimits );
$linkDays = $config->get( 'RCLinkDays' );
$linkDays = $this->getLinkDays();
$linkDays[] = $options['days'];
sort( $linkDays );
$linkDays = array_unique( $linkDays );