$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() ) {