Version Description
- This is a critical update. Fixes a bug in the core backup library. Please update immediately.
Download this release
Release Info
| Developer | pauldewouters |
| Plugin | |
| Version | 3.0.1 |
| Comparing to | |
| See all releases | |
Code changes from version 3.0 to 3.0.1
- History.md +68 -0
- admin/schedule-form-excludes.php +1 -1
- assets/d-azure-alt.png +0 -0
- assets/d-azure.png +0 -0
- assets/d-dream-alt.png +0 -0
- assets/d-dream.png +0 -0
- assets/d-drive-alt.png +0 -0
- assets/d-drive.png +0 -0
- assets/d-dropbox-alt.png +0 -0
- assets/d-dropbox.png +0 -0
- assets/d-ftp-alt.png +0 -0
- assets/d-ftp.png +0 -0
- assets/d-rack-alt.png +0 -0
- assets/d-rack.png +0 -0
- assets/d-s3-alt.png +0 -0
- assets/d-s3.png +0 -0
- assets/hmbkp.js +4 -14
- backupwordpress.php +1 -1
- hm-backup/hm-backup.php +142 -44
- readme.txt +16 -1
History.md
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
n.n.n / 2014-11-20
|
| 3 |
+
==================
|
| 4 |
+
|
| 5 |
+
* remove uneeded images
|
| 6 |
+
* latest hm-backup
|
| 7 |
+
* latest hm-backup
|
| 8 |
+
* Typos in v 3.0 changelog
|
| 9 |
+
* Specify POT filename in grunt task
|
| 10 |
+
* Update POT file
|
| 11 |
+
* Markdown readme
|
| 12 |
+
* Regenerate readme
|
| 13 |
+
* Add plugin headers
|
| 14 |
+
* Merge branch 'master' of github.com:humanmade/backupwordpress
|
| 15 |
+
* Refactor the recursive filesize scanner
|
| 16 |
+
* correct text domain
|
| 17 |
+
* Merge pull request #556 from humanmade/issue-556
|
| 18 |
+
* Merge pull request #580 from humanmade/issue-580
|
| 19 |
+
* Merge pull request #584 from humanmade/update-backdrop
|
| 20 |
+
* Remove unneede statements
|
| 21 |
+
* reload the excludes filelist in the correct place when someone excludes a file
|
| 22 |
+
* Latest backdrop
|
| 23 |
+
* Regenerate minified CSS
|
| 24 |
+
* Regenerate minified JS
|
| 25 |
+
* Fix cancel backup action
|
| 26 |
+
* WordPress Coding Standards
|
| 27 |
+
* Exit early if incompatible version of WordPress
|
| 28 |
+
* Update translations
|
| 29 |
+
* Update changelog
|
| 30 |
+
* Merge pull request #573 from humanmade/design
|
| 31 |
+
* Load minified CSS
|
| 32 |
+
* Formatting
|
| 33 |
+
* Biweekly wording
|
| 34 |
+
* Add missing period
|
| 35 |
+
* use nonce_url instead of manually adding the nonce query param
|
| 36 |
+
* close the settings form when done
|
| 37 |
+
* Design changes as per ticket
|
| 38 |
+
* Start tracking langauge in server info
|
| 39 |
+
* Right align the primary button in the enable support modal
|
| 40 |
+
* Re-factor the directory filesize code to use a single array instead of thoussands of transients
|
| 41 |
+
* Remove the warning that would show if you were using anything other than the latest stable, it's no longer needed now that the FAQ is local
|
| 42 |
+
* switch to using a single transient to store directory filesize data
|
| 43 |
+
* Merge pull request #552 from humanmade/issue-552
|
| 44 |
+
* Merge pull request #562 from humanmade/enhancement/issue-562
|
| 45 |
+
* Add an anchor link
|
| 46 |
+
* Add error message
|
| 47 |
+
* Rename function
|
| 48 |
+
* Prefix GET params
|
| 49 |
+
* Update exclude rule action
|
| 50 |
+
* Adds function for building admin action urls
|
| 51 |
+
* fix vertical scroll
|
| 52 |
+
* Adds some functions to manage settings form submission errors
|
| 53 |
+
* Rename nonce and action
|
| 54 |
+
* fetch errors to display
|
| 55 |
+
* Form submission handling for BWP and add-ons settings
|
| 56 |
+
* Use a new function that persists form submission errors to a transient
|
| 57 |
+
* None check
|
| 58 |
+
* Pass the nonce around in the ajax request
|
| 59 |
+
* Enable support action links
|
| 60 |
+
* Check nonces
|
| 61 |
+
* Modify action URLs to use the admin_post hook
|
| 62 |
+
* Remove unneeded code
|
| 63 |
+
* New line at end
|
| 64 |
+
* Use admin_post hook
|
| 65 |
+
* Merge pull request #502 from humanmade/stream-integration
|
| 66 |
+
* Merge pull request #554 from humanmade/fix-display-schedule-time
|
| 67 |
+
* Display schedule start time in local timezone
|
| 68 |
+
* Add an action hook that gives access to consumers to the backup progress
|
admin/schedule-form-excludes.php
CHANGED
|
@@ -45,7 +45,7 @@
|
|
| 45 |
|
| 46 |
<?php else : ?>
|
| 47 |
|
| 48 |
-
<a href="<?php echo hmbkp_admin_action_url( 'remove_exclude_rule', array( 'hmbkp_remove_exclude' => $exclude, 'hmbkp_schedule_id' => $schedule->get_id() ) ); ?>" class="delete-action"><?php _e( '
|
| 49 |
|
| 50 |
<?php endif; ?>
|
| 51 |
|
| 45 |
|
| 46 |
<?php else : ?>
|
| 47 |
|
| 48 |
+
<a href="<?php echo hmbkp_admin_action_url( 'remove_exclude_rule', array( 'hmbkp_remove_exclude' => $exclude, 'hmbkp_schedule_id' => $schedule->get_id() ) ); ?>" class="delete-action"><?php _e( 'Stop excluding', 'hmbkp' ); ?></a>
|
| 49 |
|
| 50 |
<?php endif; ?>
|
| 51 |
|
assets/d-azure-alt.png
DELETED
|
Binary file
|
assets/d-azure.png
DELETED
|
Binary file
|
assets/d-dream-alt.png
DELETED
|
Binary file
|
assets/d-dream.png
DELETED
|
Binary file
|
assets/d-drive-alt.png
DELETED
|
Binary file
|
assets/d-drive.png
DELETED
|
Binary file
|
assets/d-dropbox-alt.png
DELETED
|
Binary file
|
assets/d-dropbox.png
DELETED
|
Binary file
|
assets/d-ftp-alt.png
DELETED
|
Binary file
|
assets/d-ftp.png
DELETED
|
Binary file
|
assets/d-rack-alt.png
DELETED
|
Binary file
|
assets/d-rack.png
DELETED
|
Binary file
|
assets/d-s3-alt.png
DELETED
|
Binary file
|
assets/d-s3.png
DELETED
|
Binary file
|
assets/hmbkp.js
CHANGED
|
@@ -61,8 +61,9 @@ jQuery( document ).ready( function( $ ) {
|
|
| 61 |
}
|
| 62 |
|
| 63 |
// Fail silently for now
|
| 64 |
-
else
|
| 65 |
$( '.calculating' ).remove();
|
|
|
|
| 66 |
|
| 67 |
}
|
| 68 |
).error( function() {
|
|
@@ -173,8 +174,9 @@ function hmbkpToggleScheduleFields( recurrence ){
|
|
| 173 |
function hmbkpCatchResponseAndOfferToEmail( data ) {
|
| 174 |
|
| 175 |
// Backup Succeeded
|
| 176 |
-
if ( ! data || data == 0 )
|
| 177 |
location.reload( true );
|
|
|
|
| 178 |
|
| 179 |
// The backup failed, show the error and offer to have it emailed back
|
| 180 |
else {
|
|
@@ -189,18 +191,6 @@ function hmbkpCatchResponseAndOfferToEmail( data ) {
|
|
| 189 |
if ( ! data || data == 0 )
|
| 190 |
return;
|
| 191 |
|
| 192 |
-
// jQuery.colorbox( {
|
| 193 |
-
// 'innerWidth' : "320px",
|
| 194 |
-
// 'maxHeight' : "100%",
|
| 195 |
-
// 'html' : data,
|
| 196 |
-
// 'overlayClose' : false,
|
| 197 |
-
// 'escKey' : false,
|
| 198 |
-
// 'onLoad' : function() {
|
| 199 |
-
// jQuery( '#cboxClose' ).remove();
|
| 200 |
-
// jQuery.colorbox.resize();
|
| 201 |
-
// }
|
| 202 |
-
// } );
|
| 203 |
-
|
| 204 |
}
|
| 205 |
);
|
| 206 |
|
| 61 |
}
|
| 62 |
|
| 63 |
// Fail silently for now
|
| 64 |
+
else {
|
| 65 |
$( '.calculating' ).remove();
|
| 66 |
+
}
|
| 67 |
|
| 68 |
}
|
| 69 |
).error( function() {
|
| 174 |
function hmbkpCatchResponseAndOfferToEmail( data ) {
|
| 175 |
|
| 176 |
// Backup Succeeded
|
| 177 |
+
if ( ! data || data == 0 ) {
|
| 178 |
location.reload( true );
|
| 179 |
+
}
|
| 180 |
|
| 181 |
// The backup failed, show the error and offer to have it emailed back
|
| 182 |
else {
|
| 191 |
if ( ! data || data == 0 )
|
| 192 |
return;
|
| 193 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 194 |
}
|
| 195 |
);
|
| 196 |
|
backupwordpress.php
CHANGED
|
@@ -5,7 +5,7 @@ Plugin Name: BackUpWordPress
|
|
| 5 |
Plugin URI: http://bwp.hmn.md/
|
| 6 |
Description: Simple automated backups of your WordPress powered website. Once activated you'll find me under <strong>Tools → Backups</strong>.
|
| 7 |
Author: Human Made Limited
|
| 8 |
-
Version: 3.0
|
| 9 |
Author URI: http://hmn.md/
|
| 10 |
License: GPL-2.0+
|
| 11 |
License URI: http://www.gnu.org/licenses/gpl-2.0.txt
|
| 5 |
Plugin URI: http://bwp.hmn.md/
|
| 6 |
Description: Simple automated backups of your WordPress powered website. Once activated you'll find me under <strong>Tools → Backups</strong>.
|
| 7 |
Author: Human Made Limited
|
| 8 |
+
Version: 3.0.1
|
| 9 |
Author URI: http://hmn.md/
|
| 10 |
License: GPL-2.0+
|
| 11 |
License URI: http://www.gnu.org/licenses/gpl-2.0.txt
|
hm-backup/hm-backup.php
CHANGED
|
@@ -94,6 +94,14 @@ class HM_Backup {
|
|
| 94 |
*/
|
| 95 |
private $unreadable_files = array();
|
| 96 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 97 |
/**
|
| 98 |
* Contains an array of errors
|
| 99 |
*
|
|
@@ -132,26 +140,6 @@ class HM_Backup {
|
|
| 132 |
*/
|
| 133 |
protected $archive_verified = false;
|
| 134 |
|
| 135 |
-
/**
|
| 136 |
-
* @var array
|
| 137 |
-
*/
|
| 138 |
-
protected $included_files = array();
|
| 139 |
-
|
| 140 |
-
/**
|
| 141 |
-
* @var int
|
| 142 |
-
*/
|
| 143 |
-
protected $included_file_count = 0;
|
| 144 |
-
|
| 145 |
-
/**
|
| 146 |
-
* @var int
|
| 147 |
-
*/
|
| 148 |
-
protected $excluded_file_count = 0;
|
| 149 |
-
|
| 150 |
-
/**
|
| 151 |
-
* @var int
|
| 152 |
-
*/
|
| 153 |
-
protected $get_unreadable_file_count = 0;
|
| 154 |
-
|
| 155 |
/**
|
| 156 |
* Check whether safe mode is active or not
|
| 157 |
*
|
|
@@ -208,14 +196,10 @@ class HM_Backup {
|
|
| 208 |
|
| 209 |
$home_path = ABSPATH;
|
| 210 |
|
| 211 |
-
// Attempt to guess the home path based on the location of wp-config.php
|
| 212 |
-
if ( ! file_exists( ABSPATH . 'wp-config.php' ) ) {
|
| 213 |
-
$home_path = trailingslashit( dirname( ABSPATH ) );
|
| 214 |
-
}
|
| 215 |
-
|
| 216 |
// If site_url contains home_url and they differ then assume WordPress is installed in a sub directory
|
| 217 |
-
if ( $home_url !== $site_url && strpos( $site_url, $home_url ) === 0 )
|
| 218 |
$home_path = trailingslashit( substr( self::conform_dir( ABSPATH ), 0, strrpos( self::conform_dir( ABSPATH ), str_replace( $home_url, '', $site_url ) ) ) );
|
|
|
|
| 219 |
|
| 220 |
return self::conform_dir( $home_path );
|
| 221 |
|
|
@@ -261,7 +245,7 @@ class HM_Backup {
|
|
| 261 |
@set_time_limit( 0 );
|
| 262 |
|
| 263 |
// Set a custom error handler so we can track errors
|
| 264 |
-
set_error_handler( array(
|
| 265 |
|
| 266 |
}
|
| 267 |
|
|
@@ -1041,6 +1025,103 @@ class HM_Backup {
|
|
| 1041 |
|
| 1042 |
}
|
| 1043 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1044 |
private function load_pclzip() {
|
| 1045 |
|
| 1046 |
// Load PclZip
|
|
@@ -1062,12 +1143,14 @@ class HM_Backup {
|
|
| 1062 |
|
| 1063 |
$excludes = array();
|
| 1064 |
|
| 1065 |
-
if ( isset( $this->excludes ) )
|
| 1066 |
$excludes = $this->excludes;
|
|
|
|
| 1067 |
|
| 1068 |
// If path() is inside root(), exclude it
|
| 1069 |
-
if ( strpos( $this->get_path(), $this->get_root() ) !== false )
|
| 1070 |
array_unshift( $excludes, trailingslashit( $this->get_path() ) );
|
|
|
|
| 1071 |
|
| 1072 |
return array_unique( $excludes );
|
| 1073 |
|
|
@@ -1081,11 +1164,13 @@ class HM_Backup {
|
|
| 1081 |
*/
|
| 1082 |
public function set_excludes( $excludes, $append = false ) {
|
| 1083 |
|
| 1084 |
-
if ( is_string( $excludes ) )
|
| 1085 |
$excludes = explode( ',', $excludes );
|
|
|
|
| 1086 |
|
| 1087 |
-
if ( $append )
|
| 1088 |
$excludes = array_merge( $this->excludes, $excludes );
|
|
|
|
| 1089 |
|
| 1090 |
$this->excludes = array_filter( array_unique( array_map( 'trim', $excludes ) ) );
|
| 1091 |
|
|
@@ -1126,53 +1211,66 @@ class HM_Backup {
|
|
| 1126 |
$file = $absolute = $fragment = false;
|
| 1127 |
|
| 1128 |
// Files don't end with /
|
| 1129 |
-
if ( ! in_array( substr( $rule, - 1 ), array( '\\', '/' ) ) )
|
| 1130 |
$file = true;
|
|
|
|
| 1131 |
|
| 1132 |
// If rule starts with a / then treat as absolute path
|
| 1133 |
-
elseif ( in_array( substr( $rule, 0, 1 ), array( '\\', '/' ) ) )
|
| 1134 |
$absolute = true;
|
|
|
|
| 1135 |
|
| 1136 |
// Otherwise treat as dir fragment
|
| 1137 |
-
else
|
| 1138 |
$fragment = true;
|
|
|
|
| 1139 |
|
| 1140 |
// Strip $this->root and conform
|
| 1141 |
$rule = str_ireplace( $this->get_root(), '', untrailingslashit( self::conform_dir( $rule ) ) );
|
| 1142 |
|
|
|
|
| 1143 |
// Strip the preceeding slash
|
| 1144 |
-
if ( in_array( substr( $rule, 0, 1 ), array( '\\', '/' ) ) )
|
| 1145 |
$rule = substr( $rule, 1 );
|
|
|
|
| 1146 |
|
| 1147 |
// Escape string for regex
|
| 1148 |
-
if ( $context === 'regex' )
|
| 1149 |
$rule = str_replace( '.', '\.', $rule );
|
|
|
|
| 1150 |
|
| 1151 |
// Convert any existing wildcards
|
| 1152 |
-
if ( $wildcard !== '*' && strpos( $rule, '*' ) !== false )
|
| 1153 |
$rule = str_replace( '*', $wildcard, $rule );
|
|
|
|
| 1154 |
|
| 1155 |
// Wrap directory fragments and files in wildcards for zip
|
| 1156 |
-
if ( $context === 'zip' && ( $fragment || $file ) )
|
| 1157 |
$rule = $wildcard . $rule . $wildcard;
|
|
|
|
| 1158 |
|
| 1159 |
// Add a wildcard to the end of absolute url for zips
|
| 1160 |
-
if ( $context === 'zip' && $absolute )
|
| 1161 |
$rule .= $wildcard;
|
|
|
|
| 1162 |
|
| 1163 |
// Add and end carrot to files for pclzip but only if it doesn't end in a wildcard
|
| 1164 |
-
if ( $file && $context === 'regex' )
|
| 1165 |
$rule .= '$';
|
|
|
|
| 1166 |
|
| 1167 |
// Add a start carrot to absolute urls for pclzip
|
| 1168 |
-
if ( $absolute && $context === 'regex' )
|
| 1169 |
$rule = '^' . $rule;
|
|
|
|
|
|
|
| 1170 |
|
| 1171 |
}
|
| 1172 |
|
| 1173 |
// Escape shell args for zip command
|
| 1174 |
-
if ( $context === 'zip' )
|
| 1175 |
$excludes = array_map( 'escapeshellarg', array_unique( $excludes ) );
|
|
|
|
| 1176 |
|
| 1177 |
return implode( $separator, $excludes );
|
| 1178 |
|
|
@@ -1525,10 +1623,10 @@ class HM_Backup {
|
|
| 1525 |
* of the zip
|
| 1526 |
*
|
| 1527 |
* @param string $event
|
| 1528 |
-
* @param array
|
| 1529 |
* @return bool
|
| 1530 |
*/
|
| 1531 |
-
function hmbkp_pclzip_callback( $event,
|
| 1532 |
|
| 1533 |
global $_hmbkp_exclude_string;
|
| 1534 |
|
| 94 |
*/
|
| 95 |
private $unreadable_files = array();
|
| 96 |
|
| 97 |
+
/**
|
| 98 |
+
* An array of all the files in root
|
| 99 |
+
* that will be included in the backup
|
| 100 |
+
*
|
| 101 |
+
* @var array
|
| 102 |
+
*/
|
| 103 |
+
protected $included_files = array();
|
| 104 |
+
|
| 105 |
/**
|
| 106 |
* Contains an array of errors
|
| 107 |
*
|
| 140 |
*/
|
| 141 |
protected $archive_verified = false;
|
| 142 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 143 |
/**
|
| 144 |
* Check whether safe mode is active or not
|
| 145 |
*
|
| 196 |
|
| 197 |
$home_path = ABSPATH;
|
| 198 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 199 |
// If site_url contains home_url and they differ then assume WordPress is installed in a sub directory
|
| 200 |
+
if ( $home_url !== $site_url && strpos( $site_url, $home_url ) === 0 ) {
|
| 201 |
$home_path = trailingslashit( substr( self::conform_dir( ABSPATH ), 0, strrpos( self::conform_dir( ABSPATH ), str_replace( $home_url, '', $site_url ) ) ) );
|
| 202 |
+
}
|
| 203 |
|
| 204 |
return self::conform_dir( $home_path );
|
| 205 |
|
| 245 |
@set_time_limit( 0 );
|
| 246 |
|
| 247 |
// Set a custom error handler so we can track errors
|
| 248 |
+
set_error_handler( array( $this, 'error_handler' ) );
|
| 249 |
|
| 250 |
}
|
| 251 |
|
| 1025 |
|
| 1026 |
}
|
| 1027 |
|
| 1028 |
+
/**
|
| 1029 |
+
* Returns an array of files that will be included in the backup.
|
| 1030 |
+
*
|
| 1031 |
+
* @return array
|
| 1032 |
+
*/
|
| 1033 |
+
public function get_included_files() {
|
| 1034 |
+
|
| 1035 |
+
if ( ! empty( $this->included_files ) )
|
| 1036 |
+
return $this->included_files;
|
| 1037 |
+
|
| 1038 |
+
$this->included_files = array();
|
| 1039 |
+
|
| 1040 |
+
$excludes = $this->exclude_string( 'regex' );
|
| 1041 |
+
|
| 1042 |
+
foreach ( $this->get_files() as $file ) {
|
| 1043 |
+
|
| 1044 |
+
// Skip dot files, they should only exist on versions of PHP between 5.2.11 -> 5.3
|
| 1045 |
+
if ( method_exists( $file, 'isDot' ) && $file->isDot() )
|
| 1046 |
+
continue;
|
| 1047 |
+
|
| 1048 |
+
// Skip unreadable files
|
| 1049 |
+
if ( ! @realpath( $file->getPathname() ) || ! $file->isReadable() )
|
| 1050 |
+
continue;
|
| 1051 |
+
|
| 1052 |
+
// Excludes
|
| 1053 |
+
if ( $excludes && preg_match( '(' . $excludes . ')', str_ireplace( trailingslashit( $this->get_root() ), '', self::conform_dir( $file->getPathname() ) ) ) )
|
| 1054 |
+
continue;
|
| 1055 |
+
|
| 1056 |
+
$this->included_files[] = $file;
|
| 1057 |
+
|
| 1058 |
+
}
|
| 1059 |
+
|
| 1060 |
+
return $this->included_files;
|
| 1061 |
+
|
| 1062 |
+
}
|
| 1063 |
+
|
| 1064 |
+
/**
|
| 1065 |
+
* Returns an array of files that match the exclude rules.
|
| 1066 |
+
*
|
| 1067 |
+
* @return array
|
| 1068 |
+
*/
|
| 1069 |
+
public function get_excluded_files() {
|
| 1070 |
+
|
| 1071 |
+
if ( ! empty( $this->excluded_files ) )
|
| 1072 |
+
return $this->excluded_files;
|
| 1073 |
+
|
| 1074 |
+
$this->excluded_files = array();
|
| 1075 |
+
|
| 1076 |
+
$excludes = $this->exclude_string( 'regex' );
|
| 1077 |
+
|
| 1078 |
+
foreach ( $this->get_files() as $file ) {
|
| 1079 |
+
|
| 1080 |
+
// Skip dot files, they should only exist on versions of PHP between 5.2.11 -> 5.3
|
| 1081 |
+
if ( method_exists( $file, 'isDot' ) && $file->isDot() )
|
| 1082 |
+
continue;
|
| 1083 |
+
|
| 1084 |
+
// Skip unreadable files
|
| 1085 |
+
if ( ! @realpath( $file->getPathname() ) || ! $file->isReadable() )
|
| 1086 |
+
continue;
|
| 1087 |
+
|
| 1088 |
+
// Excludes
|
| 1089 |
+
if ( $excludes && preg_match( '(' . $excludes . ')', str_ireplace( trailingslashit( $this->get_root() ), '', self::conform_dir( $file->getPathname() ) ) ) )
|
| 1090 |
+
$this->excluded_files[] = $file;
|
| 1091 |
+
|
| 1092 |
+
}
|
| 1093 |
+
|
| 1094 |
+
return $this->excluded_files;
|
| 1095 |
+
|
| 1096 |
+
}
|
| 1097 |
+
|
| 1098 |
+
/**
|
| 1099 |
+
* Returns an array of unreadable files.
|
| 1100 |
+
*
|
| 1101 |
+
* @return array
|
| 1102 |
+
*/
|
| 1103 |
+
public function get_unreadable_files() {
|
| 1104 |
+
|
| 1105 |
+
if ( ! empty( $this->unreadable_files ) )
|
| 1106 |
+
return $this->unreadable_files;
|
| 1107 |
+
|
| 1108 |
+
$this->unreadable_files = array();
|
| 1109 |
+
|
| 1110 |
+
foreach ( $this->get_files() as $file ) {
|
| 1111 |
+
|
| 1112 |
+
// Skip dot files, they should only exist on versions of PHP between 5.2.11 -> 5.3
|
| 1113 |
+
if ( method_exists( $file, 'isDot' ) && $file->isDot() )
|
| 1114 |
+
continue;
|
| 1115 |
+
|
| 1116 |
+
if ( ! @realpath( $file->getPathname() ) || ! $file->isReadable() )
|
| 1117 |
+
$this->unreadable_files[] = $file;
|
| 1118 |
+
|
| 1119 |
+
}
|
| 1120 |
+
|
| 1121 |
+
return $this->unreadable_files;
|
| 1122 |
+
|
| 1123 |
+
}
|
| 1124 |
+
|
| 1125 |
private function load_pclzip() {
|
| 1126 |
|
| 1127 |
// Load PclZip
|
| 1143 |
|
| 1144 |
$excludes = array();
|
| 1145 |
|
| 1146 |
+
if ( isset( $this->excludes ) ) {
|
| 1147 |
$excludes = $this->excludes;
|
| 1148 |
+
}
|
| 1149 |
|
| 1150 |
// If path() is inside root(), exclude it
|
| 1151 |
+
if ( strpos( $this->get_path(), $this->get_root() ) !== false ) {
|
| 1152 |
array_unshift( $excludes, trailingslashit( $this->get_path() ) );
|
| 1153 |
+
}
|
| 1154 |
|
| 1155 |
return array_unique( $excludes );
|
| 1156 |
|
| 1164 |
*/
|
| 1165 |
public function set_excludes( $excludes, $append = false ) {
|
| 1166 |
|
| 1167 |
+
if ( is_string( $excludes ) ) {
|
| 1168 |
$excludes = explode( ',', $excludes );
|
| 1169 |
+
}
|
| 1170 |
|
| 1171 |
+
if ( $append ) {
|
| 1172 |
$excludes = array_merge( $this->excludes, $excludes );
|
| 1173 |
+
}
|
| 1174 |
|
| 1175 |
$this->excludes = array_filter( array_unique( array_map( 'trim', $excludes ) ) );
|
| 1176 |
|
| 1211 |
$file = $absolute = $fragment = false;
|
| 1212 |
|
| 1213 |
// Files don't end with /
|
| 1214 |
+
if ( ! in_array( substr( $rule, - 1 ), array( '\\', '/' ) ) ) {
|
| 1215 |
$file = true;
|
| 1216 |
+
}
|
| 1217 |
|
| 1218 |
// If rule starts with a / then treat as absolute path
|
| 1219 |
+
elseif ( in_array( substr( $rule, 0, 1 ), array( '\\', '/' ) ) ) {
|
| 1220 |
$absolute = true;
|
| 1221 |
+
}
|
| 1222 |
|
| 1223 |
// Otherwise treat as dir fragment
|
| 1224 |
+
else {
|
| 1225 |
$fragment = true;
|
| 1226 |
+
}
|
| 1227 |
|
| 1228 |
// Strip $this->root and conform
|
| 1229 |
$rule = str_ireplace( $this->get_root(), '', untrailingslashit( self::conform_dir( $rule ) ) );
|
| 1230 |
|
| 1231 |
+
|
| 1232 |
// Strip the preceeding slash
|
| 1233 |
+
if ( in_array( substr( $rule, 0, 1 ), array( '\\', '/' ) ) ) {
|
| 1234 |
$rule = substr( $rule, 1 );
|
| 1235 |
+
}
|
| 1236 |
|
| 1237 |
// Escape string for regex
|
| 1238 |
+
if ( $context === 'regex' ) {
|
| 1239 |
$rule = str_replace( '.', '\.', $rule );
|
| 1240 |
+
}
|
| 1241 |
|
| 1242 |
// Convert any existing wildcards
|
| 1243 |
+
if ( $wildcard !== '*' && strpos( $rule, '*' ) !== false ) {
|
| 1244 |
$rule = str_replace( '*', $wildcard, $rule );
|
| 1245 |
+
}
|
| 1246 |
|
| 1247 |
// Wrap directory fragments and files in wildcards for zip
|
| 1248 |
+
if ( $context === 'zip' && ( $fragment || $file ) ) {
|
| 1249 |
$rule = $wildcard . $rule . $wildcard;
|
| 1250 |
+
}
|
| 1251 |
|
| 1252 |
// Add a wildcard to the end of absolute url for zips
|
| 1253 |
+
if ( $context === 'zip' && $absolute ) {
|
| 1254 |
$rule .= $wildcard;
|
| 1255 |
+
}
|
| 1256 |
|
| 1257 |
// Add and end carrot to files for pclzip but only if it doesn't end in a wildcard
|
| 1258 |
+
if ( $file && $context === 'regex' ) {
|
| 1259 |
$rule .= '$';
|
| 1260 |
+
}
|
| 1261 |
|
| 1262 |
// Add a start carrot to absolute urls for pclzip
|
| 1263 |
+
if ( $absolute && $context === 'regex' ) {
|
| 1264 |
$rule = '^' . $rule;
|
| 1265 |
+
}
|
| 1266 |
+
|
| 1267 |
|
| 1268 |
}
|
| 1269 |
|
| 1270 |
// Escape shell args for zip command
|
| 1271 |
+
if ( $context === 'zip' ) {
|
| 1272 |
$excludes = array_map( 'escapeshellarg', array_unique( $excludes ) );
|
| 1273 |
+
}
|
| 1274 |
|
| 1275 |
return implode( $separator, $excludes );
|
| 1276 |
|
| 1623 |
* of the zip
|
| 1624 |
*
|
| 1625 |
* @param string $event
|
| 1626 |
+
* @param array $file
|
| 1627 |
* @return bool
|
| 1628 |
*/
|
| 1629 |
+
function hmbkp_pclzip_callback( $event, $file ) {
|
| 1630 |
|
| 1631 |
global $_hmbkp_exclude_string;
|
| 1632 |
|
readme.txt
CHANGED
|
@@ -3,7 +3,7 @@ Contributors: humanmade, willmot, pauldewouters, joehoyle, mattheu, tcrsavage, c
|
|
| 3 |
Tags: back up, backup, backups, database, zip, db, files, archive, wp-cli, humanmade
|
| 4 |
Requires at least: 3.8.4
|
| 5 |
Tested up to: 4.1
|
| 6 |
-
Stable tag: 3.0
|
| 7 |
|
| 8 |
Simple automated backups of your WordPress powered website.
|
| 9 |
|
|
@@ -114,8 +114,23 @@ You can also tweet <a href="http://twitter.com/humanmadeltd">@humanmadeltd</a> o
|
|
| 114 |
2. Choose your schedule, backup type, number of backups to keep and whether to recieve a notification email.
|
| 115 |
3. Easily manage exclude rules and see exactly which files are included and excluded from your backup.
|
| 116 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 117 |
== Changelog ==
|
| 118 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 119 |
#### 3.0 / 2014-11-14
|
| 120 |
|
| 121 |
* Refactor the recursive filesize scanner
|
| 3 |
Tags: back up, backup, backups, database, zip, db, files, archive, wp-cli, humanmade
|
| 4 |
Requires at least: 3.8.4
|
| 5 |
Tested up to: 4.1
|
| 6 |
+
Stable tag: 3.0.1
|
| 7 |
|
| 8 |
Simple automated backups of your WordPress powered website.
|
| 9 |
|
| 114 |
2. Choose your schedule, backup type, number of backups to keep and whether to recieve a notification email.
|
| 115 |
3. Easily manage exclude rules and see exactly which files are included and excluded from your backup.
|
| 116 |
|
| 117 |
+
== Upgrade Notice ==
|
| 118 |
+
|
| 119 |
+
* This is a critical update. Fixes a bug in the core backup library. Please update immediately.
|
| 120 |
+
|
| 121 |
== Changelog ==
|
| 122 |
|
| 123 |
+
#### 3.0.1 / 2014-11-20
|
| 124 |
+
|
| 125 |
+
* remove uneeded images
|
| 126 |
+
* latest hm-backup / fixes a serious bug in backups.
|
| 127 |
+
* Typos in v 3.0 changelog
|
| 128 |
+
* Specify POT filename in grunt task
|
| 129 |
+
* Update POT file
|
| 130 |
+
* Markdown readme
|
| 131 |
+
* Regenerate readme
|
| 132 |
+
* Add plugin headers
|
| 133 |
+
|
| 134 |
#### 3.0 / 2014-11-14
|
| 135 |
|
| 136 |
* Refactor the recursive filesize scanner
|
