}
/**
- * Returns page information in an easily-manipulated format. Array keys are used so extensions
- * may add additional information in arbitrary positions. Array values are arrays with one
- * element to be rendered as a header, arrays with two elements to be rendered as a table row.
+ * Returns an array of info groups (will be rendered as tables), keyed by group ID.
+ * Group IDs are arbitrary and used so that extensions may add additional information in
+ * arbitrary positions (and as message keys for section headers for the tables, prefixed
+ * with 'pageinfo-').
+ * Each info group is a non-associative array of info items (rendered as table rows).
+ * Each info item is an array with two elements: the first describes the type of
+ * information, the second the value for the current page. Both can be strings (will be
+ * interpreted as raw HTML) or messages (will be interpreted as plain text and escaped).
*
* @return array
*/
if ( $title->inNamespace( NS_FILE ) ) {
$fileObj = wfFindFile( $title );
if ( $fileObj !== false ) {
- $output = $fileObj->getSha1();
+ // Convert the base-36 sha1 value obtained from database to base-16
+ $output = Wikimedia\base_convert( $fileObj->getSha1(), 36, 16, 40 );
$pageInfo['header-basic'][] = [
$this->msg( 'pageinfo-file-hash' ),
$output
self::getCacheKey( $cache, $page->getTitle(), $page->getLatest() ),
WANObjectCache::TTL_WEEK,
function ( $oldValue, &$ttl, &$setOpts ) use ( $page, $config, $fname ) {
+ global $wgActorTableSchemaMigrationStage;
+
$title = $page->getTitle();
$id = $title->getArticleID();
$dbrWatchlist = wfGetDB( DB_REPLICA, 'watchlist' );
$setOpts += Database::getCacheSetOptions( $dbr, $dbrWatchlist );
+ if ( $wgActorTableSchemaMigrationStage === MIGRATION_NEW ) {
+ $tables = [ 'revision_actor_temp' ];
+ $field = 'revactor_actor';
+ $pageField = 'revactor_page';
+ $tsField = 'revactor_timestamp';
+ $joins = [];
+ } elseif ( $wgActorTableSchemaMigrationStage === MIGRATION_OLD ) {
+ $tables = [ 'revision' ];
+ $field = 'rev_user_text';
+ $pageField = 'rev_page';
+ $tsField = 'rev_timestamp';
+ $joins = [];
+ } else {
+ $tables = [ 'revision', 'revision_actor_temp', 'actor' ];
+ $field = 'COALESCE( actor_name, rev_user_text)';
+ $pageField = 'rev_page';
+ $tsField = 'rev_timestamp';
+ $joins = [
+ 'revision_actor_temp' => [ 'LEFT JOIN', 'revactor_rev = rev_id' ],
+ 'actor' => [ 'LEFT JOIN', 'revactor_actor = actor_id' ],
+ ];
+ }
+
$watchedItemStore = MediaWikiServices::getInstance()->getWatchedItemStore();
$result = [];
$result['authors'] = 0;
} else {
$result['authors'] = (int)$dbr->selectField(
- 'revision',
- 'COUNT(DISTINCT rev_user_text)',
- [ 'rev_page' => $id ],
- $fname
+ $tables,
+ "COUNT(DISTINCT $field)",
+ [ $pageField => $id ],
+ $fname,
+ [],
+ $joins
);
}
// Recent number of distinct authors
$result['recent_authors'] = (int)$dbr->selectField(
- 'revision',
- 'COUNT(DISTINCT rev_user_text)',
+ $tables,
+ "COUNT(DISTINCT $field)",
[
- 'rev_page' => $id,
- "rev_timestamp >= " . $dbr->addQuotes( $threshold )
+ $pageField => $id,
+ "$tsField >= " . $dbr->addQuotes( $threshold )
],
- $fname
+ $fname,
+ [],
+ $joins
);
// Subpages (if enabled)