diff options
author | Aaron Schulz <aschulz@wikimedia.org> | 2013-06-12 10:46:37 -0700 |
---|---|---|
committer | Gerrit Code Review <gerrit@wikimedia.org> | 2013-06-13 23:37:00 +0000 |
commit | 28483205c91a9110355a24c26058121dc1bfeb83 (patch) | |
tree | 8539315a535b74161e0533659d9832c2484a33e3 | |
parent | 382f706a5be188b32c9006a7c98da3c56e4f4321 (diff) | |
download | mediawikicore-28483205c91a9110355a24c26058121dc1bfeb83.tar.gz mediawikicore-28483205c91a9110355a24c26058121dc1bfeb83.zip |
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
-rw-r--r-- | maintenance/purgeDeletedFiles.php | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/maintenance/purgeDeletedFiles.php b/maintenance/purgeDeletedFiles.php index 32b65692365d..86658c52d489 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"; |