Skip to content

Commit

Permalink
MDL-36963 Improve mdeploy worker::move_directory() method
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
mudrd8mz authored and danpoltawski committed Dec 6, 2012
1 parent ee22329 commit b68bbc5
Showing 1 changed file with 34 additions and 5 deletions.
39 changes: 34 additions & 5 deletions mdeploy.php
Original file line number Diff line number Diff line change
Expand Up @@ -1136,23 +1136,45 @@ protected function move_directory_target_precheck($target) {
/**
* 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;
Expand All @@ -1163,15 +1185,22 @@ protected function move_directory($source, $target) {
}

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;
}

/**
Expand Down

0 comments on commit b68bbc5

Please sign in to comment.