From b68bbc5ae117283cecd2e95983ec336443de8440 Mon Sep 17 00:00:00 2001 From: =?utf8?q?David=20Mudr=C3=A1k?= Date: Thu, 6 Dec 2012 02:31:36 +0100 Subject: [PATCH 1/1] MDL-36963 Improve mdeploy worker::move_directory() method The additional parameter allows to use this method without actual removing the root of the source location. That is, it is now possible to move the content of a folder only. Also, a small refactoring happened here as we will need a variant of this method that does not throw exception if the target already exists. --- mdeploy.php | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/mdeploy.php b/mdeploy.php index 8381a9099ec..9e986b0e0b4 100644 --- a/mdeploy.php +++ b/mdeploy.php @@ -1136,23 +1136,45 @@ class worker extends singleton_pattern { /** * Moves the given source into a new location recursively * + * The target location can not exist. + * * @param string $source full path to the existing directory * @param string $destination full path to the new location of the folder + * @param bool $keepsourceroot should the root of the $source be kept or removed at the end * @return bool */ - protected function move_directory($source, $target) { + protected function move_directory($source, $target, $keepsourceroot = false) { if (file_exists($target)) { throw new filesystem_exception('Unable to move the directory - target location already exists'); } + return $this->move_directory_into($source, $target, $keepsourceroot); + } + + /** + * Moves the given source into a new location recursively + * + * If the target already exists, files are moved into it. The target is created otherwise. + * + * @param string $source full path to the existing directory + * @param string $destination full path to the new location of the folder + * @param bool $keepsourceroot should the root of the $source be kept or removed at the end + * @return bool + */ + protected function move_directory_into($source, $target, $keepsourceroot = false) { + if (is_dir($source)) { $handle = opendir($source); } else { throw new filesystem_exception('Source location is not a directory'); } - mkdir($target, 02777); + if (is_dir($target)) { + $result = true; + } else { + $result = mkdir($target, 02777); + } while ($filename = readdir($handle)) { $sourcepath = $source.'/'.$filename; @@ -1163,15 +1185,22 @@ class worker extends singleton_pattern { } if (is_dir($sourcepath)) { - $this->move_directory($sourcepath, $targetpath); + $result = $result && $this->move_directory($sourcepath, $targetpath, false); } else { - rename($sourcepath, $targetpath); + $result = $result && rename($sourcepath, $targetpath); } } closedir($handle); - return rmdir($source); + + if (!$keepsourceroot) { + $result = $result && rmdir($source); + } + + clearstatcache(); + + return $result; } /** -- 2.43.0