aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorJulius Härtl <jus@bitgrid.net>2023-02-10 09:09:08 +0100
committerGitHub <noreply@github.com>2023-02-10 09:09:08 +0100
commitd9cd8b1d37375ad567b4d15828e4d84b9cf58526 (patch)
tree8e4ff41064f8d04cdb6e887d277466eee13b23fe /lib
parent524db1c6dcc9eab8827f465375fc22854d7fee54 (diff)
parent5bcf37b7ffacba181212956eac85910f095adf07 (diff)
downloadnextcloud-server-d9cd8b1d37375ad567b4d15828e4d84b9cf58526.tar.gz
nextcloud-server-d9cd8b1d37375ad567b4d15828e4d84b9cf58526.zip
Merge pull request #36610 from nextcloud/folder-lazy-submounts
Diffstat (limited to 'lib')
-rw-r--r--lib/private/Files/Node/File.php2
-rw-r--r--lib/private/Files/Node/Folder.php8
-rw-r--r--lib/private/Files/Node/Node.php56
-rw-r--r--lib/private/Files/Node/Root.php4
-rw-r--r--lib/private/Files/View.php17
5 files changed, 50 insertions, 37 deletions
diff --git a/lib/private/Files/Node/File.php b/lib/private/Files/Node/File.php
index d8a6741dc6e..475930b361a 100644
--- a/lib/private/Files/Node/File.php
+++ b/lib/private/Files/Node/File.php
@@ -37,7 +37,7 @@ class File extends Node implements \OCP\Files\File {
* Creates a Folder that represents a non-existing path
*
* @param string $path path
- * @return string non-existing node class
+ * @return NonExistingFile non-existing node
*/
protected function createNonExistingNode($path) {
return new NonExistingFile($this->root, $this->view, $path);
diff --git a/lib/private/Files/Node/Folder.php b/lib/private/Files/Node/Folder.php
index bf9ae3c148d..90aed642a2d 100644
--- a/lib/private/Files/Node/Folder.php
+++ b/lib/private/Files/Node/Folder.php
@@ -54,7 +54,7 @@ class Folder extends Node implements \OCP\Files\Folder {
* Creates a Folder that represents a non-existing path
*
* @param string $path path
- * @return string non-existing node class
+ * @return NonExistingFolder non-existing node
*/
protected function createNonExistingNode($path) {
return new NonExistingFolder($this->root, $this->view, $path);
@@ -98,7 +98,7 @@ class Folder extends Node implements \OCP\Files\Folder {
* @throws \OCP\Files\NotFoundException
*/
public function getDirectoryListing() {
- $folderContent = $this->view->getDirectoryContent($this->path, '', $this->getFileInfo());
+ $folderContent = $this->view->getDirectoryContent($this->path, '', $this->getFileInfo(false));
return array_map(function (FileInfo $info) {
if ($info->getMimetype() === FileInfo::MIMETYPE_FOLDER) {
@@ -114,7 +114,7 @@ class Folder extends Node implements \OCP\Files\Folder {
* @param FileInfo $info
* @return File|Folder
*/
- protected function createNode($path, FileInfo $info = null) {
+ protected function createNode($path, FileInfo $info = null, bool $infoHasSubMountsIncluded = true) {
if (is_null($info)) {
$isDir = $this->view->is_dir($path);
} else {
@@ -122,7 +122,7 @@ class Folder extends Node implements \OCP\Files\Folder {
}
$parent = dirname($path) === $this->getPath() ? $this : null;
if ($isDir) {
- return new Folder($this->root, $this->view, $path, $info, $parent);
+ return new Folder($this->root, $this->view, $path, $info, $parent, $infoHasSubMountsIncluded);
} else {
return new File($this->root, $this->view, $path, $info, $parent);
}
diff --git a/lib/private/Files/Node/Node.php b/lib/private/Files/Node/Node.php
index 6c4e0b0f908..2f88cc3a15a 100644
--- a/lib/private/Files/Node/Node.php
+++ b/lib/private/Files/Node/Node.php
@@ -56,35 +56,35 @@ class Node implements \OCP\Files\Node {
*/
protected $path;
- /**
- * @var \OCP\Files\FileInfo
- */
- protected $fileInfo;
+ protected ?FileInfo $fileInfo;
/**
* @var Node|null
*/
protected $parent;
+ private bool $infoHasSubMountsIncluded;
+
/**
* @param \OC\Files\View $view
* @param \OCP\Files\IRootFolder $root
* @param string $path
* @param FileInfo $fileInfo
*/
- public function __construct($root, $view, $path, $fileInfo = null, ?Node $parent = null) {
+ public function __construct($root, $view, $path, $fileInfo = null, ?Node $parent = null, bool $infoHasSubMountsIncluded = true) {
$this->view = $view;
$this->root = $root;
$this->path = $path;
$this->fileInfo = $fileInfo;
$this->parent = $parent;
+ $this->infoHasSubMountsIncluded = $infoHasSubMountsIncluded;
}
/**
* Creates a Node of the same type that represents a non-existing path
*
* @param string $path path
- * @return string non-existing node class
+ * @return Node non-existing node
* @throws \Exception
*/
protected function createNonExistingNode($path) {
@@ -98,17 +98,23 @@ class Node implements \OCP\Files\Node {
* @throws InvalidPathException
* @throws NotFoundException
*/
- public function getFileInfo() {
+ public function getFileInfo(bool $includeMountPoint = true) {
if (!$this->fileInfo) {
if (!Filesystem::isValidPath($this->path)) {
throw new InvalidPathException();
}
- $fileInfo = $this->view->getFileInfo($this->path);
+ $fileInfo = $this->view->getFileInfo($this->path, $includeMountPoint);
+ $this->infoHasSubMountsIncluded = $includeMountPoint;
if ($fileInfo instanceof FileInfo) {
$this->fileInfo = $fileInfo;
} else {
throw new NotFoundException();
}
+ } elseif ($includeMountPoint && !$this->infoHasSubMountsIncluded && $this instanceof Folder) {
+ if ($this->fileInfo instanceof \OC\Files\FileInfo) {
+ $this->view->addSubMounts($this->fileInfo);
+ }
+ $this->infoHasSubMountsIncluded = true;
}
return $this->fileInfo;
}
@@ -179,7 +185,7 @@ class Node implements \OCP\Files\Node {
* @return string
*/
public function getInternalPath() {
- return $this->getFileInfo()->getInternalPath();
+ return $this->getFileInfo(false)->getInternalPath();
}
/**
@@ -188,7 +194,7 @@ class Node implements \OCP\Files\Node {
* @throws NotFoundException
*/
public function getId() {
- return $this->getFileInfo()->getId();
+ return $this->getFileInfo(false)->getId() ?? -1;
}
/**
@@ -232,7 +238,7 @@ class Node implements \OCP\Files\Node {
* @throws NotFoundException
*/
public function getPermissions() {
- return $this->getFileInfo()->getPermissions();
+ return $this->getFileInfo(false)->getPermissions();
}
/**
@@ -241,7 +247,7 @@ class Node implements \OCP\Files\Node {
* @throws NotFoundException
*/
public function isReadable() {
- return $this->getFileInfo()->isReadable();
+ return $this->getFileInfo(false)->isReadable();
}
/**
@@ -250,7 +256,7 @@ class Node implements \OCP\Files\Node {
* @throws NotFoundException
*/
public function isUpdateable() {
- return $this->getFileInfo()->isUpdateable();
+ return $this->getFileInfo(false)->isUpdateable();
}
/**
@@ -259,7 +265,7 @@ class Node implements \OCP\Files\Node {
* @throws NotFoundException
*/
public function isDeletable() {
- return $this->getFileInfo()->isDeletable();
+ return $this->getFileInfo(false)->isDeletable();
}
/**
@@ -268,7 +274,7 @@ class Node implements \OCP\Files\Node {
* @throws NotFoundException
*/
public function isShareable() {
- return $this->getFileInfo()->isShareable();
+ return $this->getFileInfo(false)->isShareable();
}
/**
@@ -277,7 +283,7 @@ class Node implements \OCP\Files\Node {
* @throws NotFoundException
*/
public function isCreatable() {
- return $this->getFileInfo()->isCreatable();
+ return $this->getFileInfo(false)->isCreatable();
}
/**
@@ -328,42 +334,42 @@ class Node implements \OCP\Files\Node {
}
public function isMounted() {
- return $this->getFileInfo()->isMounted();
+ return $this->getFileInfo(false)->isMounted();
}
public function isShared() {
- return $this->getFileInfo()->isShared();
+ return $this->getFileInfo(false)->isShared();
}
public function getMimeType() {
- return $this->getFileInfo()->getMimetype();
+ return $this->getFileInfo(false)->getMimetype();
}
public function getMimePart() {
- return $this->getFileInfo()->getMimePart();
+ return $this->getFileInfo(false)->getMimePart();
}
public function getType() {
- return $this->getFileInfo()->getType();
+ return $this->getFileInfo(false)->getType();
}
public function isEncrypted() {
- return $this->getFileInfo()->isEncrypted();
+ return $this->getFileInfo(false)->isEncrypted();
}
public function getMountPoint() {
- return $this->getFileInfo()->getMountPoint();
+ return $this->getFileInfo(false)->getMountPoint();
}
public function getOwner() {
- return $this->getFileInfo()->getOwner();
+ return $this->getFileInfo(false)->getOwner();
}
public function getChecksum() {
}
public function getExtension(): string {
- return $this->getFileInfo()->getExtension();
+ return $this->getFileInfo(false)->getExtension();
}
/**
diff --git a/lib/private/Files/Node/Root.php b/lib/private/Files/Node/Root.php
index 8d0a65d2a68..29cdbb987c3 100644
--- a/lib/private/Files/Node/Root.php
+++ b/lib/private/Files/Node/Root.php
@@ -202,9 +202,9 @@ class Root extends Folder implements IRootFolder {
$path = $this->normalizePath($path);
if ($this->isValidPath($path)) {
$fullPath = $this->getFullPath($path);
- $fileInfo = $this->view->getFileInfo($fullPath);
+ $fileInfo = $this->view->getFileInfo($fullPath, false);
if ($fileInfo) {
- return $this->createNode($fullPath, $fileInfo);
+ return $this->createNode($fullPath, $fileInfo, false);
} else {
throw new NotFoundException($path);
}
diff --git a/lib/private/Files/View.php b/lib/private/Files/View.php
index f79a992c773..456f804ee56 100644
--- a/lib/private/Files/View.php
+++ b/lib/private/Files/View.php
@@ -1412,11 +1412,7 @@ class View {
if ($includeMountPoints and $data['mimetype'] === 'httpd/unix-directory') {
//add the sizes of other mount points to the folder
$extOnly = ($includeMountPoints === 'ext');
- $mounts = Filesystem::getMountManager()->findIn($path);
- $info->setSubMounts(array_filter($mounts, function (IMountPoint $mount) use ($extOnly) {
- $subStorage = $mount->getStorage();
- return !($extOnly && $subStorage instanceof \OCA\Files_Sharing\SharedStorage);
- }));
+ $this->addSubMounts($info, $extOnly);
}
}
@@ -1429,6 +1425,17 @@ class View {
}
/**
+ * Extend a FileInfo that was previously requested with `$includeMountPoints = false` to include the sub mounts
+ */
+ public function addSubMounts(FileInfo $info, $extOnly = false): void {
+ $mounts = Filesystem::getMountManager()->findIn($info->getPath());
+ $info->setSubMounts(array_filter($mounts, function (IMountPoint $mount) use ($extOnly) {
+ $subStorage = $mount->getStorage();
+ return !($extOnly && $subStorage instanceof \OCA\Files_Sharing\SharedStorage);
+ }));
+ }
+
+ /**
* get the content of a directory
*
* @param string $directory path under datadirectory