From 134243d3e5a78b51f20ac0816d462c1de8e121c8 Mon Sep 17 00:00:00 2001
From: Robin Appelman <icewind@owncloud.com>
Date: Fri, 13 Feb 2015 14:30:05 +0100
Subject: [PATCH] Dont lower the mtime of a folder when propagating changes

---
 lib/private/files/cache/changepropagator.php |  4 +--
 tests/lib/files/cache/changepropagator.php   | 27 ++++++++++++++++++--
 2 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/lib/private/files/cache/changepropagator.php b/lib/private/files/cache/changepropagator.php
index 2967c8f625..36fc6e8014 100644
--- a/lib/private/files/cache/changepropagator.php
+++ b/lib/private/files/cache/changepropagator.php
@@ -59,8 +59,8 @@ class ChangePropagator {
 			list($storage, $internalPath) = $this->view->resolvePath($parent);
 			if ($storage) {
 				$cache = $storage->getCache();
-				$id = $cache->getId($internalPath);
-				$cache->update($id, array('mtime' => $time, 'etag' => $storage->getETag($internalPath)));
+				$entry = $cache->get($internalPath);
+				$cache->update($entry['fileid'], array('mtime' => max($time, $entry['mtime']), 'etag' => $storage->getETag($internalPath)));
 			}
 		}
 	}
diff --git a/tests/lib/files/cache/changepropagator.php b/tests/lib/files/cache/changepropagator.php
index 89bd9dfe80..1b56da5e97 100644
--- a/tests/lib/files/cache/changepropagator.php
+++ b/tests/lib/files/cache/changepropagator.php
@@ -23,12 +23,17 @@ class ChangePropagator extends \Test\TestCase {
 	 */
 	private $view;
 
+	/**
+	 * @var \OC\Files\Storage\Storage
+	 */
+	private $storage;
+
 	protected function setUp() {
 		parent::setUp();
 
-		$storage = new Temporary(array());
+		$this->storage = new Temporary(array());
 		$root = $this->getUniqueID('/');
-		Filesystem::mount($storage, array(), $root);
+		Filesystem::mount($this->storage, array(), $root);
 		$this->view = new View($root);
 		$this->propagator = new \OC\Files\Cache\ChangePropagator($this->view);
 	}
@@ -71,4 +76,22 @@ class ChangePropagator extends \Test\TestCase {
 		$this->assertNotSame($oldInfo2->getEtag(), $newInfo2->getEtag());
 		$this->assertNotSame($oldInfo3->getEtag(), $newInfo3->getEtag());
 	}
+
+	public function testDontLowerMtime() {
+		$time = time();
+		$this->view->mkdir('/foo');
+		$this->view->mkdir('/foo/bar');
+
+		$cache = $this->storage->getCache();
+		$cache->put('', ['mtime' => $time - 50]);
+		$cache->put('foo', ['mtime' => $time - 150]);
+		$cache->put('foo/bar', ['mtime' => $time - 250]);
+
+		$this->propagator->addChange('/foo/bar/foo');
+		$this->propagator->propagateChanges($time - 100);
+
+		$this->assertEquals(50, $time - $cache->get('')['mtime']);
+		$this->assertEquals(100, $time - $cache->get('foo')['mtime']);
+		$this->assertEquals(100, $time - $cache->get('foo/bar')['mtime']);
+	}
 }
-- 
GitLab