--- /dev/null
+<?php
+
+/**
+ * @file
+ * Drush pm directory copy backup extension
+ */
+
+use Drush\Log\LogLevel;
+
+class drush_version_control_backup implements drush_version_control {
+
+ /**
+ * Implementation of pre_update().
+ */
+ public function pre_update(&$project, $items_to_test = array()) {
+ if (drush_get_option('no-backup', FALSE)) {
+ // Delete the project path to clean up files that should be removed
+ if (!drush_delete_dir($project['full_project_path'])) {
+ return FALSE;
+ }
+ return TRUE;
+ }
+ if ($backup_target = $this->prepare_backup_dir()) {
+ if ($project['project_type'] != 'core') {
+ $backup_target .= '/' . $project['project_type'] . 's';
+ drush_mkdir($backup_target);
+ }
+ $backup_target .= '/'. $project['name'];
+ // Save for rollback or notifications.
+ $project['backup_target'] = $backup_target;
+
+ // Move or copy to backup target based in package-handler.
+ if (drush_get_option('package-handler', 'wget') == 'wget') {
+ if (drush_move_dir($project['full_project_path'], $backup_target)) {
+ return TRUE;
+ }
+ }
+ // cvs or git.
+ elseif (drush_copy_dir($project['full_project_path'], $backup_target)) {
+ return TRUE;
+ }
+ return drush_set_error('DRUSH_PM_BACKUP_FAILED', dt('Failed to backup project directory !project to !backup_target', array('!project' => $project['full_project_path'], '!backup_target' => $backup_target)));
+ }
+ }
+
+ /**
+ * Implementation of rollback().
+ */
+ public function rollback($project) {
+ if (drush_get_option('no-backup', FALSE)) {
+ return;
+ }
+ if (drush_move_dir($project['backup_target'], $project['full_project_path'], TRUE)) {
+ return drush_log(dt("Backups were restored successfully."), LogLevel::OK);
+ }
+ return drush_set_error('DRUSH_PM_BACKUP_ROLLBACK_FAILED', dt('Could not restore backup and rollback from failed upgrade. You will need to resolve manually.'));
+ }
+
+ /**
+ * Implementation of post_update().
+ */
+ public function post_update($project) {
+ if (drush_get_option('no-backup', FALSE)) {
+ return;
+ }
+ if ($project['backup_target']) {
+ drush_log(dt("Backups were saved into the directory !backup_target.", array('!backup_target' => $project['backup_target'])), LogLevel::OK);
+ }
+ }
+
+ /**
+ * Implementation of post_download().
+ */
+ public function post_download($project) {
+ // NOOP
+ }
+
+ // Helper for pre_update.
+ public function prepare_backup_dir($subdir = NULL) {
+ return drush_prepare_backup_dir($subdir);
+ }
+
+ public static function reserved_files() {
+ return array();
+ }
+}