diff --git a/_test/core/DokuWikiTest.php b/_test/core/DokuWikiTest.php index 4e40d510ae3f48b928318f34f20f4a3e7cb458b9..5f085a7c20e575ff3967e589c8bbed1b07a92631 100644 --- a/_test/core/DokuWikiTest.php +++ b/_test/core/DokuWikiTest.php @@ -73,7 +73,15 @@ abstract class DokuWikiTest extends PHPUnit_Framework_TestCase { } } } + // reload some settings + $conf['gzip_output'] &= (strpos($_SERVER['HTTP_ACCEPT_ENCODING'],'gzip') !== false); + if($conf['compression'] == 'bz2' && !DOKU_HAS_BZIP) { + $conf['compression'] = 'gz'; + } + if($conf['compression'] == 'gz' && !DOKU_HAS_GZIP) { + $conf['compression'] = 0; + } // make real paths and check them init_paths(); init_files(); diff --git a/_test/tests/inc/common_pageinfo.test.php b/_test/tests/inc/common_pageinfo.test.php index 2b230d9ce037fb7279b75f5ad425db9af12f4978..adc9538d2c974569f56f30a797002641aac8c4a3 100644 --- a/_test/tests/inc/common_pageinfo.test.php +++ b/_test/tests/inc/common_pageinfo.test.php @@ -128,6 +128,10 @@ class common_pageinfo_test extends DokuWikiTest { $filename = $conf['datadir'].'/wiki/syntax.txt'; $rev = filemtime($filename); $REV = $rev - 100; + $ext = '.txt'; + if($conf['compression']) { //compression in $info['filepath'] determined by wikiFN depends also on if the page exist + $ext .= "." . $conf['compression']; //.gz or .bz2 + } $info = $this->_get_expected_pageinfo(); $info['id'] = 'wiki:syntax'; @@ -135,7 +139,7 @@ class common_pageinfo_test extends DokuWikiTest { $info['meta'] = p_get_metadata($ID); $info['rev'] = $REV; $info['currentrev'] = $rev; - $info['filepath'] = str_replace('pages','attic',substr($filename,0,-3).$REV.'.txt.gz'); + $info['filepath'] = str_replace('pages','attic',substr($filename,0,-3).$REV.$ext); $this->assertEquals($info, pageinfo()); $this->assertEquals($rev-100, $REV); diff --git a/_test/tests/inc/common_saveWikiText.test.php b/_test/tests/inc/common_saveWikiText.test.php index 800e20952be1f760d6195fa62b6a0a796aedf72e..ede0fdf291e49c701a594bf7579fc4094103f382 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,262 @@ 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']); } + + /** + * Execute a whole bunch of saves on the same page and check the results + */ + function test_savesequencedeleteexternalrevision() { + $page = 'page2'; + $file = wikiFN($page); + + // create the page + $this->assertFileNotExists($file); + saveWikiText($page, 'teststring', 'first save', false); + $this->assertFileExists($file); + $lastmod = filemtime($file); + + $pagelog = new PageChangeLog($page); + $revisions = $pagelog->getRevisions(-1, 200); + $this->assertEquals(1, count($revisions)); + $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 + + // delete + saveWikiText($page, '', 'second save', false); + clearstatcache(false, $file); + $this->assertFileNotExists($file); + + $pagelog = new PageChangeLog($page); + $revisions = $pagelog->getRevisions(-1, 200); + $this->assertEquals(2, count($revisions)); + $revinfo = $pagelog->getRevisionInfo($revisions[0]); + $this->assertEquals('second save', $revinfo['sum']); + $this->assertEquals(DOKU_CHANGE_TYPE_DELETE, $revinfo['type']); + $this->assertEquals(-10, $revinfo['sizechange']); + + sleep(1); // wait for new revision ID + + // create external edit + file_put_contents($file, 'teststring5'); + + sleep(1); // wait for new revision ID + + // save on top of external edit + saveWikiText($page, 'teststring6', 'third save', false); + clearstatcache(false, $file); + + $pagelog = new PageChangeLog($page); + $revisions = $pagelog->getRevisions(-1, 200); + $this->assertEquals(4, count($revisions)); // two more revisions now! + $revinfo = $pagelog->getRevisionInfo($revisions[0]); + $this->assertEquals('third 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(11, $revinfo['sizechange']); + + } + + /** + * Execute a whole bunch of saves on the same page and check the results + */ + function test_saveexternalasfirst() { + $page = 'page3'; + $file = wikiFN($page); + + // create the page + $this->assertFileNotExists($file); + + // create external edit + file_put_contents($file, 'teststring'); + + sleep(1); // wait for new revision ID + + // save on top of external edit + saveWikiText($page, 'teststring6', 'first save', false); + clearstatcache(false, $file); + + $pagelog = new PageChangeLog($page); + $revisions = $pagelog->getRevisions(-1, 200); + $this->assertEquals(2, count($revisions)); // two more revisions now! + $revinfo = $pagelog->getRevisionInfo($revisions[0]); + $this->assertEquals('first save', $revinfo['sum']); + $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']); + $this->assertEquals(1, $revinfo['sizechange']); + + $revinfo = $pagelog->getRevisionInfo($revisions[1]); + $this->assertEquals('external edit', $revinfo['sum']); + $this->assertEquals(DOKU_CHANGE_TYPE_EDIT, $revinfo['type']); + $this->assertEquals(10, $revinfo['sizechange']); + + } + + /** + * Execute a whole bunch of saves on the same page and check the results + */ + function test_savesequenceexternaldeleteedit() { + $page = 'page4'; + $file = wikiFN($page); + + // create the page + $this->assertFileNotExists($file); + saveWikiText($page, 'teststring', 'first save', false); + $this->assertFileExists($file); + $lastmod = filemtime($file); + + $pagelog = new PageChangeLog($page); + $revisions = $pagelog->getRevisions(-1, 200); + $this->assertEquals(1, count($revisions)); + $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 + + + // create external delete + unlink($file); + clearstatcache(false, $file); + + sleep(1); // wait for new revision ID + + // save on top of external delete. save is seen as creation + saveWikiText($page, 'teststring6', 'second save', false); + clearstatcache(false, $file); + + $pagelog = new PageChangeLog($page); + $revisions = $pagelog->getRevisions(-1, 200); + $this->assertEquals(2, count($revisions)); // one more revisions now! + $revinfo = $pagelog->getRevisionInfo($revisions[0]); + $this->assertEquals('second save', $revinfo['sum']); + $this->assertEquals(DOKU_CHANGE_TYPE_CREATE, $revinfo['type']); + $this->assertEquals(11, $revinfo['sizechange']); + + $revinfo = $pagelog->getRevisionInfo($revisions[1]); + $this->assertEquals('first save', $revinfo['sum']); + + } + + /** + * Execute a whole bunch of saves on the same page and check the results + */ + function test_savesequencerevert() { + global $REV; + + $page = 'page5'; + $file = wikiFN($page); + + // create the page + $this->assertFileNotExists($file); + saveWikiText($page, 'teststring', 'first save', false); + $this->assertFileExists($file); + $lastmod = filemtime($file); + + $pagelog = new PageChangeLog($page); + $revisions = $pagelog->getRevisions(-1, 200); + $this->assertEquals(1, count($revisions)); + $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 + + // save with same content should be ignored + saveWikiText($page, 'teststring', 'second save', false); + clearstatcache(false, $file); + $this->assertEquals($lastmod, filemtime($file)); + + $pagelog = new PageChangeLog($page); + $revisions = $pagelog->getRevisions(-1, 200); + $this->assertEquals(1, count($revisions)); + + // update the page with new text + saveWikiText($page, 'teststring2long', 'third save', false); + clearstatcache(false, $file); + $newmod = filemtime($file); + $this->assertNotEquals($lastmod, $newmod); + $lastmod = $newmod; + $revertrev = $newmod; + + $pagelog = new PageChangeLog($page); + $revisions = $pagelog->getRevisions(-1, 200); + $this->assertEquals(2, count($revisions)); + $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, 'teststring3long', 'fourth save', true); + clearstatcache(false, $file); + $newmod = filemtime($file); + $this->assertNotEquals($lastmod, $newmod); + $lastmod = $newmod; + + $pagelog = new PageChangeLog($page); + $revisions = $pagelog->getRevisions(-1, 200); + $this->assertEquals(3, count($revisions)); + $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 + + // add a minor edit (authenticated) + $_SERVER['REMOTE_USER'] = 'user'; + saveWikiText($page, 'teststring4', 'fifth save', true); + clearstatcache(false, $file); + $newmod = filemtime($file); + $this->assertNotEquals($lastmod, $newmod); + $lastmod = $newmod; + + $pagelog = new PageChangeLog($page); + $revisions = $pagelog->getRevisions(-1, 200); + $this->assertEquals(4, count($revisions)); + $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 + + // restore + $REV = $revertrev; + saveWikiText($page, 'teststring2long', 'sixth save', true); + clearstatcache(false, $file); + $this->assertFileExists($file); + $newmod = filemtime($file); + $this->assertNotEquals($lastmod, $newmod); + + $pagelog = new PageChangeLog($page); + $revisions = $pagelog->getRevisions(-1, 200); + $this->assertEquals(5, count($revisions)); + $revinfo = $pagelog->getRevisionInfo($revisions[0]); + $this->assertEquals('sixth save', $revinfo['sum']); + $this->assertEquals(DOKU_CHANGE_TYPE_REVERT, $revinfo['type']); + $this->assertEquals($REV, $revinfo['extra']); + $this->assertEquals(4, $revinfo['sizechange']); + $REV = ''; + } + } diff --git a/_test/tests/inc/io_getSizeFile.test.php b/_test/tests/inc/io_getSizeFile.test.php new file mode 100644 index 0000000000000000000000000000000000000000..3456342ba5d6b17a11e265479a6cbfcac022705d --- /dev/null +++ b/_test/tests/inc/io_getSizeFile.test.php @@ -0,0 +1,62 @@ +<?php + +class io_getSizeFile_test extends DokuWikiTest { + + /* + * dependency for tests needing zlib extension to pass + */ + public function test_ext_zlib() { + if (!DOKU_HAS_GZIP) { + $this->markTestSkipped('skipping all zlib tests. Need zlib extension'); + } + } + + /* + * dependency for tests needing zlib extension to pass + */ + public function test_ext_bz2() { + if (!DOKU_HAS_BZIP) { + $this->markTestSkipped('skipping all bzip2 tests. Need bz2 extension'); + } + } + + function test_plain(){ + // since git converts line endings, we can't check in this test file but have to create it ourselves + $plain = TMP_DIR.'/test.txt'; + file_put_contents($plain, "The\015\012Test\015\012"); + + $this->assertEquals(11, io_getSizeFile($plain)); + $this->assertEquals(0, io_getSizeFile(__DIR__.'/io_readfile/nope.txt')); + $plain_mb = TMP_DIR.'/test.txt'; + io_saveFile($plain_mb, "string with utf-8 chars åèö - doo-bee doo-bee dooh\012"); + $this->assertEquals(54, io_getSizeFile($plain_mb)); + } + + /** + * @depends test_ext_zlib + */ + function test_gzfiles(){ + $this->assertEquals(11, io_getSizeFile(__DIR__.'/io_readfile/test.txt.gz')); + $this->assertEquals(0, io_getSizeFile(__DIR__.'/io_readfile/nope.txt.gz')); + $this->assertEquals(11, io_getSizeFile(__DIR__.'/io_readfile/corrupt.txt.gz')); + $gz_mb = TMP_DIR.'/test.txt.gz'; + io_saveFile($gz_mb, "string with utf-8 chars åèö - doo-bee doo-bee dooh\012"); + $this->assertEquals(54, io_getSizeFile($gz_mb)); + } + + /** + * @depends test_ext_bz2 + */ + function test_bzfiles(){ + + $this->assertEquals(11, io_getSizeFile(__DIR__.'/io_readfile/test.txt.bz2')); + $this->assertEquals(0, io_getSizeFile(__DIR__.'/io_readfile/nope.txt.bz2')); + $this->assertEquals(0, io_getSizeFile(__DIR__.'/io_readfile/corrupt.txt.bz2')); + $this->assertEquals(9720, io_getSizeFile(__DIR__.'/io_readfile/large.txt.bz2')); + $this->assertEquals(17780, io_getSizeFile(__DIR__.'/io_readfile/long.txt.bz2')); + $bz_mb = TMP_DIR.'/test.txt.bz2'; + io_saveFile($bz_mb, "string with utf-8 chars åèö - doo-bee doo-bee dooh\012"); + $this->assertEquals(54, io_getSizeFile($bz_mb)); + } + +} diff --git a/inc/changelog.php b/inc/changelog.php index f4731021ca48c63e14eae6d414eb02132cf72866..3ab0cfd40304340a797a66589e6223b333a8f2dc 100644 --- a/inc/changelog.php +++ b/inc/changelog.php @@ -23,6 +23,7 @@ define('DOKU_CHANGE_TYPE_REVERT', 'R'); * @return array|bool parsed line or false */ function parseChangelogLine($line) { + $line = rtrim($line, "\n"); $tmp = explode("\t", $line); if ($tmp!==false && count($tmp)>1) { $info = array(); @@ -32,9 +33,16 @@ function parseChangelogLine($line) { $info['id'] = $tmp[3]; // page id $info['user'] = $tmp[4]; // user name $info['sum'] = $tmp[5]; // edit summary (or action reason) - $info['extra'] = rtrim($tmp[6], "\n"); // extra data (varies by line type) + $info['extra'] = $tmp[6]; // extra data (varies by line type) + if(isset($tmp[7]) && $tmp[7] !== '') { //last item has line-end|| + $info['sizechange'] = (int) $tmp[7]; + } else { + $info['sizechange'] = null; + } return $info; - } else { return false; } + } else { + return false; + } } /** @@ -48,12 +56,13 @@ function parseChangelogLine($line) { * @param array $flags Additional flags in a key value array. * Available flags: * - ExternalEdit - mark as an external edit. + * @param null|int $sizechange Change of filesize * * @author Andreas Gohr <andi@splitbrain.org> * @author Esther Brunner <wikidesign@gmail.com> * @author Ben Coburn <btcoburn@silicodon.net> */ -function addLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extra='', $flags=null){ +function addLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extra='', $flags=null, $sizechange = null){ global $conf, $INFO; /** @var Input $INPUT */ global $INPUT; @@ -71,17 +80,23 @@ function addLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extr if(!$date) $date = time(); //use current time if none supplied $remote = (!$flagExternalEdit)?clientIP(true):'127.0.0.1'; $user = (!$flagExternalEdit)?$INPUT->server->str('REMOTE_USER'):''; + if($sizechange === null) { + $sizechange = ''; + } else { + $sizechange = (int) $sizechange; + } $strip = array("\t", "\n"); $logline = array( - 'date' => $date, - 'ip' => $remote, - 'type' => str_replace($strip, '', $type), - 'id' => $id, - 'user' => $user, - 'sum' => utf8_substr(str_replace($strip, '', $summary),0,255), - 'extra' => str_replace($strip, '', $extra) - ); + 'date' => $date, + 'ip' => $remote, + 'type' => str_replace($strip, '', $type), + 'id' => $id, + 'user' => $user, + 'sum' => utf8_substr(str_replace($strip, '', $summary), 0, 255), + 'extra' => str_replace($strip, '', $extra), + 'sizechange' => $sizechange + ); $wasCreated = ($type===DOKU_CHANGE_TYPE_CREATE); $wasReverted = ($type===DOKU_CHANGE_TYPE_REVERT); @@ -130,8 +145,9 @@ function addLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extr * @param array $flags Additional flags in a key value array. * Available flags: * - (none, so far) + * @param null|int $sizechange Change of filesize */ -function addMediaLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extra='', $flags=null){ +function addMediaLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extra='', $flags=null, $sizechange = null){ global $conf; /** @var Input $INPUT */ global $INPUT; @@ -141,17 +157,23 @@ function addMediaLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', if(!$date) $date = time(); //use current time if none supplied $remote = clientIP(true); $user = $INPUT->server->str('REMOTE_USER'); + if($sizechange === null) { + $sizechange = ''; + } else { + $sizechange = (int) $sizechange; + } $strip = array("\t", "\n"); $logline = array( - 'date' => $date, - 'ip' => $remote, - 'type' => str_replace($strip, '', $type), - 'id' => $id, - 'user' => $user, - 'sum' => utf8_substr(str_replace($strip, '', $summary),0,255), - 'extra' => str_replace($strip, '', $extra) - ); + 'date' => $date, + 'ip' => $remote, + 'type' => str_replace($strip, '', $type), + 'id' => $id, + 'user' => $user, + 'sum' => utf8_substr(str_replace($strip, '', $summary), 0, 255), + 'extra' => str_replace($strip, '', $extra), + 'sizechange' => $sizechange + ); // add changelog lines $logline = implode("\t", $logline)."\n"; diff --git a/inc/common.php b/inc/common.php index 91004af5ddfbab38b10b41057e0097a82da02b44..539aed29098738566f8752352353e5e8a185e598 100644 --- a/inc/common.php +++ b/inc/common.php @@ -1203,20 +1203,30 @@ function con($pre, $text, $suf, $pretty = false) { function detectExternalEdit($id) { global $lang; - $file = wikiFN($id); - $old = @filemtime($file); // from page - $pagelog = new PageChangeLog($id, 1024); - $oldRev = $pagelog->getRevisions(-1, 1); // from changelog - $oldRev = (int) (empty($oldRev) ? 0 : $oldRev[0]); + $fileLastMod = wikiFN($id); + $lastMod = @filemtime($fileLastMod); // from page + $pagelog = new PageChangeLog($id, 1024); + $lastRev = $pagelog->getRevisions(-1, 1); // from changelog + $lastRev = (int) (empty($lastRev) ? 0 : $lastRev[0]); - if(!file_exists(wikiFN($id, $old)) && file_exists($file) && $old >= $oldRev) { + if(!file_exists(wikiFN($id, $lastMod)) && file_exists($fileLastMod) && $lastMod >= $lastRev) { // add old revision to the attic if missing saveOldRevision($id); // add a changelog entry if this edit came from outside dokuwiki - if($old > $oldRev) { - addLogEntry($old, $id, DOKU_CHANGE_TYPE_EDIT, $lang['external_edit'], '', array('ExternalEdit'=> true)); + if($lastMod > $lastRev) { + $fileLastRev = wikiFN($id, $lastRev); + $revinfo = $pagelog->getRevisionInfo($lastRev); + if(empty($lastRev) || !file_exists($fileLastRev) || $revinfo['type'] == DOKU_CHANGE_TYPE_DELETE) { + $filesize_old = 0; + } else { + $filesize_old = io_getSizeFile($fileLastRev); + } + $filesize_new = filesize($fileLastMod); + $sizechange = $filesize_new - $filesize_old; + + addLogEntry($lastMod, $id, DOKU_CHANGE_TYPE_EDIT, $lang['external_edit'], '', array('ExternalEdit'=> true), $sizechange); // remove soon to be stale instructions - $cache = new cache_instructions($id, $file); + $cache = new cache_instructions($id, $fileLastMod); $cache->removeCache(); } } @@ -1260,6 +1270,7 @@ function saveWikiText($id, $text, $summary, $minor = false) { $svdta['contentChanged'] = ($svdta['newContent'] != $svdta['oldContent']); $svdta['changeInfo'] = ''; $svdta['changeType'] = DOKU_CHANGE_TYPE_EDIT; + $svdta['sizechange'] = null; // select changelog line type if($REV) { @@ -1271,7 +1282,9 @@ function saveWikiText($id, $text, $summary, $minor = false) { // empty or whitespace only content deletes $svdta['changeType'] = DOKU_CHANGE_TYPE_DELETE; // autoset summary on deletion - if(blank($svdta['summary'])) $svdta['summary'] = $lang['deleted']; + if(blank($svdta['summary'])) { + $svdta['summary'] = $lang['deleted']; + } } else if($minor && $conf['useacl'] && $INPUT->server->str('REMOTE_USER')) { //minor edits only for logged in users $svdta['changeType'] = DOKU_CHANGE_TYPE_MINOR_EDIT; @@ -1284,6 +1297,15 @@ function saveWikiText($id, $text, $summary, $minor = false) { if(!$svdta['contentChanged']) return; detectExternalEdit($id); + + 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']); + } if($svdta['changeType'] == DOKU_CHANGE_TYPE_DELETE) { // Send "update" event with empty data, so plugins can react to page deletion $data = array(array($svdta['file'], '', false), getNS($id), noNS($id), false); @@ -1294,6 +1316,7 @@ function saveWikiText($id, $text, $summary, $minor = false) { $data['newRevision'] = saveOldRevision($id); // remove empty file @unlink($svdta['file']); + $filesize_new = 0; // don't remove old meta info as it should be saved, plugins can use IO_WIKIPAGE_WRITE for removing their metadata... // purge non-persistant meta data p_purge_metadata($id); @@ -1305,11 +1328,14 @@ function saveWikiText($id, $text, $summary, $minor = false) { io_writeWikiPage($svdta['file'], $text, $id); // pre-save the revision, to keep the attic in sync $svdta['newRevision'] = saveOldRevision($id); + $filesize_new = filesize($svdta['file']); } + $svdta['sizechange'] = $filesize_new - $filesize_old; $event->advise_after(); - addLogEntry($svdta['newRevision'], $svdta['id'], $svdta['changeType'], $svdta['summary'], $svdta['changeInfo']); + addLogEntry($svdta['newRevision'], $svdta['id'], $svdta['changeType'], $svdta['summary'], $svdta['changeInfo'], null, $svdta['sizechange']); + // send notify mails notify($svdta['id'], 'admin', $svdta['oldRevision'], $svdta['summary'], $minor); notify($svdta['id'], 'subscribers', $svdta['oldRevision'], $svdta['summary'], $minor); diff --git a/inc/html.php b/inc/html.php index c3cc66aa9d5fc3aad69251a17b2f38dc52e61d86..d578b867358f341477e2885bef43de227480a1e1 100644 --- a/inc/html.php +++ b/inc/html.php @@ -501,28 +501,61 @@ function html_revisions($first=0, $media_id = false){ array_pop($revisions); // remove extra log entry } - if (!$media_id) $date = dformat($INFO['lastmod']); - else $date = dformat(@filemtime(mediaFN($id))); - if (!$media_id) print p_locale_xhtml('revisions'); $params = array('id' => 'page__revisions', 'class' => 'changes'); - if ($media_id) $params['action'] = media_managerURL(array('image' => $media_id), '&'); + if($media_id) { + $params['action'] = media_managerURL(array('image' => $media_id), '&'); + } + + if(!$media_id) { + $exists = $INFO['exists']; + $display_name = useHeading('navigation') ? hsc(p_get_first_heading($id)) : $id; + if(!$display_name) { + $display_name = $id; + } + } else { + $exists = file_exists(mediaFN($id)); + $display_name = $id; + } $form = new Doku_Form($params); $form->addElement(form_makeOpenTag('ul')); - if (!$media_id) $exists = $INFO['exists']; - else $exists = file_exists(mediaFN($id)); + if($exists && $first == 0) { + $minor = false; + if($media_id) { + $date = dformat(@filemtime(mediaFN($id))); + $href = media_managerURL(array('image' => $id, 'tab_details' => 'view'), '&'); + + $changelog->setChunkSize(1024); + $revinfo = $changelog->getRevisionInfo(@filemtime(fullpath(mediaFN($id)))); - $display_name = (!$media_id && useHeading('navigation')) ? hsc(p_get_first_heading($id)) : $id; - if (!$display_name) $display_name = $id; + $summary = $revinfo['sum']; + if($revinfo['user']) { + $editor = $revinfo['user']; + } else { + $editor = $revinfo['ip']; + } + $sizechange = $revinfo['sizechange']; + } else { + $date = dformat($INFO['lastmod']); + if(isset($INFO['meta']) && isset($INFO['meta']['last_change'])) { + if($INFO['meta']['last_change']['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) { + $minor = true; + } + if(isset($INFO['meta']['last_change']['sizechange'])) { + $sizechange = $INFO['meta']['last_change']['sizechange']; + } else { + $sizechange = null; + } + } + $href = wl($id); + $summary = $INFO['sum']; + $editor = $INFO['editor']; + } - if($exists && $first==0){ - if (!$media_id && isset($INFO['meta']) && isset($INFO['meta']['last_change']) && $INFO['meta']['last_change']['type']===DOKU_CHANGE_TYPE_MINOR_EDIT) - $form->addElement(form_makeOpenTag('li', array('class' => 'minor'))); - else - $form->addElement(form_makeOpenTag('li')); + $form->addElement(form_makeOpenTag('li', array('class' => ($minor ? 'minor' : '')))); $form->addElement(form_makeOpenTag('div', array('class' => 'li'))); $form->addElement(form_makeTag('input', array( 'type' => 'checkbox', @@ -535,8 +568,6 @@ function html_revisions($first=0, $media_id = false){ $form->addElement('<img src="'.DOKU_BASE.'lib/images/blank.gif" width="15" height="11" alt="" />'); - if (!$media_id) $href = wl($id); - else $href = media_managerURL(array('image' => $id, 'tab_details' => 'view'), '&'); $form->addElement(form_makeOpenTag('a', array( 'class' => 'wikilink1', 'href' => $href))); @@ -545,28 +576,31 @@ function html_revisions($first=0, $media_id = false){ if ($media_id) $form->addElement(form_makeOpenTag('div')); - if (!$media_id) { + if($summary) { $form->addElement(form_makeOpenTag('span', array('class' => 'sum'))); - $form->addElement(' – '); - $form->addElement(htmlspecialchars($INFO['sum'])); + if(!$media_id) $form->addElement(' – '); + $form->addElement('<bdi>' . htmlspecialchars($summary) . '</bdi>'); $form->addElement(form_makeCloseTag('span')); } - $changelog->setChunkSize(1024); - $form->addElement(form_makeOpenTag('span', array('class' => 'user'))); - if($media_id) { - $revinfo = $changelog->getRevisionInfo(@filemtime(fullpath(mediaFN($id)))); - if($revinfo['user']) { - $editor = $revinfo['user']; - } else { - $editor = $revinfo['ip']; + $form->addElement((empty($editor))?('('.$lang['external_edit'].')'):'<bdi>'.editorinfo($editor).'</bdi>'); + $form->addElement(form_makeCloseTag('span')); + + if(isset($sizechange)) { + $class = 'sizechange'; + $value = filesize_h(abs($sizechange)); + if($sizechange > 0) { + $class .= ' positive'; + $value = '+' . $value; + } elseif($sizechange < 0) { + $class .= ' negative'; + $value = '-' . $value; } - } else { - $editor = $INFO['editor']; + $form->addElement(form_makeOpenTag('span', array('class' => $class))); + $form->addElement($value); + $form->addElement(form_makeCloseTag('span')); } - $form->addElement((empty($editor))?('('.$lang['external_edit'].')'):editorinfo($editor)); - $form->addElement(form_makeCloseTag('span')); $form->addElement('('.$lang['current'].')'); @@ -576,7 +610,7 @@ function html_revisions($first=0, $media_id = false){ $form->addElement(form_makeCloseTag('li')); } - foreach($revisions as $rev){ + foreach($revisions as $rev) { $date = dformat($rev); $info = $changelog->getRevisionInfo($rev); if($media_id) { @@ -585,10 +619,11 @@ function html_revisions($first=0, $media_id = false){ $exists = page_exists($id, $rev); } - if ($info['type']===DOKU_CHANGE_TYPE_MINOR_EDIT) - $form->addElement(form_makeOpenTag('li', array('class' => 'minor'))); - else - $form->addElement(form_makeOpenTag('li')); + $class = ''; + if($info['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) { + $class = 'minor'; + } + $form->addElement(form_makeOpenTag('li', array('class' => $class))); $form->addElement(form_makeOpenTag('div', array('class' => 'li'))); if($exists){ $form->addElement(form_makeTag('input', array( @@ -604,9 +639,14 @@ function html_revisions($first=0, $media_id = false){ $form->addElement(form_makeCloseTag('span')); if($exists){ - if (!$media_id) $href = wl($id,"rev=$rev,do=diff", false, '&'); - else $href = media_managerURL(array('image' => $id, 'rev' => $rev, 'mediado' => 'diff'), '&'); - $form->addElement(form_makeOpenTag('a', array('href' => $href, 'class' => 'diff_link'))); + if (!$media_id) { + $href = wl($id,"rev=$rev,do=diff", false, '&'); + } else { + $href = media_managerURL(array('image' => $id, 'rev' => $rev, 'mediado' => 'diff'), '&'); + } + $form->addElement(form_makeOpenTag('a', array( + 'class' => 'diff_link', + 'href' => $href))); $form->addElement(form_makeTag('img', array( 'src' => DOKU_BASE.'lib/images/diff.png', 'width' => 15, @@ -614,9 +654,15 @@ function html_revisions($first=0, $media_id = false){ 'title' => $lang['diff'], 'alt' => $lang['diff']))); $form->addElement(form_makeCloseTag('a')); - if (!$media_id) $href = wl($id,"rev=$rev",false,'&'); - else $href = media_managerURL(array('image' => $id, 'tab_details' => 'view', 'rev' => $rev), '&'); - $form->addElement(form_makeOpenTag('a', array('href' => $href, 'class' => 'wikilink1'))); + + if (!$media_id) { + $href = wl($id,"rev=$rev",false,'&'); + } else { + $href = media_managerURL(array('image' => $id, 'tab_details' => 'view', 'rev' => $rev), '&'); + } + $form->addElement(form_makeOpenTag('a', array( + 'class' => 'wikilink1', + 'href' => $href))); $form->addElement($display_name); $form->addElement(form_makeCloseTag('a')); }else{ @@ -628,7 +674,7 @@ function html_revisions($first=0, $media_id = false){ if ($info['sum']) { $form->addElement(form_makeOpenTag('span', array('class' => 'sum'))); - if (!$media_id) $form->addElement(' – '); + if(!$media_id) $form->addElement(' – '); $form->addElement('<bdi>'.htmlspecialchars($info['sum']).'</bdi>'); $form->addElement(form_makeCloseTag('span')); } @@ -644,6 +690,21 @@ function html_revisions($first=0, $media_id = false){ } $form->addElement(form_makeCloseTag('span')); + if(isset($info['sizechange'])) { + $class = 'sizechange'; + $value = filesize_h(abs($info['sizechange'])); + if($info['sizechange'] > 0) { + $class .= ' positive'; + $value = '+' . $value; + } elseif($info['sizechange'] < 0) { + $class .= ' negative'; + $value = '-' . $value; + } + $form->addElement(form_makeOpenTag('span', array('class' => $class))); + $form->addElement($value); + $form->addElement(form_makeCloseTag('span')); + } + if ($media_id) $form->addElement(form_makeCloseTag('div')); $form->addElement(form_makeCloseTag('div')); @@ -695,7 +756,7 @@ function html_revisions($first=0, $media_id = false){ * @param int $first * @param string $show_changes */ -function html_recent($first=0, $show_changes='both'){ +function html_recent($first = 0, $show_changes = 'both') { global $conf; global $lang; global $ID; @@ -704,48 +765,50 @@ function html_recent($first=0, $show_changes='both'){ * This is the cheapest solution to get this information. */ $flags = 0; - if ($show_changes == 'mediafiles' && $conf['mediarevisions']) { + if($show_changes == 'mediafiles' && $conf['mediarevisions']) { $flags = RECENTS_MEDIA_CHANGES; - } elseif ($show_changes == 'pages') { + } elseif($show_changes == 'pages') { $flags = 0; - } elseif ($conf['mediarevisions']) { + } elseif($conf['mediarevisions']) { $show_changes = 'both'; $flags = RECENTS_MEDIA_PAGES_MIXED; } - $recents = getRecents($first,$conf['recent'] + 1,getNS($ID),$flags); - if(count($recents) == 0 && $first != 0){ - $first=0; - $recents = getRecents($first,$conf['recent'] + 1,getNS($ID),$flags); + $recents = getRecents($first, $conf['recent'] + 1, getNS($ID), $flags); + if(count($recents) == 0 && $first != 0) { + $first = 0; + $recents = getRecents($first, $conf['recent'] + 1, getNS($ID), $flags); } $hasNext = false; - if (count($recents)>$conf['recent']) { + if(count($recents) > $conf['recent']) { $hasNext = true; array_pop($recents); // remove extra log entry } print p_locale_xhtml('recent'); - if (getNS($ID) != '') + if(getNS($ID) != '') { print '<div class="level1"><p>' . sprintf($lang['recent_global'], getNS($ID), wl('', 'do=recent')) . '</p></div>'; + } $form = new Doku_Form(array('id' => 'dw__recent', 'method' => 'GET', 'class' => 'changes')); $form->addHidden('sectok', null); $form->addHidden('do', 'recent'); $form->addHidden('id', $ID); - if ($conf['mediarevisions']) { + if($conf['mediarevisions']) { $form->addElement('<div class="changeType">'); $form->addElement(form_makeListboxField( 'show_changes', array( 'pages' => $lang['pages_changes'], 'mediafiles' => $lang['media_changes'], - 'both' => $lang['both_changes']), + 'both' => $lang['both_changes'] + ), $show_changes, $lang['changes_type'], - '','', - array('class'=>'quickselect'))); + '', '', + array('class' => 'quickselect'))); $form->addElement(form_makeButton('submit', 'recent', $lang['btn_apply'])); $form->addElement('</div>'); @@ -753,20 +816,21 @@ function html_recent($first=0, $show_changes='both'){ $form->addElement(form_makeOpenTag('ul')); - foreach($recents as $recent){ + foreach($recents as $recent) { $date = dformat($recent['date']); - if ($recent['type']===DOKU_CHANGE_TYPE_MINOR_EDIT) - $form->addElement(form_makeOpenTag('li', array('class' => 'minor'))); - else - $form->addElement(form_makeOpenTag('li')); + $class = ''; + if($recent['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) { + $class = 'minor'; + } + $form->addElement(form_makeOpenTag('li', array('class' => $class))); $form->addElement(form_makeOpenTag('div', array('class' => 'li'))); - if (!empty($recent['media'])) { + if(!empty($recent['media'])) { $form->addElement(media_printicon($recent['id'])); } else { - $icon = DOKU_BASE.'lib/images/fileicons/file.png'; - $form->addElement('<img src="'.$icon.'" alt="'.$recent['id'].'" class="icon" />'); + $icon = DOKU_BASE . 'lib/images/fileicons/file.png'; + $form->addElement('<img src="' . $icon . '" alt="' . $recent['id'] . '" class="icon" />'); } $form->addElement(form_makeOpenTag('span', array('class' => 'date'))); @@ -776,76 +840,94 @@ function html_recent($first=0, $show_changes='both'){ $diff = false; $href = ''; - if (!empty($recent['media'])) { + if(!empty($recent['media'])) { $changelog = new MediaChangeLog($recent['id']); $revs = $changelog->getRevisions(0, 1); $diff = (count($revs) && file_exists(mediaFN($recent['id']))); - if ($diff) { + if($diff) { $href = media_managerURL(array( - 'tab_details' => 'history', - 'mediado' => 'diff', - 'image' => $recent['id'], - 'ns' => getNS($recent['id']) - ), '&'); + 'tab_details' => 'history', + 'mediado' => 'diff', + 'image' => $recent['id'], + 'ns' => getNS($recent['id']) + ), '&'); } } else { - $href = wl($recent['id'],"do=diff", false, '&'); + $href = wl($recent['id'], "do=diff", false, '&'); } - if (!empty($recent['media']) && !$diff) { - $form->addElement('<img src="'.DOKU_BASE.'lib/images/blank.gif" width="15" height="11" alt="" />'); + if(!empty($recent['media']) && !$diff) { + $form->addElement('<img src="' . DOKU_BASE . 'lib/images/blank.gif" width="15" height="11" alt="" />'); } else { $form->addElement(form_makeOpenTag('a', array('class' => 'diff_link', 'href' => $href))); $form->addElement(form_makeTag('img', array( - 'src' => DOKU_BASE.'lib/images/diff.png', - 'width' => 15, - 'height'=> 11, - 'title' => $lang['diff'], - 'alt' => $lang['diff'] - ))); + 'src' => DOKU_BASE . 'lib/images/diff.png', + 'width' => 15, + 'height' => 11, + 'title' => $lang['diff'], + 'alt' => $lang['diff'] + ))); $form->addElement(form_makeCloseTag('a')); } - if (!empty($recent['media'])) { - $href = media_managerURL(array('tab_details' => 'history', - 'image' => $recent['id'], 'ns' => getNS($recent['id'])), '&'); + if(!empty($recent['media'])) { + $href = media_managerURL(array('tab_details' => 'history', 'image' => $recent['id'], 'ns' => getNS($recent['id'])), '&'); } else { - $href = wl($recent['id'],"do=revisions",false,'&'); + $href = wl($recent['id'], "do=revisions", false, '&'); } - $form->addElement(form_makeOpenTag('a', array('class' => 'revisions_link', 'href' => $href))); + $form->addElement(form_makeOpenTag('a', array( + 'class' => 'revisions_link', + 'href' => $href))); $form->addElement(form_makeTag('img', array( - 'src' => DOKU_BASE.'lib/images/history.png', - 'width' => 12, - 'height'=> 14, - 'title' => $lang['btn_revs'], - 'alt' => $lang['btn_revs'] - ))); + 'src' => DOKU_BASE . 'lib/images/history.png', + 'width' => 12, + 'height' => 14, + 'title' => $lang['btn_revs'], + 'alt' => $lang['btn_revs'] + ))); $form->addElement(form_makeCloseTag('a')); - if (!empty($recent['media'])) { + if(!empty($recent['media'])) { $href = media_managerURL(array('tab_details' => 'view', 'image' => $recent['id'], 'ns' => getNS($recent['id'])), '&'); - $class = (file_exists(mediaFN($recent['id']))) ? 'wikilink1' : $class = 'wikilink2'; - $form->addElement(form_makeOpenTag('a', array('class' => $class, 'href' => $href))); + $class = file_exists(mediaFN($recent['id'])) ? 'wikilink1' : 'wikilink2'; + $form->addElement(form_makeOpenTag('a', array( + 'class' => $class, + 'href' => $href))); $form->addElement($recent['id']); $form->addElement(form_makeCloseTag('a')); } else { - $form->addElement(html_wikilink(':'.$recent['id'],useHeading('navigation')?null:$recent['id'])); + $form->addElement(html_wikilink(':' . $recent['id'], useHeading('navigation') ? null : $recent['id'])); } $form->addElement(form_makeOpenTag('span', array('class' => 'sum'))); - $form->addElement(' – '.htmlspecialchars($recent['sum'])); + $form->addElement(' – ' . htmlspecialchars($recent['sum'])); $form->addElement(form_makeCloseTag('span')); $form->addElement(form_makeOpenTag('span', array('class' => 'user'))); - if($recent['user']){ - $form->addElement('<bdi>'.editorinfo($recent['user']).'</bdi>'); - if(auth_ismanager()){ - $form->addElement(' <bdo dir="ltr">('.$recent['ip'].')</bdo>'); + if($recent['user']) { + $form->addElement('<bdi>' . editorinfo($recent['user']) . '</bdi>'); + if(auth_ismanager()) { + $form->addElement(' <bdo dir="ltr">(' . $recent['ip'] . ')</bdo>'); } - }else{ - $form->addElement('<bdo dir="ltr">'.$recent['ip'].'</bdo>'); + } else { + $form->addElement('<bdo dir="ltr">' . $recent['ip'] . '</bdo>'); } $form->addElement(form_makeCloseTag('span')); + if(isset($recent['sizechange'])) { + $class = 'sizechange'; + $value = filesize_h(abs($recent['sizechange'])); + if($recent['sizechange'] > 0) { + $class .= ' positive'; + $value = '+' . $value; + } elseif($recent['sizechange'] < 0) { + $class .= ' negative'; + $value = '-' . $value; + } + $form->addElement(form_makeOpenTag('span', array('class' => $class))); + $form->addElement($value); + $form->addElement(form_makeCloseTag('span')); + } + $form->addElement(form_makeCloseTag('div')); $form->addElement(form_makeCloseTag('li')); } @@ -853,30 +935,30 @@ function html_recent($first=0, $show_changes='both'){ $form->addElement(form_makeOpenTag('div', array('class' => 'pagenav'))); $last = $first + $conf['recent']; - if ($first > 0) { + if($first > 0) { $first -= $conf['recent']; - if ($first < 0) $first = 0; + if($first < 0) $first = 0; $form->addElement(form_makeOpenTag('div', array('class' => 'pagenav-prev'))); $form->addElement(form_makeOpenTag('button', array( - 'type' => 'submit', - 'name' => 'first['.$first.']', - 'accesskey' => 'n', - 'title' => $lang['btn_newer'].' [N]', - 'class' => 'button show' + 'type' => 'submit', + 'name' => 'first[' . $first . ']', + 'accesskey' => 'n', + 'title' => $lang['btn_newer'] . ' [N]', + 'class' => 'button show' ))); $form->addElement($lang['btn_newer']); $form->addElement(form_makeCloseTag('button')); $form->addElement(form_makeCloseTag('div')); } - if ($hasNext) { + if($hasNext) { $form->addElement(form_makeOpenTag('div', array('class' => 'pagenav-next'))); $form->addElement(form_makeOpenTag('button', array( - 'type' => 'submit', - 'name' => 'first['.$last.']', + 'type' => 'submit', + 'name' => 'first[' . $last . ']', 'accesskey' => 'p', - 'title' => $lang['btn_older'].' [P]', - 'class' => 'button show' - ))); + 'title' => $lang['btn_older'] . ' [P]', + 'class' => 'button show' + ))); $form->addElement($lang['btn_older']); $form->addElement(form_makeCloseTag('button')); $form->addElement(form_makeCloseTag('div')); diff --git a/inc/io.php b/inc/io.php index 066030c89a5dc339bb62861df7f23cab17c7df5f..8d3407f8da72823ae05b51810fffb82356ddc784 100644 --- a/inc/io.php +++ b/inc/io.php @@ -776,3 +776,46 @@ function io_grep($file,$pattern,$max=0,$backref=false){ return $matches; } + +/** + * Get size of contents of a file, for a compressed file the uncompressed size + * Warning: reading uncompressed size of content of bz-files requires uncompressing + * + * @author Gerrit Uitslag <klapinklapin@gmail.com> + * + * @param string $file filename path to file + * @return int size of file + */ +function io_getSizeFile($file) { + if (!file_exists($file)) return 0; + + if(substr($file,-3) == '.gz'){ + $fp = @fopen($file, "rb"); + if($fp === false) return 0; + + fseek($fp, -4, SEEK_END); + $buffer = fread($fp, 4); + fclose($fp); + $array = unpack("V", $buffer); + $uncompressedsize = end($array); + }else if(substr($file,-4) == '.bz2'){ + if(!DOKU_HAS_BZIP) return 0; + + $bz = bzopen($file,"r"); + if($bz === false) return 0; + + $uncompressedsize = 0; + while (!feof($bz)) { + //8192 seems to be the maximum buffersize? + $buffer = bzread($bz,8192); + if(($buffer === false) || (bzerrno($bz) !== 0)) { + return 0; + } + $uncompressedsize += strlen($buffer); + } + }else{ + $uncompressedsize = filesize($file); + } + + return $uncompressedsize; + } diff --git a/inc/media.php b/inc/media.php index e9fff14895e09fd7de578461f021a44a4aad6e53..e103bdf04de9b66f162813d251fdd17afa40deac 100644 --- a/inc/media.php +++ b/inc/media.php @@ -74,13 +74,16 @@ function media_metasave($id,$auth,$data){ // add old revision to the attic media_saveOldRevision($id); } - + $filesize_old = filesize($src); if($meta->save()){ if($conf['fperm']) chmod($src, $conf['fperm']); - + @clearstatcache(true, $src); $new = @filemtime($src); + $filesize_new = filesize($src); + $sizechange = $filesize_new - $filesize_old; + // add a log entry to the media changelog - addMediaLogEntry($new, $id, DOKU_CHANGE_TYPE_EDIT, $lang['media_meta_edited']); + addMediaLogEntry($new, $id, DOKU_CHANGE_TYPE_EDIT, $lang['media_meta_edited'], '', null, $sizechange); msg($lang['metasaveok'],1); return $id; @@ -254,9 +257,11 @@ function media_delete($id,$auth){ } $data['unl'] = @unlink($file); - if($data['unl']){ - addMediaLogEntry(time(), $id, DOKU_CHANGE_TYPE_DELETE, $lang['deleted']); - $data['del'] = io_sweepNS($id,'mediadir'); + if($data['unl']) { + $sizechange = 0 - $data['size']; + addMediaLogEntry(time(), $id, DOKU_CHANGE_TYPE_DELETE, $lang['deleted'], '', null, $sizechange); + + $data['del'] = io_sweepNS($id, 'mediadir'); } } $evt->advise_after(); @@ -505,6 +510,8 @@ function media_upload_finish($fn_tmp, $fn, $id, $imime, $overwrite, $move = 'mov // prepare directory io_createNamespace($id, 'media'); + $filesize_old = file_exists($fn) ? filesize($fn) : 0; + if($move($fn_tmp, $fn)) { @clearstatcache(true,$fn); $new = @filemtime($fn); @@ -515,12 +522,14 @@ function media_upload_finish($fn_tmp, $fn, $id, $imime, $overwrite, $move = 'mov msg($lang['uploadsucc'],1); media_notify($id,$fn,$imime,$old); // add a log entry to the media changelog - if ($REV){ - addMediaLogEntry($new, $id, DOKU_CHANGE_TYPE_REVERT, sprintf($lang['restored'], dformat($REV)), $REV); - } elseif ($overwrite) { - addMediaLogEntry($new, $id, DOKU_CHANGE_TYPE_EDIT); + $filesize_new = filesize($fn); + $sizechange = $filesize_new - $filesize_old; + if($REV) { + addMediaLogEntry($new, $id, DOKU_CHANGE_TYPE_REVERT, sprintf($lang['restored'], dformat($REV)), $REV, null, $sizechange); + } elseif($overwrite) { + addMediaLogEntry($new, $id, DOKU_CHANGE_TYPE_EDIT, '', '', null, $sizechange); } else { - addMediaLogEntry($new, $id, DOKU_CHANGE_TYPE_CREATE, $lang['created']); + addMediaLogEntry($new, $id, DOKU_CHANGE_TYPE_CREATE, $lang['created'], '', null, $sizechange); } return $id; }else{ @@ -549,10 +558,16 @@ function media_saveOldRevision($id){ if (!$medialog->getRevisionInfo($date)) { // there was an external edit, // there is no log entry for current version of file - if (!file_exists(mediaMetaFN($id,'.changes'))) { - addMediaLogEntry($date, $id, DOKU_CHANGE_TYPE_CREATE, $lang['created']); + $sizechange = filesize($oldf); + if(!file_exists(mediaMetaFN($id, '.changes'))) { + addMediaLogEntry($date, $id, DOKU_CHANGE_TYPE_CREATE, $lang['created'], '', null, $sizechange); } else { - addMediaLogEntry($date, $id, DOKU_CHANGE_TYPE_EDIT); + $oldRev = $medialog->getRevisions(-1, 1); // from changelog + $oldRev = (int) (empty($oldRev) ? 0 : $oldRev[0]); + $filesize_old = filesize(mediaFN($id, $oldRev)); + $sizechange = $sizechange - $filesize_old; + + addMediaLogEntry($date, $id, DOKU_CHANGE_TYPE_EDIT, '', '', null, $sizechange); } } diff --git a/lib/tpl/dokuwiki/css/_recent.css b/lib/tpl/dokuwiki/css/_recent.css index d73bb9463c432b7934a47c4dff412aaea35785b4..eaa565838ab6ecb90568a272ecc886306873b023 100644 --- a/lib/tpl/dokuwiki/css/_recent.css +++ b/lib/tpl/dokuwiki/css/_recent.css @@ -45,6 +45,22 @@ .dokuwiki form.changes li span.user { } +/*____________ size differences ____________*/ + +.dokuwiki li .sizechange { + font-size: 80%; + border-radius: 0.2em; + padding: 0.1em 0.2em +} + +.dokuwiki li .sizechange.positive { + background-color: #cfc;; +} + +.dokuwiki li .sizechange.negative { + background-color: #fdd; +} + /*____________ page navigator ____________*/