}
}
- /**
- * @brief Erase versions of deleted file
- * @param array
- *
- * This function is connected to the delete signal of OC_Filesystem
- * cleanup the versions directory if the actual file gets deleted
- */
+
+ /**\r
+ * @brief Erase versions of deleted file\r
+ * @param array\r
+ *\r
+ * This function is connected to the delete signal of OC_Filesystem\r
+ * cleanup the versions directory if the actual file gets deleted\r
+ */\r
public static function remove_hook($params) {
- $rel_path = $params['path'];
- $abs_path = \OCP\Config::getSystemValue('datadirectory').'/'.\OCP\User::getUser()."/versions".$rel_path.'.v';
- if(Storage::isversioned($rel_path)) {
- $versions = Storage::getVersions($rel_path);
- foreach ($versions as $v){
- unlink($abs_path . $v['version']);
- }
- }
- }
-
- /**
- * @brief rename/move versions of renamed/moved files
- * @param array with oldpath and newpath
- *
- * This function is connected to the rename signal of OC_Filesystem and adjust the name and location
- * of the stored versions along the actual file
- */
+ $versions_fileview = \OCP\Files::getStorage('files_versions');\r
+ $rel_path = $params['path'];\r
+ $abs_path = \OCP\Config::getSystemValue('datadirectory').$versions_fileview->getAbsolutePath('').$rel_path.'.v';\r
+ if(Storage::isversioned($rel_path)) {\r
+ $versions = Storage::getVersions($rel_path);\r
+ foreach ($versions as $v){\r
+ unlink($abs_path . $v['version']);\r
+ }\r
+ }\r
+ }\r
+ \r
+ /**\r
+ * @brief rename/move versions of renamed/moved files\r
+ * @param array with oldpath and newpath\r
+ *\r
+ * This function is connected to the rename signal of OC_Filesystem and adjust the name and location\r
+ * of the stored versions along the actual file\r
+ */\r
public static function rename_hook($params) {
- $rel_oldpath = $params['oldpath'];
- $abs_oldpath = \OCP\Config::getSystemValue('datadirectory').'/'.\OCP\User::getUser()."/versions".$rel_oldpath.'.v';
- $abs_newpath = \OCP\Config::getSystemValue('datadirectory').'/'.\OCP\User::getUser()."/versions".$params['newpath'].'.v';
+ $versions_fileview = \OCP\Files::getStorage('files_versions');\r
+ $rel_oldpath = $params['oldpath'];\r
+ $abs_oldpath = \OCP\Config::getSystemValue('datadirectory').$versions_fileview->getAbsolutePath('').$rel_oldpath.'.v';\r
+ $abs_newpath = \OCP\Config::getSystemValue('datadirectory').$versions_fileview->getAbsolutePath('').$params['newpath'].'.v';\r
if(Storage::isversioned($rel_oldpath)) {
- $versions = Storage::getVersions($rel_oldpath);
- foreach ($versions as $v){
- rename($abs_oldpath.$v['version'], $abs_newpath.$v['version']);
- }
- }
+ $info=pathinfo($abs_newpath);\r
+ if(!file_exists($info['dirname'])) mkdir($info['dirname'],0700,true);\r
+ $versions = Storage::getVersions($rel_oldpath);\r
+ foreach ($versions as $v){\r
+ rename($abs_oldpath.$v['version'], $abs_newpath.$v['version']);\r
+ }\r
+ }\r
}
}
// - files_versionsfolder\r
// - files_versionsblacklist\r
// - files_versionsmaxfilesize\r
- // - files_versionsinterval \r
- // - files_versionmaxversions \r
+ // - files_versionsinterval\r
+ // - files_versionmaxversions\r
//\r
// todo:\r
// - finish porting to OC_FilesystemView to enable network transparency\r
// - add transparent compression. first test if it´s worth it.\r
\r
- const DEFAULTENABLED=true; \r
- const DEFAULTFOLDER='versions'; \r
- const DEFAULTBLACKLIST='avi mp3 mpg mp4 ctmp'; \r
- const DEFAULTMAXFILESIZE=1048576; // 10MB \r
+ const DEFAULTENABLED=true;\r
+ const DEFAULTBLACKLIST='avi mp3 mpg mp4 ctmp';\r
+ const DEFAULTMAXFILESIZE=1048576; // 10MB\r
const DEFAULTMININTERVAL=60; // 1 min\r
const DEFAULTMAXVERSIONS=50;\r
- \r
+\r
private $view;\r
- \r
- function __construct( $view ) {\r
- \r
- $this->view = $view;\r
- \r
- }\r
\r
- /**\r
- * init the versioning and create the versions folder.\r
- */\r
- public static function init() {\r
- if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') {\r
- // create versions folder\r
- $foldername=\OCP\Config::getSystemValue('datadirectory').'/'. \OCP\USER::getUser() .'/'.\OCP\Config::getSystemValue('files_versionsfolder', Storage::DEFAULTFOLDER);\r
- if(!is_dir($foldername)){\r
- mkdir($foldername);\r
- }\r
- }\r
- }\r
+ function __construct() {\r
+\r
+ $this->view = \OCP\Files::getStorage('files_versions');\r
\r
+ }\r
\r
/**\r
* listen to write event.\r
*/\r
public function store($filename) {\r
if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') {\r
- \r
+\r
$files_view = \OCP\Files::getStorage("files");\r
$users_view = \OCP\Files::getStorage("files_versions");\r
$users_view->chroot(\OCP\User::getUser().'/');\r
- \r
+ \r
if (\OCP\App::isEnabled('files_sharing') && $source = \OC_Share::getSource('/'.\OCP\User::getUser().'/files'.$filename)) {\r
$pos = strpos($source, '/files', 1);\r
$uid = substr($source, 1, $pos - 1);\r
} else {\r
$uid = \OCP\User::getUser();\r
}\r
- $versionsFolderName=\OCP\Config::getSystemValue('datadirectory').'/'. $uid .'/'.\OCP\Config::getSystemValue('files_versionsfolder', Storage::DEFAULTFOLDER);\r
- $filesfoldername=\OCP\Config::getSystemValue('datadirectory').'/'. $uid .'/files';\r
- Storage::init();\r
-\r
+ \r
+ $versionsFolderName=\OCP\Config::getSystemValue('datadirectory') . $this->view->getAbsolutePath('');\r
+ \r
//check if source file already exist as version to avoid recursions.\r
if ($users_view->file_exists($filename)) {\r
return false;\r
}\r
- \r
+ \r
// check if filename is a directory\r
if($files_view->is_dir($filename)){\r
return false;\r
return false;\r
}\r
}\r
- \r
+ \r
// check filesize\r
if($files_view->filesize($filename)>\OCP\Config::getSystemValue('files_versionsmaxfilesize', Storage::DEFAULTMAXFILESIZE)){\r
return false;\r
\r
\r
// create all parent folders\r
- $info=pathinfo($filename); \r
- if(!file_exists($versionsFolderName.'/'.$info['dirname'])) mkdir($versionsFolderName.'/'.$info['dirname'],0700,true); \r
+ $info=pathinfo($filename);\r
+ if(!file_exists($versionsFolderName.'/'.$info['dirname'])) mkdir($versionsFolderName.'/'.$info['dirname'],0700,true);\r
\r
// store a new version of a file\r
- @$users_view->copy('files'.$filename, 'versions'.$filename.'.v'.time());\r
- \r
+ @$users_view->copy('files'.$filename, 'files_versions'.$filename.'.v'.time());\r
+\r
// expire old revisions if necessary\r
Storage::expire($filename);\r
}\r
* rollback to an old version of a file.\r
*/\r
public static function rollback($filename,$revision) {\r
- \r
+\r
if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') {\r
$users_view = \OCP\Files::getStorage("files_versions");\r
$users_view->chroot(\OCP\User::getUser().'/');\r
- \r
+ \r
if (\OCP\App::isEnabled('files_sharing') && $source = \OC_Share::getSource('/'.\OCP\User::getUser().'/files'.$filename)) {\r
$pos = strpos($source, '/files', 1);\r
$uid = substr($source, 1, $pos - 1);\r
} else {\r
$uid = \OCP\User::getUser();\r
}\r
- $versionsFolderName=\OCP\Config::getSystemValue('datadirectory').'/'.$uid .'/'.\OCP\Config::getSystemValue('files_versionsfolder', Storage::DEFAULTFOLDER);\r
- \r
- $filesfoldername=\OCP\Config::getSystemValue('datadirectory').'/'. $uid .'/files';\r
- \r
+ \r
// rollback\r
- if( @$users_view->copy('versions'.$filename.'.v'.$revision, 'files'.$filename) ) {\r
- \r
+ if( @$users_view->copy('files_versions'.$filename.'.v'.$revision, 'files'.$filename) ) {\r
+ \r
return true;\r
- \r
+\r
}else{\r
- \r
+ \r
return false;\r
- \r
+\r
}\r
- \r
+ \r
}\r
- \r
+\r
}\r
\r
/**\r
*/\r
public static function isversioned($filename) {\r
if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') {\r
+ $versions_fileview = \OCP\Files::getStorage("files_versions");\r
if (\OCP\App::isEnabled('files_sharing') && $source = \OC_Share::getSource('/'.\OCP\User::getUser().'/files'.$filename)) {\r
$pos = strpos($source, '/files', 1);\r
- $uid = substr($source, 1, $pos - 1);\r
$filename = substr($source, $pos + 6);\r
- } else {\r
- $uid = \OCP\User::getUser();\r
}\r
- $versionsFolderName=\OCP\Config::getSystemValue('datadirectory').'/'. $uid .'/'.\OCP\Config::getSystemValue('files_versionsfolder', Storage::DEFAULTFOLDER);\r
\r
+ $versionsFolderName=\OCP\Config::getSystemValue('datadirectory'). $versions_fileview->getAbsolutePath('');\r
+ \r
// check for old versions\r
- $matches=glob($versionsFolderName.'/'.$filename.'.v*');\r
- if(count($matches)>1){\r
+ $matches=glob($versionsFolderName.$filename.'.v*');\r
+ if(count($matches)>0){\r
return true;\r
}else{\r
return false;\r
}\r
\r
\r
- \r
- /**\r
- * @brief get a list of all available versions of a file in descending chronological order\r
- * @param $filename file to find versions of, relative to the user files dir\r
- * @param $count number of versions to return\r
- * @returns array\r
- */\r
- public static function getVersions( $filename, $count = 0 ) {\r
- \r
- if( \OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true' ) {\r
- \r
+\r
+ /**\r
+ * @brief get a list of all available versions of a file in descending chronological order\r
+ * @param $filename file to find versions of, relative to the user files dir\r
+ * @param $count number of versions to return\r
+ * @returns array\r
+ */\r
+ public static function getVersions( $filename, $count = 0 ) {\r
+\r
+ if( \OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true' ) {\r
+\r
if (\OCP\App::isEnabled('files_sharing') && $source = \OC_Share::getSource('/'.\OCP\User::getUser().'/files'.$filename)) {\r
$pos = strpos($source, '/files', 1);\r
$uid = substr($source, 1, $pos - 1);\r
} else {\r
$uid = \OCP\User::getUser();\r
}\r
- $versionsFolderName = \OCP\Config::getSystemValue('datadirectory').'/'. $uid .'/'.\OCP\Config::getSystemValue('files_versionsfolder', Storage::DEFAULTFOLDER);\r
- $versions = array(); \r
- \r
+ $versions_fileview = \OCP\Files::getStorage('files_versions');\r
+ $versionsFolderName = \OCP\Config::getSystemValue('datadirectory'). $versions_fileview->getAbsolutePath('');\r
+ $versions = array();\r
+ \r
// fetch for old versions\r
$matches = glob( $versionsFolderName.'/'.$filename.'.v*' );\r
- \r
+ \r
sort( $matches );\r
- \r
+ \r
$i = 0;\r
- \r
- foreach( $matches as $ma ) {\r
\r
+ $files_view = \OCP\Files::getStorage('files');\r
+ $local_file = $files_view->getLocalFile($filename);\r
+ foreach( $matches as $ma ) {\r
+\r
$i++;\r
$versions[$i]['cur'] = 0;\r
$parts = explode( '.v', $ma );\r
$versions[$i]['version'] = ( end( $parts ) );\r
- \r
+\r
// if file with modified date exists, flag it in array as currently enabled version\r
- $files_view = \OCP\Files::getStorage('files');\r
- $local_file = $files_view->getLocalFile($filename);\r
( \md5_file( $ma ) == \md5_file( $local_file ) ? $versions[$i]['fileMatch'] = 1 : $versions[$i]['fileMatch'] = 0 );\r
- \r
+\r
}\r
- \r
+ \r
$versions = array_reverse( $versions );\r
- \r
- foreach( $versions as $key => $value ) {\r
\r
+ foreach( $versions as $key => $value ) {\r
+\r
// flag the first matched file in array (which will have latest modification date) as current version\r
if ( $versions[$key]['fileMatch'] ) {\r
- \r
+\r
$versions[$key]['cur'] = 1;\r
break;\r
- \r
+ \r
}\r
- \r
+ \r
}\r
- \r
+ \r
$versions = array_reverse( $versions );\r
- \r
+ \r
// only show the newest commits\r
if( $count != 0 and ( count( $versions )>$count ) ) {\r
- \r
+ \r
$versions = array_slice( $versions, count( $versions ) - $count );\r
- \r
+\r
}\r
- \r
+\r
return( $versions );\r
\r
\r
- } else {\r
- \r
+ } else {\r
+\r
// if versioning isn't enabled then return an empty array\r
- return( array() );\r
- \r
- }\r
- \r
- }\r
-\r
- /**\r
- * @brief Erase a file's versions which exceed the set quota\r
- */\r
- public static function expire($filename) {\r
- if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') {\r
+ return( array() );\r
+\r
+ }\r
+\r
+ }\r
+\r
+ /**\r
+ * @brief Erase a file's versions which exceed the set quota\r
+ */\r
+ public static function expire($filename) {\r
+ if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') {\r
\r
if (\OCP\App::isEnabled('files_sharing') && $source = \OC_Share::getSource('/'.\OCP\User::getUser().'/files'.$filename)) {\r
$pos = strpos($source, '/files', 1);\r
} else {\r
$uid = \OCP\User::getUser();\r
}\r
- $versionsFolderName=\OCP\Config::getSystemValue('datadirectory').'/'. $uid .'/'.\OCP\Config::getSystemValue('files_versionsfolder', Storage::DEFAULTFOLDER);\r
+ $versions_fileview = \OCP\Files::getStorage("files_versions");\r
+ $versionsFolderName=\OCP\Config::getSystemValue('datadirectory'). $versions_fileview->getAbsolutePath('');\r
\r
// check for old versions\r
$matches = glob( $versionsFolderName.'/'.$filename.'.v*' );\r
- \r
+ \r
if( count( $matches ) > \OCP\Config::getSystemValue( 'files_versionmaxversions', Storage::DEFAULTMAXVERSIONS ) ) {\r
- \r
+ \r
$numberToDelete = count( $matches-\OCP\Config::getSystemValue( 'files_versionmaxversions', Storage::DEFAULTMAXVERSIONS ) );\r
\r
// delete old versions of a file\r
$deleteItems = array_slice( $matches, 0, $numberToDelete );\r
- \r
+\r
foreach( $deleteItems as $de ) {\r
- \r
+\r
unlink( $versionsFolderName.'/'.$filename.'.v'.$de );\r
- \r
+ \r
}\r
}\r
- }\r
- }\r
-\r
- /**\r
- * @brief Erase all old versions of all user files\r
- * @return true/false\r
- */\r
- public function expireAll() {\r
- \r
- $dir = \OCP\Config::getSystemValue('files_versionsfolder', Storage::DEFAULTFOLDER);\r
- \r
- return $this->view->deleteAll( $dir, true );\r
- \r
- }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * @brief Erase all old versions of all user files\r
+ * @return true/false\r
+ */\r
+ public function expireAll() {\r
+ return $this->view->deleteAll('', true);\r
+ }\r
}\r