From: scribu Date: Wed, 30 Oct 2013 12:06:26 +0000 (+0200) Subject: first copy all the files, then remove the temporary dir X-Git-Tag: v0.13.0~46^2 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=532bb25f29a713cfff6466b52bcf31f17a4800c1;p=wvm%2Fwvm.git first copy all the files, then remove the temporary dir --- diff --git a/php/commands/core.php b/php/commands/core.php index 97ebc1ec..d129ac67 100644 --- a/php/commands/core.php +++ b/php/commands/core.php @@ -87,36 +87,38 @@ class Core_Command extends WP_CLI_Command { $phar->extractTo( dirname( $tempdir ), null, true ); - self::_move_overwrite_files( $tempdir, $dest ); + self::_copy_overwrite_files( $tempdir, $dest ); - rmdir( dirname( $tempdir ) ); + self::_rmdir( dirname( $tempdir ) ); } - private static function _move_overwrite_files( $source, $dest ) { - $flags = FilesystemIterator::SKIP_DOTS - | FilesystemIterator::KEY_AS_PATHNAME - | FilesystemIterator::CURRENT_AS_FILEINFO; - - $dstOffset = strlen( $source ); + private static function _copy_overwrite_files( $source, $dest ) { + $iterator = new RecursiveIteratorIterator( + new RecursiveDirectoryIterator( $source, RecursiveDirectoryIterator::SKIP_DOTS ), + RecursiveIteratorIterator::SELF_FIRST); + + foreach ( $iterator as $item ) { + if ( $item->isDir() ) { + $dest_path = $dest . DIRECTORY_SEPARATOR . $iterator->getSubPathName(); + if ( !is_dir( $dest_path ) ) { + mkdir( $dest_path ); + } + } else { + copy( $item, $dest . DIRECTORY_SEPARATOR . $iterator->getSubPathName() ); + } + } + } - foreach( new RecursiveIteratorIterator ( - new RecursiveDirectoryIterator( $source, $flags ), + private static function _rmdir( $dir ) { + $files = new RecursiveIteratorIterator( + new RecursiveDirectoryIterator( $dir, RecursiveDirectoryIterator::SKIP_DOTS ), RecursiveIteratorIterator::CHILD_FIRST - ) as $src ) { - $dst = $dest . substr( $src, $dstOffset ); - $dstdir = dirname( $dst ); - if ( ! is_dir( $dstdir ) ) continue; - - if ( $src->isDir() && is_dir( $dst ) ) { - rmdir( $src ); - continue; - } + ); - // rename() is not reliable inside VMs: https://github.com/wp-cli/wp-cli/issues/853 - copy( $src, $dst ); - unlink( $src ); + foreach ( $files as $fileinfo ) { + $todo = $fileinfo->isDir() ? 'rmdir' : 'unlink'; + $todo( $fileinfo->getRealPath() ); } - rmdir( $source ); } private static function _request( $method, $url, $headers = array(), $options = array() ) {