From 4b5aebc14b3cb0ef994231900623500c020612ac Mon Sep 17 00:00:00 2001
From: Gerrit Uitslag <klapinklapin@gmail.com>
Date: Fri, 18 Mar 2016 22:33:26 +0100
Subject: [PATCH] filesize zero cases, compressed revisions

- handle all cases where not an old file exist, or when that old file is
zero size.
- When using old revision normally these files are compressed, use
uncompressed size.
---
 _test/tests/inc/common_saveWikiText.test.php | 12 ++++++++++--
 inc/common.php                               | 13 +++++++++++--
 2 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/_test/tests/inc/common_saveWikiText.test.php b/_test/tests/inc/common_saveWikiText.test.php
index 800e20952..2d4e855d0 100644
--- a/_test/tests/inc/common_saveWikiText.test.php
+++ b/_test/tests/inc/common_saveWikiText.test.php
@@ -23,6 +23,7 @@ class common_saveWikiText_test extends DokuWikiTest {
         $revinfo = $pagelog->getRevisionInfo($revisions[0]);
         $this->assertEquals('first save', $revinfo['sum']);
         $this->assertEquals(DOKU_CHANGE_TYPE_CREATE, $revinfo['type']);
+        $this->assertEquals(10, $revinfo['sizechange']);
 
         sleep(1); // wait for new revision ID
 
@@ -36,7 +37,7 @@ class common_saveWikiText_test extends DokuWikiTest {
         $this->assertEquals(1, count($revisions));
 
         // update the page with new text
-        saveWikiText($page, 'teststring2', 'third save', false);
+        saveWikiText($page, 'teststring2long', 'third save', false);
         clearstatcache(false, $file);
         $newmod = filemtime($file);
         $this->assertNotEquals($lastmod, $newmod);
@@ -48,11 +49,12 @@ class common_saveWikiText_test extends DokuWikiTest {
         $revinfo = $pagelog->getRevisionInfo($revisions[0]);
         $this->assertEquals('third save', $revinfo['sum']);
         $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']);
+        $this->assertEquals(5, $revinfo['sizechange']);
 
         sleep(1); // wait for new revision ID
 
         // add a minor edit (unauthenticated)
-        saveWikiText($page, 'teststring3', 'fourth save', true);
+        saveWikiText($page, 'teststring3long', 'fourth save', true);
         clearstatcache(false, $file);
         $newmod = filemtime($file);
         $this->assertNotEquals($lastmod, $newmod);
@@ -64,6 +66,7 @@ class common_saveWikiText_test extends DokuWikiTest {
         $revinfo = $pagelog->getRevisionInfo($revisions[0]);
         $this->assertEquals('fourth save', $revinfo['sum']);
         $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']);
+        $this->assertEquals(0, $revinfo['sizechange']);
 
         sleep(1); // wait for new revision ID
 
@@ -81,6 +84,7 @@ class common_saveWikiText_test extends DokuWikiTest {
         $revinfo = $pagelog->getRevisionInfo($revisions[0]);
         $this->assertEquals('fifth save', $revinfo['sum']);
         $this->assertEquals(DOKU_CHANGE_TYPE_MINOR_EDIT, $revinfo['type']);
+        $this->assertEquals(-4, $revinfo['sizechange']);
 
         sleep(1); // wait for new revision ID
 
@@ -95,6 +99,7 @@ class common_saveWikiText_test extends DokuWikiTest {
         $revinfo = $pagelog->getRevisionInfo($revisions[0]);
         $this->assertEquals('sixth save', $revinfo['sum']);
         $this->assertEquals(DOKU_CHANGE_TYPE_DELETE, $revinfo['type']);
+        $this->assertEquals(-11, $revinfo['sizechange']);
 
         sleep(1); // wait for new revision ID
 
@@ -114,6 +119,7 @@ class common_saveWikiText_test extends DokuWikiTest {
         $this->assertEquals('seventh save', $revinfo['sum']);
         $this->assertEquals(DOKU_CHANGE_TYPE_REVERT, $revinfo['type']);
         $this->assertEquals($REV, $revinfo['extra']);
+        $this->assertEquals(11, $revinfo['sizechange']);
         $REV = '';
 
         sleep(1); // wait for new revision ID
@@ -136,10 +142,12 @@ class common_saveWikiText_test extends DokuWikiTest {
         $revinfo = $pagelog->getRevisionInfo($revisions[0]);
         $this->assertEquals('eigth save', $revinfo['sum']);
         $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']);
+        $this->assertEquals(0, $revinfo['sizechange']);
 
         $revinfo = $pagelog->getRevisionInfo($revisions[1]);
         $this->assertEquals('external edit', $revinfo['sum']);
         $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']);
+        $this->assertEquals(0, $revinfo['sizechange']);
 
     }
 }
diff --git a/inc/common.php b/inc/common.php
index 92e475cbe..bbbeefc6e 100644
--- a/inc/common.php
+++ b/inc/common.php
@@ -1214,7 +1214,13 @@ function detectExternalEdit($id) {
         saveOldRevision($id);
         // add a changelog entry if this edit came from outside dokuwiki
         if($old > $oldRev) {
-            $filesize_old = filesize(wikiFN($id, $oldRev));
+            $lastfileinrevisions = wikiFN($id, $oldRev);
+            $revinfo = $pagelog->getRevisionInfo($oldRev);
+            if(empty($oldRev) || !file_exists($lastfileinrevisions) || $revinfo['changeType'] == DOKU_CHANGE_TYPE_DELETE) {
+                $filesize_old = 0;
+            } else {
+                $filesize_old = io_getSizeFile($lastfileinrevisions);
+            }
             $filesize_new = filesize($file);
             $sizechange = $filesize_new - $filesize_old;
 
@@ -1292,7 +1298,10 @@ function saveWikiText($id, $text, $summary, $minor = false) {
 
     detectExternalEdit($id);
 
-    if($svdta['changeType'] == DOKU_CHANGE_TYPE_CREATE) {
+    if(
+        $svdta['changeType'] == DOKU_CHANGE_TYPE_CREATE ||
+        ($svdta['changeType'] == DOKU_CHANGE_TYPE_REVERT && !file_exists($svdta['file']))
+    ) {
         $filesize_old = 0;
     } else {
         $filesize_old = filesize($svdta['file']);
-- 
GitLab