Merge "New hook for filters on Special:Contributions form"
[lhc/web/wiklou.git] / maintenance / findOrphanedFiles.php
index 2ee406f..2362957 100644 (file)
@@ -25,7 +25,7 @@ class FindOrphanedFiles extends Maintenance {
        function __construct() {
                parent::__construct();
 
-               $this->mDescription = "Find unregistered files in the 'public' repo zone.";
+               $this->addDescription( "Find unregistered files in the 'public' repo zone." );
                $this->addOption( 'subdir',
                        'Only scan files in this subdirectory (e.g. "a/a0")', false, true );
                $this->addOption( 'verbose', "Mention file paths checked" );
@@ -55,37 +55,41 @@ class FindOrphanedFiles extends Maintenance {
                        $this->error( "Could not get file listing.", 1 );
                }
 
-               $nameBatch = array();
+               $pathBatch = array();
                foreach ( $list as $path ) {
                        if ( preg_match( '#^(thumb|deleted)/#', $path ) ) {
                                continue; // handle ugly nested containers on stock installs
                        }
 
-                       $nameBatch[] = basename( $path );
-                       if ( count( $nameBatch ) >= $this->mBatchSize ) {
-                               $this->checkFiles( $repo, $nameBatch, $verbose );
-                               $nameBatch = array();
+                       $pathBatch[] = $path;
+                       if ( count( $pathBatch ) >= $this->mBatchSize ) {
+                               $this->checkFiles( $repo, $pathBatch, $verbose );
+                               $pathBatch = array();
                        }
                }
-               $this->checkFiles( $repo, $nameBatch, $verbose );
+               $this->checkFiles( $repo, $pathBatch, $verbose );
        }
 
-       protected function checkFiles( LocalRepo $repo, array $names, $verbose ) {
-               if ( !count( $names ) ) {
+       protected function checkFiles( LocalRepo $repo, array $paths, $verbose ) {
+               if ( !count( $paths ) ) {
                        return;
                }
 
                $dbr = $repo->getSlaveDB();
 
+               $curNames = array();
+               $oldNames = array();
                $imgIN = array();
                $oiWheres = array();
-               foreach ( $names as $name ) {
-                       if ( strpos( $name, '!' ) !== false ) {
+               foreach ( $paths as $path ) {
+                       $name = basename( $path );
+                       if ( preg_match( '#^archive/#', $path ) ) {
                                if ( $verbose ) {
                                        $this->output( "Checking old file $name\n" );
                                }
 
-                               list( , $base ) = explode( '!', $name ); // <TS_MW>!<img_name>
+                               $oldNames[] = $name;
+                               list( , $base ) = explode( '!', $name, 2 ); // <TS_MW>!<img_name>
                                $oiWheres[] = $dbr->makeList(
                                        array( 'oi_name' => $base, 'oi_archive_name' => $name ),
                                        LIST_AND
@@ -95,6 +99,7 @@ class FindOrphanedFiles extends Maintenance {
                                        $this->output( "Checking current file $name\n" );
                                }
 
+                               $curNames[] = $name;
                                $imgIN[] = $name;
                        }
                }
@@ -104,13 +109,13 @@ class FindOrphanedFiles extends Maintenance {
                                array(
                                        $dbr->selectSQLText(
                                                'image',
-                                               array( 'name' => 'img_name' ),
-                                               array( 'img_name' => $imgIN )
+                                               array( 'name' => 'img_name', 'old' => 0 ),
+                                               $imgIN ? array( 'img_name' => $imgIN ) : '1=0'
                                        ),
                                        $dbr->selectSQLText(
                                                'oldimage',
-                                               array( 'name' => 'oi_archive_name' ),
-                                               $dbr->makeList( $oiWheres, LIST_OR )
+                                               array( 'name' => 'oi_archive_name', 'old' => 1 ),
+                                               $oiWheres ? $dbr->makeList( $oiWheres, LIST_OR ) : '1=0'
                                        )
                                ),
                                true // UNION ALL (performance)
@@ -118,21 +123,31 @@ class FindOrphanedFiles extends Maintenance {
                        __METHOD__
                );
 
-               $namesFound = array();
+               $curNamesFound = array();
+               $oldNamesFound = array();
                foreach ( $res as $row ) {
-                       $namesFound[] = $row->name;
+                       if ( $row->old ) {
+                               $oldNamesFound[] = $row->name;
+                       } else {
+                               $curNamesFound[] = $row->name;
+                       }
                }
 
-               $namesOrphans = array_diff( $names, $namesFound );
-               foreach ( $namesOrphans as $name ) {
+               foreach ( array_diff( $curNames, $curNamesFound ) as $name ) {
+                       $file = $repo->newFile( $name );
                        // Print name and public URL to ease recovery
-                       if ( strpos( $name, '!' ) !== false ) {
-                               list( , $base ) = explode( '!', $name ); // <TS_MW>!<img_name>
-                               $file = $repo->newFromArchiveName( Title::makeTitle( NS_FILE, $base ), $name );
+                       if ( $file ) {
+                               $this->output( $name . "\n" . $file->getCanonicalUrl() . "\n\n" );
                        } else {
-                               $file = $repo->newFile( $name );
+                               $this->error( "Cannot get URL for bad file title '$name'" );
                        }
-                       $this->output( $name . "\n" . $file->getUrl() . "\n\n" );
+               }
+
+               foreach ( array_diff( $oldNames, $oldNamesFound ) as $name ) {
+                       list( , $base ) = explode( '!', $name, 2 ); // <TS_MW>!<img_name>
+                       $file = $repo->newFromArchiveName( Title::makeTitle( NS_FILE, $base ), $name );
+                       // Print name and public URL to ease recovery
+                       $this->output( $name . "\n" . $file->getCanonicalUrl() . "\n\n" );
                }
        }
 }