diff options
author | Thomas Müller <thomas.mueller@tmit.eu> | 2015-07-06 17:05:36 +0200 |
---|---|---|
committer | Thomas Müller <thomas.mueller@tmit.eu> | 2015-07-06 17:05:36 +0200 |
commit | 9120942bcfe474e758174ab52e4e35f62b477df4 (patch) | |
tree | 720216dde0e711408f17e7ec933ddc80bcd70d0d | |
parent | 14eef434fff78bf39a926b1f27220b9ad1ebb833 (diff) | |
parent | a0c089a1c9f72df782d2bde9c90eef7558746979 (diff) | |
download | nextcloud-server-9120942bcfe474e758174ab52e4e35f62b477df4.tar.gz nextcloud-server-9120942bcfe474e758174ab52e4e35f62b477df4.zip |
Merge pull request #16924 from owncloud/copy-recursive-polyfill
add recursive copy polyfill for storage backends
-rw-r--r-- | lib/private/files/storage/polyfill/copydirectory.php | 89 | ||||
-rw-r--r-- | tests/lib/files/storage/copydirectory.php | 46 |
2 files changed, 135 insertions, 0 deletions
diff --git a/lib/private/files/storage/polyfill/copydirectory.php b/lib/private/files/storage/polyfill/copydirectory.php new file mode 100644 index 00000000000..1b4873a3a76 --- /dev/null +++ b/lib/private/files/storage/polyfill/copydirectory.php @@ -0,0 +1,89 @@ +<?php +/** + * Copyright (c) 2015 Robin Appelman <icewind@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OC\Files\Storage\PolyFill; + +trait CopyDirectory { + /** + * Check if a path is a directory + * + * @param string $path + * @return bool + */ + abstract public function is_dir($path); + + /** + * Check if a file or folder exists + * + * @param string $path + * @return bool + */ + abstract public function file_exists($path); + + /** + * Delete a file or folder + * + * @param string $path + * @return bool + */ + abstract public function unlink($path); + + /** + * Open a directory handle for a folder + * + * @param string $path + * @return resource | bool + */ + abstract public function opendir($path); + + /** + * Create a new folder + * + * @param string $path + * @return bool + */ + abstract public function mkdir($path); + + public function copy($source, $target) { + if ($this->is_dir($source)) { + if ($this->file_exists($target)) { + $this->unlink($target); + } + $this->mkdir($target); + return $this->copyRecursive($source, $target); + } else { + return parent::copy($source, $target); + } + } + + /** + * For adapters that dont support copying folders natively + * + * @param $source + * @param $target + * @return bool + */ + protected function copyRecursive($source, $target) { + $dh = $this->opendir($source); + $result = true; + while ($file = readdir($dh)) { + if ($file !== '.' and $file !== '..') { + if ($this->is_dir($source . '/' . $file)) { + $this->mkdir($target . '/' . $file); + $result = $this->copyRecursive($source . '/' . $file, $target . '/' . $file); + } else { + $result = parent::copy($source . '/' . $file, $target . '/' . $file); + } + if (!$result) { + break; + } + } + } + return $result; + } +} diff --git a/tests/lib/files/storage/copydirectory.php b/tests/lib/files/storage/copydirectory.php new file mode 100644 index 00000000000..3338747f49b --- /dev/null +++ b/tests/lib/files/storage/copydirectory.php @@ -0,0 +1,46 @@ +<?php +/** + * @author Robin Appelman <icewind@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace Test\Files\Storage; + +use OC\Files\Storage\Temporary; + +class StorageNoRecursiveCopy extends Temporary { + public function copy($path1, $path2) { + if ($this->is_dir($path1)) { + return false; + } + return copy($this->getSourcePath($path1), $this->getSourcePath($path2)); + } +} + +class CopyDirectoryStorage extends StorageNoRecursiveCopy { + use \OC\Files\Storage\PolyFill\CopyDirectory; +} + +class CopyDirectory extends Storage { + + protected function setUp() { + parent::setUp(); + $this->instance = new CopyDirectoryStorage([]); + } +} + |