From e56947255e0760c6c560fa15f67468c966919685 Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Thu, 10 Oct 2013 14:43:40 +0200 Subject: [PATCH 1/6] don't use glob() and getLocalFile(), this can lead to problems on windows servers --- apps/files_versions/lib/versions.php | 146 +++++++++++---------------- 1 file changed, 61 insertions(+), 85 deletions(-) diff --git a/apps/files_versions/lib/versions.php b/apps/files_versions/lib/versions.php index fc8d0365c7..4ad272e43c 100644 --- a/apps/files_versions/lib/versions.php +++ b/apps/files_versions/lib/versions.php @@ -238,60 +238,35 @@ class Storage { * @param $filename file to find versions of, relative to the user files dir * @returns array */ - public static function getVersions($uid, $filename ) { - if( \OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true' ) { - $versions_fileview = new \OC\Files\View('/' . $uid . '/files_versions'); - $versionsName = $versions_fileview->getLocalFile($filename).'.v'; - $escapedVersionName = preg_replace('/(\*|\?|\[)/', '[$1]', $versionsName); + public static function getVersions($uid, $filename) { + $versions = array(); + // fetch for old versions + $view = new \OC\Files\View('/' . $uid . '/files_versions/'); + $files = $view->getDirectoryContent(dirname($filename)); - $versions = array(); - // fetch for old versions - $matches = glob($escapedVersionName.'*'); + $versionedFile = pathinfo($filename, PATHINFO_BASENAME); - if ( !$matches ) { - return $versions; - } - - sort( $matches ); - - $files_view = new \OC\Files\View('/'.$uid.'/files'); - $local_file = $files_view->getLocalFile($filename); - $local_file_md5 = \md5_file( $local_file ); - - foreach( $matches as $ma ) { - $parts = explode( '.v', $ma ); - $version = ( end( $parts ) ); - $key = $version.'#'.$filename; - $versions[$key]['cur'] = 0; - $versions[$key]['version'] = $version; - $versions[$key]['humanReadableTimestamp'] = self::getHumanReadableTimestamp($version); - $versions[$key]['path'] = $filename; - $versions[$key]['preview'] = \OCP\Util::linkToRoute('core_ajax_versions_preview', array('file' => $filename, 'version' => $version)); - $versions[$key]['size'] = $versions_fileview->filesize($filename.'.v'.$version); - - // if file with modified date exists, flag it in array as currently enabled version - ( \md5_file( $ma ) == $local_file_md5 ? $versions[$key]['fileMatch'] = 1 : $versions[$key]['fileMatch'] = 0 ); - - } - - // newest versions first - $versions = array_reverse( $versions ); - - foreach( $versions as $key => $value ) { - // flag the first matched file in array (which will have latest modification date) as current version - if ( $value['fileMatch'] ) { - $value['cur'] = 1; - break; + foreach ($files as $file) { + if ($file['type'] === 'file') { + $pos = strrpos($file['path'], '.v'); + $length = $pos - strlen('files_versions/'); + if (substr($file['path'], strlen('files_versions/'), $length) === $versionedFile) { + $version = substr($file['path'], $pos + 2); + $key = $version . '#' . $filename; + $versions[$key]['cur'] = 0; + $versions[$key]['version'] = $version; + $versions[$key]['humanReadableTimestamp'] = self::getHumanReadableTimestamp($version); + $versions[$key]['path'] = $filename; + $versions[$key]['size'] = $file['size']; } } - - return( $versions ); - - } else { - // if versioning isn't enabled then return an empty array - return( array() ); } + // sort with oldest version first + ksort($versions); + + // return newest versions first + return array_reverse($versions); } /** @@ -366,48 +341,49 @@ class Storage { * @return array with contains two arrays 'all' which contains all versions sorted by age and 'by_file' which contains all versions sorted by filename */ private static function getAllVersions($uid) { - if( \OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true' ) { - $versions_fileview = new \OC\Files\View('/'.$uid.'/files_versions'); - $versionsRoot = $versions_fileview->getLocalFolder(''); + $view = new \OC\Files\View('/' . $uid . '/'); + $versionsPath = 'files_versions/'; + $dirs = array($versionsPath); - $iterator = new \RecursiveIteratorIterator( - new \RecursiveDirectoryIterator($versionsRoot), - \RecursiveIteratorIterator::CHILD_FIRST - ); + while (!empty($dirs)) { + $dir = array_pop($dirs); + $files = $view->getDirectoryContent($dir); - $versions = array(); - - foreach ($iterator as $path) { - if ( preg_match('/^.+\.v(\d+)$/', $path, $match) ) { - $relpath = substr($path, strlen($versionsRoot)-1); - $versions[$match[1].'#'.$relpath] = array('path' => $relpath, 'timestamp' => $match[1]); + foreach ($files as $file) { + if ($file['type'] === 'dir') { + array_push($dirs, $file['path']); + } else { + $versionsBegin = strrpos($file['path'], '.v'); + $relPathStart = strlen($versionsPath); + $version = substr($file['path'], $versionsBegin + 2); + $relpath = substr($file['path'], $relPathStart, $versionsBegin - $relPathStart); + $key = $version . '#' . $relpath; + $versions[$key] = array('path' => $relpath, 'timestamp' => $version); } } - - ksort($versions); - - $i = 0; - - $result = array(); - - foreach( $versions as $key => $value ) { - $i++; - $size = $versions_fileview->filesize($value['path']); - $filename = substr($value['path'], 0, -strlen($value['timestamp'])-2); - - $result['all'][$key]['version'] = $value['timestamp']; - $result['all'][$key]['path'] = $filename; - $result['all'][$key]['size'] = $size; - - $filename = substr($value['path'], 0, -strlen($value['timestamp'])-2); - $result['by_file'][$filename][$key]['version'] = $value['timestamp']; - $result['by_file'][$filename][$key]['path'] = $filename; - $result['by_file'][$filename][$key]['size'] = $size; - - } - - return $result; } + + ksort($versions); + + $i = 0; + + $result = array(); + + foreach ($versions as $key => $value) { + $i++; + $size = $view->filesize($value['path']); + $filename = $value['path']; + + $result['all'][$key]['version'] = $value['timestamp']; + $result['all'][$key]['path'] = $filename; + $result['all'][$key]['size'] = $size; + + $result['by_file'][$filename][$key]['version'] = $value['timestamp']; + $result['by_file'][$filename][$key]['path'] = $filename; + $result['by_file'][$filename][$key]['size'] = $size; + } + + return $result; } /** From bb3b38947d2b012b4fef0cdd32f62524b2c5898c Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Thu, 10 Oct 2013 14:57:25 +0200 Subject: [PATCH 2/6] add missing preview link --- apps/files_versions/lib/versions.php | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/files_versions/lib/versions.php b/apps/files_versions/lib/versions.php index 4ad272e43c..5b291dfa10 100644 --- a/apps/files_versions/lib/versions.php +++ b/apps/files_versions/lib/versions.php @@ -256,6 +256,7 @@ class Storage { $versions[$key]['cur'] = 0; $versions[$key]['version'] = $version; $versions[$key]['humanReadableTimestamp'] = self::getHumanReadableTimestamp($version); + $versions[$key]['preview'] = \OCP\Util::linkToRoute('core_ajax_versions_preview', array('file' => $filename, 'version' => $version)); $versions[$key]['path'] = $filename; $versions[$key]['size'] = $file['size']; } From 92009c5d8eb48d8ea89ab6ee803d8a47a7ff98c0 Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Thu, 10 Oct 2013 16:58:11 +0200 Subject: [PATCH 3/6] fix getVersions() for sub directories --- apps/files_versions/lib/versions.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/files_versions/lib/versions.php b/apps/files_versions/lib/versions.php index 5b291dfa10..8151324696 100644 --- a/apps/files_versions/lib/versions.php +++ b/apps/files_versions/lib/versions.php @@ -249,8 +249,9 @@ class Storage { foreach ($files as $file) { if ($file['type'] === 'file') { $pos = strrpos($file['path'], '.v'); - $length = $pos - strlen('files_versions/'); - if (substr($file['path'], strlen('files_versions/'), $length) === $versionedFile) { + $length = $pos - strlen('files_versions/'.dirname($filename)); + $currentFile = substr($file['name'], 0, strrpos($file['name'], '.v')); + if ($currentFile === $versionedFile) { $version = substr($file['path'], $pos + 2); $key = $version . '#' . $filename; $versions[$key]['cur'] = 0; From 87cccb2e32a7e09f9df95b41909964bad5b4acb7 Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Thu, 10 Oct 2013 20:06:42 +0200 Subject: [PATCH 4/6] some small changes/fixes --- apps/files_versions/lib/versions.php | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/apps/files_versions/lib/versions.php b/apps/files_versions/lib/versions.php index 8151324696..48c25831eb 100644 --- a/apps/files_versions/lib/versions.php +++ b/apps/files_versions/lib/versions.php @@ -242,14 +242,16 @@ class Storage { $versions = array(); // fetch for old versions $view = new \OC\Files\View('/' . $uid . '/files_versions/'); - $files = $view->getDirectoryContent(dirname($filename)); - $versionedFile = pathinfo($filename, PATHINFO_BASENAME); + $pathinfo = pathinfo($filename); + + $files = $view->getDirectoryContent($pathinfo['dirname']); + + $versionedFile = $pathinfo['basename']; foreach ($files as $file) { if ($file['type'] === 'file') { $pos = strrpos($file['path'], '.v'); - $length = $pos - strlen('files_versions/'.dirname($filename)); $currentFile = substr($file['name'], 0, strrpos($file['name'], '.v')); if ($currentFile === $versionedFile) { $version = substr($file['path'], $pos + 2); @@ -264,11 +266,10 @@ class Storage { } } - // sort with oldest version first - ksort($versions); + // sort with newest version first + krsort($versions); - // return newest versions first - return array_reverse($versions); + return $versions; } /** @@ -367,8 +368,6 @@ class Storage { ksort($versions); - $i = 0; - $result = array(); foreach ($versions as $key => $value) { From f4e86045dee9578e80cd323d7ea56823388dd4ec Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Thu, 10 Oct 2013 20:09:38 +0200 Subject: [PATCH 5/6] make files versions root a class constant --- apps/files_versions/lib/versions.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/files_versions/lib/versions.php b/apps/files_versions/lib/versions.php index 48c25831eb..7724221665 100644 --- a/apps/files_versions/lib/versions.php +++ b/apps/files_versions/lib/versions.php @@ -19,6 +19,7 @@ class Storage { const DEFAULTENABLED=true; const DEFAULTMAXSIZE=50; // unit: percentage; 50% of available disk space/quota + const VERSIONS_ROOT = 'files_versions/'; private static $max_versions_per_interval = array( //first 10sec, one version every 2sec @@ -241,7 +242,7 @@ class Storage { public static function getVersions($uid, $filename) { $versions = array(); // fetch for old versions - $view = new \OC\Files\View('/' . $uid . '/files_versions/'); + $view = new \OC\Files\View('/' . $uid . '/' . self::VERSIONS_ROOT); $pathinfo = pathinfo($filename); @@ -345,8 +346,7 @@ class Storage { */ private static function getAllVersions($uid) { $view = new \OC\Files\View('/' . $uid . '/'); - $versionsPath = 'files_versions/'; - $dirs = array($versionsPath); + $dirs = array(self::VERSIONS_ROOT); while (!empty($dirs)) { $dir = array_pop($dirs); From a0de5dd325fb9898a842733143fa36028cff1076 Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Fri, 11 Oct 2013 10:34:34 +0200 Subject: [PATCH 6/6] some small fixes --- apps/files_versions/lib/versions.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/files_versions/lib/versions.php b/apps/files_versions/lib/versions.php index 7724221665..dae2de83b8 100644 --- a/apps/files_versions/lib/versions.php +++ b/apps/files_versions/lib/versions.php @@ -357,7 +357,7 @@ class Storage { array_push($dirs, $file['path']); } else { $versionsBegin = strrpos($file['path'], '.v'); - $relPathStart = strlen($versionsPath); + $relPathStart = strlen(self::VERSIONS_ROOT); $version = substr($file['path'], $versionsBegin + 2); $relpath = substr($file['path'], $relPathStart, $versionsBegin - $relPathStart); $key = $version . '#' . $relpath; @@ -371,7 +371,6 @@ class Storage { $result = array(); foreach ($versions as $key => $value) { - $i++; $size = $view->filesize($value['path']); $filename = $value['path'];