From: Aaron Schulz Date: Wed, 12 Jun 2013 17:46:37 +0000 (-0700) Subject: Made purgeDeletedFiles.php delete files still in the public zone. X-Git-Tag: 1.31.0-rc.0~19428 X-Git-Url: http://git.cyclocoop.org//%22%22.str_replace%28%27%22%27%2C?a=commitdiff_plain;h=28483205c91a9110355a24c26058121dc1bfeb83;p=lhc%2Fweb%2Fwiklou.git 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 --- 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";