Make WordPress Core

Changeset 56069


Ignore:
Timestamp:
06/27/2023 04:06:16 PM (3 years ago)
Author:
mikeschroder
Message:

Filesystem API: Allow optional inclusion of hidden files in list_files().

Adds a new optional $include_hidden parameter to allow the inclusion of hidden (. prefixed) files.
Defaults to false for backward compatibility.

Props yani.iliev, sabernhardt, costdev, rutviksavsani, zunaid321, azaozz.
Fixes #53659.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/includes/file.php

    r55990 r56069  
    128128 * @since 2.6.0
    129129 * @since 4.9.0 Added the `$exclusions` parameter.
    130  *
    131  * @param string   $folder     Optional. Full path to folder. Default empty.
    132  * @param int      $levels     Optional. Levels of folders to follow, Default 100 (PHP Loop limit).
    133  * @param string[] $exclusions Optional. List of folders and files to skip.
     130 * @since 6.3.0 Added the `$include_hidden` parameter.
     131 *
     132 * @param string   $folder         Optional. Full path to folder. Default empty.
     133 * @param int      $levels         Optional. Levels of folders to follow, Default 100 (PHP Loop limit).
     134 * @param string[] $exclusions     Optional. List of folders and files to skip.
     135 * @param bool     $include_hidden Optional. Whether to include details of hidden ("." prefixed) files.
     136 *                                 Default false.
    134137 * @return string[]|false Array of files on success, false on failure.
    135138 */
    136 function list_files( $folder = '', $levels = 100, $exclusions = array() ) {
     139function list_files( $folder = '', $levels = 100, $exclusions = array(), $include_hidden = false ) {
    137140        if ( empty( $folder ) ) {
    138141                return false;
     
    157160
    158161                        // Skip hidden and excluded files.
    159                         if ( '.' === $file[0] || in_array( $file, $exclusions, true ) ) {
     162                        if ( ( ! $include_hidden && '.' === $file[0] ) || in_array( $file, $exclusions, true ) ) {
    160163                                continue;
    161164                        }
    162165
    163166                        if ( is_dir( $folder . $file ) ) {
    164                                 $files2 = list_files( $folder . $file, $levels - 1 );
     167                                $files2 = list_files( $folder . $file, $levels - 1, array(), $include_hidden );
    165168                                if ( $files2 ) {
    166169                                        $files = array_merge( $files, $files2 );
  • trunk/tests/phpunit/tests/functions/listFiles.php

    r51331 r56069  
    2020                $this->assertNotContains( ABSPATH . 'wp-admin/index.php', $admin_files );
    2121        }
     22
     23        /**
     24         * Tests that list_files() optionally includes hidden files.
     25         *
     26         * @ticket 53659
     27         *
     28         * @dataProvider data_list_files_should_optionally_include_hidden_files
     29         *
     30         * @param string   $filename       The name of the hidden file.
     31         * @param bool     $include_hidden Whether to include hidden ("." prefixed) files.
     32         * @param string[] $exclusions     List of folders and files to skip.
     33         * @param bool     $expected       Whether the file should be included in the results.
     34         */
     35        public function test_list_files_should_optionally_include_hidden_files( $filename, $include_hidden, $exclusions, $expected ) {
     36                $test_dir    = get_temp_dir() . 'test-list-files/';
     37                $hidden_file = $test_dir . $filename;
     38
     39                mkdir( $test_dir );
     40                touch( $hidden_file );
     41
     42                $actual = list_files( $test_dir, 100, $exclusions, $include_hidden );
     43
     44                unlink( $hidden_file );
     45                rmdir( $test_dir );
     46
     47                if ( $expected ) {
     48                        $this->assertContains( $hidden_file, $actual, 'The file was not included.' );
     49                } else {
     50                        $this->assertNotContains( $hidden_file, $actual, 'The file was included.' );
     51                }
     52        }
     53
     54        /**
     55         * Data provider.
     56         *
     57         * @return array[]
     58         */
     59        public function data_list_files_should_optionally_include_hidden_files() {
     60                return array(
     61                        '$include_hidden = false and no exclusions' => array(
     62                                'filename'       => '.hidden_file',
     63                                'include_hidden' => false,
     64                                'exclusions'     => array(),
     65                                'expected'       => false,
     66                        ),
     67                        '$include_hidden = true and no exclusions'  => array(
     68                                'filename'       => '.hidden_file',
     69                                'include_hidden' => true,
     70                                'exclusions'     => array(),
     71                                'expected'       => true,
     72                        ),
     73                        '$include_hidden = true and an excluded filename' => array(
     74                                'filename'       => '.hidden_file',
     75                                'include_hidden' => true,
     76                                'exclusions'     => array( '.hidden_file' ),
     77                                'expected'       => false,
     78                        ),
     79                );
     80        }
    2281}
Note: See TracChangeset for help on using the changeset viewer.