summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/private/Files/Node/Folder.php14
-rw-r--r--lib/private/Files/Node/Node.php21
-rw-r--r--lib/private/Preview/ProviderV1Adapter.php2
-rw-r--r--tests/lib/Files/Node/FolderTest.php40
4 files changed, 60 insertions, 17 deletions
diff --git a/lib/private/Files/Node/Folder.php b/lib/private/Files/Node/Folder.php
index 42562c99bcb..81ca7e254d9 100644
--- a/lib/private/Files/Node/Folder.php
+++ b/lib/private/Files/Node/Folder.php
@@ -101,9 +101,9 @@ class Folder extends Node implements \OCP\Files\Folder {
return array_map(function (FileInfo $info) {
if ($info->getMimetype() === FileInfo::MIMETYPE_FOLDER) {
- return new Folder($this->root, $this->view, $info->getPath(), $info);
+ return new Folder($this->root, $this->view, $info->getPath(), $info, $this);
} else {
- return new File($this->root, $this->view, $info->getPath(), $info);
+ return new File($this->root, $this->view, $info->getPath(), $info, $this);
}
}, $folderContent);
}
@@ -119,10 +119,11 @@ class Folder extends Node implements \OCP\Files\Folder {
} else {
$isDir = $info->getType() === FileInfo::TYPE_FOLDER;
}
+ $parent = dirname($path) === $this->getPath() ? $this : null;
if ($isDir) {
- return new Folder($this->root, $this->view, $path, $info);
+ return new Folder($this->root, $this->view, $path, $info, $parent);
} else {
- return new File($this->root, $this->view, $path, $info);
+ return new File($this->root, $this->view, $path, $info, $parent);
}
}
@@ -163,7 +164,8 @@ class Folder extends Node implements \OCP\Files\Folder {
if (!$this->view->mkdir($fullPath)) {
throw new NotPermittedException('Could not create folder');
}
- $node = new Folder($this->root, $this->view, $fullPath);
+ $parent = dirname($fullPath) === $this->getPath() ? $this : null;
+ $node = new Folder($this->root, $this->view, $fullPath, null, $parent);
$this->sendHooks(['postWrite', 'postCreate'], [$node]);
return $node;
} else {
@@ -193,7 +195,7 @@ class Folder extends Node implements \OCP\Files\Folder {
if ($result === false) {
throw new NotPermittedException('Could not create path');
}
- $node = new File($this->root, $this->view, $fullPath);
+ $node = new File($this->root, $this->view, $fullPath, null, $this);
$this->sendHooks(['postWrite', 'postCreate'], [$node]);
return $node;
}
diff --git a/lib/private/Files/Node/Node.php b/lib/private/Files/Node/Node.php
index c8975154059..bfa4d6861ea 100644
--- a/lib/private/Files/Node/Node.php
+++ b/lib/private/Files/Node/Node.php
@@ -62,16 +62,22 @@ class Node implements \OCP\Files\Node {
protected $fileInfo;
/**
+ * @var Node|null
+ */
+ protected $parent;
+
+ /**
* @param \OC\Files\View $view
* @param \OCP\Files\IRootFolder $root
* @param string $path
* @param FileInfo $fileInfo
*/
- public function __construct($root, $view, $path, $fileInfo = null) {
+ public function __construct($root, $view, $path, $fileInfo = null, ?Node $parent = null) {
$this->view = $view;
$this->root = $root;
$this->path = $path;
$this->fileInfo = $fileInfo;
+ $this->parent = $parent;
}
/**
@@ -278,11 +284,16 @@ class Node implements \OCP\Files\Node {
* @return Node
*/
public function getParent() {
- $newPath = dirname($this->path);
- if ($newPath === '' || $newPath === '.' || $newPath === '/') {
- return $this->root;
+ if ($this->parent === null) {
+ $newPath = dirname($this->path);
+ if ($newPath === '' || $newPath === '.' || $newPath === '/') {
+ return $this->root;
+ }
+
+ $this->parent = $this->root->get($newPath);
}
- return $this->root->get($newPath);
+
+ return $this->parent;
}
/**
diff --git a/lib/private/Preview/ProviderV1Adapter.php b/lib/private/Preview/ProviderV1Adapter.php
index 22db380d30d..5e50db9d8da 100644
--- a/lib/private/Preview/ProviderV1Adapter.php
+++ b/lib/private/Preview/ProviderV1Adapter.php
@@ -55,7 +55,7 @@ class ProviderV1Adapter implements IProviderV2 {
}
private function getViewAndPath(File $file) {
- $view = new View($file->getParent()->getPath());
+ $view = new View(dirname($file->getPath()));
$path = $file->getName();
return [$view, $path];
diff --git a/tests/lib/Files/Node/FolderTest.php b/tests/lib/Files/Node/FolderTest.php
index 4cda92b6e83..ddf6c412dcd 100644
--- a/tests/lib/Files/Node/FolderTest.php
+++ b/tests/lib/Files/Node/FolderTest.php
@@ -14,6 +14,7 @@ use OC\Files\Config\CachedMountInfo;
use OC\Files\FileInfo;
use OC\Files\Mount\Manager;
use OC\Files\Mount\MountPoint;
+use OC\Files\Node\File;
use OC\Files\Node\Folder;
use OC\Files\Node\Node;
use OC\Files\Node\Root;
@@ -105,11 +106,13 @@ class FolderTest extends NodeTest {
->method('getUser')
->willReturn($this->user);
+ $node = new File($root, $view, '/bar/foo/asd');
$root->method('get')
- ->with('/bar/foo/asd');
+ ->with('/bar/foo/asd')
+ ->willReturn($node);
- $node = new Folder($root, $view, '/bar/foo');
- $node->get('asd');
+ $parentNode = new Folder($root, $view, '/bar/foo');
+ self::assertEquals($node, $parentNode->get('asd'));
}
public function testNodeExists() {
@@ -178,11 +181,38 @@ class FolderTest extends NodeTest {
->willReturn(true);
$node = new Folder($root, $view, '/bar/foo');
- $child = new Folder($root, $view, '/bar/foo/asd');
+ $child = new Folder($root, $view, '/bar/foo/asd', null, $node);
$result = $node->newFolder('asd');
$this->assertEquals($child, $result);
}
+ public function testNewFolderDeepParent() {
+ $manager = $this->createMock(Manager::class);
+ /**
+ * @var \OC\Files\View | \PHPUnit\Framework\MockObject\MockObject $view
+ */
+ $view = $this->createMock(View::class);
+ $root = $this->getMockBuilder(Root::class)
+ ->setConstructorArgs([$manager, $view, $this->user, $this->userMountCache, $this->logger, $this->userManager, $this->eventDispatcher])
+ ->getMock();
+ $root->expects($this->any())
+ ->method('getUser')
+ ->willReturn($this->user);
+
+ $view->method('getFileInfo')
+ ->with('/foobar')
+ ->willReturn($this->getFileInfo(['permissions' => \OCP\Constants::PERMISSION_ALL]));
+
+ $view->method('mkdir')
+ ->with('/foobar/asd/sdf')
+ ->willReturn(true);
+
+ $node = new Folder($root, $view, '/foobar');
+ $child = new Folder($root, $view, '/foobar/asd/sdf', null, null);
+ $result = $node->newFolder('asd/sdf');
+ $this->assertEquals($child, $result);
+ }
+
public function testNewFolderNotPermitted() {
$this->expectException(\OCP\Files\NotPermittedException::class);
@@ -228,7 +258,7 @@ class FolderTest extends NodeTest {
->willReturn(true);
$node = new Folder($root, $view, '/bar/foo');
- $child = new \OC\Files\Node\File($root, $view, '/bar/foo/asd');
+ $child = new \OC\Files\Node\File($root, $view, '/bar/foo/asd', null, $node);
$result = $node->newFile('asd');
$this->assertEquals($child, $result);
}