*/
class WantedFilesPage extends WantedQueryPage {
- function getName() {
- return 'Wantedfiles';
+ function __construct( $name = 'Wantedfiles' ) {
+ parent::__construct( $name );
+ }
+
+ function getPageHeader() {
+ # Specifically setting to use "Wanted Files" (NS_MAIN) as title, so as to get what
+ # category would be used on main namespace pages, for those tricky wikipedia
+ # admins who like to do {{#ifeq:{{NAMESPACE}}|foo|bar|....}}.
+ $catMessage = $this->msg( 'broken-file-category' )
+ ->title( Title::newFromText( "Wanted Files", NS_MAIN ) )
+ ->inContentLanguage();
+
+ if ( !$catMessage->isDisabled() ) {
+ $category = Title::makeTitleSafe( NS_CATEGORY, $catMessage->text() );
+ } else {
+ $category = false;
+ }
+
+ $noForeign = '';
+ if ( !$this->likelyToHaveFalsePositives() ) {
+ // Additional messages for grep:
+ // wantedfiletext-cat-noforeign, wantedfiletext-nocat-noforeign
+ $noForeign = '-noforeign';
+ }
+
+ if ( $category ) {
+ return $this
+ ->msg( 'wantedfiletext-cat' . $noForeign )
+ ->params( $category->getFullText() )
+ ->parseAsBlock();
+ } else {
+ return $this
+ ->msg( 'wantedfiletext-nocat' . $noForeign )
+ ->parseAsBlock();
+ }
+ }
+
+ /**
+ * Whether foreign repos are likely to cause false positives
+ *
+ * In its own function to allow subclasses to override.
+ * @see SpecialWantedFilesGUOverride in GlobalUsage extension.
+ * @since 1.24
+ * @return bool
+ */
+ protected function likelyToHaveFalsePositives() {
+ return RepoGroup::singleton()->hasForeignRepos();
}
/**
* KLUGE: The results may contain false positives for files
* that exist e.g. in a shared repo. Setting this at least
* keeps them from showing up as redlinks in the output, even
- * if it doesn't fix the real problem (bug 6220).
+ * if it doesn't fix the real problem (T8220).
+ *
+ * @note could also have existing links here from broken file
+ * redirects.
+ * @return bool
*/
function forceExistenceCheck() {
return true;
}
- function getSQL() {
- $dbr = wfGetDB( DB_SLAVE );
- list( $imagelinks, $image ) = $dbr->tableNamesN( 'imagelinks', 'image' );
- $name = $dbr->addQuotes( $this->getName() );
- return
- "
- SELECT
- $name as type,
- " . NS_FILE . " as namespace,
- il_to as title,
- COUNT(*) as value
- FROM $imagelinks
- LEFT JOIN $image ON il_to = img_name
- WHERE img_name IS NULL
- GROUP BY il_to
- ";
+ /**
+ * Does the file exist?
+ *
+ * Use wfFindFile so we still think file namespace pages without
+ * files are missing, but valid file redirects and foreign files are ok.
+ *
+ * @param Title $title
+ * @return bool
+ */
+ protected function existenceCheck( Title $title ) {
+ return (bool)wfFindFile( $title );
}
-}
-
-/**
- * constructor
- */
-function wfSpecialWantedFiles() {
- list( $limit, $offset ) = wfCheckLimits();
- $wpp = new WantedFilesPage();
+ function getQueryInfo() {
+ return [
+ 'tables' => [
+ 'imagelinks',
+ 'page',
+ 'redirect',
+ 'img1' => 'image',
+ 'img2' => 'image',
+ ],
+ 'fields' => [
+ 'namespace' => NS_FILE,
+ 'title' => 'il_to',
+ 'value' => 'COUNT(*)'
+ ],
+ 'conds' => [
+ 'img1.img_name' => null,
+ // We also need to exclude file redirects
+ 'img2.img_name' => null,
+ ],
+ 'options' => [ 'GROUP BY' => 'il_to' ],
+ 'join_conds' => [
+ 'img1' => [ 'LEFT JOIN',
+ 'il_to = img1.img_name'
+ ],
+ 'page' => [ 'LEFT JOIN', [
+ 'il_to = page_title',
+ 'page_namespace' => NS_FILE,
+ ] ],
+ 'redirect' => [ 'LEFT JOIN', [
+ 'page_id = rd_from',
+ 'rd_namespace' => NS_FILE,
+ 'rd_interwiki' => ''
+ ] ],
+ 'img2' => [ 'LEFT JOIN',
+ 'rd_title = img2.img_name'
+ ]
+ ]
+ ];
+ }
- $wpp->doQuery( $offset, $limit );
+ protected function getGroupName() {
+ return 'maintenance';
+ }
}