Version Description
- Added storage layer to avoid permission issues with OS's directory used for temporary storage
- Added additional checks to verify the consistency of the imported archive
- Fixed a bug that caused the database to be exported without data
- Removed unused variables from package.json file
Download this release
Release Info
Developer | bangelov |
Plugin | All-in-One WP Migration |
Version | 1.7.0 |
Comparing to | |
See all releases |
Code changes from version 1.6.0 to 1.7.0
- all-in-one-wp-migration.php +1 -1
- constants.php +11 -1
- lib/controller/class-ai1wm-export-controller.php +15 -8
- lib/controller/class-ai1wm-import-controller.php +9 -2
- lib/model/class-ai1wm-export.php +57 -41
- lib/model/class-ai1wm-file.php +37 -41
- lib/model/class-ai1wm-import.php +211 -147
- lib/vendor/mysqldump-factory/mysqldump-factory/lib/MysqlDumpPDO.php +8 -5
- lib/vendor/mysqldump-factory/mysqldump-factory/lib/MysqlDumpSQL.php +8 -5
- lib/vendor/storage-factory/storage-factory/.editorconfig +26 -0
- lib/vendor/storage-factory/storage-factory/.travil.yml +10 -0
- lib/vendor/storage-factory/storage-factory/LICENSE +20 -0
- lib/vendor/storage-factory/storage-factory/README.md +32 -0
- lib/vendor/storage-factory/storage-factory/bump-version.sh +63 -0
- lib/vendor/storage-factory/storage-factory/composer.json +25 -0
- lib/vendor/storage-factory/storage-factory/lib/StorageAbstract.php +89 -0
- lib/vendor/storage-factory/storage-factory/lib/StorageArea.php +89 -0
- lib/vendor/storage-factory/storage-factory/lib/StorageDirectory.php +109 -0
- lib/vendor/storage-factory/storage-factory/lib/StorageFile.php +85 -0
- lib/vendor/storage-factory/storage-factory/phpunit.xml +29 -0
- lib/vendor/storage-factory/storage-factory/test/bootstrap.php +40 -0
- lib/vendor/storage-factory/storage-factory/test/test-storage-factory.php +67 -0
- lib/vendor/zip-factory/zip-factory/lib/ArchiverPclZip.php +36 -14
- lib/vendor/zip-factory/zip-factory/lib/ArchiverZipArchive.php +17 -19
- lib/vendor/zip-factory/zip-factory/lib/ZipFactory.php +1 -1
- lib/view/export/index.php +3 -4
- lib/view/import/index.php +3 -4
- loader.php +11 -0
- readme.txt +9 -3
all-in-one-wp-migration.php
CHANGED
@@ -5,7 +5,7 @@
|
|
5 |
* Description: Migration tool for all your blog data
|
6 |
* Author: ServMask
|
7 |
* Author URI: http://servmask.com/
|
8 |
-
* Version: 1.
|
9 |
*
|
10 |
* Copyright (C) 2013 ServMask LLC
|
11 |
*
|
5 |
* Description: Migration tool for all your blog data
|
6 |
* Author: ServMask
|
7 |
* Author URI: http://servmask.com/
|
8 |
+
* Version: 1.7.0
|
9 |
*
|
10 |
* Copyright (C) 2013 ServMask LLC
|
11 |
*
|
constants.php
CHANGED
@@ -26,7 +26,7 @@
|
|
26 |
// ==================
|
27 |
// = Plugin VERSION =
|
28 |
// ==================
|
29 |
-
define( 'AI1WM_VERSION', '1.
|
30 |
|
31 |
// ===============
|
32 |
// = Plugin Name =
|
@@ -43,6 +43,11 @@ define( 'AI1WM_PLUGIN_BASENAME', plugin_basename( __FILE__ ) );
|
|
43 |
// ===============
|
44 |
define( 'AI1WM_PATH', dirname( __FILE__ ) );
|
45 |
|
|
|
|
|
|
|
|
|
|
|
46 |
// ============
|
47 |
// = Lib Path =
|
48 |
// ============
|
@@ -93,6 +98,11 @@ define( 'AI1WM_REPORT_URL', 'https://servmask.com/ai1wm/report/create' );
|
|
93 |
// ==============
|
94 |
define( 'AI1WM_TABLE_PREFIX', 'SERVMASK_PREFIX_' );
|
95 |
|
|
|
|
|
|
|
|
|
|
|
96 |
// ===========================
|
97 |
// = WP_CONTENT_DIR Constant =
|
98 |
// ===========================
|
26 |
// ==================
|
27 |
// = Plugin VERSION =
|
28 |
// ==================
|
29 |
+
define( 'AI1WM_VERSION', '1.7.0' );
|
30 |
|
31 |
// ===============
|
32 |
// = Plugin Name =
|
43 |
// ===============
|
44 |
define( 'AI1WM_PATH', dirname( __FILE__ ) );
|
45 |
|
46 |
+
// ===============
|
47 |
+
// = Storage Path =
|
48 |
+
// ===============
|
49 |
+
define( 'AI1WM_STORAGE_PATH', AI1WM_PATH . DIRECTORY_SEPARATOR . 'storage' );
|
50 |
+
|
51 |
// ============
|
52 |
// = Lib Path =
|
53 |
// ============
|
98 |
// ==============
|
99 |
define( 'AI1WM_TABLE_PREFIX', 'SERVMASK_PREFIX_' );
|
100 |
|
101 |
+
// ==============
|
102 |
+
// = ServMask Storage Prefix =
|
103 |
+
// ==============
|
104 |
+
define( 'AI1WM_STORAGE_PREFIX', 'wm_' );
|
105 |
+
|
106 |
// ===========================
|
107 |
// = WP_CONTENT_DIR Constant =
|
108 |
// ===========================
|
lib/controller/class-ai1wm-export-controller.php
CHANGED
@@ -26,12 +26,19 @@
|
|
26 |
class Ai1wm_Export_Controller
|
27 |
{
|
28 |
public static function index() {
|
29 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
30 |
Ai1wm_Template::render(
|
31 |
'export/index',
|
32 |
array(
|
33 |
-
'list_plugins'
|
34 |
-
'
|
35 |
)
|
36 |
);
|
37 |
}
|
@@ -43,11 +50,11 @@ class Ai1wm_Export_Controller
|
|
43 |
|
44 |
// Get options
|
45 |
if ( isset( $_POST['options'] ) && ( $options = $_POST['options'] ) ) {
|
46 |
-
$
|
47 |
|
48 |
// Export archive
|
49 |
$model = new Ai1wm_Export;
|
50 |
-
$file = $model->export( $
|
51 |
|
52 |
// Send the file to the user
|
53 |
header( 'Content-Description: File Transfer' );
|
@@ -64,14 +71,14 @@ class Ai1wm_Export_Controller
|
|
64 |
header( 'Expires: 0' );
|
65 |
header( 'Cache-Control: must-revalidate' );
|
66 |
header( 'Pragma: public' );
|
67 |
-
header( 'Content-Length: ' . filesize( $file ) );
|
68 |
|
69 |
// Clear output buffering and read file content
|
70 |
if ( ob_get_length() > 0 ) {
|
71 |
@ob_end_clean();
|
72 |
}
|
73 |
-
readfile( $file );
|
74 |
-
|
75 |
exit;
|
76 |
}
|
77 |
}
|
26 |
class Ai1wm_Export_Controller
|
27 |
{
|
28 |
public static function index() {
|
29 |
+
try {
|
30 |
+
$storage = new StorageArea;
|
31 |
+
$is_accessible = $storage->makeFile();
|
32 |
+
$storage->flush();
|
33 |
+
} catch ( Exception $e ) {
|
34 |
+
$is_accessible = false;
|
35 |
+
}
|
36 |
+
|
37 |
Ai1wm_Template::render(
|
38 |
'export/index',
|
39 |
array(
|
40 |
+
'list_plugins' => get_plugins(),
|
41 |
+
'is_accessible' => $is_accessible,
|
42 |
)
|
43 |
);
|
44 |
}
|
50 |
|
51 |
// Get options
|
52 |
if ( isset( $_POST['options'] ) && ( $options = $_POST['options'] ) ) {
|
53 |
+
$storage = new StorageArea;
|
54 |
|
55 |
// Export archive
|
56 |
$model = new Ai1wm_Export;
|
57 |
+
$file = $model->export( $storage, $options );
|
58 |
|
59 |
// Send the file to the user
|
60 |
header( 'Content-Description: File Transfer' );
|
71 |
header( 'Expires: 0' );
|
72 |
header( 'Cache-Control: must-revalidate' );
|
73 |
header( 'Pragma: public' );
|
74 |
+
header( 'Content-Length: ' . filesize( $file->getAs( 'string' ) ) );
|
75 |
|
76 |
// Clear output buffering and read file content
|
77 |
if ( ob_get_length() > 0 ) {
|
78 |
@ob_end_clean();
|
79 |
}
|
80 |
+
readfile( $file->getAs( 'string' ) );
|
81 |
+
$storage->flush();
|
82 |
exit;
|
83 |
}
|
84 |
}
|
lib/controller/class-ai1wm-import-controller.php
CHANGED
@@ -26,11 +26,18 @@
|
|
26 |
class Ai1wm_Import_Controller
|
27 |
{
|
28 |
public static function index() {
|
29 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
30 |
Ai1wm_Template::render(
|
31 |
'import/index',
|
32 |
array(
|
33 |
-
'
|
34 |
)
|
35 |
);
|
36 |
}
|
26 |
class Ai1wm_Import_Controller
|
27 |
{
|
28 |
public static function index() {
|
29 |
+
try {
|
30 |
+
$storage = new StorageArea;
|
31 |
+
$is_accessible = $storage->makeFile();
|
32 |
+
$storage->flush();
|
33 |
+
} catch ( Exception $e ) {
|
34 |
+
$is_accessible = false;
|
35 |
+
}
|
36 |
+
|
37 |
Ai1wm_Template::render(
|
38 |
'import/index',
|
39 |
array(
|
40 |
+
'is_accessible' => $is_accessible,
|
41 |
)
|
42 |
);
|
43 |
}
|
lib/model/class-ai1wm-export.php
CHANGED
@@ -52,11 +52,11 @@ class Ai1wm_Export
|
|
52 |
/**
|
53 |
* Export archive file (database, media, package.json)
|
54 |
*
|
55 |
-
* @param
|
56 |
-
* @param array
|
57 |
-
* @return
|
58 |
*/
|
59 |
-
public function export( $
|
60 |
global $wp_version;
|
61 |
$options['plugin_version'] = AI1WM_VERSION;
|
62 |
$options['wp_version'] = $wp_version;
|
@@ -69,15 +69,20 @@ class Ai1wm_Export
|
|
69 |
// Export last options
|
70 |
update_option( self::EXPORT_LAST_OPTIONS, $options );
|
71 |
|
|
|
|
|
|
|
72 |
// Make archive
|
73 |
-
$archive = ZipFactory::makeZipArchiver( $output_file, ! class_exists( 'ZipArchive' ), true );
|
74 |
|
75 |
// Should we export database?
|
76 |
-
if ( ! isset( $options['export-database'
|
77 |
-
|
78 |
-
$database_file = $this->prepare_database( $
|
|
|
|
|
79 |
$archive->addFile(
|
80 |
-
$database_file,
|
81 |
self::EXPORT_DATABASE_NAME
|
82 |
);
|
83 |
}
|
@@ -102,7 +107,8 @@ class Ai1wm_Export
|
|
102 |
if ( ! isset( $options['export-plugins'] ) ) {
|
103 |
$archive->addDir(
|
104 |
$this->prepare_plugins( $options ),
|
105 |
-
self::EXPORT_PLUGINS_NAME
|
|
|
106 |
);
|
107 |
}
|
108 |
|
@@ -112,20 +118,21 @@ class Ai1wm_Export
|
|
112 |
$this->prepare_package( $options )
|
113 |
);
|
114 |
|
115 |
-
return $
|
116 |
}
|
117 |
|
118 |
/**
|
119 |
* Export database in SQL format
|
120 |
*
|
121 |
-
* @param
|
122 |
-
* @param array
|
123 |
-
* @return
|
124 |
*/
|
125 |
-
public function prepare_database( $
|
126 |
global $wpdb;
|
127 |
|
128 |
-
$
|
|
|
129 |
|
130 |
// Set include tables
|
131 |
$includeTables = array();
|
@@ -163,16 +170,16 @@ class Ai1wm_Export
|
|
163 |
}
|
164 |
|
165 |
// No table data, but leave Administrator account unchanged
|
166 |
-
if (
|
|
|
|
|
167 |
$clauses[ $wpdb->users ] = ' WHERE id = 1 ';
|
168 |
$clauses[ $wpdb->usermeta ] = ' WHERE user_id = 1 ';
|
169 |
}
|
170 |
|
171 |
-
$output_meta = stream_get_meta_data( $output_file );
|
172 |
-
|
173 |
// Set dump options
|
174 |
$this->connection
|
175 |
-
->setFileName( $
|
176 |
->setIncludeTables( $includeTables )
|
177 |
->setExcludeTables( $excludeTables )
|
178 |
->setNoTableData( $noTableData )
|
@@ -184,10 +191,7 @@ class Ai1wm_Export
|
|
184 |
$this->connection->dump();
|
185 |
|
186 |
// Replace Old/New Values
|
187 |
-
if (
|
188 |
-
isset( $options['replace'] ) &&
|
189 |
-
( $replace = $options['replace'] )
|
190 |
-
) {
|
191 |
$old_values = array();
|
192 |
$new_values = array();
|
193 |
for ( $i = 0; $i < count( $replace['old-value'] ); $i++ ) {
|
@@ -202,7 +206,8 @@ class Ai1wm_Export
|
|
202 |
}
|
203 |
// Do String Replacement
|
204 |
if ( $old_values && $new_values ) {
|
205 |
-
$output_file = $
|
|
|
206 |
$output_file,
|
207 |
$old_values,
|
208 |
$new_values
|
@@ -210,7 +215,9 @@ class Ai1wm_Export
|
|
210 |
}
|
211 |
}
|
212 |
|
213 |
-
|
|
|
|
|
214 |
$output_file,
|
215 |
'/s:(\d+):([\\\\]?"[\\\\]?"|[\\\\]?"((.*?)[^\\\\])[\\\\]?");/'
|
216 |
);
|
@@ -276,7 +283,6 @@ class Ai1wm_Export
|
|
276 |
*/
|
277 |
public function prepare_plugins( array $options = array() ) {
|
278 |
if ( ! isset( $options['export-plugins'] ) ) {
|
279 |
-
|
280 |
return WP_PLUGIN_DIR;
|
281 |
}
|
282 |
}
|
@@ -288,22 +294,32 @@ class Ai1wm_Export
|
|
288 |
* @return string Package config
|
289 |
*/
|
290 |
public function prepare_package( array $options = array() ) {
|
291 |
-
$config = array(
|
292 |
-
|
293 |
-
|
294 |
-
|
295 |
-
|
296 |
-
|
297 |
-
|
298 |
-
|
299 |
-
|
300 |
-
|
301 |
-
|
302 |
-
|
303 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
304 |
}
|
305 |
}
|
306 |
|
307 |
-
return
|
308 |
}
|
309 |
}
|
52 |
/**
|
53 |
* Export archive file (database, media, package.json)
|
54 |
*
|
55 |
+
* @param StorageArea $storage Storage instance
|
56 |
+
* @param array $options Export settings
|
57 |
+
* @return StorageFile StorageFile instance
|
58 |
*/
|
59 |
+
public function export( StorageArea $storage, array $options = array() ) {
|
60 |
global $wp_version;
|
61 |
$options['plugin_version'] = AI1WM_VERSION;
|
62 |
$options['wp_version'] = $wp_version;
|
69 |
// Export last options
|
70 |
update_option( self::EXPORT_LAST_OPTIONS, $options );
|
71 |
|
72 |
+
// Create output file
|
73 |
+
$output_file = $storage->makeFile();
|
74 |
+
|
75 |
// Make archive
|
76 |
+
$archive = ZipFactory::makeZipArchiver( $output_file->getAs( 'resource' ), ! class_exists( 'ZipArchive' ), true );
|
77 |
|
78 |
// Should we export database?
|
79 |
+
if ( ! isset( $options['export-database'] ) ) {
|
80 |
+
// Prepare database file
|
81 |
+
$database_file = $this->prepare_database( $storage, $options );
|
82 |
+
|
83 |
+
// Add database to archive
|
84 |
$archive->addFile(
|
85 |
+
$database_file->getAs( 'resource' ),
|
86 |
self::EXPORT_DATABASE_NAME
|
87 |
);
|
88 |
}
|
107 |
if ( ! isset( $options['export-plugins'] ) ) {
|
108 |
$archive->addDir(
|
109 |
$this->prepare_plugins( $options ),
|
110 |
+
self::EXPORT_PLUGINS_NAME,
|
111 |
+
$this->get_plugins( array( AI1WM_PLUGIN_NAME ) )
|
112 |
);
|
113 |
}
|
114 |
|
118 |
$this->prepare_package( $options )
|
119 |
);
|
120 |
|
121 |
+
return $output_file;
|
122 |
}
|
123 |
|
124 |
/**
|
125 |
* Export database in SQL format
|
126 |
*
|
127 |
+
* @param StorageArea $storage Storage instance
|
128 |
+
* @param array $options Export settings
|
129 |
+
* @return StorageFile StorageFile instance
|
130 |
*/
|
131 |
+
public function prepare_database( StorageArea $storage, array $options = array() ) {
|
132 |
global $wpdb;
|
133 |
|
134 |
+
$file = new Ai1wm_File;
|
135 |
+
$output_file = $storage->makeFile();
|
136 |
|
137 |
// Set include tables
|
138 |
$includeTables = array();
|
170 |
}
|
171 |
|
172 |
// No table data, but leave Administrator account unchanged
|
173 |
+
if ( $noTableData ) {
|
174 |
+
$clauses = array();
|
175 |
+
$clauses[ $wpdb->options ] = ' ORDER BY option_id ASC ';
|
176 |
$clauses[ $wpdb->users ] = ' WHERE id = 1 ';
|
177 |
$clauses[ $wpdb->usermeta ] = ' WHERE user_id = 1 ';
|
178 |
}
|
179 |
|
|
|
|
|
180 |
// Set dump options
|
181 |
$this->connection
|
182 |
+
->setFileName( $output_file->getAs( 'string' ) )
|
183 |
->setIncludeTables( $includeTables )
|
184 |
->setExcludeTables( $excludeTables )
|
185 |
->setNoTableData( $noTableData )
|
191 |
$this->connection->dump();
|
192 |
|
193 |
// Replace Old/New Values
|
194 |
+
if ( isset( $options['replace'] ) && ( $replace = $options['replace'] ) ) {
|
|
|
|
|
|
|
195 |
$old_values = array();
|
196 |
$new_values = array();
|
197 |
for ( $i = 0; $i < count( $replace['old-value'] ); $i++ ) {
|
206 |
}
|
207 |
// Do String Replacement
|
208 |
if ( $old_values && $new_values ) {
|
209 |
+
$output_file = $file->str_replace_file(
|
210 |
+
$storage,
|
211 |
$output_file,
|
212 |
$old_values,
|
213 |
$new_values
|
215 |
}
|
216 |
}
|
217 |
|
218 |
+
// Do find and replace
|
219 |
+
return $file->preg_replace_file(
|
220 |
+
$storage,
|
221 |
$output_file,
|
222 |
'/s:(\d+):([\\\\]?"[\\\\]?"|[\\\\]?"((.*?)[^\\\\])[\\\\]?");/'
|
223 |
);
|
283 |
*/
|
284 |
public function prepare_plugins( array $options = array() ) {
|
285 |
if ( ! isset( $options['export-plugins'] ) ) {
|
|
|
286 |
return WP_PLUGIN_DIR;
|
287 |
}
|
288 |
}
|
294 |
* @return string Package config
|
295 |
*/
|
296 |
public function prepare_package( array $options = array() ) {
|
297 |
+
$config = array(
|
298 |
+
'Version' => AI1WM_VERSION,
|
299 |
+
);
|
300 |
+
|
301 |
+
return json_encode( $config );
|
302 |
+
}
|
303 |
+
|
304 |
+
/**
|
305 |
+
* Get available plugins
|
306 |
+
*
|
307 |
+
* @param array $exclude Exclude plugins
|
308 |
+
* @return array List of installed plugins
|
309 |
+
*/
|
310 |
+
public function get_plugins( $exclude = array() ) {
|
311 |
+
if ( ! function_exists( 'get_plugins' ) ) {
|
312 |
+
require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
|
313 |
+
}
|
314 |
+
|
315 |
+
$plugins = array();
|
316 |
+
foreach ( get_plugins() as $key => $plugin ) {
|
317 |
+
$directory = current( explode( DIRECTORY_SEPARATOR, $key ) );
|
318 |
+
if ( ! in_array( $directory, $exclude ) ) {
|
319 |
+
$plugins[] = $directory;
|
320 |
}
|
321 |
}
|
322 |
|
323 |
+
return $plugins;
|
324 |
}
|
325 |
}
|
lib/model/class-ai1wm-file.php
CHANGED
@@ -27,29 +27,28 @@ class Ai1wm_File
|
|
27 |
{
|
28 |
|
29 |
/**
|
30 |
-
*
|
31 |
-
*
|
32 |
-
*
|
33 |
-
* @param
|
34 |
-
* @
|
|
|
|
|
|
|
35 |
*/
|
36 |
-
public function str_replace_file( $
|
37 |
-
$
|
|
|
38 |
|
39 |
-
while ( ! feof( $
|
40 |
-
$line = stream_get_line( $
|
41 |
|
42 |
// append new line at the end of the line
|
43 |
-
if ( strlen( $line ) < 1000000 && ! feof( $
|
44 |
$line .= '\n';
|
45 |
}
|
46 |
|
47 |
-
if (
|
48 |
-
false === fwrite(
|
49 |
-
$_new_file,
|
50 |
-
str_replace( $pattern, $replacement, $line )
|
51 |
-
)
|
52 |
-
) {
|
53 |
wp_die(
|
54 |
'Writting to a file failed! Probably, there is no more free space left?',
|
55 |
'Out of disk space'
|
@@ -57,55 +56,52 @@ class Ai1wm_File
|
|
57 |
}
|
58 |
}
|
59 |
|
60 |
-
return $
|
61 |
}
|
62 |
|
63 |
/**
|
64 |
* Replace a file, line by line with the regex pattern and then writes the
|
65 |
* output to a new file.
|
66 |
*
|
67 |
-
* @param
|
68 |
-
* @param
|
69 |
-
*
|
70 |
-
* @return
|
71 |
*/
|
72 |
-
public function preg_replace_file( $
|
73 |
-
$
|
|
|
74 |
|
75 |
-
//
|
76 |
-
rewind( $
|
77 |
|
78 |
-
while ( ! feof( $
|
79 |
-
$line = stream_get_line( $
|
80 |
-
//
|
81 |
-
if ( strlen( $line ) < 1000000 && ! feof( $
|
82 |
$line .= '\n';
|
83 |
}
|
84 |
|
85 |
$replaced = $this->_preg_replace( $line, $pattern );
|
86 |
-
if (
|
87 |
-
false === fwrite(
|
88 |
-
$_new_file,
|
89 |
-
$replaced
|
90 |
-
)
|
91 |
-
) {
|
92 |
wp_die(
|
93 |
'Writting to a file failed! Probably, there is no more free space left?',
|
94 |
'Out of disk space'
|
95 |
);
|
96 |
}
|
97 |
}
|
98 |
-
return $
|
99 |
}
|
100 |
|
101 |
/**
|
102 |
-
*
|
103 |
-
*
|
104 |
-
* @param
|
105 |
-
* @
|
|
|
106 |
*/
|
107 |
public function _preg_replace( $line, $pattern ) {
|
108 |
-
//
|
109 |
static $callback = null;
|
110 |
|
111 |
if ( $callback === null ) {
|
27 |
{
|
28 |
|
29 |
/**
|
30 |
+
* Replace a file, line by line with the str pattern and then writes the
|
31 |
+
* output to a new file.
|
32 |
+
*
|
33 |
+
* @param StorageArea $storage Storage instance
|
34 |
+
* @param StorageFile $file StorageFile instance
|
35 |
+
* @param string $pattern Find and replace pattern
|
36 |
+
* @param string $replacement Replace term
|
37 |
+
* @return StorageFile StorageFile instance
|
38 |
*/
|
39 |
+
public function str_replace_file( StorageArea $storage, StorageFile $file, $pattern, $replacement ) {
|
40 |
+
$new_file = $storage->makeFile();
|
41 |
+
$current_file = $file->getAs( 'resource' );
|
42 |
|
43 |
+
while ( ! feof( $current_file ) ) {
|
44 |
+
$line = stream_get_line( $current_file, 1000000, '\n' );
|
45 |
|
46 |
// append new line at the end of the line
|
47 |
+
if ( strlen( $line ) < 1000000 && ! feof( $current_file ) ) {
|
48 |
$line .= '\n';
|
49 |
}
|
50 |
|
51 |
+
if ( false === fwrite( $new_file->getAs( 'resource' ), str_replace( $pattern, $replacement, $line ) ) ) {
|
|
|
|
|
|
|
|
|
|
|
52 |
wp_die(
|
53 |
'Writting to a file failed! Probably, there is no more free space left?',
|
54 |
'Out of disk space'
|
56 |
}
|
57 |
}
|
58 |
|
59 |
+
return $new_file;
|
60 |
}
|
61 |
|
62 |
/**
|
63 |
* Replace a file, line by line with the regex pattern and then writes the
|
64 |
* output to a new file.
|
65 |
*
|
66 |
+
* @param StorageArea $storage Storage instance
|
67 |
+
* @param StorageFile $file StorageFile instance
|
68 |
+
* @param string $pattern Find and replace pattern
|
69 |
+
* @return StorageFile StorageFile instance
|
70 |
*/
|
71 |
+
public function preg_replace_file( StorageArea $storage, StorageFile $file, $pattern ) {
|
72 |
+
$new_file = $storage->makeFile();
|
73 |
+
$current_file = $file->getAs( 'resource' );
|
74 |
|
75 |
+
// Set file handle to the beginning of the file
|
76 |
+
rewind( $current_file );
|
77 |
|
78 |
+
while ( ! feof( $current_file ) ) {
|
79 |
+
$line = stream_get_line( $current_file, 1000000, '\n' );
|
80 |
+
// Append new line at the end of the line
|
81 |
+
if ( strlen( $line ) < 1000000 && ! feof( $current_file ) ) {
|
82 |
$line .= '\n';
|
83 |
}
|
84 |
|
85 |
$replaced = $this->_preg_replace( $line, $pattern );
|
86 |
+
if ( false === fwrite( $new_file->getAs( 'resource' ), $replaced ) ) {
|
|
|
|
|
|
|
|
|
|
|
87 |
wp_die(
|
88 |
'Writting to a file failed! Probably, there is no more free space left?',
|
89 |
'Out of disk space'
|
90 |
);
|
91 |
}
|
92 |
}
|
93 |
+
return $new_file;
|
94 |
}
|
95 |
|
96 |
/**
|
97 |
+
* Find and replace line by line with pattern
|
98 |
+
*
|
99 |
+
* @param string $line Line to replace
|
100 |
+
* @param string $pattern Pattern
|
101 |
+
* @return string New line
|
102 |
*/
|
103 |
public function _preg_replace( $line, $pattern ) {
|
104 |
+
// PHP doesn't garbage collect functions created by create_function()
|
105 |
static $callback = null;
|
106 |
|
107 |
if ( $callback === null ) {
|
lib/model/class-ai1wm-import.php
CHANGED
@@ -56,184 +56,198 @@ class Ai1wm_Import
|
|
56 |
$errors = array();
|
57 |
|
58 |
if ( empty( $input_file['error'] ) ) {
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
|
|
|
|
|
|
71 |
}
|
72 |
-
}
|
73 |
|
74 |
-
|
75 |
-
|
76 |
|
77 |
-
|
78 |
-
|
79 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
80 |
$errors[] = sprintf(
|
81 |
_(
|
82 |
-
'
|
83 |
-
Please make sure that
|
84 |
-
<a href="https://servmask.com/blog/setting-permissions-for-temp-folder-on-windows" target="_blank">See how?</a>'
|
85 |
),
|
86 |
-
|
87 |
);
|
|
|
|
|
|
|
88 |
}
|
89 |
|
90 |
// Check if file has been uploaded
|
91 |
if ( empty( $errors ) && ( ! $options['chunks'] || $options['chunk'] == $options['chunks'] - 1 ) ) {
|
92 |
// Create temporary directory
|
93 |
-
$extract_to =
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
98 |
}
|
99 |
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
$upload_dir = wp_upload_dir();
|
112 |
-
$upload_basedir = $upload_dir['basedir'] . DIRECTORY_SEPARATOR;
|
113 |
-
if ( ! is_dir( $upload_basedir ) ) {
|
114 |
-
mkdir( $upload_basedir );
|
115 |
-
}
|
116 |
-
|
117 |
-
// Themes base directory
|
118 |
-
$themes_dir = get_theme_root();
|
119 |
-
$themes_basedir = $themes_dir . DIRECTORY_SEPARATOR;
|
120 |
-
if ( ! is_dir( $themes_basedir ) ) {
|
121 |
-
mkdir( $themes_basedir );
|
122 |
-
}
|
123 |
-
|
124 |
-
if ( file_exists( $extract_to . Ai1wm_Export::EXPORT_DATABASE_NAME ) ) {
|
125 |
-
// Backup database
|
126 |
-
$model = new Ai1wm_Export;
|
127 |
-
$database_file = tmpfile();
|
128 |
-
$options = array( 'add-drop-table' => true, 'export-single-transaction' => true );
|
129 |
-
$model->prepare_database( $database_file, $options );
|
130 |
-
|
131 |
-
// Truncate database
|
132 |
-
$this->connection->truncateDatabase();
|
133 |
-
|
134 |
-
// Import database
|
135 |
-
$this->connection->setOldTablePrefix( AI1WM_TABLE_PREFIX )
|
136 |
-
->setNewTablePrefix( $wpdb->prefix )
|
137 |
-
->import( $extract_to . Ai1wm_Export::EXPORT_DATABASE_NAME );
|
138 |
-
}
|
139 |
-
|
140 |
-
// Check if media files are present
|
141 |
-
if ( file_exists( $extract_to . Ai1wm_Export::EXPORT_MEDIA_NAME ) ) {
|
142 |
-
// Backup media files
|
143 |
-
$backup_media_to = sys_get_temp_dir() . DIRECTORY_SEPARATOR
|
144 |
-
. uniqid()
|
145 |
-
. DIRECTORY_SEPARATOR;
|
146 |
-
if ( ! is_dir( $backup_media_to ) ) {
|
147 |
-
mkdir( $backup_media_to );
|
148 |
-
}
|
149 |
-
|
150 |
-
$this->copy_dir( $upload_basedir, $backup_media_to );
|
151 |
-
|
152 |
-
// Truncate media files
|
153 |
-
$this->truncate_dir( $upload_basedir );
|
154 |
-
|
155 |
-
// Import media files
|
156 |
-
$this->copy_dir( $extract_to . Ai1wm_Export::EXPORT_MEDIA_NAME, $upload_basedir );
|
157 |
-
}
|
158 |
-
|
159 |
-
if ( file_exists( $extract_to . Ai1wm_Export::EXPORT_THEMES_NAME ) ) {
|
160 |
-
// Backup themes files
|
161 |
-
$backup_themes_to = sys_get_temp_dir() . DIRECTORY_SEPARATOR
|
162 |
-
. uniqid()
|
163 |
-
. DIRECTORY_SEPARATOR;
|
164 |
-
if ( ! is_dir( $backup_themes_to ) ) {
|
165 |
-
mkdir( $backup_themes_to );
|
166 |
}
|
167 |
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
// Import themes files
|
174 |
-
$this->copy_dir( $extract_to . Ai1wm_Export::EXPORT_THEMES_NAME, $themes_basedir );
|
175 |
-
}
|
176 |
-
|
177 |
-
if ( file_exists( $extract_to . Ai1wm_Export::EXPORT_PLUGINS_NAME ) ) {
|
178 |
-
// Backup plugin files
|
179 |
-
$backup_plugins_to = sys_get_temp_dir() . DIRECTORY_SEPARATOR
|
180 |
-
. uniqid()
|
181 |
-
. DIRECTORY_SEPARATOR;
|
182 |
-
if ( ! is_dir( $backup_plugins_to ) ) {
|
183 |
-
mkdir( $backup_plugins_to );
|
184 |
}
|
185 |
|
186 |
-
|
187 |
-
|
188 |
-
// Truncate plugin files
|
189 |
-
$this->truncate_dir( WP_PLUGIN_DIR );
|
190 |
-
|
191 |
-
// Import plugin files
|
192 |
-
$this->copy_dir( $extract_to . Ai1wm_Export::EXPORT_PLUGINS_NAME, WP_PLUGIN_DIR );
|
193 |
-
}
|
194 |
-
|
195 |
-
// Test website
|
196 |
-
if ( ! $this->test_website( get_option( 'siteurl' ) ) ) {
|
197 |
if ( file_exists( $extract_to . Ai1wm_Export::EXPORT_DATABASE_NAME ) ) {
|
|
|
|
|
|
|
|
|
198 |
// Truncate database
|
199 |
$this->connection->truncateDatabase();
|
200 |
|
201 |
-
// Import
|
202 |
$this->connection->setOldTablePrefix( AI1WM_TABLE_PREFIX )
|
203 |
-
|
204 |
-
->import( $
|
205 |
}
|
206 |
|
207 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
208 |
// Truncate media files
|
209 |
$this->truncate_dir( $upload_basedir );
|
210 |
|
211 |
-
// Import
|
212 |
-
$this->copy_dir( $
|
213 |
}
|
214 |
|
215 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
216 |
// Truncate themes files
|
217 |
$this->truncate_dir( $themes_basedir );
|
218 |
|
219 |
-
// Import
|
220 |
-
$this->copy_dir( $
|
221 |
}
|
222 |
|
223 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
224 |
// Truncate plugin files
|
225 |
-
$this->truncate_dir( WP_PLUGIN_DIR );
|
226 |
|
227 |
-
// Import
|
228 |
-
$this->copy_dir( $
|
229 |
}
|
230 |
-
}
|
231 |
|
232 |
-
|
233 |
-
|
234 |
-
|
235 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
236 |
}
|
|
|
|
|
|
|
237 |
}
|
238 |
} else {
|
239 |
$errors[] = $this->code_to_message( $input_file['error'] );
|
@@ -256,22 +270,47 @@ class Ai1wm_Import
|
|
256 |
/**
|
257 |
* Copy files from directory to directory
|
258 |
*
|
259 |
-
* @param string $from
|
260 |
-
* @param string $to
|
|
|
261 |
* @return void
|
262 |
*/
|
263 |
-
public function copy_dir( $from, $to ) {
|
264 |
$from = trailingslashit( $from );
|
265 |
$to = trailingslashit( $to );
|
266 |
|
267 |
$iterator = new RecursiveIteratorIterator(
|
268 |
-
|
269 |
RecursiveIteratorIterator::SELF_FIRST
|
270 |
);
|
271 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
272 |
foreach ( $iterator as $item ) {
|
273 |
// Skip dots
|
274 |
-
if ( $iterator->isDot() )
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
275 |
|
276 |
if ( $item->isDir() ) {
|
277 |
mkdir( $to . $iterator->getSubPathName() );
|
@@ -284,19 +323,44 @@ class Ai1wm_Import
|
|
284 |
/**
|
285 |
* Truncate all files from specific directory
|
286 |
*
|
287 |
-
* @param string $dir
|
|
|
288 |
* @return void
|
289 |
*/
|
290 |
-
public function truncate_dir( $dir ) {
|
291 |
$dir = trailingslashit( $dir );
|
292 |
$iterator = new RecursiveIteratorIterator(
|
293 |
-
|
294 |
RecursiveIteratorIterator::CHILD_FIRST
|
295 |
);
|
296 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
297 |
foreach ( $iterator as $item ) {
|
298 |
// Skip dots
|
299 |
-
if ( $iterator->isDot() )
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
300 |
|
301 |
if ( $item->isDir() ) {
|
302 |
rmdir( $dir . $iterator->getSubPathName() );
|
56 |
$errors = array();
|
57 |
|
58 |
if ( empty( $input_file['error'] ) ) {
|
59 |
+
try {
|
60 |
+
$storage = new StorageArea;
|
61 |
+
|
62 |
+
// Partial file path
|
63 |
+
$upload_file = $storage->makeFile( $options['name'] )->getAs( 'string' );
|
64 |
+
|
65 |
+
// Open partial file
|
66 |
+
$out = fopen( $upload_file, $options['chunk'] == 0 ? 'wb' : 'ab' );
|
67 |
+
if ( $out ) {
|
68 |
+
// Read binary input stream and append it to temp file
|
69 |
+
$in = fopen( $input_file['tmp_name'], 'rb' );
|
70 |
+
if ( $in ) {
|
71 |
+
while ( $buff = fread( $in, 4096 ) ) {
|
72 |
+
fwrite( $out, $buff );
|
73 |
+
}
|
74 |
}
|
|
|
75 |
|
76 |
+
fclose( $in );
|
77 |
+
fclose( $out );
|
78 |
|
79 |
+
// Remove temporary uploaded file
|
80 |
+
unlink( $input_file['tmp_name'] );
|
81 |
+
} else {
|
82 |
+
$errors[] = sprintf(
|
83 |
+
_(
|
84 |
+
'Site could not be imported!<br />
|
85 |
+
Please make sure that storage directory <strong>%s</strong> has read and write permissions.'
|
86 |
+
),
|
87 |
+
AI1WM_STORAGE_PATH
|
88 |
+
);
|
89 |
+
|
90 |
+
// Clear storage
|
91 |
+
$storage->flush();
|
92 |
+
}
|
93 |
+
} catch ( Exception $e ) {
|
94 |
$errors[] = sprintf(
|
95 |
_(
|
96 |
+
'Site could not be imported!<br />
|
97 |
+
Please make sure that storage directory <strong>%s</strong> has read and write permissions.'
|
|
|
98 |
),
|
99 |
+
AI1WM_STORAGE_PATH
|
100 |
);
|
101 |
+
|
102 |
+
// Clear storage
|
103 |
+
$storage->flush();
|
104 |
}
|
105 |
|
106 |
// Check if file has been uploaded
|
107 |
if ( empty( $errors ) && ( ! $options['chunks'] || $options['chunk'] == $options['chunks'] - 1 ) ) {
|
108 |
// Create temporary directory
|
109 |
+
$extract_to = $storage->makeDirectory()->getAs( 'string' );
|
110 |
+
|
111 |
+
try {
|
112 |
+
// Extract archive to a temporary directory
|
113 |
+
$archive = ZipFactory::makeZipArchiver( $upload_file, ! class_exists( 'ZipArchive' ) );
|
114 |
+
$archive->extractTo( $extract_to );
|
115 |
+
$archive->close();
|
116 |
+
} catch ( Exception $e ) {
|
117 |
+
$errors[] = _(
|
118 |
+
'Archive file is broken or is not compatible with
|
119 |
+
"All In One WP Migration" plugin! Please verify your archive file.'
|
120 |
+
);
|
121 |
}
|
122 |
|
123 |
+
if ( empty( $errors ) ) {
|
124 |
+
// Verify whether this archive is valid
|
125 |
+
if ( $this->is_valid( $extract_to ) ) {
|
126 |
+
// Enable maintenance mode
|
127 |
+
$this->maintenance_mode( true );
|
128 |
+
|
129 |
+
// Media base directory
|
130 |
+
$upload_dir = wp_upload_dir();
|
131 |
+
$upload_basedir = $upload_dir['basedir'] . DIRECTORY_SEPARATOR;
|
132 |
+
if ( ! is_dir( $upload_basedir ) ) {
|
133 |
+
mkdir( $upload_basedir );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
134 |
}
|
135 |
|
136 |
+
// Themes base directory
|
137 |
+
$themes_dir = get_theme_root();
|
138 |
+
$themes_basedir = $themes_dir . DIRECTORY_SEPARATOR;
|
139 |
+
if ( ! is_dir( $themes_basedir ) ) {
|
140 |
+
mkdir( $themes_basedir );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
141 |
}
|
142 |
|
143 |
+
// Database import
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
144 |
if ( file_exists( $extract_to . Ai1wm_Export::EXPORT_DATABASE_NAME ) ) {
|
145 |
+
// Backup database
|
146 |
+
$model = new Ai1wm_Export;
|
147 |
+
$database_file = $model->prepare_database( $storage );
|
148 |
+
|
149 |
// Truncate database
|
150 |
$this->connection->truncateDatabase();
|
151 |
|
152 |
+
// Import database
|
153 |
$this->connection->setOldTablePrefix( AI1WM_TABLE_PREFIX )
|
154 |
+
->setNewTablePrefix( $wpdb->prefix )
|
155 |
+
->import( $extract_to . Ai1wm_Export::EXPORT_DATABASE_NAME );
|
156 |
}
|
157 |
|
158 |
+
// Media import
|
159 |
+
if ( is_dir( $extract_to . Ai1wm_Export::EXPORT_MEDIA_NAME ) ) {
|
160 |
+
// Backup media files
|
161 |
+
$backup_media_to = $storage->makeDirectory()->getAs( 'string' );
|
162 |
+
|
163 |
+
$this->copy_dir( $upload_basedir, $backup_media_to );
|
164 |
+
|
165 |
// Truncate media files
|
166 |
$this->truncate_dir( $upload_basedir );
|
167 |
|
168 |
+
// Import media files
|
169 |
+
$this->copy_dir( $extract_to . Ai1wm_Export::EXPORT_MEDIA_NAME, $upload_basedir );
|
170 |
}
|
171 |
|
172 |
+
// Themes import
|
173 |
+
if ( is_dir( $extract_to . Ai1wm_Export::EXPORT_THEMES_NAME ) ) {
|
174 |
+
// Backup themes files
|
175 |
+
$backup_themes_to = $storage->makeDirectory()->getAs( 'string' );
|
176 |
+
|
177 |
+
$this->copy_dir( $themes_basedir, $backup_themes_to );
|
178 |
+
|
179 |
// Truncate themes files
|
180 |
$this->truncate_dir( $themes_basedir );
|
181 |
|
182 |
+
// Import themes files
|
183 |
+
$this->copy_dir( $extract_to . Ai1wm_Export::EXPORT_THEMES_NAME, $themes_basedir );
|
184 |
}
|
185 |
|
186 |
+
// Plugins import
|
187 |
+
if ( is_dir( $extract_to . Ai1wm_Export::EXPORT_PLUGINS_NAME ) ) {
|
188 |
+
// Backup plugin files
|
189 |
+
$backup_plugins_to = $storage->makeDirectory()->getAs( 'string' );
|
190 |
+
|
191 |
+
$this->copy_dir( WP_PLUGIN_DIR, $backup_plugins_to, array( AI1WM_PLUGIN_NAME ) );
|
192 |
+
|
193 |
// Truncate plugin files
|
194 |
+
$this->truncate_dir( WP_PLUGIN_DIR, array( AI1WM_PLUGIN_NAME ) );
|
195 |
|
196 |
+
// Import plugin files
|
197 |
+
$this->copy_dir( $extract_to . Ai1wm_Export::EXPORT_PLUGINS_NAME, WP_PLUGIN_DIR );
|
198 |
}
|
|
|
199 |
|
200 |
+
// Test website
|
201 |
+
if ( ! $this->test_website( get_option( 'siteurl' ) ) ) {
|
202 |
+
|
203 |
+
// Database import
|
204 |
+
if ( file_exists( $extract_to . Ai1wm_Export::EXPORT_DATABASE_NAME ) ) {
|
205 |
+
// Truncate database
|
206 |
+
$this->connection->truncateDatabase();
|
207 |
+
|
208 |
+
// Import "OLD" database
|
209 |
+
$this->connection->setOldTablePrefix( AI1WM_TABLE_PREFIX )
|
210 |
+
->setNewTablePrefix( $wpdb->prefix )
|
211 |
+
->import( $database_file->getAs( 'string' ) );
|
212 |
+
}
|
213 |
+
|
214 |
+
// Media import
|
215 |
+
if ( is_dir( $extract_to . Ai1wm_Export::EXPORT_MEDIA_NAME ) ) {
|
216 |
+
// Truncate media files
|
217 |
+
$this->truncate_dir( $upload_basedir );
|
218 |
+
|
219 |
+
// Import "OLD" media files
|
220 |
+
$this->copy_dir( $backup_media_to, $upload_basedir );
|
221 |
+
}
|
222 |
+
|
223 |
+
// Themes import
|
224 |
+
if ( is_dir( $extract_to . Ai1wm_Export::EXPORT_THEMES_NAME ) ) {
|
225 |
+
// Truncate themes files
|
226 |
+
$this->truncate_dir( $themes_basedir );
|
227 |
+
|
228 |
+
// Import "OLD" themes files
|
229 |
+
$this->copy_dir( $backup_themes_to, $themes_basedir );
|
230 |
+
}
|
231 |
+
|
232 |
+
// Plugins import
|
233 |
+
if ( is_dir( $extract_to . Ai1wm_Export::EXPORT_PLUGINS_NAME ) ) {
|
234 |
+
// Truncate plugin files
|
235 |
+
$this->truncate_dir( WP_PLUGIN_DIR, array( AI1WM_PLUGIN_NAME ) );
|
236 |
+
|
237 |
+
// Import "OLD" plugin files
|
238 |
+
$this->copy_dir( $backup_plugins_to, WP_PLUGIN_DIR, array( AI1WM_PLUGIN_NAME ) );
|
239 |
+
}
|
240 |
+
}
|
241 |
+
|
242 |
+
// Disable maintenance mode
|
243 |
+
$this->maintenance_mode( false );
|
244 |
+
} else {
|
245 |
+
$errors[] = _( 'File is not compatible with "All In One WP Migration" plugin! Please verify your archive file.' );
|
246 |
+
}
|
247 |
}
|
248 |
+
|
249 |
+
// Clear storage
|
250 |
+
$storage->flush();
|
251 |
}
|
252 |
} else {
|
253 |
$errors[] = $this->code_to_message( $input_file['error'] );
|
270 |
/**
|
271 |
* Copy files from directory to directory
|
272 |
*
|
273 |
+
* @param string $from Copy files and directories FROM
|
274 |
+
* @param string $to Copy files and directories TO
|
275 |
+
* @param array $exclude List of directories to exclude
|
276 |
* @return void
|
277 |
*/
|
278 |
+
public function copy_dir( $from, $to, $exclude = array() ) {
|
279 |
$from = trailingslashit( $from );
|
280 |
$to = trailingslashit( $to );
|
281 |
|
282 |
$iterator = new RecursiveIteratorIterator(
|
283 |
+
new RecursiveDirectoryIterator( $from ),
|
284 |
RecursiveIteratorIterator::SELF_FIRST
|
285 |
);
|
286 |
|
287 |
+
// Prepare filter pattern
|
288 |
+
$filter_pattern = null;
|
289 |
+
if ( is_array( $exclude ) ) {
|
290 |
+
$filters = array();
|
291 |
+
foreach ( $exclude as $filter ) {
|
292 |
+
$filters[] = sprintf(
|
293 |
+
'(%s(%s.*)?)',
|
294 |
+
preg_quote( $filter, '/' ),
|
295 |
+
preg_quote( DIRECTORY_SEPARATOR, '/' )
|
296 |
+
);
|
297 |
+
}
|
298 |
+
|
299 |
+
$filter_pattern = implode( '|', $filters );
|
300 |
+
}
|
301 |
+
|
302 |
foreach ( $iterator as $item ) {
|
303 |
// Skip dots
|
304 |
+
if ( $iterator->isDot() ) {
|
305 |
+
continue;
|
306 |
+
}
|
307 |
+
|
308 |
+
// Validate filter pattern
|
309 |
+
if ( $filter_pattern ) {
|
310 |
+
if ( preg_match( '/^' . $filter_pattern . '$/', $iterator->getSubPathName() ) ) {
|
311 |
+
continue;
|
312 |
+
}
|
313 |
+
}
|
314 |
|
315 |
if ( $item->isDir() ) {
|
316 |
mkdir( $to . $iterator->getSubPathName() );
|
323 |
/**
|
324 |
* Truncate all files from specific directory
|
325 |
*
|
326 |
+
* @param string $dir Path to directory
|
327 |
+
* @param array $exclude List of directories to exclude
|
328 |
* @return void
|
329 |
*/
|
330 |
+
public function truncate_dir( $dir, $exclude = array() ) {
|
331 |
$dir = trailingslashit( $dir );
|
332 |
$iterator = new RecursiveIteratorIterator(
|
333 |
+
new RecursiveDirectoryIterator( $dir ),
|
334 |
RecursiveIteratorIterator::CHILD_FIRST
|
335 |
);
|
336 |
|
337 |
+
// Prepare filter pattern
|
338 |
+
$filter_pattern = null;
|
339 |
+
if ( is_array( $exclude ) ) {
|
340 |
+
$filters = array();
|
341 |
+
foreach ( $exclude as $filter ) {
|
342 |
+
$filters[] = sprintf(
|
343 |
+
'(%s(%s.*)?)',
|
344 |
+
preg_quote( $filter, '/' ),
|
345 |
+
preg_quote( DIRECTORY_SEPARATOR, '/' )
|
346 |
+
);
|
347 |
+
}
|
348 |
+
|
349 |
+
$filter_pattern = implode( '|', $filters );
|
350 |
+
}
|
351 |
+
|
352 |
foreach ( $iterator as $item ) {
|
353 |
// Skip dots
|
354 |
+
if ( $iterator->isDot() ) {
|
355 |
+
continue;
|
356 |
+
}
|
357 |
+
|
358 |
+
// Validate filter pattern
|
359 |
+
if ( $filter_pattern ) {
|
360 |
+
if ( preg_match( '/^' . $filter_pattern . '$/', $iterator->getSubPathName() ) ) {
|
361 |
+
continue;
|
362 |
+
}
|
363 |
+
}
|
364 |
|
365 |
if ( $item->isDir() ) {
|
366 |
rmdir( $dir . $iterator->getSubPathName() );
|
lib/vendor/mysqldump-factory/mysqldump-factory/lib/MysqlDumpPDO.php
CHANGED
@@ -543,11 +543,14 @@ class MysqlDumpPDO implements MysqlDumpInterface
|
|
543 |
$query = "SELECT * FROM `$tableName` ";
|
544 |
|
545 |
// Apply additional query clauses
|
546 |
-
|
547 |
-
|
548 |
-
|
549 |
-
|
550 |
-
|
|
|
|
|
|
|
551 |
}
|
552 |
|
553 |
// Replace table prefix
|
543 |
$query = "SELECT * FROM `$tableName` ";
|
544 |
|
545 |
// Apply additional query clauses
|
546 |
+
$clauses = $this->getQueryClauses();
|
547 |
+
if (isset($clauses[$tableName]) && ($queryClause = $clauses[$tableName])) {
|
548 |
+
$query .= $queryClause;
|
549 |
+
}
|
550 |
+
|
551 |
+
// No table data
|
552 |
+
if ($this->getNoTableData() && !isset($clauses[$tableName])) {
|
553 |
+
return;
|
554 |
}
|
555 |
|
556 |
// Replace table prefix
|
lib/vendor/mysqldump-factory/mysqldump-factory/lib/MysqlDumpSQL.php
CHANGED
@@ -536,11 +536,14 @@ class MysqlDumpSQL implements MysqlDumpInterface
|
|
536 |
$query = "SELECT * FROM `$tableName` ";
|
537 |
|
538 |
// Apply additional query clauses
|
539 |
-
|
540 |
-
|
541 |
-
|
542 |
-
|
543 |
-
|
|
|
|
|
|
|
544 |
}
|
545 |
|
546 |
// Replace table prefix
|
536 |
$query = "SELECT * FROM `$tableName` ";
|
537 |
|
538 |
// Apply additional query clauses
|
539 |
+
$clauses = $this->getQueryClauses();
|
540 |
+
if (isset($clauses[$tableName]) && ($queryClause = $clauses[$tableName])) {
|
541 |
+
$query .= $queryClause;
|
542 |
+
}
|
543 |
+
|
544 |
+
// No table data
|
545 |
+
if ($this->getNoTableData() && !isset($clauses[$tableName])) {
|
546 |
+
return;
|
547 |
}
|
548 |
|
549 |
// Replace table prefix
|
lib/vendor/storage-factory/storage-factory/.editorconfig
ADDED
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# top-most EditorConfig file
|
2 |
+
root = true
|
3 |
+
|
4 |
+
# Unix-style newlines with a newline ending every file
|
5 |
+
[*]
|
6 |
+
end_of_line = lf
|
7 |
+
charset = utf-8
|
8 |
+
trim_trailing_whitespace = true
|
9 |
+
insert_final_newline = true
|
10 |
+
indent_style = space
|
11 |
+
|
12 |
+
# PHP
|
13 |
+
[*.php]
|
14 |
+
indent_style = space
|
15 |
+
indent_size = 4
|
16 |
+
max_line_length = 120
|
17 |
+
|
18 |
+
# YAML
|
19 |
+
[*.yml]
|
20 |
+
indent_style = space
|
21 |
+
indent_size = 4
|
22 |
+
|
23 |
+
# XML
|
24 |
+
[*.xml]
|
25 |
+
indent_style = space
|
26 |
+
indent_size = 4
|
lib/vendor/storage-factory/storage-factory/.travil.yml
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
language: php
|
2 |
+
|
3 |
+
php:
|
4 |
+
- 5.5
|
5 |
+
- 5.4
|
6 |
+
- 5.3
|
7 |
+
- 5.2
|
8 |
+
|
9 |
+
script: phpunit
|
10 |
+
|
lib/vendor/storage-factory/storage-factory/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
The MIT License (MIT)
|
2 |
+
|
3 |
+
Copyright (c) 2013 Yani Iliev, Bobby Angelov
|
4 |
+
|
5 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6 |
+
this software and associated documentation files (the "Software"), to deal in
|
7 |
+
the Software without restriction, including without limitation the rights to
|
8 |
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
9 |
+
the Software, and to permit persons to whom the Software is furnished to do so,
|
10 |
+
subject to the following conditions:
|
11 |
+
|
12 |
+
The above copyright notice and this permission notice shall be included in all
|
13 |
+
copies or substantial portions of the Software.
|
14 |
+
|
15 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
17 |
+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
18 |
+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
19 |
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
20 |
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
lib/vendor/storage-factory/storage-factory/README.md
ADDED
@@ -0,0 +1,32 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Storage Factory
|
2 |
+
|
3 |
+
[![Build Status](https://travis-ci.org/borislav-angelov/storage-factory.png)](https://travis-ci.org/borislav-angelov/storage-factory)
|
4 |
+
[![Latest Stable Version](https://poser.pugx.org/storage-factory/storage-factory/v/stable.png)](https://packagist.org/packages/storage-factory/storage-factory)
|
5 |
+
[![Total Downloads](https://poser.pugx.org/storage-factory/storage-factory/downloads.png)](https://packagist.org/packages/storage-factory/storage-factory)
|
6 |
+
|
7 |
+
Factory class that creates either File Storage or Directory Storage
|
8 |
+
|
9 |
+
### Requirements
|
10 |
+
PHP v5.2 and up. Tested on PHP v5.2.17, v5.3, v5.4, v5.5
|
11 |
+
|
12 |
+
### Usage
|
13 |
+
```php
|
14 |
+
```
|
15 |
+
|
16 |
+
### Tests
|
17 |
+
Coverage reports are stored inside the coverage folder.
|
18 |
+
```bash
|
19 |
+
phpunit
|
20 |
+
```
|
21 |
+
|
22 |
+
### Contributing
|
23 |
+
For code guidelines refer to `.editorconfig`. This project is following PEAR code standard - http://pear.php.net/manual/en/standards.php
|
24 |
+
The project is following Vincent Driessen's branching model aka git flow - http://nvie.com/git-model/
|
25 |
+
Make sure to submit your pull requests against the **develop** branch
|
26 |
+
|
27 |
+
### License
|
28 |
+
MIT
|
29 |
+
|
30 |
+
### Authors
|
31 |
+
* Bobby Angelov
|
32 |
+
* Yani Iliev
|
lib/vendor/storage-factory/storage-factory/bump-version.sh
ADDED
@@ -0,0 +1,63 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/bin/bash
|
2 |
+
|
3 |
+
if [ -z "$1" ]; then
|
4 |
+
echo -e "\033[0;31mUsage:\033[0m $0 (major|minor|patch)\033[0m"
|
5 |
+
echo -e "\033[4;32mCurrent version\033[0m:\033[0m \033[33m`git describe master`\033[0m"
|
6 |
+
exit -1
|
7 |
+
fi
|
8 |
+
|
9 |
+
# increment version depending on passed parameter
|
10 |
+
case "$1" in
|
11 |
+
major)
|
12 |
+
currentVersion=`git describe master`
|
13 |
+
bumpedVersion=`echo $currentVersion | ( IFS=".$IFS" ; read a b c && echo $((a + 1)).0.0 )`
|
14 |
+
;;
|
15 |
+
minor)
|
16 |
+
currentVersion=`git describe master`
|
17 |
+
bumpedVersion=`echo $currentVersion | ( IFS=".$IFS" ; read a b c && echo $a.$((b + 1)).0 )`
|
18 |
+
;;
|
19 |
+
patch)
|
20 |
+
currentVersion=`git describe master`
|
21 |
+
bumpedVersion=`echo $currentVersion | ( IFS=".$IFS" ; read a b c && echo $a.$b.$((c + 1)) )`
|
22 |
+
;;
|
23 |
+
*)
|
24 |
+
echo -e "\033[0;31mUsage:\033[0m $0 (major|minor|patch)\033[0m"
|
25 |
+
echo -e "\033[4;32mCurrent version\033[0m:\033[0m \033[33m`git describe master`\033[0m"
|
26 |
+
exit -1
|
27 |
+
esac
|
28 |
+
|
29 |
+
# let's start a new release
|
30 |
+
git flow release start $bumpedVersion
|
31 |
+
|
32 |
+
# bump version in all files
|
33 |
+
for file in `find . -path ./coverage -prune -o -path ./.git -prune -o -type f`
|
34 |
+
do
|
35 |
+
filename=$(basename "$file")
|
36 |
+
ext="${filename##*.}"
|
37 |
+
if [ $ext != "png" -a $ext != "jpg" -a $ext != "jpeg" -a $ext != "gif" ]; then
|
38 |
+
if [ $ext != "DS_Store" -a $ext != "ttf" -a $ext != "node_modules" -a $ext != "git" ]; then
|
39 |
+
sed -i '' "s/GIT: ..11.0.0$currentVersion/GIT: ..11.0.0$bumpedVersion/g" $file
|
40 |
+
fi
|
41 |
+
fi
|
42 |
+
done
|
43 |
+
|
44 |
+
# bump version in package.json
|
45 |
+
sed -i '' "s/\"version\": \"$currentVersion\"/\"version\": \"$bumpedVersion\"/g" package.json
|
46 |
+
|
47 |
+
# add changed files to git
|
48 |
+
git add . && git commit -m "Bumped version from $currentVersion to $bumpedVersion"
|
49 |
+
|
50 |
+
# finish the release
|
51 |
+
git flow release finish -F -m "$bumpedVersion" $bumpedVersion
|
52 |
+
|
53 |
+
# publish develop branch
|
54 |
+
git checkout develop && git push origin develop
|
55 |
+
|
56 |
+
# publish master
|
57 |
+
git checkout master && git push origin master
|
58 |
+
|
59 |
+
# publish tags
|
60 |
+
git push origin --tags
|
61 |
+
|
62 |
+
# Announce the result
|
63 |
+
echo -e "\033[4;32mSuccessfully released\033[0m:\033[0m \033[33m$bumpedVersion\033[0m"
|
lib/vendor/storage-factory/storage-factory/composer.json
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"name": "storage-factory/storage-factory",
|
3 |
+
"type": "library",
|
4 |
+
"description": "Factory class that creates either File Storage or Directory Storage PHP 5.2.17 and up",
|
5 |
+
"keywords": ["file storage", "directory storage"],
|
6 |
+
"homepage": "http://github.com/borislav-angelov/storage-factory",
|
7 |
+
"license": "MIT",
|
8 |
+
"authors": [
|
9 |
+
{
|
10 |
+
"name": "Bobby Angelov",
|
11 |
+
"email": "borislav.angelov@gmail.com",
|
12 |
+
"homepage": "https://servmask.com",
|
13 |
+
"role": "developer"
|
14 |
+
},
|
15 |
+
{
|
16 |
+
"name": "Yani Iliev",
|
17 |
+
"email": "yani@iliev.me",
|
18 |
+
"homepage": "https://yani.iliev.me",
|
19 |
+
"role": "developer"
|
20 |
+
}
|
21 |
+
],
|
22 |
+
"require": {
|
23 |
+
"php": ">=5.2.0"
|
24 |
+
}
|
25 |
+
}
|
lib/vendor/storage-factory/storage-factory/lib/StorageAbstract.php
ADDED
@@ -0,0 +1,89 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
|
3 |
+
|
4 |
+
/**
|
5 |
+
* StorageAbstract class
|
6 |
+
*
|
7 |
+
* PHP version 5
|
8 |
+
*
|
9 |
+
* LICENSE: Permission is hereby granted, free of charge, to any person obtaining
|
10 |
+
* a copy of this software and associated documentation files (the "Software"), to
|
11 |
+
* deal in the Software without restriction, including without limitation the rights
|
12 |
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
13 |
+
* of the Software, and to permit persons to whom the Software is furnished to do so,
|
14 |
+
* subject to the following conditions:
|
15 |
+
*
|
16 |
+
* The above copyright notice and this permission notice shall be included in all
|
17 |
+
* copies or substantial portions of the Software.
|
18 |
+
*
|
19 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
20 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
21 |
+
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
22 |
+
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
23 |
+
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
24 |
+
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
25 |
+
*
|
26 |
+
* @category FileSystem
|
27 |
+
* @package StorageFactory
|
28 |
+
* @author Yani Iliev <yani@iliev.me>
|
29 |
+
* @author Bobby Angelov <bobby@servmask.com>
|
30 |
+
* @copyright 2014 Yani Iliev, Bobby Angelov
|
31 |
+
* @license https://raw.github.com/borislav-angelov/storage-factory/master/LICENSE The MIT License (MIT)
|
32 |
+
* @version GIT: 1.0.0
|
33 |
+
* @link https://github.com/borislav-angelov/storage-factory/
|
34 |
+
*/
|
35 |
+
|
36 |
+
/**
|
37 |
+
* StorageAbstract class
|
38 |
+
*
|
39 |
+
* @category FileSystem
|
40 |
+
* @package StorageFactory
|
41 |
+
* @author Yani Iliev <yani@iliev.me>
|
42 |
+
* @author Bobby Angelov <bobby@servmask.com>
|
43 |
+
* @copyright 2014 Yani Iliev, Bobby Angelov
|
44 |
+
* @license https://raw.github.com/borislav-angelov/storage-factory/master/LICENSE The MIT License (MIT)
|
45 |
+
* @version GIT: 1.0.0
|
46 |
+
* @link https://github.com/borislav-angelov/storage-factory/
|
47 |
+
*/
|
48 |
+
abstract class StorageAbstract
|
49 |
+
{
|
50 |
+
/**
|
51 |
+
* Get a file or directory as resource
|
52 |
+
*
|
53 |
+
* @param string Get a file or directory as resource or absolute path
|
54 |
+
* @return mixed
|
55 |
+
*/
|
56 |
+
abstract public function getAs($type = 'string');
|
57 |
+
|
58 |
+
/**
|
59 |
+
* Delete a file or directory
|
60 |
+
*
|
61 |
+
* @return string
|
62 |
+
*/
|
63 |
+
abstract public function delete();
|
64 |
+
|
65 |
+
/**
|
66 |
+
* Get storage absolute path
|
67 |
+
*
|
68 |
+
* @return mixed
|
69 |
+
*/
|
70 |
+
public function getRootPath() {
|
71 |
+
if (defined('AI1WM_STORAGE_PATH') && self::isAccessible(AI1WM_STORAGE_PATH)) {
|
72 |
+
return AI1WM_STORAGE_PATH;
|
73 |
+
} else if (self::isAccessible(sys_get_temp_dir())) {
|
74 |
+
return sys_get_temp_dir();
|
75 |
+
} else {
|
76 |
+
throw new Exception('Storage directory is not accessible (read/write).');
|
77 |
+
}
|
78 |
+
}
|
79 |
+
|
80 |
+
/**
|
81 |
+
* Is path accessible (read/write)
|
82 |
+
*
|
83 |
+
* @param string Absolute path
|
84 |
+
* @return boolean Path is accessible or not
|
85 |
+
*/
|
86 |
+
public static function isAccessible($path) {
|
87 |
+
return is_readable($path) && is_writable($path);
|
88 |
+
}
|
89 |
+
}
|
lib/vendor/storage-factory/storage-factory/lib/StorageArea.php
ADDED
@@ -0,0 +1,89 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
|
3 |
+
|
4 |
+
/**
|
5 |
+
* StorageArea class main file
|
6 |
+
*
|
7 |
+
* PHP version 5
|
8 |
+
*
|
9 |
+
* LICENSE: Permission is hereby granted, free of charge, to any person obtaining
|
10 |
+
* a copy of this software and associated documentation files (the "Software"), to
|
11 |
+
* deal in the Software without restriction, including without limitation the rights
|
12 |
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
13 |
+
* of the Software, and to permit persons to whom the Software is furnished to do so,
|
14 |
+
* subject to the following conditions:
|
15 |
+
*
|
16 |
+
* The above copyright notice and this permission notice shall be included in all
|
17 |
+
* copies or substantial portions of the Software.
|
18 |
+
*
|
19 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
20 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
21 |
+
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
22 |
+
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
23 |
+
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
24 |
+
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
25 |
+
*
|
26 |
+
* @category FileSystem
|
27 |
+
* @package StorageFactory
|
28 |
+
* @author Yani Iliev <yani@iliev.me>
|
29 |
+
* @author Bobby Angelov <bobby@servmask.com>
|
30 |
+
* @copyright 2014 Yani Iliev, Bobby Angelov
|
31 |
+
* @license https://raw.github.com/borislav-angelov/storage-factory/master/LICENSE The MIT License (MIT)
|
32 |
+
* @version GIT: 1.0.0
|
33 |
+
* @link https://github.com/borislav-angelov/storage-factory/
|
34 |
+
*/
|
35 |
+
|
36 |
+
require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'StorageFile.php';
|
37 |
+
require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'StorageDirectory.php';
|
38 |
+
|
39 |
+
/**
|
40 |
+
* StorageArea Main class
|
41 |
+
*
|
42 |
+
* @category FileSystem
|
43 |
+
* @package StorageFactory
|
44 |
+
* @author Yani Iliev <yani@iliev.me>
|
45 |
+
* @author Bobby Angelov <bobby@servmask.com>
|
46 |
+
* @copyright 2014 Yani Iliev, Bobby Angelov
|
47 |
+
* @license https://raw.github.com/borislav-angelov/storage-factory/master/LICENSE The MIT License (MIT)
|
48 |
+
* @version GIT: 1.0.0
|
49 |
+
* @link https://github.com/borislav-angelov/storage-factory/
|
50 |
+
*/
|
51 |
+
class StorageArea
|
52 |
+
{
|
53 |
+
protected $nodes = array();
|
54 |
+
|
55 |
+
/**
|
56 |
+
* Create a file with unique name
|
57 |
+
*
|
58 |
+
* @param string $name Custom file name
|
59 |
+
* @return StorageFile StorageFile instance
|
60 |
+
*/
|
61 |
+
public function makeFile($name = null) {
|
62 |
+
$this->nodes[] = $node = new StorageFile($name);
|
63 |
+
|
64 |
+
return $node;
|
65 |
+
}
|
66 |
+
|
67 |
+
/**
|
68 |
+
* Create a directory with unique name
|
69 |
+
*
|
70 |
+
* @param string $name Custom directory name
|
71 |
+
* @return StorageDirectory StorageDirectory instance
|
72 |
+
*/
|
73 |
+
public function makeDirectory($name = null) {
|
74 |
+
$this->nodes[] = $node = new StorageDirectory($name);
|
75 |
+
|
76 |
+
return $node;
|
77 |
+
}
|
78 |
+
|
79 |
+
/**
|
80 |
+
* Remove all files and directories in the current storage
|
81 |
+
*
|
82 |
+
* @return void
|
83 |
+
*/
|
84 |
+
public function flush() {
|
85 |
+
foreach ($this->nodes as $node) {
|
86 |
+
$node->delete();
|
87 |
+
}
|
88 |
+
}
|
89 |
+
}
|
lib/vendor/storage-factory/storage-factory/lib/StorageDirectory.php
ADDED
@@ -0,0 +1,109 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
|
3 |
+
|
4 |
+
/**
|
5 |
+
* StorageDirectory class
|
6 |
+
*
|
7 |
+
* PHP version 5
|
8 |
+
*
|
9 |
+
* LICENSE: Permission is hereby granted, free of charge, to any person obtaining
|
10 |
+
* a copy of this software and associated documentation files (the "Software"), to
|
11 |
+
* deal in the Software without restriction, including without limitation the rights
|
12 |
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
13 |
+
* of the Software, and to permit persons to whom the Software is furnished to do so,
|
14 |
+
* subject to the following conditions:
|
15 |
+
*
|
16 |
+
* The above copyright notice and this permission notice shall be included in all
|
17 |
+
* copies or substantial portions of the Software.
|
18 |
+
*
|
19 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
20 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
21 |
+
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
22 |
+
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
23 |
+
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
24 |
+
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
25 |
+
*
|
26 |
+
* @category FileSystem
|
27 |
+
* @package StorageFactory
|
28 |
+
* @author Yani Iliev <yani@iliev.me>
|
29 |
+
* @author Bobby Angelov <bobby@servmask.com>
|
30 |
+
* @copyright 2014 Yani Iliev, Bobby Angelov
|
31 |
+
* @license https://raw.github.com/borislav-angelov/storage-factory/master/LICENSE The MIT License (MIT)
|
32 |
+
* @version GIT: 1.0.0
|
33 |
+
* @link https://github.com/borislav-angelov/storage-factory/
|
34 |
+
*/
|
35 |
+
|
36 |
+
require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'StorageAbstract.php';
|
37 |
+
|
38 |
+
/**
|
39 |
+
* StorageDirectory class
|
40 |
+
*
|
41 |
+
* @category FileSystem
|
42 |
+
* @package StorageFactory
|
43 |
+
* @author Yani Iliev <yani@iliev.me>
|
44 |
+
* @author Bobby Angelov <bobby@servmask.com>
|
45 |
+
* @copyright 2014 Yani Iliev, Bobby Angelov
|
46 |
+
* @license https://raw.github.com/borislav-angelov/storage-factory/master/LICENSE The MIT License (MIT)
|
47 |
+
* @version GIT: 1.0.0
|
48 |
+
* @link https://github.com/borislav-angelov/storage-factory/
|
49 |
+
*/
|
50 |
+
class StorageDirectory extends StorageAbstract
|
51 |
+
{
|
52 |
+
protected $directory = null;
|
53 |
+
|
54 |
+
/**
|
55 |
+
* CTOR
|
56 |
+
*/
|
57 |
+
public function __construct($name = null) {
|
58 |
+
if (empty($name)) {
|
59 |
+
$this->directory = $this->getRootPath() . DIRECTORY_SEPARATOR . uniqid() . DIRECTORY_SEPARATOR;
|
60 |
+
} else {
|
61 |
+
$this->directory = $this->getRootPath() . DIRECTORY_SEPARATOR . $name . DIRECTORY_SEPARATOR;
|
62 |
+
}
|
63 |
+
|
64 |
+
// Create directory
|
65 |
+
if (!is_dir($this->directory)) {
|
66 |
+
mkdir($this->directory);
|
67 |
+
}
|
68 |
+
}
|
69 |
+
|
70 |
+
/**
|
71 |
+
* Get a file or directory as resource
|
72 |
+
*
|
73 |
+
* @param string Get a file or directory as resource or absolute path
|
74 |
+
* @return mixed
|
75 |
+
*/
|
76 |
+
public function getAs($type = 'string') {
|
77 |
+
if ($type === 'string') {
|
78 |
+
return $this->directory;
|
79 |
+
} else {
|
80 |
+
throw new Exception('Unable to retrieve directory as ' . $type . '. Make sure the method is implemented');
|
81 |
+
}
|
82 |
+
}
|
83 |
+
|
84 |
+
/**
|
85 |
+
* Delete a file or directory
|
86 |
+
*
|
87 |
+
* @return void
|
88 |
+
*/
|
89 |
+
public function delete() {
|
90 |
+
$iterator = new RecursiveIteratorIterator(
|
91 |
+
new RecursiveDirectoryIterator( $this->directory ),
|
92 |
+
RecursiveIteratorIterator::CHILD_FIRST
|
93 |
+
);
|
94 |
+
|
95 |
+
foreach ( $iterator as $item ) {
|
96 |
+
// Skip dots
|
97 |
+
if ( $iterator->isDot() ) continue;
|
98 |
+
|
99 |
+
if ( $item->isDir() ) {
|
100 |
+
rmdir( $this->directory . $iterator->getSubPathName() );
|
101 |
+
} else {
|
102 |
+
unlink( $this->directory . $iterator->getSubPathName() );
|
103 |
+
}
|
104 |
+
}
|
105 |
+
|
106 |
+
rmdir( $this->directory );
|
107 |
+
}
|
108 |
+
|
109 |
+
}
|
lib/vendor/storage-factory/storage-factory/lib/StorageFile.php
ADDED
@@ -0,0 +1,85 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
|
3 |
+
|
4 |
+
/**
|
5 |
+
* StorageFile class
|
6 |
+
*
|
7 |
+
* PHP version 5
|
8 |
+
*
|
9 |
+
* LICENSE: Permission is hereby granted, free of charge, to any person obtaining
|
10 |
+
* a copy of this software and associated documentation files (the "Software"), to
|
11 |
+
* deal in the Software without restriction, including without limitation the rights
|
12 |
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
13 |
+
* of the Software, and to permit persons to whom the Software is furnished to do so,
|
14 |
+
* subject to the following conditions:
|
15 |
+
*
|
16 |
+
* The above copyright notice and this permission notice shall be included in all
|
17 |
+
* copies or substantial portions of the Software.
|
18 |
+
*
|
19 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
20 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
21 |
+
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
22 |
+
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
23 |
+
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
24 |
+
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
25 |
+
*
|
26 |
+
* @category FileSystem
|
27 |
+
* @package StorageFactory
|
28 |
+
* @author Yani Iliev <yani@iliev.me>
|
29 |
+
* @author Bobby Angelov <bobby@servmask.com>
|
30 |
+
* @copyright 2014 Yani Iliev, Bobby Angelov
|
31 |
+
* @license https://raw.github.com/borislav-angelov/storage-factory/master/LICENSE The MIT License (MIT)
|
32 |
+
* @version GIT: 1.0.0
|
33 |
+
* @link https://github.com/borislav-angelov/storage-factory/
|
34 |
+
*/
|
35 |
+
|
36 |
+
require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'StorageAbstract.php';
|
37 |
+
|
38 |
+
/**
|
39 |
+
* StorageFile class
|
40 |
+
*
|
41 |
+
* @category FileSystem
|
42 |
+
* @package StorageFactory
|
43 |
+
* @author Yani Iliev <yani@iliev.me>
|
44 |
+
* @author Bobby Angelov <bobby@servmask.com>
|
45 |
+
* @copyright 2014 Yani Iliev, Bobby Angelov
|
46 |
+
* @license https://raw.github.com/borislav-angelov/storage-factory/master/LICENSE The MIT License (MIT)
|
47 |
+
* @version GIT: 1.0.0
|
48 |
+
* @link https://github.com/borislav-angelov/storage-factory/
|
49 |
+
*/
|
50 |
+
class StorageFile extends StorageAbstract
|
51 |
+
{
|
52 |
+
protected $file = null;
|
53 |
+
|
54 |
+
/**
|
55 |
+
* CTOR
|
56 |
+
*/
|
57 |
+
public function __construct($name = null) {
|
58 |
+
if (empty($name)) {
|
59 |
+
$this->file = tempnam(
|
60 |
+
$this->getRootPath(),
|
61 |
+
(defined('AI1WM_STORAGE_PREFIX') ? AI1WM_STORAGE_PREFIX : 'sm_')
|
62 |
+
);
|
63 |
+
} else {
|
64 |
+
$this->file = $this->getRootPath() . DIRECTORY_SEPARATOR . $name;
|
65 |
+
}
|
66 |
+
}
|
67 |
+
|
68 |
+
/**
|
69 |
+
* Get absolute file path or file resource
|
70 |
+
*
|
71 |
+
* @return mixed
|
72 |
+
*/
|
73 |
+
public function getAs($type = 'string') {
|
74 |
+
return ($type === 'string' ? $this->file : fopen($this->file, 'a+'));
|
75 |
+
}
|
76 |
+
|
77 |
+
/**
|
78 |
+
* Delete file
|
79 |
+
*
|
80 |
+
* @return boolean
|
81 |
+
*/
|
82 |
+
public function delete() {
|
83 |
+
return unlink($this->file);
|
84 |
+
}
|
85 |
+
}
|
lib/vendor/storage-factory/storage-factory/phpunit.xml
ADDED
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<phpunit
|
2 |
+
bootstrap="test/bootstrap.php"
|
3 |
+
backupGlobals="false"
|
4 |
+
colors="true"
|
5 |
+
convertErrorsToExceptions="true"
|
6 |
+
convertNoticesToExceptions="true"
|
7 |
+
convertWarningsToExceptions="true"
|
8 |
+
>
|
9 |
+
<testsuites>
|
10 |
+
<testsuite>
|
11 |
+
<directory prefix="test-" suffix=".php">./test/</directory>
|
12 |
+
</testsuite>
|
13 |
+
</testsuites>
|
14 |
+
<filter>
|
15 |
+
<whitelist processUncoveredFilesFromWhitelist="true">
|
16 |
+
<directory suffix=".php">lib/</directory>
|
17 |
+
</whitelist>
|
18 |
+
</filter>
|
19 |
+
<logging>
|
20 |
+
<log
|
21 |
+
type="coverage-html"
|
22 |
+
target="coverage"
|
23 |
+
charset="UTF-8"
|
24 |
+
highlight="false"
|
25 |
+
lowUpperBound="35"
|
26 |
+
highLowerBound="70"
|
27 |
+
/>
|
28 |
+
</logging>
|
29 |
+
</phpunit>
|
lib/vendor/storage-factory/storage-factory/test/bootstrap.php
ADDED
@@ -0,0 +1,40 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Bootstrap file for unit tests used in Storage Factory
|
6 |
+
*
|
7 |
+
* PHP version 5
|
8 |
+
*
|
9 |
+
* LICENSE: Permission is hereby granted, free of charge, to any person obtaining
|
10 |
+
* a copy of this software and associated documentation files (the "Software"), to
|
11 |
+
* deal in the Software without restriction, including without limitation the rights
|
12 |
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
13 |
+
* of the Software, and to permit persons to whom the Software is furnished to do so,
|
14 |
+
* subject to the following conditions:
|
15 |
+
*
|
16 |
+
* The above copyright notice and this permission notice shall be included in all
|
17 |
+
* copies or substantial portions of the Software.
|
18 |
+
*
|
19 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
20 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
21 |
+
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
22 |
+
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
23 |
+
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
24 |
+
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
25 |
+
*
|
26 |
+
* @category FileSystem
|
27 |
+
* @package StorageFactory
|
28 |
+
* @author Yani Iliev <yani@iliev.me>
|
29 |
+
* @author Bobby Angelov <bobby@servmask.com>
|
30 |
+
* @copyright 2014 Yani Iliev, Bobby Angelov
|
31 |
+
* @license https://raw.github.com/borislav-angelov/storage-factory/master/LICENSE The MIT License (MIT)
|
32 |
+
* @version GIT: 1.0.0
|
33 |
+
* @link https://github.com/borislav-angelov/storage-factory/
|
34 |
+
*/
|
35 |
+
|
36 |
+
require_once
|
37 |
+
dirname(__FILE__) .
|
38 |
+
DIRECTORY_SEPARATOR . '..' .
|
39 |
+
DIRECTORY_SEPARATOR . 'lib' .
|
40 |
+
DIRECTORY_SEPARATOR . 'StorageFactory.php';
|
lib/vendor/storage-factory/storage-factory/test/test-storage-factory.php
ADDED
@@ -0,0 +1,67 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Bootstrap file for unit tests used in Storage Factory
|
6 |
+
*
|
7 |
+
* PHP version 5
|
8 |
+
*
|
9 |
+
* LICENSE: Permission is hereby granted, free of charge, to any person obtaining
|
10 |
+
* a copy of this software and associated documentation files (the "Software"), to
|
11 |
+
* deal in the Software without restriction, including without limitation the rights
|
12 |
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
13 |
+
* of the Software, and to permit persons to whom the Software is furnished to do so,
|
14 |
+
* subject to the following conditions:
|
15 |
+
*
|
16 |
+
* The above copyright notice and this permission notice shall be included in all
|
17 |
+
* copies or substantial portions of the Software.
|
18 |
+
*
|
19 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
20 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
21 |
+
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
22 |
+
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
23 |
+
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
24 |
+
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
25 |
+
*
|
26 |
+
* @category FileSystem
|
27 |
+
* @package StorageFactory
|
28 |
+
* @author Yani Iliev <yani@iliev.me>
|
29 |
+
* @author Bobby Angelov <bobby@servmask.com>
|
30 |
+
* @copyright 2014 Yani Iliev, Bobby Angelov
|
31 |
+
* @license https://raw.github.com/borislav-angelov/storage-factory/master/LICENSE The MIT License (MIT)
|
32 |
+
* @version GIT: 1.0.0
|
33 |
+
* @link https://github.com/borislav-angelov/storage-factory/
|
34 |
+
*/
|
35 |
+
|
36 |
+
/**
|
37 |
+
* Unit test class
|
38 |
+
*
|
39 |
+
* @category Tests
|
40 |
+
* @package ZipFactory
|
41 |
+
* @author Yani Iliev <yani@iliev.me>
|
42 |
+
* @author Bobby Angelov <bobby@servmask.com>
|
43 |
+
* @copyright 2014 Yani Iliev, Bobby Angelov
|
44 |
+
* @license https://raw.github.com/borislav-angelov/storage-factory/master/LICENSE The MIT License (MIT)
|
45 |
+
* @version GIT: 1.0.0
|
46 |
+
* @link https://github.com/borislav-angelov/storage-factory/
|
47 |
+
*/
|
48 |
+
class StorageFactoryTest extends PHPUnit_Framework_TestCase
|
49 |
+
{
|
50 |
+
/**
|
51 |
+
* @return [type] [description]
|
52 |
+
*/
|
53 |
+
public function testMakeFileStorage()
|
54 |
+
{
|
55 |
+
$fileStorage = StorageFactory::make();
|
56 |
+
$this->assertTrue($fileStorage instanceof StorageFile);
|
57 |
+
}
|
58 |
+
|
59 |
+
/**
|
60 |
+
* @return [type] [description]
|
61 |
+
*/
|
62 |
+
public function testMakeDirectoryStorage()
|
63 |
+
{
|
64 |
+
$fileStorage = StorageFactory::make(true);
|
65 |
+
$this->assertTrue($fileStorage instanceof StorageDirectory);
|
66 |
+
}
|
67 |
+
}
|
lib/vendor/zip-factory/zip-factory/lib/ArchiverPclZip.php
CHANGED
@@ -28,7 +28,7 @@
|
|
28 |
* @author Yani Iliev <yani@iliev.me>
|
29 |
* @copyright 2014 Yani Iliev
|
30 |
* @license https://raw.github.com/yani-/zip-factory/master/LICENSE The MIT License (MIT)
|
31 |
-
* @version GIT: 1.
|
32 |
* @link https://github.com/yani-/zip-factory/
|
33 |
*/
|
34 |
|
@@ -121,23 +121,45 @@ if (function_exists('gzopen')) {
|
|
121 |
}
|
122 |
|
123 |
/**
|
124 |
-
*
|
125 |
*
|
126 |
-
* @param
|
127 |
-
* @param
|
128 |
-
* @param array $include
|
129 |
*
|
130 |
-
* @return
|
131 |
*/
|
132 |
-
public function addDir($path, $
|
133 |
{
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
$
|
138 |
-
|
139 |
-
|
140 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
141 |
}
|
142 |
|
143 |
/**
|
28 |
* @author Yani Iliev <yani@iliev.me>
|
29 |
* @copyright 2014 Yani Iliev
|
30 |
* @license https://raw.github.com/yani-/zip-factory/master/LICENSE The MIT License (MIT)
|
31 |
+
* @version GIT: 1.2.0
|
32 |
* @link https://github.com/yani-/zip-factory/
|
33 |
*/
|
34 |
|
121 |
}
|
122 |
|
123 |
/**
|
124 |
+
* Add directory to archive
|
125 |
*
|
126 |
+
* @param string $path Path to directory
|
127 |
+
* @param string $parent_dir Parent path name
|
128 |
+
* @param array $include Include specific directories
|
129 |
*
|
130 |
+
* @return void
|
131 |
*/
|
132 |
+
public function addDir($path, $parent_dir = null, $include = array())
|
133 |
{
|
134 |
+
// Prepare filter pattern
|
135 |
+
$filter_pattern = null;
|
136 |
+
if (is_array($include)) {
|
137 |
+
$filters = array();
|
138 |
+
foreach ($include as $filter) {
|
139 |
+
$filters[] = $path . DIRECTORY_SEPARATOR . $filter;
|
140 |
+
}
|
141 |
+
|
142 |
+
$filter_pattern = implode(',', $filters);
|
143 |
+
}
|
144 |
+
|
145 |
+
// Validate filter pattern
|
146 |
+
if ($filter_pattern) {
|
147 |
+
$this->pclzip->add(
|
148 |
+
$filter_pattern,
|
149 |
+
PCLZIP_OPT_REMOVE_PATH,
|
150 |
+
$path,
|
151 |
+
PCLZIP_OPT_ADD_PATH,
|
152 |
+
$parent_dir
|
153 |
+
);
|
154 |
+
} else {
|
155 |
+
$this->pclzip->add(
|
156 |
+
$path,
|
157 |
+
PCLZIP_OPT_REMOVE_PATH,
|
158 |
+
$path,
|
159 |
+
PCLZIP_OPT_ADD_PATH,
|
160 |
+
$parent_dir
|
161 |
+
);
|
162 |
+
}
|
163 |
}
|
164 |
|
165 |
/**
|
lib/vendor/zip-factory/zip-factory/lib/ArchiverZipArchive.php
CHANGED
@@ -28,7 +28,7 @@
|
|
28 |
* @author Yani Iliev <yani@iliev.me>
|
29 |
* @copyright 2014 Yani Iliev
|
30 |
* @license https://raw.github.com/yani-/zip-factory/master/LICENSE The MIT License (MIT)
|
31 |
-
* @version GIT: 1.
|
32 |
* @link https://github.com/yani-/zip-factory/
|
33 |
*/
|
34 |
|
@@ -112,13 +112,13 @@ if (class_exists('ZipArchive')) {
|
|
112 |
}
|
113 |
|
114 |
/**
|
115 |
-
*
|
116 |
*
|
117 |
-
* @param
|
118 |
-
* @param
|
119 |
-
* @param array $include
|
120 |
*
|
121 |
-
* @return
|
122 |
*/
|
123 |
public function addDir($path, $parent_dir = null, $include = array())
|
124 |
{
|
@@ -128,18 +128,19 @@ if (class_exists('ZipArchive')) {
|
|
128 |
RecursiveIteratorIterator::SELF_FIRST
|
129 |
);
|
130 |
|
131 |
-
// Prepare
|
132 |
-
$
|
133 |
if (is_array($include)) {
|
134 |
$filters = array();
|
135 |
-
foreach ($include as $
|
136 |
-
$filters[] =
|
137 |
-
'
|
138 |
-
preg_quote($
|
|
|
139 |
);
|
140 |
}
|
141 |
|
142 |
-
$
|
143 |
}
|
144 |
|
145 |
foreach ($iterator as $item) {
|
@@ -148,12 +149,9 @@ if (class_exists('ZipArchive')) {
|
|
148 |
continue;
|
149 |
}
|
150 |
|
151 |
-
// Validate
|
152 |
-
if ($
|
153 |
-
if (!preg_match(
|
154 |
-
'/^(' . $file_pattern . ')$/',
|
155 |
-
$iterator->getSubPathName()
|
156 |
-
)) {
|
157 |
continue;
|
158 |
}
|
159 |
}
|
28 |
* @author Yani Iliev <yani@iliev.me>
|
29 |
* @copyright 2014 Yani Iliev
|
30 |
* @license https://raw.github.com/yani-/zip-factory/master/LICENSE The MIT License (MIT)
|
31 |
+
* @version GIT: 1.2.0
|
32 |
* @link https://github.com/yani-/zip-factory/
|
33 |
*/
|
34 |
|
112 |
}
|
113 |
|
114 |
/**
|
115 |
+
* Add directory to archive
|
116 |
*
|
117 |
+
* @param string $path Path to directory
|
118 |
+
* @param string $parent_dir Parent path name
|
119 |
+
* @param array $include Include specific directories
|
120 |
*
|
121 |
+
* @return void
|
122 |
*/
|
123 |
public function addDir($path, $parent_dir = null, $include = array())
|
124 |
{
|
128 |
RecursiveIteratorIterator::SELF_FIRST
|
129 |
);
|
130 |
|
131 |
+
// Prepare filter pattern
|
132 |
+
$filter_pattern = null;
|
133 |
if (is_array($include)) {
|
134 |
$filters = array();
|
135 |
+
foreach ($include as $filter) {
|
136 |
+
$filters[] = sprintf(
|
137 |
+
'(%s(%s.*)?)',
|
138 |
+
preg_quote( $filter, '/' ),
|
139 |
+
preg_quote( DIRECTORY_SEPARATOR, '/' )
|
140 |
);
|
141 |
}
|
142 |
|
143 |
+
$filter_pattern = implode( '|', $filters );
|
144 |
}
|
145 |
|
146 |
foreach ($iterator as $item) {
|
149 |
continue;
|
150 |
}
|
151 |
|
152 |
+
// Validate filter pattern
|
153 |
+
if ($filter_pattern) {
|
154 |
+
if (!preg_match('/^' . $filter_pattern . '$/', $iterator->getSubPathName())) {
|
|
|
|
|
|
|
155 |
continue;
|
156 |
}
|
157 |
}
|
lib/vendor/zip-factory/zip-factory/lib/ZipFactory.php
CHANGED
@@ -28,7 +28,7 @@
|
|
28 |
* @author Yani Iliev <yani@iliev.me>
|
29 |
* @copyright 2014 Yani Iliev
|
30 |
* @license https://raw.github.com/yani-/zip-factory/master/LICENSE The MIT License (MIT)
|
31 |
-
* @version GIT: 1.
|
32 |
* @link https://github.com/yani-/zip-factory/
|
33 |
*/
|
34 |
|
28 |
* @author Yani Iliev <yani@iliev.me>
|
29 |
* @copyright 2014 Yani Iliev
|
30 |
* @license https://raw.github.com/yani-/zip-factory/master/LICENSE The MIT License (MIT)
|
31 |
+
* @version GIT: 1.2.0
|
32 |
* @link https://github.com/yani-/zip-factory/
|
33 |
*/
|
34 |
|
lib/view/export/index.php
CHANGED
@@ -149,7 +149,7 @@
|
|
149 |
</div>
|
150 |
|
151 |
<div class="ai1wm-field">
|
152 |
-
<?php if ( $
|
153 |
<div class="ai1wm-buttons">
|
154 |
<button type="submit" name="options[action]" value="export" class="ai1wm-button-green">
|
155 |
<i class="ai1wm-icon-arrow-down"></i>
|
@@ -162,10 +162,9 @@
|
|
162 |
printf(
|
163 |
_(
|
164 |
'Site could not be exported!<br />
|
165 |
-
Please make sure that
|
166 |
-
<a href="https://servmask.com/blog/setting-permissions-for-temp-folder-on-windows" target="_blank">See how to do it?</a>'
|
167 |
),
|
168 |
-
|
169 |
);
|
170 |
?>
|
171 |
</div>
|
149 |
</div>
|
150 |
|
151 |
<div class="ai1wm-field">
|
152 |
+
<?php if ( $is_accessible ): ?>
|
153 |
<div class="ai1wm-buttons">
|
154 |
<button type="submit" name="options[action]" value="export" class="ai1wm-button-green">
|
155 |
<i class="ai1wm-icon-arrow-down"></i>
|
162 |
printf(
|
163 |
_(
|
164 |
'Site could not be exported!<br />
|
165 |
+
Please make sure that storage directory <strong>%s</strong> has read and write permissions.'
|
|
|
166 |
),
|
167 |
+
AI1WM_STORAGE_PATH
|
168 |
);
|
169 |
?>
|
170 |
</div>
|
lib/view/import/index.php
CHANGED
@@ -59,7 +59,7 @@
|
|
59 |
<?php _e( 'When the file is uploaded successfully it will be automatically restored on the current WordPress instance.' ); ?>
|
60 |
</p>
|
61 |
|
62 |
-
<?php if ( $
|
63 |
<div class="ai1wm-upload-file-message ai1wm-message"></div>
|
64 |
|
65 |
<form action="" method="post" enctype="multipart/form-data">
|
@@ -89,10 +89,9 @@
|
|
89 |
printf(
|
90 |
_(
|
91 |
'Site could not be imported!<br />
|
92 |
-
Please make sure that
|
93 |
-
<a href="https://servmask.com/blog/setting-permissions-for-temp-folder-on-windows" target="_blank">See how to do it?</a>'
|
94 |
),
|
95 |
-
|
96 |
);
|
97 |
?>
|
98 |
</div>
|
59 |
<?php _e( 'When the file is uploaded successfully it will be automatically restored on the current WordPress instance.' ); ?>
|
60 |
</p>
|
61 |
|
62 |
+
<?php if ( $is_accessible ): ?>
|
63 |
<div class="ai1wm-upload-file-message ai1wm-message"></div>
|
64 |
|
65 |
<form action="" method="post" enctype="multipart/form-data">
|
89 |
printf(
|
90 |
_(
|
91 |
'Site could not be imported!<br />
|
92 |
+
Please make sure that storage directory <strong>%s</strong> has read and write permissions.'
|
|
|
93 |
),
|
94 |
+
AI1WM_STORAGE_PATH
|
95 |
);
|
96 |
?>
|
97 |
</div>
|
loader.php
CHANGED
@@ -54,6 +54,16 @@ require_once AI1WM_VENDOR_PATH .
|
|
54 |
DIRECTORY_SEPARATOR .
|
55 |
'ZipFactory.php';
|
56 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
57 |
require_once AI1WM_CONTROLLER_PATH .
|
58 |
DIRECTORY_SEPARATOR .
|
59 |
'class-ai1wm-main-controller.php';
|
@@ -101,3 +111,4 @@ require_once AI1WM_MODEL_PATH .
|
|
101 |
require_once AI1WM_MODEL_PATH .
|
102 |
DIRECTORY_SEPARATOR .
|
103 |
'class-ai1wm-report.php';
|
|
54 |
DIRECTORY_SEPARATOR .
|
55 |
'ZipFactory.php';
|
56 |
|
57 |
+
require_once AI1WM_VENDOR_PATH .
|
58 |
+
DIRECTORY_SEPARATOR .
|
59 |
+
'storage-factory' .
|
60 |
+
DIRECTORY_SEPARATOR .
|
61 |
+
'storage-factory' .
|
62 |
+
DIRECTORY_SEPARATOR .
|
63 |
+
'lib' .
|
64 |
+
DIRECTORY_SEPARATOR .
|
65 |
+
'StorageArea.php';
|
66 |
+
|
67 |
require_once AI1WM_CONTROLLER_PATH .
|
68 |
DIRECTORY_SEPARATOR .
|
69 |
'class-ai1wm-main-controller.php';
|
111 |
require_once AI1WM_MODEL_PATH .
|
112 |
DIRECTORY_SEPARATOR .
|
113 |
'class-ai1wm-report.php';
|
114 |
+
|
readme.txt
CHANGED
@@ -2,8 +2,8 @@
|
|
2 |
Contributors: yani.iliev, bangelov, mirkov
|
3 |
Tags: db migration, migration, wordpress migration, db backup, db restore, website backup, website restore, website migration, website deploy, wordpress deploy, db backup, database export, database serialization, database find replace
|
4 |
Requires at least: 3.3
|
5 |
-
Tested up to: 3.
|
6 |
-
Stable tag: 1.
|
7 |
License: GPLv2 or later
|
8 |
|
9 |
All-in-One WP Migration is the only tools that you will ever needs when you need to perform site migration of your WordPress blog.
|
@@ -40,7 +40,7 @@ All in One WP Plugin is the first plugin to offer true mobile experience on Word
|
|
40 |
* Your export files are archived using the fast ZipArchive pecl extension. If your server doesn't have it, we fall back to PclZIP which is included in WordPress
|
41 |
|
42 |
= True WordPress v3.3 Support =
|
43 |
-
* We tested every single WordPress version from `3.3` up to `3.
|
44 |
|
45 |
= Coming soon in a commercial version =
|
46 |
* A new, slicker design
|
@@ -70,6 +70,12 @@ All in One WP Plugin is the first plugin to offer true mobile experience on Word
|
|
70 |
3. Plugin Menu
|
71 |
|
72 |
== Changelog ==
|
|
|
|
|
|
|
|
|
|
|
|
|
73 |
= 1.6.0 =
|
74 |
* Added additional check for directory's permissions
|
75 |
* Added additional check for output buffering when exporting a file
|
2 |
Contributors: yani.iliev, bangelov, mirkov
|
3 |
Tags: db migration, migration, wordpress migration, db backup, db restore, website backup, website restore, website migration, website deploy, wordpress deploy, db backup, database export, database serialization, database find replace
|
4 |
Requires at least: 3.3
|
5 |
+
Tested up to: 3.9
|
6 |
+
Stable tag: 1.7.0
|
7 |
License: GPLv2 or later
|
8 |
|
9 |
All-in-One WP Migration is the only tools that you will ever needs when you need to perform site migration of your WordPress blog.
|
40 |
* Your export files are archived using the fast ZipArchive pecl extension. If your server doesn't have it, we fall back to PclZIP which is included in WordPress
|
41 |
|
42 |
= True WordPress v3.3 Support =
|
43 |
+
* We tested every single WordPress version from `3.3` up to `3.9`
|
44 |
|
45 |
= Coming soon in a commercial version =
|
46 |
* A new, slicker design
|
70 |
3. Plugin Menu
|
71 |
|
72 |
== Changelog ==
|
73 |
+
= 1.7.0 =
|
74 |
+
* Added storage layer to avoid permission issues with OS's directory used for temporary storage
|
75 |
+
* Added additional checks to verify the consistency of the imported archive
|
76 |
+
* Fixed a bug that caused the database to be exported without data
|
77 |
+
* Removed unused variables from package.json file
|
78 |
+
|
79 |
= 1.6.0 =
|
80 |
* Added additional check for directory's permissions
|
81 |
* Added additional check for output buffering when exporting a file
|