WordPress.org

Make WordPress Core

Ticket #11903: 11903.wp-admin.includes.misc.php.diff

File 11903.wp-admin.includes.misc.php.diff, 3.9 KB (added by loushou, 7 years ago)

patch for the mod_rewrite config to only write the file when needed

  • wp-admin/includes/misc.php

     
    100100 * @return bool True on write success, false on failure.
    101101 */
    102102function insert_with_markers( $filename, $marker, $insertion ) {
    103         if (!file_exists( $filename ) || is_writeable( $filename ) ) {
    104                 if (!file_exists( $filename ) ) {
     103        // if we can write to the speified file
     104        if ( ! file_exists( $filename ) || is_writeable( $filename ) ) {
     105                // go ahead and add the markers to the insertion
     106                $insertion = array_merge( array( '# BEGIN ' . $marker ), $insertion, array( '# END ' . $marker ) );
     107
     108                // load any existing file into an array for parsing below
     109                if ( ! file_exists( $filename ) ) {
    105110                        $markerdata = '';
    106111                } else {
    107                         $markerdata = explode( "\n", implode( '', file( $filename ) ) );
     112                        $markerdata = implode( '', file( $filename ) );
     113                        // handle empty file
     114                        $markerdata = $markerdata ? explode( "\n", $markerdata ) : '';
    108115                }
    109116
    110                 if ( !$f = @fopen( $filename, 'w' ) )
    111                         return false;
     117                $output = array();
    112118
    113                 $foundit = false;
     119                // if we actually have an existing file with lines in it, search the file for our insertion
     120                // otherwise, just add the insertion as the ony thing to write
    114121                if ( $markerdata ) {
     122                        // cleanup the output for better match testing; array_values() used here for array comparison below
     123                        $sane_insertion = array_values( array_filter( array_map( 'trim', $insertion ) ) );
     124
     125                        // track all lines in a possibly matching block
     126                        $possible = array();
     127
     128                        // track whether we are currently adding to our output array or not
    115129                        $state = true;
    116                         foreach ( $markerdata as $n => $markerline ) {
    117                                 if (strpos($markerline, '# BEGIN ' . $marker) !== false)
     130
     131                        // start searching the lines for a possible matching insertion
     132                        while ( ( $line = array_shift( $markerdata ) ) !== null ) {
     133                                // if we have a marker that matches our new marker, then we found what was previously written,
     134                                // so stop adding to the output array, and start tracking lines for later comparison
     135                                if ( strpos( $line, '# BEGIN ' . $marker ) !== false )
    118136                                        $state = false;
     137
    119138                                if ( $state ) {
    120                                         if ( $n + 1 < count( $markerdata ) )
    121                                                 fwrite( $f, "{$markerline}\n" );
    122                                         else
    123                                                 fwrite( $f, "{$markerline}" );
     139                                        $ouptut[] = $line;
     140                                } else {
     141                                        $possible[] = $line;
    124142                                }
    125                                 if (strpos($markerline, '# END ' . $marker) !== false) {
    126                                         fwrite( $f, "# BEGIN {$marker}\n" );
    127                                         if ( is_array( $insertion ))
    128                                                 foreach ( $insertion as $insertline )
    129                                                         fwrite( $f, "{$insertline}\n" );
    130                                         fwrite( $f, "# END {$marker}\n" );
    131                                         $state = true;
    132                                         $foundit = true;
     143
     144                                // if we are at the ending marker line, then we need to compare
     145                                if ( strpos( $line, '# END ' . $marker ) !== false ) {
     146                                        // clean up the possible list for comparison to the insertion
     147                                        $possible = array_values( array_filter( array_map( 'trim', $possible ) ) );
     148
     149                                        // if we found out block, then just quit with a success, becuase nothing needs to be done
     150                                        // otherwise, ignore this block, and keep searching in case there are multiple blocks
     151                                        // techinically this otherwise should not matter, but good to be safe
     152                                        if ( $possible === $sane_insertion ) {
     153                                                return true;
     154                                        } else {
     155                                                $possible = array();
     156                                        }
    133157                                }
    134158                        }
     159                } else {
     160                        $output = $insertion;
    135161                }
    136                 if (!$foundit) {
    137                         fwrite( $f, "\n# BEGIN {$marker}\n" );
    138                         foreach ( $insertion as $insertline )
    139                                 fwrite( $f, "{$insertline}\n" );
    140                         fwrite( $f, "# END {$marker}\n" );
    141                 }
     162
     163                // if we made it this far, then it is time for writing, so open the output file for writing
     164                if ( !$f = @fopen( $filename, 'w' ) )
     165                        return false;
     166
     167                // write the file
     168                foreach ( $output as $insertline )
     169                        fwrite( $f, "{$insertline}\n" );
     170
     171                // close the file
    142172                fclose( $f );
     173
    143174                return true;
    144175        } else {
    145176                return false;