From 16cfca6a5fb3db897246e6ac9ccb7420cf256240 Mon Sep 17 00:00:00 2001
From: Robin Appelman <icewind@owncloud.com>
Date: Thu, 16 Oct 2014 15:17:36 +0200
Subject: [PATCH] Better reuse of cache data for getFolderContents

---
 lib/private/files/view.php | 17 +++++++++++------
 tests/lib/files/view.php   |  5 +++--
 2 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/lib/private/files/view.php b/lib/private/files/view.php
index a9577b193c7..5f5f29ded4f 100644
--- a/lib/private/files/view.php
+++ b/lib/private/files/view.php
@@ -964,15 +964,20 @@ class View {
 			$cache = $storage->getCache($internalPath);
 			$user = \OC_User::getUser();
 
-			if ($cache->getStatus($internalPath) < Cache\Cache::COMPLETE) {
+			$data = $cache->get($internalPath);
+			$watcher = $storage->getWatcher($internalPath);
+			if (!$data or $data['size'] === -1) {
+				if (!$storage->file_exists($internalPath)) {
+					return array();
+				}
 				$scanner = $storage->getScanner($internalPath);
 				$scanner->scan($internalPath, Cache\Scanner::SCAN_SHALLOW);
-			} else {
-				$watcher = $storage->getWatcher($internalPath);
-				$watcher->checkUpdate($internalPath);
+				$data = $cache->get($internalPath);
+			} else if ($watcher->checkUpdate($internalPath, $data)) {
+				$data = $cache->get($internalPath);
 			}
 
-			$folderId = $cache->getId($internalPath);
+			$folderId = $data['fileid'];
 			/**
 			 * @var \OC\Files\FileInfo[] $files
 			 */
@@ -1034,7 +1039,7 @@ class View {
 									break;
 								}
 							}
-							$rootEntry['path'] = substr($path . '/' . $rootEntry['name'], strlen($user) + 2); // full path without /$user/
+							$rootEntry['path'] = substr(Filesystem::normalizePath($path . '/' . $rootEntry['name']), strlen($user) + 2); // full path without /$user/
 
 							// if sharing was disabled for the user we remove the share permissions
 							if (\OCP\Util::isSharingDisabledForUser()) {
diff --git a/tests/lib/files/view.php b/tests/lib/files/view.php
index 8d56ecd9003..5f030f29fa7 100644
--- a/tests/lib/files/view.php
+++ b/tests/lib/files/view.php
@@ -177,8 +177,9 @@ class View extends \PHPUnit_Framework_TestCase {
 
 	function testCacheIncompleteFolder() {
 		$storage1 = $this->getTestStorage(false);
-		\OC\Files\Filesystem::mount($storage1, array(), '/');
-		$rootView = new \OC\Files\View('');
+		\OC\Files\Filesystem::clearMounts();
+		\OC\Files\Filesystem::mount($storage1, array(), '/incomplete');
+		$rootView = new \OC\Files\View('/incomplete');
 
 		$entries = $rootView->getDirectoryContent('/');
 		$this->assertEquals(3, count($entries));
-- 
GitLab