From 4a70315ad1bb58da57b815afe9c723bf96fb521f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Fri, 22 Mar 2013 13:52:07 +0100 Subject: [PATCH 1/2] ignore files in scanFile instead of scan to catch all occurences. --- lib/files/cache/scanner.php | 69 +++++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 26 deletions(-) diff --git a/lib/files/cache/scanner.php b/lib/files/cache/scanner.php index 661ece5b120..4eaea947e51 100644 --- a/lib/files/cache/scanner.php +++ b/lib/files/cache/scanner.php @@ -62,32 +62,36 @@ class Scanner { * @return array with metadata of the scanned file */ public function scanFile($file, $checkExisting = false) { - \OC_Hook::emit('\OC\Files\Cache\Scanner', 'scan_file', array('path' => $file, 'storage' => $this->storageId)); - $data = $this->getData($file); - if ($data) { - if ($file) { - $parent = dirname($file); - if ($parent === '.') { - $parent = ''; + if (!$this->isIgnoredFile($file)) { + \OC_Hook::emit('\OC\Files\Cache\Scanner', 'scan_file', array('path' => $file, 'storage' => $this->storageId)); + $data = $this->getData($file); + if ($data) { + if ($file) { + $parent = dirname($file); + if ($parent === '.') { + $parent = ''; + } + if (!$this->cache->inCache($parent)) { + $this->scanFile($parent); + } } - if (!$this->cache->inCache($parent)) { - $this->scanFile($parent); + if($cacheData = $this->cache->get($file)) { + if ($data['mtime'] === $cacheData['mtime'] && + $data['size'] === $cacheData['size']) { + $data['etag'] = $cacheData['etag']; + } } + if ($checkExisting and $cacheData) { + if ($data['size'] === -1) { + $data['size'] = $cacheData['size']; + } + } + $this->cache->put($file, $data); } - if($cacheData = $this->cache->get($file)) { - if ($data['mtime'] === $cacheData['mtime'] && - $data['size'] === $cacheData['size']) { - $data['etag'] = $cacheData['etag']; - } - } - if ($checkExisting and $cacheData) { - if ($data['size'] === -1) { - $data['size'] = $cacheData['size']; - } - } - $this->cache->put($file, $data); + return $data; } - return $data; + \OCP\Util::writeLog('scanner', 'Ignoring '.$file.' and not triggering scan_file hook.', \OCP\Util::DEBUG); + return null; } /** @@ -109,8 +113,8 @@ class Scanner { if ($this->storage->is_dir($path) && ($dh = $this->storage->opendir($path))) { \OC_DB::beginTransaction(); while ($file = readdir($dh)) { - if (!$this->isIgnoredFile($file)) { - $child = ($path) ? $path . '/' . $file : $file; + $child = ($path) ? $path . '/' . $file : $file; + if (!$this->isIgnoredDir($file)) { $data = $this->scanFile($child, $recursive === self::SCAN_SHALLOW); if ($data) { if ($data['size'] === -1) { @@ -144,6 +148,20 @@ 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 === '..' + || \OC\Files\Filesystem::isFileBlacklisted($file) + ) { + return true; + } + return false; + } /** * @brief check if the file should be ignored when scanning * NOTE: files with a '.part' extension are ignored as well! @@ -152,8 +170,7 @@ class Scanner { * @return boolean */ private function isIgnoredFile($file) { - if ($file === '.' || $file === '..' - || pathinfo($file, PATHINFO_EXTENSION) === 'part' + if (pathinfo($file, PATHINFO_EXTENSION) === 'part' || \OC\Files\Filesystem::isFileBlacklisted($file) ) { return true; From aa103bd5b32fc45e5594976c59cd7680bff60d2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Wed, 27 Mar 2013 13:57:31 +0100 Subject: [PATCH 2/2] supress write hook for .part files --- lib/files/cache/scanner.php | 9 +++------ lib/files/view.php | 6 +++--- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/lib/files/cache/scanner.php b/lib/files/cache/scanner.php index 4eaea947e51..f019d4fc608 100644 --- a/lib/files/cache/scanner.php +++ b/lib/files/cache/scanner.php @@ -62,7 +62,7 @@ class Scanner { * @return array with metadata of the scanned file */ public function scanFile($file, $checkExisting = false) { - if (!$this->isIgnoredFile($file)) { + if (!self::isIgnoredFile($file)) { \OC_Hook::emit('\OC\Files\Cache\Scanner', 'scan_file', array('path' => $file, 'storage' => $this->storageId)); $data = $this->getData($file); if ($data) { @@ -90,7 +90,6 @@ class Scanner { } return $data; } - \OCP\Util::writeLog('scanner', 'Ignoring '.$file.' and not triggering scan_file hook.', \OCP\Util::DEBUG); return null; } @@ -155,9 +154,7 @@ class Scanner { * @return boolean */ private function isIgnoredDir($dir) { - if ($dir === '.' || $dir === '..' - || \OC\Files\Filesystem::isFileBlacklisted($file) - ) { + if ($dir === '.' || $dir === '..') { return true; } return false; @@ -169,7 +166,7 @@ class Scanner { * @param String $file * @return boolean */ - private function isIgnoredFile($file) { + public static function isIgnoredFile($file) { if (pathinfo($file, PATHINFO_EXTENSION) === 'part' || \OC\Files\Filesystem::isFileBlacklisted($file) ) { diff --git a/lib/files/view.php b/lib/files/view.php index 19f33ad64a2..e811fb093cc 100644 --- a/lib/files/view.php +++ b/lib/files/view.php @@ -267,7 +267,7 @@ class View { $path = $this->getRelativePath($absolutePath); $exists = $this->file_exists($path); $run = true; - if ($this->fakeRoot == Filesystem::getRoot()) { + if ($this->fakeRoot == Filesystem::getRoot() && ! Cache\Scanner::isIgnoredFile($path) ) { if (!$exists) { \OC_Hook::emit( Filesystem::CLASSNAME, @@ -295,7 +295,7 @@ class View { list ($count, $result) = \OC_Helper::streamCopy($data, $target); fclose($target); fclose($data); - if ($this->fakeRoot == Filesystem::getRoot()) { + if ($this->fakeRoot == Filesystem::getRoot() && ! Cache\Scanner::isIgnoredFile($path) ) { if (!$exists) { \OC_Hook::emit( Filesystem::CLASSNAME, @@ -627,7 +627,7 @@ class View { private function runHooks($hooks, $path, $post = false) { $prefix = ($post) ? 'post_' : ''; $run = true; - if (Filesystem::$loaded and $this->fakeRoot == Filesystem::getRoot()) { + if (Filesystem::$loaded and $this->fakeRoot == Filesystem::getRoot() && ! Cache\Scanner::isIgnoredFile($path) ) { foreach ($hooks as $hook) { if ($hook != 'read') { \OC_Hook::emit(