From 0ad2449fe8d7c6a0295626c285d55466847ecedb Mon Sep 17 00:00:00 2001 From: hakre Date: Mon, 28 Jul 2014 23:42:53 +0200 Subject: [PATCH] rmdir needs to be used on windows to remove symbolic links to directories --- src/Composer/Util/Filesystem.php | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/Composer/Util/Filesystem.php b/src/Composer/Util/Filesystem.php index 182004205..7cc463525 100644 --- a/src/Composer/Util/Filesystem.php +++ b/src/Composer/Util/Filesystem.php @@ -181,9 +181,9 @@ class Filesystem */ public function unlink($path) { - if (!@unlink($path)) { + if (!@$this->unlinkImplementation($path)) { // retry after a bit on windows since it tends to be touchy with mass removals - if (!defined('PHP_WINDOWS_VERSION_BUILD') || (usleep(350000) && !@unlink($path))) { + if (!defined('PHP_WINDOWS_VERSION_BUILD') || (usleep(350000) && !@$this->unlinkImplementation($path))) { $error = error_get_last(); $message = 'Could not delete '.$path.': ' . @$error['message']; if (defined('PHP_WINDOWS_VERSION_BUILD')) { @@ -473,4 +473,22 @@ class Filesystem { return new ProcessExecutor; } + + /** + * delete symbolic link implementation (commonly known as "unlink()") + * + * symbolic links on windows which link to directories need rmdir instead of unlink + * + * @param string $path + * + * @return bool + */ + private function unlinkImplementation($path) + { + if (defined('PHP_WINDOWS_VERSION_BUILD') && is_dir($path) && is_link($path)) { + return rmdir($path); + } + + return unlink($path); + } }