WordPress.org

Make WordPress Core

Ticket #14928: 14928.2.patch

File 14928.2.patch, 3.1 KB (added by hakre, 4 years ago)

Refactoring Iteration

  • wp-includes/functions.php

     
    20152015} 
    20162016 
    20172017/** 
     2018 * Make Directories. 
     2019 * 
    20182020 * Recursive directory creation based on full path. 
     2021 * Attempts to set permissions on newly created folders. 
    20192022 * 
    2020  * Will attempt to set permissions on folders. 
     2023 * As php mkdir() (PHP < 5.0.0) does not support recursive paths, this function mimics  
     2024 * the *nix `mkdir -p` / `mkdir --parent` command. 
    20212025 * 
     2026 * In difference to mkdir, the permissions set on newly created folders  
     2027 * is based on the parent folder permissions - not umask. 
     2028 * 
     2029 * @link http://www.gnu.org/software/coreutils/manual/coreutils.html#mkdir-invocation 
     2030 * @link http://php.net/mkdir 
    20222031 * @since 2.0.1 
    20232032 * 
    2024  * @param string $target Full path to attempt to create. 
    2025  * @return bool Whether the path was created. True if path already exists. 
     2033 * @param string $target Path of a directory to create. 
     2034 * @return bool Whether the target path exists (already or just created does not make a difference). 
    20262035 */ 
    20272036function wp_mkdir_p( $target ) { 
    2028         // from php.net/mkdir user contributed notes 
    2029         $target = str_replace( '//', '/', $target ); 
     2037        // Normalize $target 
     2038        $target = str_replace( '//', '/', $target ); // undocumented, from a removed php.net/mkdir user-note 
     2039        $target = rtrim( $target, '/' ); // safe mode fails with a trailing slash under certain PHP versions. 
     2040        empty( $target ) && $target = '/'; // empty target is root (posix). 
    20302041 
    2031         // safe mode fails with a trailing slash under certain PHP versions. 
    2032         $target = rtrim($target, '/'); // Use rtrim() instead of untrailingslashit to avoid formatting.php dependency. 
    2033         if ( empty($target) ) 
    2034                 $target = '/'; 
    2035  
     2042        // Handle existing target. 
    20362043        if ( file_exists( $target ) ) 
    20372044                return @is_dir( $target ); 
    20382045 
    2039         // Attempting to create the directory may clutter up our display. 
    2040         if ( @mkdir( $target ) ) { 
    2041                 $stat = @stat( dirname( $target ) ); 
    2042                 $dir_perms = $stat['mode'] & 0007777;  // Get the permission bits. 
    2043                 @chmod( $target, $dir_perms ); 
    2044                 return true; 
    2045         } elseif ( is_dir( dirname( $target ) ) ) { 
    2046                         return false; 
    2047         } 
     2046        // Handle target parent directory (recursion). 
     2047        $parent     = dirname( $target ); 
     2048        $has_parent = strlen( $target ) !== strlen( $parent ); 
     2049        if ( $has_parent && !wp_mkdir_p( $parent ) ) 
     2050                return false; 
    20482051 
    2049         // If the above failed, attempt to create the parent node, then try again. 
    2050         if ( ( $target != '/' ) && ( wp_mkdir_p( dirname( $target ) ) ) ) 
    2051                 return wp_mkdir_p( $target ); 
     2052        // Target directory creation 
     2053        if ( !@mkdir( $target ) ) 
     2054                return false; 
    20522055 
    2053         return false; 
     2056        // Set Permissions on created target, defaults to 0755/FS_CHMOD_DIR and if  
     2057        // parent status exists, to the parent's status inode protection mode permissions. 
     2058        $target_perms = defined( 'FS_CHMOD_DIR' ) ? FS_CHMOD_DIR : 0755; // see /wp-admin/includes/file.php 
     2059        $parent_stat  = $has_parent ? @stat( $parent ) : false; 
     2060        $parent_stat && ( $target_perms = $parent_stat['mode'] & 0007777 ); // Get permission bits. 
     2061        @chmod( $target, $target_perms ); 
     2062 
     2063        return true; 
    20542064} 
    20552065 
    20562066/**