WordPress.org

Make WordPress Core

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

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

THE CORRECT PATCH. the first one was an earlier, bad version i had

  • 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 = '';
    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                        $added_already = false;
     131
     132                        // start searching the lines for a possible matching insertion
     133                        while ( ( $line = array_shift( $markerdata ) ) !== null ) {
     134                                // if we have a marker that matches our new marker, then we found what was previously written,
     135                                // so stop adding to the output array, and start tracking lines for later comparison
     136                                if ( strpos( $line, '# BEGIN ' . $marker ) !== false )
    118137                                        $state = false;
     138
    119139                                if ( $state ) {
    120                                         if ( $n + 1 < count( $markerdata ) )
    121                                                 fwrite( $f, "{$markerline}\n" );
    122                                         else
    123                                                 fwrite( $f, "{$markerline}" );
     140                                        $output = $output . $line . "\n";
     141                                } else {
     142                                        $possible[] = $line;
    124143                                }
    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" );
     144
     145                                // if we are at the ending marker line, then we need to compare
     146                                if ( strpos( $line, '# END ' . $marker ) !== false ) {
     147                                        // clean up the possible list for comparison to the insertion
     148                                        $possible = array_values( array_filter( array_map( 'trim', $possible ) ) );
     149
     150                                        // if we found out block, then just quit with a success, becuase nothing needs to be done
     151                                        // otherwise, ignore this block, and keep searching in case there are multiple blocks
     152                                        // techinically this otherwise should not matter, but good to be safe
     153                                        if ( ! $added_already && $possible === $sane_insertion ) {
     154                                                return true;
     155                                        } else {
     156                                                $possible = array();
     157
     158                                                // prevent writing two of these blocks
     159                                                if ( ! $added_already ) {
     160                                                        $output = $output . implode( "\n", $insertion ) . "\n";
     161                                                        $added_already = true;
     162                                                }
     163                                        }
     164
    131165                                        $state = true;
    132                                         $foundit = true;
    133166                                }
    134167                        }
     168                } else {
     169                        $output = implode( "\n", $insertion );
    135170                }
    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                 }
     171
     172                $output = trim( $output );
     173                $out_len = strlen( $output );
     174
     175                // if we made it this far, then it is time for writing, so open the output file for writing
     176                if ( !$f = @fopen( $filename, 'w' ) )
     177                        return false;
     178
     179                // write the file
     180                if ( $out_len )
     181                        fwrite( $f, $output, $out_len );
     182
     183                // close the file
    142184                fclose( $f );
     185
    143186                return true;
    144187        } else {
    145188                return false;