WordPress.org

Make WordPress Core

Ticket #16971: 16971.2.patch

File 16971.2.patch, 2.9 KB (added by hakre, 7 years ago)

Example only

  • wp-admin/includes/misc.php

    ### Eclipse Workspace Patch 1.0
    #P wordpress-trunk
     
    6565 * @return bool True on write success, false on failure.
    6666 */
    6767function insert_with_markers( $filename, $marker, $insertion ) {
    68         if (!file_exists( $filename ) || is_writeable( $filename ) ) {
    69                 if (!file_exists( $filename ) ) {
    70                         $markerdata = '';
    71                 } else {
    72                         $markerdata = explode( "\n", implode( '', file( $filename ) ) );
    73                 }
     68        $file_exists = file_exists( $filename );
    7469
    75                 if ( !$f = @fopen( $filename, 'w' ) )
     70        if (!$file_exists) {
     71                $r = @file_put_contents( $filename, '' );
     72                if ( false  === $r )
    7673                        return false;
     74                chmod( $filename, FS_CHMOD_FILE );
     75                $lines = array();
     76        } else {
     77                $lines = file( $filename, FILE_IGNORE_NEW_LINES );
     78        }
    7779
    78                 $foundit = false;
    79                 if ( $markerdata ) {
    80                         $state = true;
    81                         foreach ( $markerdata as $n => $markerline ) {
    82                                 if (strpos($markerline, '# BEGIN ' . $marker) !== false)
    83                                         $state = false;
    84                                 if ( $state ) {
    85                                         if ( $n + 1 < count( $markerdata ) )
    86                                                 fwrite( $f, "{$markerline}\n" );
    87                                         else
    88                                                 fwrite( $f, "{$markerline}" );
    89                                 }
    90                                 if (strpos($markerline, '# END ' . $marker) !== false) {
    91                                         fwrite( $f, "# BEGIN {$marker}\n" );
    92                                         if ( is_array( $insertion ))
    93                                                 foreach ( $insertion as $insertline )
    94                                                         fwrite( $f, "{$insertline}\n" );
    95                                         fwrite( $f, "# END {$marker}\n" );
    96                                         $state = true;
    97                                         $foundit = true;
    98                                 }
    99                         }
     80        if ( !is_writable($filename) )
     81                return false;
     82
     83        $marker_begin = "# BEGIN $marker";
     84        $marker_end = "# END $marker";
     85        $buffer = array();
     86        $foundit = array();
     87        $state = true;
     88        foreach ($lines as $line) {
     89                if ( false !== strpos( $line, $marker_begin ) )
     90                        $state = false;
     91                if ( $state )
     92                        $buffer[] = $line;
     93                if ( false !== strpos( $line, $marker_end ) ) {
     94                        $foundit[] = count( $buffer );
     95                        $buffer[] = ''; # placeholder
    10096                }
    101                 if (!$foundit) {
    102                         fwrite( $f, "\n# BEGIN {$marker}\n" );
    103                         foreach ( $insertion as $insertline )
    104                                 fwrite( $f, "{$insertline}\n" );
    105                         fwrite( $f, "# END {$marker}\n" );
    106                 }
    107                 fclose( $f );
    108                 return true;
     97        }
     98
     99        if ( 0 === count( $foundit ) ) {
     100                $foundit[] = count( $buffer );
     101                $buffer[] = ''; # placeholder
    109102        } else {
     103                // backwards compat: non array insertions are ignored if markers were found
     104                // @todo this should be streamlined
     105                if (!is_array($insertion))
     106                        $insertion = array();
     107        }
     108
     109        array_unshift($insertion, $marker_begin );
     110        $insertion[] = $marker_end;
     111        $insertion = implode( "\n", $insertion );
     112       
     113        foreach( $foundit as $index )
     114                $buffer[$index] = $insertion;
     115        $buffer = implode( "\n", $buffer);
     116
     117        if ( false === @file_put_contents( $filename, $buffer) )
    110118                return false;
    111         }
     119
     120        return true;
    112121}
    113122
    114123/**