From 28483205c91a9110355a24c26058121dc1bfeb83 Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Wed, 12 Jun 2013 10:46:37 -0700 Subject: [PATCH] Made purgeDeletedFiles.php delete files still in the public zone. * This makes purges more useful since the file won't come back. * This only applies for files that are confirmed to already be in the deleted zone too. This is for sanity. Change-Id: I60316c1d9323347d09607e36a334fc5eb0b6a2e7 --- maintenance/purgeDeletedFiles.php | 34 +++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/maintenance/purgeDeletedFiles.php b/maintenance/purgeDeletedFiles.php index 32b6569236..86658c52d4 100644 --- a/maintenance/purgeDeletedFiles.php +++ b/maintenance/purgeDeletedFiles.php @@ -68,28 +68,54 @@ class PurgeDeletedFiles extends Maintenance { $res = $db->select( 'logging', array( 'log_title', 'log_timestamp' ), $conds, __METHOD__ ); foreach ( $res as $row ) { $file = $repo->newFile( Title::makeTitle( NS_FILE, $row->log_title ) ); - + // If there is an orphaned storage file still there...delete it + if ( !$file->exists() && $repo->fileExists( $file->getPath() ) ) { + $dpath = $this->getDeletedPath( $repo, $file ); + if ( $repo->fileExists( $dpath ) ) { // sanity check to avoid data loss + $repo->getBackend()->delete( array( 'src' => $file->getPath() ) ); + $this->output( "Deleted orphan file: {$file->getPath()}.\n" ); + } else { + $this->error( "File was not deleted: {$file->getPath()}.\n" ); + } + } // Purge current version and any versions in oldimage table $file->purgeCache(); $file->purgeHistory(); // Purge items from fileachive table (rows are likely here) - $this->purgeFromArchiveTable( $file ); + $this->purgeFromArchiveTable( $repo, $file ); $this->output( "Purged file {$row->log_title}; deleted on {$row->log_timestamp}.\n" ); } } - protected function purgeFromArchiveTable( LocalFile $file ) { - $db = $file->getRepo()->getSlaveDB(); + protected function purgeFromArchiveTable( LocalRepo $repo, LocalFile $file ) { + $db = $repo->getSlaveDB(); $res = $db->select( 'filearchive', array( 'fa_archive_name' ), array( 'fa_name' => $file->getName() ), __METHOD__ ); foreach ( $res as $row ) { + $ofile = $repo->newFromArchiveName( $file->getTitle(), $row->fa_archive_name ); + // If there is an orphaned storage file still there...delete it + if ( !$file->exists() && $repo->fileExists( $ofile->getPath() ) ) { + $dpath = $this->getDeletedPath( $repo, $ofile ); + if ( $repo->fileExists( $dpath ) ) { // sanity check to avoid data loss + $repo->getBackend()->delete( array( 'src' => $ofile->getPath() ) ); + $this->output( "Deleted orphan file: {$ofile->getPath()}.\n" ); + } else { + $this->error( "File was not deleted: {$ofile->getPath()}.\n" ); + } + } $file->purgeOldThumbnails( $row->fa_archive_name ); } } + + protected function getDeletedPath( LocalRepo $repo, LocalFile $file ) { + $hash = $repo->getFileSha1( $file->getPath() ); + $key = "{$hash}.{$file->getExtension()}"; + return $repo->getDeletedHashPath( $key ) . $key; + } } $maintClass = "PurgeDeletedFiles"; -- 2.20.1