summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Müller <thomas.mueller@tmit.eu>2014-03-25 22:41:09 +0100
committerThomas Müller <thomas.mueller@tmit.eu>2014-03-25 22:41:09 +0100
commit1ae10b9da3280b9bb6fc3965d1ace43f1c0be56f (patch)
tree6c5baf7e48fb399d7bf1b151b7cc40d5052113e2
parentbbc2e37259128ba12082e731bacdc740495ba2ea (diff)
parenteabeedb306849e3ec8916de5791a3951074a199f (diff)
downloadnextcloud-server-1ae10b9da3280b9bb6fc3965d1ace43f1c0be56f.tar.gz
nextcloud-server-1ae10b9da3280b9bb6fc3965d1ace43f1c0be56f.zip
Merge pull request #7420 from owncloud/cachehooks-first
Manually triger the filecache update hooks before any other hook
-rw-r--r--apps/files/appinfo/app.php7
-rw-r--r--lib/private/files/cache/updater.php5
-rw-r--r--lib/private/files/view.php25
-rw-r--r--tests/lib/files/cache/updater.php5
4 files changed, 28 insertions, 14 deletions
diff --git a/apps/files/appinfo/app.php b/apps/files/appinfo/app.php
index 909baca92ea..15a29133789 100644
--- a/apps/files/appinfo/app.php
+++ b/apps/files/appinfo/app.php
@@ -12,13 +12,6 @@ OCP\App::addNavigationEntry(array("id" => "files_index",
OC_Search::registerProvider('OC_Search_Provider_File');
-// cache hooks must be connected before all other apps.
-// since 'files' is always loaded first the hooks need to be connected here
-\OC_Hook::connect('OC_Filesystem', 'post_write', '\OC\Files\Cache\Updater', 'writeHook');
-\OC_Hook::connect('OC_Filesystem', 'post_touch', '\OC\Files\Cache\Updater', 'touchHook');
-\OC_Hook::connect('OC_Filesystem', 'post_delete', '\OC\Files\Cache\Updater', 'deleteHook');
-\OC_Hook::connect('OC_Filesystem', 'post_rename', '\OC\Files\Cache\Updater', 'renameHook');
-
\OCP\BackgroundJob::addRegularTask('\OC\Files\Cache\BackgroundWatcher', 'checkNext');
$templateManager = OC_Helper::getFileTemplateManager();
diff --git a/lib/private/files/cache/updater.php b/lib/private/files/cache/updater.php
index 666d5dd7fe5..199ce5dee78 100644
--- a/lib/private/files/cache/updater.php
+++ b/lib/private/files/cache/updater.php
@@ -119,6 +119,9 @@ class Updater {
if ($uid != \OCP\User::getUser()) {
$info = \OC\Files\Filesystem::getFileInfo($filename);
+ if (!$info) {
+ return array($uid, '/files/' . $filename);
+ }
$ownerView = new \OC\Files\View('/' . $uid . '/files');
$filename = $ownerView->getPath($info['fileid']);
}
@@ -150,7 +153,7 @@ class Updater {
$cache->update($id, array('mtime' => $time, 'etag' => $storage->getETag($internalPath)));
if ($realPath !== '') {
$realPath = dirname($realPath);
- if($realPath === DIRECTORY_SEPARATOR ) {
+ if ($realPath === DIRECTORY_SEPARATOR) {
$realPath = "";
}
// check storage for parent in case we change the storage in this step
diff --git a/lib/private/files/view.php b/lib/private/files/view.php
index 2dbbf5b88c9..f06c2fcd66c 100644
--- a/lib/private/files/view.php
+++ b/lib/private/files/view.php
@@ -25,6 +25,8 @@
namespace OC\Files;
+use OC\Files\Cache\Updater;
+
class View {
private $fakeRoot = '';
private $internal_path_cache = array();
@@ -308,6 +310,9 @@ class View {
fclose($target);
fclose($data);
if ($this->shouldEmitHooks($path) && $result !== false) {
+ Updater::writeHook(array(
+ 'path' => $this->getHookPath($path)
+ ));
if (!$exists) {
\OC_Hook::emit(
Filesystem::CLASSNAME,
@@ -433,6 +438,7 @@ class View {
}
if ($this->shouldEmitHooks() && (Cache\Scanner::isPartialFile($path1) && !Cache\Scanner::isPartialFile($path2)) && $result !== false) {
// if it was a rename from a part file to a regular file it was a write and not a rename operation
+ Updater::writeHook(array('path' => $this->getHookPath($path2)));
\OC_Hook::emit(
Filesystem::CLASSNAME,
Filesystem::signal_post_write,
@@ -441,6 +447,10 @@ class View {
)
);
} elseif ($this->shouldEmitHooks() && $result !== false) {
+ Updater::renameHook(array(
+ 'oldpath' => $this->getHookPath($path1),
+ 'newpath' => $this->getHookPath($path2)
+ ));
\OC_Hook::emit(
Filesystem::CLASSNAME,
Filesystem::signal_post_rename,
@@ -741,7 +751,10 @@ class View {
}
/**
+ * @param string[] $hooks
* @param string $path
+ * @param bool $post
+ * @return bool
*/
private function runHooks($hooks, $path, $post = false) {
$path = $this->getHookPath($path);
@@ -749,6 +762,16 @@ class View {
$run = true;
if ($this->shouldEmitHooks($path)) {
foreach ($hooks as $hook) {
+ // manually triger updater hooks to ensure they are called first
+ if ($post) {
+ if ($hook == 'write') {
+ Updater::writeHook(array('path' => $path));
+ } elseif ($hook == 'touch') {
+ Updater::touchHook(array('path' => $path));
+ } else if ($hook == 'delete') {
+ Updater::deleteHook(array('path' => $path));
+ }
+ }
if ($hook != 'read') {
\OC_Hook::emit(
Filesystem::CLASSNAME,
@@ -820,7 +843,7 @@ class View {
$data = $cache->get($internalPath);
}
- if ($data and $data['fileid']) {
+ if ($data and isset($data['fileid'])) {
if ($includeMountPoints and $data['mimetype'] === 'httpd/unix-directory') {
//add the sizes of other mountpoints to the folder
$mountPoints = Filesystem::getMountPoints($path);
diff --git a/tests/lib/files/cache/updater.php b/tests/lib/files/cache/updater.php
index a6ee8c46661..e2fae0ae57f 100644
--- a/tests/lib/files/cache/updater.php
+++ b/tests/lib/files/cache/updater.php
@@ -65,11 +65,6 @@ class Updater extends \PHPUnit_Framework_TestCase {
Filesystem::mount($this->storage, array(), '/' . self::$user . '/files');
\OC_Hook::clear('OC_Filesystem');
-
- \OC_Hook::connect('OC_Filesystem', 'post_write', '\OC\Files\Cache\Updater', 'writeHook');
- \OC_Hook::connect('OC_Filesystem', 'post_delete', '\OC\Files\Cache\Updater', 'deleteHook');
- \OC_Hook::connect('OC_Filesystem', 'post_rename', '\OC\Files\Cache\Updater', 'renameHook');
- \OC_Hook::connect('OC_Filesystem', 'post_touch', '\OC\Files\Cache\Updater', 'touchHook');
}
public function tearDown() {