diff --git a/DBV.php b/DBV.php
index c1ede13..8ec45cf 100644
--- a/DBV.php
+++ b/DBV.php
@@ -36,431 +36,495 @@ class DBV_Exception extends Exception
class DBV
{
- protected $_action = "index";
- protected $_adapter;
- protected $_log = array();
-
- public function authenticate()
- {
- if (isset($_SERVER['HTTP_AUTHORIZATION'])) {
- $authorization = $_SERVER['HTTP_AUTHORIZATION'];
- } else {
- if (function_exists('apache_request_headers')) {
- $headers = apache_request_headers();
- $authorization = array_key_exists('HTTP_AUTHORIZATION', $headers)
- ? $headers['HTTP_AUTHORIZATION']
- : '';
- }
- }
-
- if ($authorization) {
- list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':', base64_decode(substr($authorization, 6)));
- }
- if (strlen(DBV_USERNAME) && strlen(DBV_PASSWORD) && (!isset($_SERVER['PHP_AUTH_USER']) || !($_SERVER['PHP_AUTH_USER'] == DBV_USERNAME && $_SERVER['PHP_AUTH_PW'] == DBV_PASSWORD))) {
- header('WWW-Authenticate: Basic realm="DBV interface"');
- header('HTTP/1.0 401 Unauthorized');
- echo __('Access denied');
- exit();
- }
- }
-
- /**
- * @return DBV_Adapter_Interface
- */
- protected function _getAdapter()
- {
- if (!$this->_adapter) {
- $file = DBV_ROOT_PATH . DS . 'lib' . DS . 'adapters' . DS . DB_ADAPTER . '.php';
- if (file_exists($file)) {
- require_once $file;
-
- $class = 'DBV_Adapter_' . DB_ADAPTER;
- if (class_exists($class)) {
- $adapter = new $class;
- try {
- $adapter->connect(DB_HOST, DB_PORT, DB_USERNAME, DB_PASSWORD, DB_NAME);
- $this->_adapter = $adapter;
- } catch (DBV_Exception $e) {
- $this->error("[{$e->getCode()}] " . $e->getMessage());
- }
- }
- }
- }
-
- return $this->_adapter;
- }
-
- public function dispatch()
- {
- $action = $this->_getAction() . "Action";
- $this->$action();
- }
-
- public function indexAction()
- {
- if ($this->_getAdapter()) {
- $this->schema = $this->_getSchema();
- $this->revisions = $this->_getRevisions();
- $this->revision = $this->_getCurrentRevision();
- }
-
- $this->_view("index");
- }
-
- public function schemaAction()
- {
- $items = isset($_POST['schema']) ? $_POST['schema'] : array();
-
- if ($this->_isXMLHttpRequest()) {
- if (!count($items)) {
- return $this->_json(array('error' => __("You didn't select any objects")));
- }
-
- foreach ($items as $item) {
- switch ($_POST['action']) {
- case 'create':
- $this->_createSchemaObject($item);
- break;
- case 'export':
- $this->_exportSchemaObject($item);
- break;
- }
- }
-
- $return = array('messages' => array());
- foreach ($this->_log as $message) {
- $return['messages'][$message['type']][] = $message['message'];
- }
-
- $return['items'] = $this->_getSchema();
-
- $this->_json($return);
- }
- }
-
- public function revisionsAction()
- {
- $revisions = isset($_POST['revisions']) ? array_filter($_POST['revisions'], 'is_numeric') : array();
- $current_revision = $this->_getCurrentRevision();
-
- if (count($revisions)) {
- sort($revisions);
-
- foreach ($revisions as $revision) {
- $files = $this->_getRevisionFiles($revision);
-
- if (count($files)) {
- foreach ($files as $file) {
- $file = DBV_REVISIONS_PATH . DS . $revision . DS . $file;
- if (!$this->_runFile($file)) {
- break 2;
- }
- }
- }
-
- if ($revision > $current_revision) {
- $this->_setCurrentRevision($revision);
- }
- $this->confirm(__("Executed revision #{revision}", array('revision' => "$revision")));
- }
- }
-
- if ($this->_isXMLHttpRequest()) {
- $return = array(
+ protected $_action = "index";
+ protected $_adapter;
+ protected $_log = array();
+
+ public function authenticate()
+ {
+ if (isset($_SERVER['HTTP_AUTHORIZATION'])) {
+ $authorization = $_SERVER['HTTP_AUTHORIZATION'];
+ } else {
+ if (function_exists('apache_request_headers')) {
+ $headers = apache_request_headers();
+ $authorization = array_key_exists('HTTP_AUTHORIZATION', $headers)
+ ? $headers['HTTP_AUTHORIZATION']
+ : '';
+ }
+ }
+
+ if ($authorization) {
+ list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':', base64_decode(substr($authorization, 6)));
+ }
+ if (strlen(DBV_USERNAME) && strlen(DBV_PASSWORD) && (!isset($_SERVER['PHP_AUTH_USER']) || !($_SERVER['PHP_AUTH_USER'] == DBV_USERNAME && $_SERVER['PHP_AUTH_PW'] == DBV_PASSWORD))) {
+ header('WWW-Authenticate: Basic realm="DBV interface"');
+ header('HTTP/1.0 401 Unauthorized');
+ echo __('Access denied');
+ exit();
+ }
+ }
+
+ /**
+ * @return DBV_Adapter_Interface
+ */
+ protected function _getAdapter()
+ {
+ if (!$this->_adapter) {
+ $file = DBV_ROOT_PATH . DS . 'lib' . DS . 'adapters' . DS . DB_ADAPTER . '.php';
+ if (file_exists($file)) {
+ require_once $file;
+
+ $class = 'DBV_Adapter_' . DB_ADAPTER;
+ if (class_exists($class)) {
+ $adapter = new $class;
+ try {
+ $adapter->connect(DB_HOST, DB_PORT, DB_USERNAME, DB_PASSWORD, DB_NAME);
+ $this->_adapter = $adapter;
+ } catch (DBV_Exception $e) {
+ $this->error("[{$e->getCode()}] " . $e->getMessage());
+ }
+ }
+ }
+ }
+
+ return $this->_adapter;
+ }
+
+ public function dispatch()
+ {
+ $action = $this->_getAction() . "Action";
+ $this->$action();
+ }
+
+ public function indexAction()
+ {
+ if ($this->_getAdapter()) {
+ $this->schema = $this->_getSchema();
+ $this->revisions = $this->_getRevisions();
+ $this->revision = $this->_getCurrentRevision();
+ }
+
+ $this->_view("index");
+ }
+
+ public function schemaAction()
+ {
+ $items = isset($_POST['schema']) ? $_POST['schema'] : array();
+
+ if ($this->_isXMLHttpRequest()) {
+ if (!count($items)) {
+ return $this->_json(array('error' => __("You didn't select any objects")));
+ }
+
+ foreach ($items as $item) {
+ switch ($_POST['action']) {
+ case 'create':
+ $this->_createSchemaObject($item);
+ break;
+ case 'export':
+ $this->_exportSchemaObject($item);
+ break;
+ }
+ }
+
+ $return = array('messages' => array());
+ foreach ($this->_log as $message) {
+ $return['messages'][$message['type']][] = $message['message'];
+ }
+
+ $return['items'] = $this->_getSchema();
+
+ $this->_json($return);
+ }
+ }
+
+ public function revisionsAction()
+ {
+ $revisions = isset($_POST['revisions']) ? array_filter($_POST['revisions'], 'is_numeric') : array();
+ $current_revision = $this->_getCurrentRevision();
+
+ if (count($revisions)) {
+ sort($revisions);
+
+ foreach ($revisions as $revision) {
+ $files = $this->_getRevisionFiles($revision);
+
+ if (count($files)) {
+ foreach ($files as $file) {
+ $file = DBV_REVISIONS_PATH . DS . $revision . DS . $file;
+ if (!$this->_runFile($file)) {
+ break 2;
+ }
+ }
+ }
+
+ if ($revision > $current_revision) {
+ $this->_setCurrentRevision($revision);
+ }
+ $this->confirm(__("Executed revision #{revision}", array('revision' => "$revision")));
+ }
+ }
+
+ if ($this->_isXMLHttpRequest()) {
+ $return = array(
'messages' => array(),
'revision' => $this->_getCurrentRevision()
- );
- foreach ($this->_log as $message) {
- $return['messages'][$message['type']][] = $message['message'];
- }
- $this->_json($return);
-
- } else {
- $this->indexAction();
- }
- }
-
-
- public function saveRevisionFileAction()
- {
- $revision = intval($_POST['revision']);
- if (preg_match('/^[a-z0-9\._]+$/i', $_POST['file'])) {
- $file = $_POST['file'];
- } else {
- $this->_json(array(
+ );
+ foreach ($this->_log as $message) {
+ $return['messages'][$message['type']][] = $message['message'];
+ }
+ $this->_json($return);
+
+ } else {
+ $this->indexAction();
+ }
+ }
+
+ public function saveRevisionFileAction()
+ {
+ $revision = intval($_POST['revision']);
+ if (preg_match('/^[a-z0-9\._]+$/i', $_POST['file'])) {
+ $file = $_POST['file'];
+ } else {
+ $this->_json(array(
'error' => __("Filename #{file} contains illegal characters. Please contact the developer.", array('file' => $_POST['file']))
- ));
- }
+ ));
+ }
- $path = DBV_REVISIONS_PATH . DS . $revision . DS . $file;
- if (!file_exists($path)) {
- $this->_404();
- }
+ $path = DBV_REVISIONS_PATH . DS . $revision . DS . $file;
+ if (!file_exists($path)) {
+ $this->_404();
+ }
- $content = $_POST['content'];
+ $content = $_POST['content'];
- if (!@file_put_contents($path, $content)) {
- $this->_json(array(
+ if (!@file_put_contents($path, $content)) {
+ $this->_json(array(
'error' => __("Couldn't write file: #{path}
Make sure the user running DBV has adequate permissions.", array('path' => "$path"))
- ));
- }
-
- $this->_json(array('ok' => true, 'message' => __("File #{path} successfully saved!", array('path' => "$path"))));
- }
-
- protected function _createSchemaObject($item)
- {
- $file = DBV_SCHEMA_PATH . DS . "$item.sql";
-
- if (file_exists($file)) {
- if ($this->_runFile($file)) {
- $this->confirm(__("Created schema object #{item}", array('item' => "$item")));
- }
- } else {
- $this->error(__("Cannot find file for schema object #{item} (looked in #{schema_path})", array(
+ ));
+ }
+
+ $this->_json(array('ok' => true, 'message' => __("File #{path} successfully saved!", array('path' => "$path"))));
+ }
+
+
+ public function addRevisionFileAction()
+ {
+
+
+ $revisions_dir = DBV_REVISIONS_PATH;
+
+ $file_exceptions = array(".", "..",".gitkeep", ".DS_Store", "_notes", "Thumbs.db");
+
+ $next_rev_id = 1;
+
+ if(file_exists(DBV_REVISIONS_PATH)){
+
+ $arr_of_revisions = scandir(DBV_REVISIONS_PATH);
+
+ $arr_of_revisions = array_diff($arr_of_revisions, $file_exceptions);
+ if (count($arr_of_revisions)>0){
+ $next_rev_id = max($arr_of_revisions);
+ $next_rev_id++;
+ }
+
+ }
+
+ // create revision dir
+ try {
+
+ if(mkdir(DBV_REVISIONS_PATH. DS .$next_rev_id)){
+ $this->confirm(__("Wrote Revision Directory: #{dir}", array('dir' => "" .$next_rev_id."")));
+ }
+
+ } catch (DBV_Exception $e) {
+ $this->error(($e->getCode() ? "[{$e->getCode()}] " : '') . $e->getMessage());
+ }
+
+
+ // Agregar alter.sql file
+ try {
+
+ $file = DBV_REVISIONS_PATH . DS . $next_rev_id . DS ."alter.sql";
+
+ if (@file_put_contents($file, ' ')) {
+ $this->confirm(__("Wrote file: #{file}", array('file' => "$file")));
+ } else {
+ $this->error(__("Cannot write file: #{file}", array('file' => "$file")));
+ }
+ } catch (DBV_Exception $e) {
+ $this->error(($e->getCode() ? "[{$e->getCode()}] " : '') . $e->getMessage());
+ }
+
+ // Reloading message
+ $this->confirm(__("Reloading page in 5 seconds..."));
+
+ // send result
+ $return = array('messages' => array());
+ foreach ($this->_log as $message) {
+ $return['messages'][$message['type']][] = $message['message'];
+ }
+
+ $return['items'] = $this->_getSchema();
+
+ $this->_json($return);
+
+
+ }
+
+ protected function _createSchemaObject($item)
+ {
+ $file = DBV_SCHEMA_PATH . DS . "$item.sql";
+
+ if (file_exists($file)) {
+ if ($this->_runFile($file)) {
+ $this->confirm(__("Created schema object #{item}", array('item' => "$item")));
+ }
+ } else {
+ $this->error(__("Cannot find file for schema object #{item} (looked in #{schema_path})", array(
'item' => "$item",
'schema_path' => DBV_SCHEMA_PATH
- )));
- }
- }
-
- protected function _exportSchemaObject($item)
- {
- try {
- $sql = $this->_getAdapter()->getSchemaObject($item);
-
- $file = DBV_SCHEMA_PATH . DS . "$item.sql";
-
- if (@file_put_contents($file, $sql)) {
- $this->confirm(__("Wrote file: #{file}", array('file' => "$file")));
- } else {
- $this->error(__("Cannot write file: #{file}", array('file' => "$file")));
- }
- } catch (DBV_Exception $e) {
- $this->error(($e->getCode() ? "[{$e->getCode()}] " : '') . $e->getMessage());
- }
- }
-
- protected function _runFile($file)
- {
- $extension = strtolower(pathinfo($file, PATHINFO_EXTENSION));
-
- switch ($extension) {
- case 'sql':
- $content = file_get_contents($file);
- if ($content === false) {
- $this->error(__("Cannot open file #{file}", array('file' => "$file")));
- return false;
- }
-
- try {
- $this->_getAdapter()->query($content);
- return true;
- } catch (DBV_Exception $e) {
- $this->error("[{$e->getCode()}] {$e->getMessage()} in $file");
- }
- break;
- }
-
- return false;
- }
-
- protected function _getAction()
- {
- if (isset($_GET['a'])) {
- $action = $_GET['a'];
- if (in_array("{$action}Action", get_class_methods(get_class($this)))) {
- $this->_action = $action;
- }
- }
- return $this->_action;
- }
-
- protected function _view($view)
- {
- $file = DBV_ROOT_PATH . DS . 'templates' . DS . "$view.php";
- if (file_exists($file)) {
- include($file);
- }
- }
-
- protected function _getSchema()
- {
- $return = array();
- $database = $this->_getAdapter()->getSchema();
- $disk = $this->_getDiskSchema();
-
- if (count($database)) {
- foreach ($database as $item) {
- $return[$item]['database'] = true;
- }
- }
-
- if (count($disk)) {
- foreach ($disk as $item) {
- $return[$item]['disk'] = true;
- }
- }
-
- ksort($return);
- return $return;
- }
-
- protected function _getDiskSchema()
- {
- $return = array();
-
- foreach (new DirectoryIterator(DBV_SCHEMA_PATH) as $file) {
- if ($file->isFile() && pathinfo($file->getFilename(), PATHINFO_EXTENSION) == 'sql') {
- $return[] = pathinfo($file->getFilename(), PATHINFO_FILENAME);
- }
- }
-
- return $return;
- }
-
- protected function _getRevisions()
- {
- $return = array();
-
- foreach (new DirectoryIterator(DBV_REVISIONS_PATH) as $file) {
- if ($file->isDir() && !$file->isDot() && is_numeric($file->getBasename())) {
- $return[] = $file->getBasename();
- }
- }
-
- rsort($return, SORT_NUMERIC);
-
- return $return;
- }
-
- protected function _getCurrentRevision()
- {
- switch (DBV_REVISION_STORAGE) {
- case 'FILE':
- $file = DBV_META_PATH . DS . 'revision';
- if (file_exists($file)) {
- return intval(file_get_contents($file));
- }
- return 0;
- break;
- case 'ADAPTER':
- return $this->_getAdapter()->getCurrentRevision();
- break;
- default:
- $this->error("Incorrect revision storage specified");
- break;
- }
- }
-
- protected function _setCurrentRevision($revision)
- {
- switch (DBV_REVISION_STORAGE) {
- case 'FILE':
- $file = DBV_META_PATH . DS . 'revision';
- if (!@file_put_contents($file, $revision)) {
- $this->error("Cannot write revision file");
- }
- break;
- case 'ADAPTER':
- if (!$this->_getAdapter()->setCurrentRevision($revision)){
- $this->error("Cannot save revision to DB");
- }
- break;
- default:
- $this->error("Incorrect revision storage specified");
- break;
- }
- }
-
- protected function _getRevisionFiles($revision)
- {
- $dir = DBV_REVISIONS_PATH . DS . $revision;
- $return = array();
-
- foreach (new DirectoryIterator($dir) as $file) {
- if ($file->isFile() && pathinfo($file->getFilename(), PATHINFO_EXTENSION) == 'sql') {
- $return[] = $file->getBasename();
- }
- }
-
- sort($return, SORT_REGULAR);
- return $return;
- }
-
- protected function _getRevisionFileContents($revision, $file)
- {
- $path = DBV_REVISIONS_PATH . DS . $revision . DS . $file;
- if (file_exists($path)) {
- return file_get_contents($path);
- }
-
- return false;
- }
-
- public function log($item)
- {
- $this->_log[] = $item;
- }
-
- public function error($message)
- {
- $item = array(
+ )));
+ }
+ }
+
+ protected function _exportSchemaObject($item)
+ {
+ try {
+ $sql = $this->_getAdapter()->getSchemaObject($item);
+
+ $file = DBV_SCHEMA_PATH . DS . "$item.sql";
+
+ if (@file_put_contents($file, $sql)) {
+ $this->confirm(__("Wrote file: #{file}", array('file' => "$file")));
+ } else {
+ $this->error(__("Cannot write file: #{file}", array('file' => "$file")));
+ }
+ } catch (DBV_Exception $e) {
+ $this->error(($e->getCode() ? "[{$e->getCode()}] " : '') . $e->getMessage());
+ }
+ }
+
+ protected function _runFile($file)
+ {
+ $extension = strtolower(pathinfo($file, PATHINFO_EXTENSION));
+
+ switch ($extension) {
+ case 'sql':
+ $content = file_get_contents($file);
+ if ($content === false) {
+ $this->error(__("Cannot open file #{file}", array('file' => "$file")));
+ return false;
+ }
+
+ try {
+ $this->_getAdapter()->query($content);
+ return true;
+ } catch (DBV_Exception $e) {
+ $this->error("[{$e->getCode()}] {$e->getMessage()} in $file");
+ }
+ break;
+ }
+
+ return false;
+ }
+
+ protected function _getAction()
+ {
+ if (isset($_GET['a'])) {
+ $action = $_GET['a'];
+ if (in_array("{$action}Action", get_class_methods(get_class($this)))) {
+ $this->_action = $action;
+ }
+ }
+ return $this->_action;
+ }
+
+ protected function _view($view)
+ {
+ $file = DBV_ROOT_PATH . DS . 'templates' . DS . "$view.php";
+ if (file_exists($file)) {
+ include($file);
+ }
+ }
+
+ protected function _getSchema()
+ {
+ $return = array();
+ $database = $this->_getAdapter()->getSchema();
+ $disk = $this->_getDiskSchema();
+
+ if (count($database)) {
+ foreach ($database as $item) {
+ $return[$item]['database'] = true;
+ }
+ }
+
+ if (count($disk)) {
+ foreach ($disk as $item) {
+ $return[$item]['disk'] = true;
+ }
+ }
+
+ ksort($return);
+ return $return;
+ }
+
+ protected function _getDiskSchema()
+ {
+ $return = array();
+
+ foreach (new DirectoryIterator(DBV_SCHEMA_PATH) as $file) {
+ if ($file->isFile() && pathinfo($file->getFilename(), PATHINFO_EXTENSION) == 'sql') {
+ $return[] = pathinfo($file->getFilename(), PATHINFO_FILENAME);
+ }
+ }
+
+ return $return;
+ }
+
+ protected function _getRevisions()
+ {
+ $return = array();
+
+ foreach (new DirectoryIterator(DBV_REVISIONS_PATH) as $file) {
+ if ($file->isDir() && !$file->isDot() && is_numeric($file->getBasename())) {
+ $return[] = $file->getBasename();
+ }
+ }
+
+ rsort($return, SORT_NUMERIC);
+
+ return $return;
+ }
+
+ protected function _getCurrentRevision()
+ {
+ switch (DBV_REVISION_STORAGE) {
+ case 'FILE':
+ $file = DBV_META_PATH . DS . 'revision';
+ if (file_exists($file)) {
+ return intval(file_get_contents($file));
+ }
+ return 0;
+ break;
+ case 'ADAPTER':
+ return $this->_getAdapter()->getCurrentRevision();
+ break;
+ default:
+ $this->error("Incorrect revision storage specified");
+ break;
+ }
+ }
+
+ protected function _setCurrentRevision($revision)
+ {
+ switch (DBV_REVISION_STORAGE) {
+ case 'FILE':
+ $file = DBV_META_PATH . DS . 'revision';
+ if (!@file_put_contents($file, $revision)) {
+ $this->error("Cannot write revision file");
+ }
+ break;
+ case 'ADAPTER':
+ if (!$this->_getAdapter()->setCurrentRevision($revision)){
+ $this->error("Cannot save revision to DB");
+ }
+ break;
+ default:
+ $this->error("Incorrect revision storage specified");
+ break;
+ }
+ }
+
+ protected function _getRevisionFiles($revision)
+ {
+ $dir = DBV_REVISIONS_PATH . DS . $revision;
+ $return = array();
+
+ foreach (new DirectoryIterator($dir) as $file) {
+ if ($file->isFile() && pathinfo($file->getFilename(), PATHINFO_EXTENSION) == 'sql') {
+ $return[] = $file->getBasename();
+ }
+ }
+
+ sort($return, SORT_REGULAR);
+ return $return;
+ }
+
+ protected function _getRevisionFileContents($revision, $file)
+ {
+ $path = DBV_REVISIONS_PATH . DS . $revision . DS . $file;
+ if (file_exists($path)) {
+ return file_get_contents($path);
+ }
+
+ return false;
+ }
+
+ public function log($item)
+ {
+ $this->_log[] = $item;
+ }
+
+ public function error($message)
+ {
+ $item = array(
"type" => "error",
"message" => $message
- );
- $this->log($item);
- }
+ );
+ $this->log($item);
+ }
- public function confirm($message)
- {
- $item = array(
+ public function confirm($message)
+ {
+ $item = array(
"type" => "success",
"message" => $message
- );
- $this->log($item);
- }
-
- protected function _404()
- {
- header('HTTP/1.0 404 Not Found', true);
- exit('404 Not Found');
- }
-
- protected function _json($data = array())
- {
- header("Content-type: application/json");
- echo (is_string($data) ? $data : json_encode($data));
- exit();
- }
-
- protected function _isXMLHttpRequest()
- {
- if ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
- return true;
- }
-
- if (function_exists('apache_request_headers')) {
- $headers = apache_request_headers();
- if ($headers['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * Singleton
- * @return DBV
- */
- static public function instance()
- {
- static $instance;
- if (!($instance instanceof self)) {
- $instance = new self();
- }
- return $instance;
- }
+ );
+ $this->log($item);
+ }
+
+ protected function _404()
+ {
+ header('HTTP/1.0 404 Not Found', true);
+ exit('404 Not Found');
+ }
+
+ protected function _json($data = array())
+ {
+ header("Content-type: application/json");
+ echo (is_string($data) ? $data : json_encode($data));
+ exit();
+ }
+
+ protected function _isXMLHttpRequest()
+ {
+ if ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
+ return true;
+ }
+
+ if (function_exists('apache_request_headers')) {
+ $headers = apache_request_headers();
+ if ($headers['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Singleton
+ * @return DBV
+ */
+ static public function instance()
+ {
+ static $instance;
+ if (!($instance instanceof self)) {
+ $instance = new self();
+ }
+ return $instance;
+ }
}
diff --git a/data/meta/.gitkeep b/data/meta/.gitkeep
old mode 100644
new mode 100755
diff --git a/data/revisions/.gitkeep b/data/revisions/.gitkeep
old mode 100644
new mode 100755
diff --git a/data/schema/.gitkeep b/data/schema/.gitkeep
old mode 100644
new mode 100755
diff --git a/templates/revisions.php b/templates/revisions.php
index 077e79b..789232c 100644
--- a/templates/revisions.php
+++ b/templates/revisions.php
@@ -1,7 +1,10 @@