From 41e2d64c86fffc3e507a1ad0788bcb498db2c640 Mon Sep 17 00:00:00 2001
From: Michael Gapczynski <mtgap@owncloud.com>
Date: Sun, 19 May 2013 14:15:49 -0400
Subject: [PATCH] Add support for copying/moving folders between storages, move
 isIgnoredDir() to Filesystem

---
 lib/files/cache/scanner.php | 14 +-------------
 lib/files/filesystem.php    | 13 +++++++++++++
 lib/files/view.php          | 32 ++++++++++++++++++++++++--------
 3 files changed, 38 insertions(+), 21 deletions(-)

diff --git a/lib/files/cache/scanner.php b/lib/files/cache/scanner.php
index 661bc48633..0b1947f17c 100644
--- a/lib/files/cache/scanner.php
+++ b/lib/files/cache/scanner.php
@@ -115,7 +115,7 @@ class Scanner {
 			\OC_DB::beginTransaction();
 			while ($file = readdir($dh)) {
 				$child = ($path) ? $path . '/' . $file : $file;
-				if (!$this->isIgnoredDir($file)) {
+				if (!\OC\Files\Filesystem::isIgnoredDir($file)) {
 					$data = $this->scanFile($child, $recursive === self::SCAN_SHALLOW);
 					if ($data) {
 						if ($data['size'] === -1) {
@@ -149,18 +149,6 @@ class Scanner {
 		return $size;
 	}
 
-	/**
-	 * @brief check if the directory should be ignored when scanning
-	 * NOTE: the special directories . and .. would cause never ending recursion
-	 * @param String $dir
-	 * @return boolean
-	 */
-	private function isIgnoredDir($dir) {
-		if ($dir === '.' || $dir === '..') {
-			return true;
-		}
-		return false;
-	}
 	/**
 	 * @brief check if the file should be ignored when scanning
 	 * NOTE: files with a '.part' extension are ignored as well!
diff --git a/lib/files/filesystem.php b/lib/files/filesystem.php
index d60d430d77..99d87011df 100644
--- a/lib/files/filesystem.php
+++ b/lib/files/filesystem.php
@@ -453,6 +453,19 @@ class Filesystem {
 		return (in_array($filename, $blacklist));
 	}
 
+	/**
+	 * @brief check if the directory should be ignored when scanning
+	 * NOTE: the special directories . and .. would cause never ending recursion
+	 * @param String $dir
+	 * @return boolean
+	 */
+	static public function isIgnoredDir($dir) {
+		if ($dir === '.' || $dir === '..') {
+			return true;
+		}
+		return false;
+	}
+
 	/**
 	 * following functions are equivalent to their php builtin equivalents for arguments/return values.
 	 */
diff --git a/lib/files/view.php b/lib/files/view.php
index f35e1e3dc1..875a6c1a1f 100644
--- a/lib/files/view.php
+++ b/lib/files/view.php
@@ -372,11 +372,18 @@ class View {
 						$result = false;
 					}
 				} else {
-					$source = $this->fopen($path1 . $postFix1, 'r');
-					$target = $this->fopen($path2 . $postFix2, 'w');
-					list($count, $result) = \OC_Helper::streamCopy($source, $target);
-					list($storage1, $internalPath1) = Filesystem::resolvePath($absolutePath1 . $postFix1);
-					$storage1->unlink($internalPath1);
+					if ($this->is_dir($path1)) {
+						$result = $this->copy($path1, $path2);
+						if ($result === true) {
+							$result = $this->deleteAll($path1);
+						}
+					} else {
+						$source = $this->fopen($path1 . $postFix1, 'r');
+						$target = $this->fopen($path2 . $postFix2, 'w');
+						list($count, $result) = \OC_Helper::streamCopy($source, $target);
+						list($storage1, $internalPath1) = Filesystem::resolvePath($absolutePath1 . $postFix1);
+						$storage1->unlink($internalPath1);
+					}
 				}
 				if ($this->fakeRoot == Filesystem::getRoot() && !Cache\Scanner::isPartialFile($path1)) {
 					\OC_Hook::emit(
@@ -459,9 +466,18 @@ class View {
 						$result = false;
 					}
 				} else {
-					$source = $this->fopen($path1 . $postFix1, 'r');
-					$target = $this->fopen($path2 . $postFix2, 'w');
-					list($count, $result) = \OC_Helper::streamCopy($source, $target);
+					if ($this->is_dir($path1) && ($dh = $this->opendir($path1))) {
+						$this->mkdir($path2);
+						while ($file = readdir($dh)) {
+							if (!Filesystem::isIgnoredDir($file)) {
+								$result = $this->copy($path1 . '/' . $file, $path2 . '/' . $file);
+							}
+						}
+					} else {
+						$source = $this->fopen($path1 . $postFix1, 'r');
+						$target = $this->fopen($path2 . $postFix2, 'w');
+						list($count, $result) = \OC_Helper::streamCopy($source, $target);
+					}
 				}
 				if ($this->fakeRoot == Filesystem::getRoot()) {
 					\OC_Hook::emit(
-- 
GitLab