<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[54143] trunk/src/wp-admin/includes/update-core.php: Upgrade/Install: Remove `_copy_dir()` function as originally intended.</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { white-space: pre-line; overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="https://core.trac.wordpress.org/changeset/54143">54143</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"https://core.trac.wordpress.org/changeset/54143","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>SergeyBiryukov</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2022-09-13 16:56:00 +0000 (Tue, 13 Sep 2022)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>Upgrade/Install: Remove `_copy_dir()` function as originally intended.

WordPress 3.2 introduced several enhancements to the `copy_dir()` function:
* No more re-installing Akismet upon upgrade.
* Respect custom `WP_CONTENT_DIR` for bundled plugins/theme installation.
* Respect custom `WP_CONTENT_DIR`/`WP_LANG_DIR` for language files when upgrading.
* Add an exclusion list to `copy_dir()` as well as `WP_Filesystem_Base::wp_lang_dir()`.
* Standardize `WP_Filesystem` path method returns.

However, the version of `copy_dir()` that runs during the upgrade process is the one from the older install, not the newer, which means that these enhancements would only be available after upgrading to WordPress 3.2 first, e.g. in a subsequent upgrade to WordPress 3.3.

In order to make these enhancements immediately available in WordPress 3.2, specifically to take advantage of skip lists and avoid re-installing Akismet if it was previously deleted, a temporary copy of the function was utilized, with the intention to remove it in WordPress 3.3 or a later release.

With further enhancements made to the Upgrade API to support partial and no-content builds, this temporary copy is no longer relevant and can be safely removed.

Follow-up to <a href="https://core.trac.wordpress.org/changeset/17576">[17576]</a>, <a href="https://core.trac.wordpress.org/changeset/17580">[17580]</a>, <a href="https://core.trac.wordpress.org/changeset/17581">[17581]</a>, <a href="https://core.trac.wordpress.org/changeset/18225">[18225]</a>.

Props afragen, costdev, dd32, peterwilsoncc, SergeyBiryukov.
Fixes <a href="https://core.trac.wordpress.org/ticket/55712">#55712</a>. See <a href="https://core.trac.wordpress.org/ticket/17173">#17173</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcwpadminincludesupdatecorephp">trunk/src/wp-admin/includes/update-core.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcwpadminincludesupdatecorephp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/includes/update-core.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/includes/update-core.php       2022-09-13 15:56:28 UTC (rev 54142)
+++ trunk/src/wp-admin/includes/update-core.php 2022-09-13 16:56:00 UTC (rev 54143)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1188,7 +1188,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">        apply_filters( 'update_feedback', __( 'Copying the required files&#8230;' ) );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        // Copy new versions of WP files into place.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $result = _copy_dir( $from . $distro, $to, $skip );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $result = copy_dir( $from . $distro, $to, $skip );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        if ( is_wp_error( $result ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $result = new WP_Error(
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1266,7 +1266,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                if ( $available_space && $total_size >= $available_space ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        $result = new WP_Error( 'disk_full', __( 'There is not enough free disk space to complete the update.' ) );
</span><span class="cx" style="display: block; padding: 0 10px">                } else {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        $result = _copy_dir( $from . $distro, $to, $skip );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 $result = copy_dir( $from . $distro, $to, $skip );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        if ( is_wp_error( $result ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                $result = new WP_Error(
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1460,95 +1460,6 @@
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> /**
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">- * Copies a directory from one location to another via the WordPress Filesystem Abstraction.
- *
- * Assumes that WP_Filesystem() has already been called and setup.
- *
- * This is a standalone copy of the `copy_dir()` function that is used to
- * upgrade the core files. It is placed here so that the version of this
- * function from the *new* WordPress version will be called.
- *
- * It was initially added for the 3.1 -> 3.2 upgrade.
- *
- * @ignore
- * @since 3.2.0
- * @since 3.7.0 Updated not to use a regular expression for the skip list.
- *
- * @see copy_dir()
- * @link https://core.trac.wordpress.org/ticket/17173
- *
- * @global WP_Filesystem_Base $wp_filesystem
- *
- * @param string   $from      Source directory.
- * @param string   $to        Destination directory.
- * @param string[] $skip_list Array of files/folders to skip copying.
- * @return true|WP_Error True on success, WP_Error on failure.
- */
-function _copy_dir( $from, $to, $skip_list = array() ) {
-       global $wp_filesystem;
-
-       $dirlist = $wp_filesystem->dirlist( $from );
-
-       if ( false === $dirlist ) {
-               return new WP_Error( 'dirlist_failed__copy_dir', __( 'Directory listing failed.' ), basename( $to ) );
-       }
-
-       $from = trailingslashit( $from );
-       $to   = trailingslashit( $to );
-
-       foreach ( (array) $dirlist as $filename => $fileinfo ) {
-               if ( in_array( $filename, $skip_list, true ) ) {
-                       continue;
-               }
-
-               if ( 'f' === $fileinfo['type'] ) {
-                       if ( ! $wp_filesystem->copy( $from . $filename, $to . $filename, true, FS_CHMOD_FILE ) ) {
-                               // If copy failed, chmod file to 0644 and try again.
-                               $wp_filesystem->chmod( $to . $filename, FS_CHMOD_FILE );
-
-                               if ( ! $wp_filesystem->copy( $from . $filename, $to . $filename, true, FS_CHMOD_FILE ) ) {
-                                       return new WP_Error( 'copy_failed__copy_dir', __( 'Could not copy file.' ), $to . $filename );
-                               }
-                       }
-
-                       /*
-                        * `wp_opcache_invalidate()` only exists in WordPress 5.5 or later,
-                        * so don't run it when upgrading from older versions.
-                        */
-                       if ( function_exists( 'wp_opcache_invalidate' ) ) {
-                               wp_opcache_invalidate( $to . $filename );
-                       }
-               } elseif ( 'd' === $fileinfo['type'] ) {
-                       if ( ! $wp_filesystem->is_dir( $to . $filename ) ) {
-                               if ( ! $wp_filesystem->mkdir( $to . $filename, FS_CHMOD_DIR ) ) {
-                                       return new WP_Error( 'mkdir_failed__copy_dir', __( 'Could not create directory.' ), $to . $filename );
-                               }
-                       }
-
-                       /*
-                        * Generate the $sub_skip_list for the subdirectory as a sub-set
-                        * of the existing $skip_list.
-                        */
-                       $sub_skip_list = array();
-
-                       foreach ( $skip_list as $skip_item ) {
-                               if ( 0 === strpos( $skip_item, $filename . '/' ) ) {
-                                       $sub_skip_list[] = preg_replace( '!^' . preg_quote( $filename, '!' ) . '/!i', '', $skip_item );
-                               }
-                       }
-
-                       $result = _copy_dir( $from . $filename, $to . $filename, $sub_skip_list );
-
-                       if ( is_wp_error( $result ) ) {
-                               return $result;
-                       }
-               }
-       }
-
-       return true;
-}
-
-/**
</del><span class="cx" style="display: block; padding: 0 10px">  * Redirect to the About WordPress page after a successful upgrade.
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * This function is only needed when the existing installation is older than 3.4.0.
</span></span></pre>
</div>
</div>

</body>
</html>