Skip to content

Instantly share code, notes, and snippets.

@georgehrke
Created September 20, 2015 09:12
Show Gist options
  • Save georgehrke/dc2ca5bf4e631381cc3c to your computer and use it in GitHub Desktop.
Save georgehrke/dc2ca5bf4e631381cc3c to your computer and use it in GitHub Desktop.
From bb82c0ca889f0f75544d1cb1089f1c1af3ee15fc Mon Sep 17 00:00:00 2001
From: Georg Ehrke <developer@georgehrke.com>
Date: Mon, 23 Mar 2015 01:05:33 +0100
Subject: [PATCH] delete cached preview when rolling back file's version
add random number using OC.parseQueryString and _.extend()
version rollback: add missing prefix to OC\Preview::post_delete
add test to assure that the rollback hook is called
---
apps/files_versions/js/versions.js | 15 ++++++++++++++
apps/files_versions/lib/storage.php | 3 +++
apps/files_versions/tests/versions.php | 37 ++++++++++++++++++++++++++++++++++
lib/base.php | 3 ++-
lib/private/preview.php | 7 +++++++
5 files changed, 64 insertions(+), 1 deletion(-)
diff --git a/apps/files_versions/js/versions.js b/apps/files_versions/js/versions.js
index e86bb4c..1223cc7 100644
--- a/apps/files_versions/js/versions.js
+++ b/apps/files_versions/js/versions.js
@@ -74,6 +74,21 @@ function revertFile(file, revision) {
} else {
$('#dropdown').slideUp(OC.menuSpeed, function() {
$('#dropdown').closest('tr').find('.modified:first').html(relative_modified_date(revision));
+ //trigger reload of thumbnail
+ var thumbnail = $('#dropdown').closest('tr').find('.thumbnail:first');
+ if (thumbnail.length > 0) {
+ var url = thumbnail.css('background-image');
+ //strip of url(...)
+ url = url.replace('url(','').replace(')','');
+
+ var url_hash = OC.parseQueryString(url);
+ var random = Math.round((new Date()).getTime() / 1000);
+ url = OC.generateUrl('/core/preview.png?') + OC.buildQueryString(_.extend(url_hash, {r: random}));
+
+ url = 'url(' + url + ')';
+ thumbnail.css('background-image', url);
+ }
+
$('#dropdown').remove();
$('tr').removeClass('mouseOver');
});
diff --git a/apps/files_versions/lib/storage.php b/apps/files_versions/lib/storage.php
index e0034f6..f7064f7 100644
--- a/apps/files_versions/lib/storage.php
+++ b/apps/files_versions/lib/storage.php
@@ -311,6 +311,9 @@ public static function rollback($file, $revision) {
if (self::copyFileContents($users_view, 'files_versions' . $filename . '.v' . $revision, 'files' . $filename)) {
$files_view->touch($file, $revision);
Storage::scheduleExpire($uid, $file);
+ \OC_Hook::emit('\OCP\Versions', 'rollback', array(
+ 'path' => $filename,
+ ));
return true;
} else if ($versionCreated) {
self::deleteVersion($users_view, $version);
diff --git a/apps/files_versions/tests/versions.php b/apps/files_versions/tests/versions.php
index 7cca409..a9eb1b9 100644
--- a/apps/files_versions/tests/versions.php
+++ b/apps/files_versions/tests/versions.php
@@ -580,6 +580,35 @@ public function testRestoreCrossStorage() {
$this->doTestRestore();
}
+ /**
+ * @param string $hookName name of hook called
+ * @param string $params variable to recieve parameters provided by hook
+ */
+ private function connectMockHooks($hookName, &$params) {
+ if ($hookName === null) {
+ return;
+ }
+
+ $eventHandler = $this->getMockBuilder('\stdclass')
+ ->setMethods(['callback'])
+ ->getMock();
+
+ $eventHandler->expects($this->any())
+ ->method('callback')
+ ->will($this->returnCallback(
+ function($p) use (&$params) {
+ $params = $p;
+ }
+ ));
+
+ \OCP\Util::connectHook(
+ '\OCP\Versions',
+ $hookName,
+ $eventHandler,
+ 'callback'
+ );
+ }
+
private function doTestRestore() {
$filePath = self::TEST_VERSIONS_USER . '/files/sub/test.txt';
$this->rootView->file_put_contents($filePath, 'test file');
@@ -608,7 +637,15 @@ private function doTestRestore() {
$this->assertEquals('test file', $this->rootView->file_get_contents($filePath));
$info1 = $this->rootView->getFileInfo($filePath);
+ $params = array();
+ $this->connectMockHooks('rollback', $params);
+
\OCA\Files_Versions\Storage::rollback('sub/test.txt', $t2);
+ $expectedParams = array(
+ 'path' => '/sub/test.txt',
+ );
+
+ $this->assertEquals($expectedParams, $params);
$this->assertEquals('version2', $this->rootView->file_get_contents($filePath));
$info2 = $this->rootView->getFileInfo($filePath);
diff --git a/lib/base.php b/lib/base.php
index fde6783..02a0c02 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -787,8 +787,9 @@ public static function registerPreviewHooks() {
OC_Hook::connect('\OCP\Versions', 'preDelete', 'OC\Preview', 'prepare_delete');
OC_Hook::connect('\OCP\Trashbin', 'preDelete', 'OC\Preview', 'prepare_delete');
OC_Hook::connect('OC_Filesystem', 'post_delete', 'OC\Preview', 'post_delete_files');
- OC_Hook::connect('\OCP\Versions', 'delete', 'OC\Preview', 'post_delete');
+ OC_Hook::connect('\OCP\Versions', 'delete', 'OC\Preview', 'post_delete_versions');
OC_Hook::connect('\OCP\Trashbin', 'delete', 'OC\Preview', 'post_delete');
+ OC_Hook::connect('\OCP\Versions', 'rollback', 'OC\Preview', 'post_delete_versions');
}
/**
diff --git a/lib/private/preview.php b/lib/private/preview.php
index 5dcab47..1ec03f6 100644
--- a/lib/private/preview.php
+++ b/lib/private/preview.php
@@ -1234,6 +1234,13 @@ public static function post_delete_files($args) {
/**
* @param array $args
+ */
+ public static function post_delete_versions($args) {
+ self::post_delete($args, 'files/');
+ }
+
+ /**
+ * @param array $args
* @param string $prefix
*/
public static function post_delete($args, $prefix = '') {
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment