diff options
author | Pierre Schmitz <pierre@archlinux.de> | 2011-06-22 11:28:20 +0200 |
---|---|---|
committer | Pierre Schmitz <pierre@archlinux.de> | 2011-06-22 11:28:20 +0200 |
commit | 9db190c7e736ec8d063187d4241b59feaf7dc2d1 (patch) | |
tree | 46d1a0dee7febef5c2d57a9f7b972be16a163b3d /includes/filerepo/FileRepo.php | |
parent | 78677c7bbdcc9739f6c10c75935898a20e1acd9e (diff) |
update to MediaWiki 1.17.0
Diffstat (limited to 'includes/filerepo/FileRepo.php')
-rw-r--r-- | includes/filerepo/FileRepo.php | 173 |
1 files changed, 112 insertions, 61 deletions
diff --git a/includes/filerepo/FileRepo.php b/includes/filerepo/FileRepo.php index f94709b3..ff73a73c 100644 --- a/includes/filerepo/FileRepo.php +++ b/includes/filerepo/FileRepo.php @@ -1,8 +1,15 @@ <?php +/** + * Base code for file repositories. + * + * @file + * @ingroup FileRepo + */ /** - * Base class for file repositories + * Base class for file repositories. * Do not instantiate, use a derived class. + * * @ingroup FileRepo */ abstract class FileRepo { @@ -12,7 +19,8 @@ abstract class FileRepo { const OVERWRITE_SAME = 4; var $thumbScriptUrl, $transformVia404; - var $descBaseUrl, $scriptDirUrl, $articleUrl, $fetchDescription, $initialCapital; + var $descBaseUrl, $scriptDirUrl, $scriptExtension, $articleUrl; + var $fetchDescription, $initialCapital; var $pathDisclosureProtection = 'paranoid'; var $descriptionCacheExpiry, $hashLevels, $url, $thumbUrl; @@ -31,7 +39,8 @@ abstract class FileRepo { $this->initialCapital = MWNamespace::isCapitalized( NS_FILE ); foreach ( array( 'descBaseUrl', 'scriptDirUrl', 'articleUrl', 'fetchDescription', 'thumbScriptUrl', 'initialCapital', 'pathDisclosureProtection', - 'descriptionCacheExpiry', 'hashLevels', 'url', 'thumbUrl' ) as $var ) + 'descriptionCacheExpiry', 'hashLevels', 'url', 'thumbUrl', 'scriptExtension' ) + as $var ) { if ( isset( $info[$var] ) ) { $this->$var = $info[$var]; @@ -49,12 +58,13 @@ abstract class FileRepo { /** * Create a new File object from the local repository - * @param mixed $title Title object or string - * @param mixed $time Time at which the image was uploaded. - * If this is specified, the returned object will be an - * instance of the repository's old file class instead of - * a current file. Repositories not supporting version - * control should return false if this parameter is set. + * + * @param $title Mixed: Title object or string + * @param $time Mixed: Time at which the image was uploaded. + * If this is specified, the returned object will be an + * instance of the repository's old file class instead of a + * current file. Repositories not supporting version control + * should return false if this parameter is set. */ function newFile( $title, $time = false ) { if ( !($title instanceof Title) ) { @@ -79,7 +89,7 @@ abstract class FileRepo { * Returns false if the file does not exist. Repositories not supporting * version control should return false if the time is specified. * - * @param mixed $title Title object or string + * @param $title Mixed: Title object or string * @param $options Associative array of options: * time: requested time for an archived image, or false for the * current version. An image object will be returned which was @@ -144,7 +154,7 @@ abstract class FileRepo { /* * Find many files at once. - * @param array $items, an array of titles, or an array of findFile() options with + * @param $items An array of titles, or an array of findFile() options with * the "title" option giving the title. Example: * * $findItem = array( 'title' => $title, 'private' => true ); @@ -153,7 +163,7 @@ abstract class FileRepo { */ function findFiles( $items ) { $result = array(); - foreach ( $items as $index => $item ) { + foreach ( $items as $item ) { if ( is_array( $item ) ) { $title = $item['title']; $options = $item; @@ -163,31 +173,33 @@ abstract class FileRepo { $options = array(); } $file = $this->findFile( $title, $options ); - if ( $file ) + if ( $file ) { $result[$file->getTitle()->getDBkey()] = $file; + } } return $result; } /** * Create a new File object from the local repository - * @param mixed $sha1 SHA-1 key - * @param mixed $time Time at which the image was uploaded. - * If this is specified, the returned object will be an - * instance of the repository's old file class instead of - * a current file. Repositories not supporting version - * control should return false if this parameter is set. + * @param $sha1 Mixed: SHA-1 key + * @param $time Mixed: time at which the image was uploaded. + * If this is specified, the returned object will be an + * of the repository's old file class instead of a current + * file. Repositories not supporting version control should + * return false if this parameter is set. */ function newFileFromKey( $sha1, $time = false ) { if ( $time ) { if ( $this->oldFileFactoryKey ) { return call_user_func( $this->oldFileFactoryKey, $sha1, $this, $time ); - } else { - return false; } } else { - return call_user_func( $this->fileFactoryKey, $sha1, $this ); + if ( $this->fileFactoryKey ) { + return call_user_func( $this->fileFactoryKey, $sha1, $this ); + } } + return false; } /** @@ -195,8 +207,8 @@ abstract class FileRepo { * Returns false if the file does not exist. Repositories not supporting * version control should return false if the time is specified. * - * @param string $sha1 string - * @param array $options Option array, same as findFile(). + * @param $sha1 String + * @param $options Option array, same as findFile(). */ function findFileFromKey( $sha1, $options = array() ) { if ( !is_array( $options ) ) { @@ -217,7 +229,7 @@ abstract class FileRepo { # Now try an old version of the file if ( $time !== false ) { $img = $this->newFileFromKey( $sha1, $time ); - if ( $img->exists() ) { + if ( $img && $img->exists() ) { if ( !$img->isDeleted(File::DELETED_FILE) ) { return $img; } else if ( !empty( $options['private'] ) && $img->userCan(File::DELETED_FILE) ) { @@ -237,7 +249,7 @@ abstract class FileRepo { /** * Get the URL corresponding to one of the four basic zones - * @param String $zone One of: public, deleted, temp, thumb + * @param $zone String: one of: public, deleted, temp, thumb * @return String or false */ function getZoneUrl( $zone ) { @@ -255,7 +267,6 @@ abstract class FileRepo { * Get the name of an image from its title object */ function getNameFromTitle( $title ) { - global $wgCapitalLinks; if ( $this->initialCapital != MWNamespace::isCapitalized( NS_FILE ) ) { global $wgContLang; $name = $title->getUserCaseDBKey(); @@ -295,6 +306,18 @@ abstract class FileRepo { function getName() { return $this->name; } + + /** + * Make an url to this repo + * + * @param $query mixed Query string to append + * @param $entry string Entry point; defaults to index + * @return string + */ + function makeUrl( $query = '', $entry = 'index' ) { + $ext = isset( $this->scriptExtension ) ? $this->scriptExtension : '.php'; + return wfAppendQuery( "{$this->scriptDirUrl}/{$entry}{$ext}", $query ); + } /** * Get the URL of an image description page. May return false if it is @@ -325,8 +348,7 @@ abstract class FileRepo { # We use "Image:" as the canonical namespace for # compatibility across all MediaWiki versions, # and just sort of hope index.php is right. ;) - return $this->scriptDirUrl . - "/index.php?title=Image:$encName"; + return $this->makeUrl( "title=Image:$encName" ); } return false; } @@ -336,8 +358,8 @@ abstract class FileRepo { * MediaWiki this means action=render. This should only be called by the * repository's file class, since it may return invalid results. User code * should use File::getDescriptionText(). - * @param string $name Name of image to fetch - * @param string $lang Language to fetch it in, if any. + * @param $name String: name of image to fetch + * @param $lang String: language to fetch it in, if any. */ function getDescriptionRenderUrl( $name, $lang = null ) { $query = 'action=render'; @@ -345,9 +367,10 @@ abstract class FileRepo { $query .= '&uselang=' . $lang; } if ( isset( $this->scriptDirUrl ) ) { - return $this->scriptDirUrl . '/index.php?title=' . + return $this->makeUrl( + 'title=' . wfUrlencode( 'Image:' . $name ) . - "&$query"; + "&$query" ); } else { $descUrl = $this->getDescriptionUrl( $name ); if ( $descUrl ) { @@ -357,14 +380,25 @@ abstract class FileRepo { } } } + + /** + * Get the URL of the stylesheet to apply to description pages + * @return string + */ + function getDescriptionStylesheetUrl() { + if ( $this->scriptDirUrl ) { + return $this->makeUrl( 'title=MediaWiki:Filepage.css&' . + wfArrayToCGI( Skin::getDynamicStylesheetQuery() ) ); + } + } /** * Store a file to a given destination. * - * @param string $srcPath Source path or virtual URL - * @param string $dstZone Destination zone - * @param string $dstRel Destination relative path - * @param integer $flags Bitwise combination of the following flags: + * @param $srcPath String: source path or virtual URL + * @param $dstZone String: destination zone + * @param $dstRel String: destination relative path + * @param $flags Integer: bitwise combination of the following flags: * self::DELETE_SOURCE Delete the source file after upload * self::OVERWRITE Overwrite an existing destination file instead of failing * self::OVERWRITE_SAME Overwrite the file if the destination exists and has the @@ -382,8 +416,8 @@ abstract class FileRepo { /** * Store a batch of files * - * @param array $triplets (src,zone,dest) triplets as per store() - * @param integer $flags Flags as per store + * @param $triplets Array: (src,zone,dest) triplets as per store() + * @param $flags Integer: flags as per store */ abstract function storeBatch( $triplets, $flags = 0 ); @@ -391,18 +425,18 @@ abstract class FileRepo { * Pick a random name in the temp zone and store a file to it. * Returns a FileRepoStatus object with the URL in the value. * - * @param string $originalName The base name of the file as specified + * @param $originalName String: the base name of the file as specified * by the user. The file extension will be maintained. - * @param string $srcPath The current location of the file. + * @param $srcPath String: the current location of the file. */ abstract function storeTemp( $originalName, $srcPath ); /** * Append the contents of the source path to the given file. - * @param $srcPath string location of the source file - * @param $toAppendPath string path to append to. - * @param $flags Bitfield, may be FileRepo::DELETE_SOURCE to indicate + * @param $srcPath String: location of the source file + * @param $toAppendPath String: path to append to. + * @param $flags Integer: bitfield, may be FileRepo::DELETE_SOURCE to indicate * that the source file should be deleted if possible * @return mixed Status or false */ @@ -410,8 +444,8 @@ abstract class FileRepo { /** * Remove a temporary file or mark it for garbage collection - * @param string $virtualUrl The virtual URL returned by storeTemp - * @return boolean True on success, false on failure + * @param $virtualUrl String: the virtual URL returned by storeTemp + * @return Boolean: true on success, false on failure * STUB */ function freeTemp( $virtualUrl ) { @@ -425,11 +459,11 @@ abstract class FileRepo { * Returns a FileRepoStatus object. On success, the value contains "new" or * "archived", to indicate whether the file was new with that name. * - * @param string $srcPath The source path or URL - * @param string $dstRel The destination relative path - * @param string $archiveRel The relative path where the existing file is to + * @param $srcPath String: the source path or URL + * @param $dstRel String: the destination relative path + * @param $archiveRel String: rhe relative path where the existing file is to * be archived, if there is one. Relative to the public zone root. - * @param integer $flags Bitfield, may be FileRepo::DELETE_SOURCE to indicate + * @param $flags Integer: bitfield, may be FileRepo::DELETE_SOURCE to indicate * that the source file should be deleted if possible */ function publish( $srcPath, $dstRel, $archiveRel, $flags = 0 ) { @@ -447,8 +481,8 @@ abstract class FileRepo { /** * Publish a batch of files - * @param array $triplets (source,dest,archive) triplets as per publish() - * @param integer $flags Bitfield, may be FileRepo::DELETE_SOURCE to indicate + * @param $triplets Array: (source,dest,archive) triplets as per publish() + * @param $flags Integer: bitfield, may be FileRepo::DELETE_SOURCE to indicate * that the source files should be deleted if possible */ abstract function publishBatch( $triplets, $flags = 0 ); @@ -461,8 +495,8 @@ abstract class FileRepo { /** * Checks existence of an array of files. * - * @param array $files URLs (or paths) of files to check - * @param integer $flags Bitwise combination of the following flags: + * @param $files Array: URLs (or paths) of files to check + * @param $flags Integer: bitwise combination of the following flags: * self::FILES_ONLY Mark file as existing only if it is a file (not directory) * @return Either array of files and existence flags, or false */ @@ -478,7 +512,7 @@ abstract class FileRepo { * assumes a naming scheme in the deleted zone based on content hash, as * opposed to the public zone which is assumed to be unique. * - * @param array $sourceDestPairs Array of source/destination pairs. Each element + * @param $sourceDestPairs Array of source/destination pairs. Each element * is a two-element array containing the source file path relative to the * public root in the first element, and the archive file path relative * to the deleted zone root in the second element. @@ -490,10 +524,10 @@ abstract class FileRepo { * Move a file to the deletion archive. * If no valid deletion archive exists, this may either delete the file * or throw an exception, depending on the preference of the repository - * @param mixed $srcRel Relative path for the file to be deleted - * @param mixed $archiveRel Relative path for the archive location. + * @param $srcRel Mixed: relative path for the file to be deleted + * @param $archiveRel Mixed: relative path for the archive location. * Relative to a private archive directory. - * @return WikiError object (wikitext-formatted), or true for success + * @return FileRepoStatus object */ function delete( $srcRel, $archiveRel ) { return $this->deleteBatch( array( array( $srcRel, $archiveRel ) ) ); @@ -589,7 +623,7 @@ abstract class FileRepo { * title object. If not, return false. * STUB * - * @param Title $title Title of image + * @param $title Title of image */ function checkRedirect( $title ) { return false; @@ -600,7 +634,7 @@ abstract class FileRepo { * Doesn't do anything for repositories that don't support image redirects. * * STUB - * @param Title $title Title of image + * @param $title Title of image */ function invalidateImageRedirect( $title ) {} @@ -620,7 +654,7 @@ abstract class FileRepo { */ public function getDisplayName() { // We don't name our own repo, return nothing - if ( $this->name == 'local' ) { + if ( $this->isLocal() ) { return null; } // 'shared-repo-name-wikimediacommons' is used when $wgUseInstantCommons = true @@ -632,6 +666,16 @@ abstract class FileRepo { } /** + * Returns true if this the local file repository. + * + * @return bool + */ + function isLocal() { + return $this->getName() == 'local'; + } + + + /** * Get a key on the primary cache for this repository. * Returns false if the repository's cache is not accessible at this site. * The parameters are the parts of the key, as for wfMemcKey(). @@ -652,4 +696,11 @@ abstract class FileRepo { array_unshift( $args, 'filerepo', $this->getName() ); return call_user_func_array( 'wfMemcKey', $args ); } + + /** + * Get an UploadStash associated with this repo. + */ + function getUploadStash() { + return new UploadStash( $this ); + } } |