Filesystem API: Add directory support to WP_Filesystem_Direct::move().

Introduces:
- New function: `wp_opcache_invalidate_directory()`, to recursively call `wp_opcache_invalidate()` after overwriting .php files.
- New function: `move_dir()`, similar to `copy_dir()` that uses `WP_Filesystem::move()` followed by `wp_opcache_invalidate_directory()`, and has a fallback to `copy_dir()`.

Props: costdev, afragen, peterwilsoncc, sergeybiryukov, ironprogrammer, flixos90, bronsonquick, mukesh27, azaozz.
Fixes #57375.

git-svn-id: https://develop.svn.wordpress.org/trunk@55204 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Andrew Ozz
2023-02-03 01:48:36 +00:00
parent 39bfc2580d
commit 5872edc052
4 changed files with 526 additions and 2 deletions

View File

@@ -316,7 +316,14 @@ class WP_Filesystem_Direct extends WP_Filesystem_Base {
}
/**
* Moves a file.
* Moves a file or directory.
*
* After moving files or directories, OPcache will need to be invalidated.
*
* If moving a directory fails, `copy_dir()` can be used for a recursive copy.
*
* Use `move_dir()` for moving directories with OPcache invalidation and a
* fallback to `copy_dir()`.
*
* @since 2.5.0
*
@@ -331,12 +338,18 @@ class WP_Filesystem_Direct extends WP_Filesystem_Base {
return false;
}
if ( $overwrite && $this->exists( $destination ) && ! $this->delete( $destination, true ) ) {
// Can't overwrite if the destination couldn't be deleted.
return false;
}
// Try using rename first. if that fails (for example, source is read only) try copy.
if ( @rename( $source, $destination ) ) {
return true;
}
if ( $this->copy( $source, $destination, $overwrite ) && $this->exists( $destination ) ) {
// Backward compatibility: Only fall back to `::copy()` for single files.
if ( $this->is_file( $source ) && $this->copy( $source, $destination, $overwrite ) && $this->exists( $destination ) ) {
$this->delete( $source );
return true;