@@ -536,6 +536,10 @@ public function mirror($originDir, $targetDir, \Traversable $iterator = null, $o
536536 $ originDir = rtrim ($ originDir , '/ \\' );
537537 $ originDirLen = \strlen ($ originDir );
538538
539+ if (!$ this ->exists ($ originDir )) {
540+ throw new IOException (sprintf ('The origin directory specified "%s" was not found. ' , $ originDir ), 0 , null , $ originDir );
541+ }
542+
539543 // Iterate in destination folder to remove obsolete entries
540544 if ($ this ->exists ($ targetDir ) && isset ($ options ['delete ' ]) && $ options ['delete ' ]) {
541545 $ deleteIterator = $ iterator ;
@@ -562,35 +566,25 @@ public function mirror($originDir, $targetDir, \Traversable $iterator = null, $o
562566 $ iterator = new \RecursiveIteratorIterator (new \RecursiveDirectoryIterator ($ originDir , $ flags ), \RecursiveIteratorIterator::SELF_FIRST );
563567 }
564568
565- if ( $ this ->exists ( $ originDir )) {
566- $ this -> mkdir ($ targetDir );
567- }
569+ $ this ->mkdir ( $ targetDir );
570+ $ targetDirInfo = new \ SplFileInfo ($ targetDir );
571+ $ regex = sprintf ( ' /^%s.*/ ' , str_replace ( ' / ' , ' \/ ' , $ targetDirInfo -> getRealPath () ? $ targetDirInfo -> getRealPath () : $ targetDir ));
568572
569573 foreach ($ iterator as $ file ) {
570- if ($ file ->getPathName () === $ targetDir ) {
574+ if ($ file ->getPathName () === $ targetDir || $ file -> getRealPath () === $ targetDirInfo -> getRealPath () || preg_match ( $ regex , $ file -> getRealPath ()) ) {
571575 continue ;
572576 }
573577
574578 $ target = $ targetDir .substr ($ file ->getPathname (), $ originDirLen );
575579
576- if ($ copyOnWindows ) {
577- if (is_file ($ file )) {
578- $ this ->copy ($ file , $ target , isset ($ options ['override ' ]) ? $ options ['override ' ] : false );
579- } elseif (is_dir ($ file )) {
580- $ this ->mkdir ($ target );
581- } else {
582- throw new IOException (sprintf ('Unable to guess "%s" file type. ' , $ file ), 0 , null , $ file );
583- }
580+ if (!$ copyOnWindows && is_link ($ file )) {
581+ $ this ->symlink ($ file ->getLinkTarget (), $ target );
582+ } elseif (is_dir ($ file )) {
583+ $ this ->mkdir ($ target );
584+ } elseif (is_file ($ file )) {
585+ $ this ->copy ($ file , $ target , isset ($ options ['override ' ]) ? $ options ['override ' ] : false );
584586 } else {
585- if (is_link ($ file )) {
586- $ this ->symlink ($ file ->getLinkTarget (), $ target );
587- } elseif (is_dir ($ file )) {
588- $ this ->mkdir ($ target );
589- } elseif (is_file ($ file )) {
590- $ this ->copy ($ file , $ target , isset ($ options ['override ' ]) ? $ options ['override ' ] : false );
591- } else {
592- throw new IOException (sprintf ('Unable to guess "%s" file type. ' , $ file ), 0 , null , $ file );
593- }
587+ throw new IOException (sprintf ('Unable to guess "%s" file type. ' , $ file ), 0 , null , $ file );
594588 }
595589 }
596590 }
0 commit comments