diff --git a/src/Composer/Util/Filesystem.php b/src/Composer/Util/Filesystem.php index d8a39952a..494376126 100644 --- a/src/Composer/Util/Filesystem.php +++ b/src/Composer/Util/Filesystem.php @@ -130,7 +130,7 @@ class Filesystem $it = new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS); $ri = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::SELF_FIRST); - if ( !file_exists($target)) { + if (!file_exists($target)) { mkdir($target, 0777, true); } @@ -159,7 +159,12 @@ class Filesystem if (defined('PHP_WINDOWS_VERSION_BUILD')) { // Try to copy & delete - this is a workaround for random "Access denied" errors. $command = sprintf('xcopy %s %s /E /I /Q', escapeshellarg($source), escapeshellarg($target)); - if (0 === $this->processExecutor->execute($command, $output)) { + $result = $this->processExecutor->execute($command, $output); + + // clear stat cache because external processes aren't tracked by the php stat cache + clearstatcache(); + + if (0 === $result) { $this->remove($source); return; @@ -170,7 +175,12 @@ class Filesystem // We do not use PHP's "rename" function here since it does not support // the case where $source, and $target are located on different partitions. $command = sprintf('mv %s %s', escapeshellarg($source), escapeshellarg($target)); - if (0 === $this->processExecutor->execute($command)) { + $result = $this->processExecutor->execute($command, $output); + + // clear stat cache because external processes aren't tracked by the php stat cache + clearstatcache(); + + if (0 === $result) { return; } }