@@ -541,6 +541,10 @@ public function mirror($originDir, $targetDir, \Traversable $iterator = null, $o
541541 $ originDir = rtrim ($ originDir , '/ \\' );
542542 $ originDirLen = \strlen ($ originDir );
543543
544+ if (!$ this ->exists ($ originDir )) {
545+ throw new IOException (sprintf ('The origin directory specified "%s" was not found. ' , $ originDir ), 0 , null , $ originDir );
546+ }
547+
544548 // Iterate in destination folder to remove obsolete entries
545549 if ($ this ->exists ($ targetDir ) && isset ($ options ['delete ' ]) && $ options ['delete ' ]) {
546550 $ deleteIterator = $ iterator ;
@@ -564,39 +568,24 @@ public function mirror($originDir, $targetDir, \Traversable $iterator = null, $o
564568 $ iterator = new \RecursiveIteratorIterator (new \RecursiveDirectoryIterator ($ originDir , $ flags ), \RecursiveIteratorIterator::SELF_FIRST );
565569 }
566570
567- if ($ this ->exists ($ originDir )) {
568- $ this ->mkdir ($ targetDir );
569- }
571+ $ this ->mkdir ($ targetDir );
572+ $ targetDirInfo = new \SplFileInfo ($ targetDir );
570573
571574 foreach ($ iterator as $ file ) {
572- if ($ file ->getPathName () === $ targetDir ) {
575+ if ($ file ->getPathName () === $ targetDir || $ file -> getRealPath () === $ targetDir || 0 === strpos ( $ file -> getRealPath (), $ targetDirInfo -> getRealPath ()) ) {
573576 continue ;
574577 }
575578
576- if (false === strpos ($ file ->getPath (), $ originDir )) {
577- throw new IOException (sprintf ('Unable to mirror "%s" directory. If the origin directory is relative, try using "realpath" before calling the mirror method. ' , $ originDir ), 0 , null , $ originDir );
578- }
579-
580579 $ target = $ targetDir .substr ($ file ->getPathname (), $ originDirLen );
581580
582- if ($ copyOnWindows ) {
583- if (is_file ($ file )) {
584- $ this ->copy ($ file , $ target , isset ($ options ['override ' ]) ? $ options ['override ' ] : false );
585- } elseif (is_dir ($ file )) {
586- $ this ->mkdir ($ target );
587- } else {
588- throw new IOException (sprintf ('Unable to guess "%s" file type. ' , $ file ), 0 , null , $ file );
589- }
581+ if (!$ copyOnWindows && is_link ($ file )) {
582+ $ this ->symlink ($ file ->getLinkTarget (), $ target );
583+ } elseif (is_dir ($ file )) {
584+ $ this ->mkdir ($ target );
585+ } elseif (is_file ($ file )) {
586+ $ this ->copy ($ file , $ target , isset ($ options ['override ' ]) ? $ options ['override ' ] : false );
590587 } else {
591- if (is_link ($ file )) {
592- $ this ->symlink ($ file ->getLinkTarget (), $ target );
593- } elseif (is_dir ($ file )) {
594- $ this ->mkdir ($ target );
595- } elseif (is_file ($ file )) {
596- $ this ->copy ($ file , $ target , isset ($ options ['override ' ]) ? $ options ['override ' ] : false );
597- } else {
598- throw new IOException (sprintf ('Unable to guess "%s" file type. ' , $ file ), 0 , null , $ file );
599- }
588+ throw new IOException (sprintf ('Unable to guess "%s" file type. ' , $ file ), 0 , null , $ file );
600589 }
601590 }
602591 }
0 commit comments