[Pkg-owncloud-commits] [owncloud] 47/85: Add a change propagator class to handle propagating etag and mtime changes
David Prévot
taffit at moszumanska.debian.org
Tue Jun 17 19:12:44 UTC 2014
This is an automated email from the git hooks/post-receive script.
taffit pushed a commit to branch 6.0
in repository owncloud.
commit 289526110256f7ff86cf56ebbddeb6e4fd716d61
Author: Robin Appelman <icewind at owncloud.com>
Date: Fri May 30 15:55:17 2014 +0200
Add a change propagator class to handle propagating etag and mtime changes
---
lib/private/files/cache/changepropagator.php | 98 ++++++++++++++++++++++++++++
tests/lib/files/cache/changepropagator.php | 72 ++++++++++++++++++++
2 files changed, 170 insertions(+)
diff --git a/lib/private/files/cache/changepropagator.php b/lib/private/files/cache/changepropagator.php
new file mode 100644
index 0000000..30f2e67
--- /dev/null
+++ b/lib/private/files/cache/changepropagator.php
@@ -0,0 +1,98 @@
+<?php
+/**
+ * Copyright (c) 2014 Robin Appelman <icewind at owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace OC\Files\Cache;
+
+/**
+ * Propagates changes in etag and mtime up the filesystem tree
+ *
+ * @package OC\Files\Cache
+ */
+class ChangePropagator {
+ /**
+ * @var string[]
+ */
+ protected $changedFiles = array();
+
+ /**
+ * @var \OC\Files\View
+ */
+ protected $view;
+
+ /**
+ * @param \OC\Files\View $view
+ */
+ public function __construct(\OC\Files\View $view) {
+ $this->view = $view;
+ }
+
+ public function addChange($path) {
+ $this->changedFiles[] = $path;
+ }
+
+ public function getChanges() {
+ return $this->changedFiles;
+ }
+
+ /**
+ * propagate the registered changes to their parent folders
+ *
+ * @param int $time (optional) the mtime to set for the folders, if not set the current time is used
+ */
+ public function propagateChanges($time = null) {
+ $parents = $this->getAllParents();
+ $this->changedFiles = array();
+ if (!$time) {
+ $time = time();
+ }
+ foreach ($parents as $parent) {
+ /**
+ * @var \OC\Files\Storage\Storage $storage
+ * @var string $internalPath
+ */
+
+ list($storage, $internalPath) = $this->view->resolvePath($parent);
+ $cache = $storage->getCache();
+ $id = $cache->getId($internalPath);
+ $cache->update($id, array('mtime' => $time, 'etag' => $storage->getETag($internalPath)));
+ }
+ }
+
+ /**
+ * @return string[]
+ */
+ public function getAllParents() {
+ $parents = array();
+ foreach ($this->getChanges() as $path) {
+ $parents = array_values(array_unique(array_merge($parents, $this->getParents($path))));
+ }
+ return $parents;
+ }
+
+ /**
+ * get all parent folders of $path
+ *
+ * @param string $path
+ * @return string[]
+ */
+ protected function getParents($path) {
+ $parts = explode('/', $path);
+
+ // remove the singe file
+ array_pop($parts);
+ $result = array('/');
+ $resultPath = '';
+ foreach ($parts as $part) {
+ if ($part) {
+ $resultPath .= '/' . $part;
+ $result[] = $resultPath;
+ }
+ }
+ return $result;
+ }
+}
diff --git a/tests/lib/files/cache/changepropagator.php b/tests/lib/files/cache/changepropagator.php
new file mode 100644
index 0000000..9beff27
--- /dev/null
+++ b/tests/lib/files/cache/changepropagator.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Copyright (c) 2014 Robin Appelman <icewind at owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace Test\Files\Cache;
+
+use OC\Files\Filesystem;
+use OC\Files\Storage\Temporary;
+use OC\Files\View;
+
+class ChangePropagator extends \PHPUnit_Framework_TestCase {
+ /**
+ * @var \OC\Files\Cache\ChangePropagator
+ */
+ private $propagator;
+
+ /**
+ * @var \OC\Files\View
+ */
+ private $view;
+
+ public function setUp() {
+ $storage = new Temporary(array());
+ $root = '/' . uniqid();
+ Filesystem::mount($storage, array(), $root);
+ $this->view = new View($root);
+ $this->propagator = new \OC\Files\Cache\ChangePropagator($this->view);
+ }
+
+ public function testGetParentsSingle() {
+ $this->propagator->addChange('/foo/bar/asd');
+ $this->assertEquals(array('/', '/foo', '/foo/bar'), $this->propagator->getAllParents());
+ }
+
+ public function testGetParentsMultiple() {
+ $this->propagator->addChange('/foo/bar/asd');
+ $this->propagator->addChange('/foo/qwerty');
+ $this->propagator->addChange('/foo/asd/bar');
+ $this->assertEquals(array('/', '/foo', '/foo/bar', '/foo/asd'), $this->propagator->getAllParents());
+ }
+
+ public function testSinglePropagate() {
+ $this->view->mkdir('/foo');
+ $this->view->mkdir('/foo/bar');
+ $this->view->file_put_contents('/foo/bar/sad.txt', 'qwerty');
+
+ $oldInfo1 = $this->view->getFileInfo('/');
+ $oldInfo2 = $this->view->getFileInfo('/foo');
+ $oldInfo3 = $this->view->getFileInfo('/foo/bar');
+
+ $time = time() + 50;
+
+ $this->propagator->addChange('/foo/bar/sad.txt');
+ $this->propagator->propagateChanges($time);
+
+ $newInfo1 = $this->view->getFileInfo('/');
+ $newInfo2 = $this->view->getFileInfo('/foo');
+ $newInfo3 = $this->view->getFileInfo('/foo/bar');
+
+ $this->assertEquals($newInfo1->getMTime(), $time);
+ $this->assertEquals($newInfo2->getMTime(), $time);
+ $this->assertEquals($newInfo3->getMTime(), $time);
+
+ $this->assertNotEquals($oldInfo1->getEtag(), $newInfo1->getEtag());
+ $this->assertNotEquals($oldInfo2->getEtag(), $newInfo2->getEtag());
+ $this->assertNotEquals($oldInfo3->getEtag(), $newInfo3->getEtag());
+ }
+}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/owncloud.git
More information about the Pkg-owncloud-commits
mailing list