Make WordPress Core

Ticket #30202: 30202.2.diff

File 30202.2.diff, 5.4 KB (added by wonderboymusic, 8 years ago)
  • src/wp-includes/ms-functions.php

     
    16831683 * @since MU
    16841684 *
    16851685 * @param string $directory
     1686 * @param string $exclude    Optional. Directory to exclude from the total.
    16861687 * @return int
    16871688 */
    1688 function get_dirsize( $directory ) {
    1689         $dirsize = get_transient( 'dirsize_cache' );
    1690         if ( is_array( $dirsize ) && isset( $dirsize[ $directory ][ 'size' ] ) )
     1689function get_dirsize( $directory, $exclude = null  ) {
     1690        // Don't get cache for calls with excludes unless it's the main site
     1691        if ( ! is_null( $exclude ) || ( is_main_site() && '/sites' === $exclude ) ) {
     1692                $dirsize = get_transient( 'dirsize_cache' );
     1693        } else {
     1694                $dirsize = false;
     1695        }
     1696
     1697        if ( is_array( $dirsize ) && isset( $dirsize[ $directory ][ 'size' ] ) ) {
    16911698                return $dirsize[ $directory ][ 'size' ];
     1699        }
    16921700
    1693         if ( ! is_array( $dirsize ) )
     1701        if ( ! is_array( $dirsize ) ) {
    16941702                $dirsize = array();
     1703        }
    16951704
    1696         $dirsize[ $directory ][ 'size' ] = recurse_dirsize( $directory );
     1705        $dirsize[ $directory ][ 'size' ] = recurse_dirsize( $directory, $exclude );
    16971706
    1698         set_transient( 'dirsize_cache', $dirsize, HOUR_IN_SECONDS );
     1707        // Don't cache calls with excludes unless it's the main site
     1708        if ( ! is_null( $exclude ) || ( is_main_site() && '/sites' === $exclude ) ) {
     1709                set_transient( 'dirsize_cache', $dirsize, HOUR_IN_SECONDS );
     1710        }
    16991711        return $dirsize[ $directory ][ 'size' ];
    17001712}
    17011713
     
    17081720 * @since MU
    17091721 *
    17101722 * @param string $directory
     1723 * @param string $exclude   Optional. Directory to exclude from the total.
    17111724 * @return int|false
    17121725 */
    1713 function recurse_dirsize( $directory ) {
     1726function recurse_dirsize( $directory, $exclude = null ) {
    17141727        $size = 0;
    17151728
    17161729        $directory = untrailingslashit( $directory );
    17171730
    1718         if ( !file_exists($directory) || !is_dir( $directory ) || !is_readable( $directory ) )
     1731        if ( ! file_exists( $directory ) || ! is_dir( $directory ) || ! is_readable( $directory ) || $directory === $exclude )  {
    17191732                return false;
     1733        }
    17201734
    1721         if ($handle = opendir($directory)) {
    1722                 while(($file = readdir($handle)) !== false) {
    1723                         $path = $directory.'/'.$file;
    1724                         if ($file != '.' && $file != '..') {
    1725                                 if (is_file($path)) {
    1726                                         $size += filesize($path);
    1727                                 } elseif (is_dir($path)) {
    1728                                         $handlesize = recurse_dirsize($path);
    1729                                         if ($handlesize > 0)
     1735        if ( $handle = opendir( $directory ) ) {
     1736                while( ( $file = readdir( $handle ) ) !== false ) {
     1737                        $path = $directory . '/' . $file;
     1738                        if ( $file !== '.' && $file !== '..' ) {
     1739                                if ( is_file( $path ) ) {
     1740                                        $size += filesize( $path );
     1741                                } elseif ( is_dir( $path ) ) {
     1742                                        $handlesize = recurse_dirsize( $path, $exclude );
     1743                                        if ( $handlesize > 0 ) {
    17301744                                                $size += $handlesize;
     1745                                        }
    17311746                                }
    17321747                        }
    17331748                }
    1734                 closedir($handle);
     1749                closedir( $handle );
    17351750        }
    17361751        return $size;
    17371752}
     
    22972312        $space_used = apply_filters( 'pre_get_space_used', false );
    22982313        if ( false === $space_used ) {
    22992314                $upload_dir = wp_upload_dir();
    2300                 $space_used = get_dirsize( $upload_dir['basedir'] ) / 1024 / 1024;
     2315                $exclude = ( is_main_site() ) ? $upload_dir['basedir'] . '/sites' : null;
     2316                $space_used = get_dirsize( $upload_dir['basedir'], $exclude ) / 1024 / 1024;
    23012317        }
    23022318
    23032319        return $space_used;
  • tests/phpunit/tests/multisite/site.php

     
    1111class Tests_Multisite_Site extends WP_UnitTestCase {
    1212        protected $suppress = false;
    1313
     14        protected $blog_upload_space;
     15
    1416        function setUp() {
    1517                global $wpdb;
    1618                parent::setUp();
     
    1719                $this->suppress = $wpdb->suppress_errors();
    1820
    1921                $_SERVER[ 'REMOTE_ADDR' ] = '';
     22
     23                if ( ! isset( $this->blog_upload_space ) ) {
     24                        $space_used = get_space_used();
     25                        $this->blog_upload_space = $space_used + get_site_option( 'blog_upload_space' );
     26                }
     27                       
     28                update_site_option( 'blog_upload_space', $this->blog_upload_space );
    2029        }
    2130
    2231        function tearDown() {
     
    13771386        }
    13781387
    13791388        /**
     1389         * Test that a site's upload space used is actually being counted
     1390         */
     1391        function test_get_space_used() {
     1392                $blog_id = $this->factory->blog->create();
     1393                switch_to_blog( $blog_id );
     1394
     1395                $this->assertEquals( 0, get_space_used() );
     1396
     1397                // Upload a file to the new site.
     1398                $filename = rand_str().'.jpg';
     1399                $contents = rand_str();
     1400                $file = wp_upload_bits( $filename, null, $contents );
     1401
     1402                // get_space_used() is measures in MB, get size of new file in MB
     1403                $size = filesize( $file['file'] ) / 1024 / 1024;
     1404
     1405                delete_transient( 'dirsize_cache' );
     1406
     1407                $this->assertEquals( $size, get_space_used() );
     1408
     1409                restore_current_blog();
     1410        }
     1411
     1412        /**
     1413         * Test that uploads for other sites are excluded from counting towards the space used by the main site
     1414         */
     1415        function test_get_space_used_exclude() {
     1416                $space_used = get_space_used();
     1417
     1418                $blog_id = $this->factory->blog->create();
     1419                switch_to_blog( $blog_id );
     1420
     1421                // Upload a file to the new site.
     1422                $filename = rand_str().'.jpg';
     1423                $contents = rand_str();
     1424                wp_upload_bits( $filename, null, $contents );
     1425
     1426                restore_current_blog();
     1427
     1428                delete_transient( 'dirsize_cache' );
     1429
     1430                $this->assertEquals( $space_used, get_space_used() );
     1431        }
     1432
     1433        /**
    13801434         * Test the primary purpose of get_blog_post(), to retrieve a post from
    13811435         * another site on the network.
    13821436         */