Merge "Added a separate error message for mkdir failures"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 9 Aug 2017 23:24:12 +0000 (23:24 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 9 Aug 2017 23:24:13 +0000 (23:24 +0000)
1  2 
includes/media/SVG.php

diff --combined includes/media/SVG.php
@@@ -20,7 -20,6 +20,7 @@@
   * @file
   * @ingroup Media
   */
 +use Wikimedia\ScopedCallback;
  
  /**
   * Handler for SVG images.
@@@ -34,12 -33,12 +34,12 @@@ class SvgHandler extends ImageHandler 
         *  to the commonly used exif tags. This allows messages
         *  to be reused, and consistent tag names for {{#formatmetadata:..}}
         */
 -      private static $metaConversion = array(
 +      private static $metaConversion = [
                'originalwidth' => 'ImageWidth',
                'originalheight' => 'ImageLength',
                'description' => 'ImageDescription',
                'title' => 'ObjectName',
 -      );
 +      ];
  
        function isEnabled() {
                global $wgSVGConverters, $wgSVGConverter;
@@@ -52,7 -51,7 +52,7 @@@
                }
        }
  
 -      function mustRender( $file ) {
 +      public function mustRender( $file ) {
                return true;
        }
  
@@@ -91,7 -90,7 +91,7 @@@
         */
        public function getAvailableLanguages( File $file ) {
                $metadata = $file->getMetadata();
 -              $langList = array();
 +              $langList = [];
                if ( $metadata ) {
                        $metadata = $this->unpackMetadata( $metadata );
                        if ( isset( $metadata['translations'] ) ) {
  
                $metadata = $this->unpackMetadata( $image->getMetadata() );
                if ( isset( $metadata['error'] ) ) { // sanity check
 -                      $err = wfMessage( 'svg-long-error', $metadata['error']['message'] )->text();
 +                      $err = wfMessage( 'svg-long-error', $metadata['error']['message'] );
  
                        return new MediaTransformError( 'thumbnail_error', $clientWidth, $clientHeight, $err );
                }
  
                if ( !wfMkdirParents( dirname( $dstPath ), null, __METHOD__ ) ) {
                        return new MediaTransformError( 'thumbnail_error', $clientWidth, $clientHeight,
 -                              wfMessage( 'thumbnail_dest_directory' )->text() );
 +                              wfMessage( 'thumbnail_dest_directory' ) );
                }
  
                $srcPath = $image->getLocalRefPath();
  
                        return new MediaTransformError( 'thumbnail_error',
                                $params['width'], $params['height'],
 -                              wfMessage( 'filemissing' )->text()
 +                              wfMessage( 'filemissing' )
                        );
                }
  
                // https://git.gnome.org/browse/librsvg/commit/?id=f01aded72c38f0e18bc7ff67dee800e380251c8e
                $tmpDir = wfTempDir() . '/svg_' . wfRandomString( 24 );
                $lnPath = "$tmpDir/" . basename( $srcPath );
-               $ok = mkdir( $tmpDir, 0771 ) && symlink( $srcPath, $lnPath );
+               $ok = mkdir( $tmpDir, 0771 );
+               if ( !$ok ) {
+                       wfDebugLog( 'thumbnail',
+                               sprintf( 'Thumbnail failed on %s: could not create temporary directory %s',
+                                       wfHostname(), $tmpDir ) );
+                       return new MediaTransformError( 'thumbnail_error',
+                               $params['width'], $params['height'],
+                               wfMessage( 'thumbnail-temp-create' )->text()
+                       );
+               }
+               $ok = symlink( $srcPath, $lnPath );
                /** @noinspection PhpUnusedLocalVariableInspection */
                $cleaner = new ScopedCallback( function () use ( $tmpDir, $lnPath ) {
                        MediaWiki\suppressWarnings();
                                        wfHostname(), $lnPath, $srcPath ) );
                        return new MediaTransformError( 'thumbnail_error',
                                $params['width'], $params['height'],
 -                              wfMessage( 'thumbnail-temp-create' )->text()
 +                              wfMessage( 'thumbnail-temp-create' )
                        );
                }
  
                        if ( is_array( $wgSVGConverters[$wgSVGConverter] ) ) {
                                // This is a PHP callable
                                $func = $wgSVGConverters[$wgSVGConverter][0];
 -                              $args = array_merge( array( $srcPath, $dstPath, $width, $height, $lang ),
 +                              $args = array_merge( [ $srcPath, $dstPath, $width, $height, $lang ],
                                        array_slice( $wgSVGConverters[$wgSVGConverter], 1 ) );
                                if ( !is_callable( $func ) ) {
                                        throw new MWException( "$func is not callable" );
                        } else {
                                // External command
                                $cmd = str_replace(
 -                                      array( '$path/', '$width', '$height', '$input', '$output' ),
 -                                      array( $wgSVGConverterPath ? wfEscapeShellArg( "$wgSVGConverterPath/" ) : "",
 +                                      [ '$path/', '$width', '$height', '$input', '$output' ],
 +                                      [ $wgSVGConverterPath ? wfEscapeShellArg( "$wgSVGConverterPath/" ) : "",
                                                intval( $width ),
                                                intval( $height ),
                                                wfEscapeShellArg( $srcPath ),
 -                                              wfEscapeShellArg( $dstPath ) ),
 +                                              wfEscapeShellArg( $dstPath ) ],
                                        $wgSVGConverters[$wgSVGConverter]
                                );
  
 -                              $env = array();
 +                              $env = [];
                                if ( $lang !== false ) {
                                        $env['LANG'] = $lang;
                                }
        }
  
        /**
 -       * @param File $file
 +       * @param File|FSFile $file
         * @param string $path Unused
         * @param bool|array $metadata
         * @return array
         */
        function getImageSize( $file, $path, $metadata = false ) {
 -              if ( $metadata === false ) {
 +              if ( $metadata === false && $file instanceof File ) {
                        $metadata = $file->getMetadata();
                }
                $metadata = $this->unpackMetadata( $metadata );
  
                if ( isset( $metadata['width'] ) && isset( $metadata['height'] ) ) {
 -                      return array( $metadata['width'], $metadata['height'], 'SVG',
 -                              "width=\"{$metadata['width']}\" height=\"{$metadata['height']}\"" );
 +                      return [ $metadata['width'], $metadata['height'], 'SVG',
 +                              "width=\"{$metadata['width']}\" height=\"{$metadata['height']}\"" ];
                } else { // error
 -                      return array( 0, 0, 'SVG', "width=\"0\" height=\"0\"" );
 +                      return [ 0, 0, 'SVG', "width=\"0\" height=\"0\"" ];
                }
        }
  
        function getThumbType( $ext, $mime, $params = null ) {
 -              return array( 'png', 'image/png' );
 +              return [ 'png', 'image/png' ];
        }
  
        /**
        }
  
        /**
 -       * @param File $file
 +       * @param File|FSFile $file
         * @param string $filename
         * @return string Serialised metadata
         */
        function getMetadata( $file, $filename ) {
 -              $metadata = array( 'version' => self::SVG_METADATA_VERSION );
 +              $metadata = [ 'version' => self::SVG_METADATA_VERSION ];
                try {
                        $metadata += SVGMetadataExtractor::getMetadata( $filename );
                } catch ( Exception $e ) { // @todo SVG specific exceptions
                        // File not found, broken, etc.
 -                      $metadata['error'] = array(
 +                      $metadata['error'] = [
                                'message' => $e->getMessage(),
                                'code' => $e->getCode()
 -                      );
 +                      ];
                        wfDebug( __METHOD__ . ': ' . $e->getMessage() . "\n" );
                }
  
        }
  
        protected function visibleMetadataFields() {
 -              $fields = array( 'objectname', 'imagedescription' );
 +              $fields = [ 'objectname', 'imagedescription' ];
  
                return $fields;
        }
         * @return array|bool
         */
        function formatMetadata( $file, $context = false ) {
 -              $result = array(
 -                      'visible' => array(),
 -                      'collapsed' => array()
 -              );
 +              $result = [
 +                      'visible' => [],
 +                      'collapsed' => []
 +              ];
                $metadata = $file->getMetadata();
                if ( !$metadata ) {
                        return false;
         * @param mixed $value Parameter value
         * @return bool Validity
         */
 -      function validateParam( $name, $value ) {
 -              if ( in_array( $name, array( 'width', 'height' ) ) ) {
 +      public function validateParam( $name, $value ) {
 +              if ( in_array( $name, [ 'width', 'height' ] ) ) {
                        // Reject negative heights, widths
                        return ( $value > 0 );
                } elseif ( $name == 'lang' ) {
                        // Validate $code
 -                      if ( $value === '' || !Language::isValidBuiltinCode( $value ) ) {
 +                      if ( $value === '' || !Language::isValidBuiltInCode( $value ) ) {
                                wfDebug( "Invalid user language code\n" );
  
                                return false;
         * @param array $params Name=>value pairs of parameters
         * @return string Filename to use
         */
 -      function makeParamString( $params ) {
 +      public function makeParamString( $params ) {
                $lang = '';
                if ( isset( $params['lang'] ) && $params['lang'] !== 'en' ) {
                        $params['lang'] = strtolower( $params['lang'] );
                return "$lang{$params['width']}px";
        }
  
 -      function parseParamString( $str ) {
 +      public function parseParamString( $str ) {
                $m = false;
                if ( preg_match( '/^lang([a-z]+(?:-[a-z]+)*)-(\d+)px$/', $str, $m ) ) {
 -                      return array( 'width' => array_pop( $m ), 'lang' => $m[1] );
 +                      return [ 'width' => array_pop( $m ), 'lang' => $m[1] ];
                } elseif ( preg_match( '/^(\d+)px$/', $str, $m ) ) {
 -                      return array( 'width' => $m[1], 'lang' => 'en' );
 +                      return [ 'width' => $m[1], 'lang' => 'en' ];
                } else {
                        return false;
                }
        }
  
 -      function getParamMap() {
 -              return array( 'img_lang' => 'lang', 'img_width' => 'width' );
 +      public function getParamMap() {
 +              return [ 'img_lang' => 'lang', 'img_width' => 'width' ];
        }
  
        /**
         * @return array
         */
        function getScriptParams( $params ) {
 -              $scriptParams = array( 'width' => $params['width'] );
 +              $scriptParams = [ 'width' => $params['width'] ];
                if ( isset( $params['lang'] ) ) {
                        $scriptParams['lang'] = $params['lang'];
                }
        public function getCommonMetaArray( File $file ) {
                $metadata = $file->getMetadata();
                if ( !$metadata ) {
 -                      return array();
 +                      return [];
                }
                $metadata = $this->unpackMetadata( $metadata );
                if ( !$metadata || isset( $metadata['error'] ) ) {
 -                      return array();
 +                      return [];
                }
 -              $stdMetadata = array();
 +              $stdMetadata = [];
                foreach ( $metadata as $name => $value ) {
                        $tag = strtolower( $name );
                        if ( $tag === 'originalwidth' || $tag === 'originalheight' ) {