Skip to content
Snippets Groups Projects
command-upgrade.php 6.16 KiB
Newer Older
  • Learn to ignore specific revisions
  • <?php
    /**
     * Upgrade the CiviCRM plugin files and database.
     *
     * ## EXAMPLES
     *
     *     # Update to the version of CiviCRM in the supplied archive.
     *     $ wp civicrm upgrade --zipfile=~/civicrm-5.57.1-wordpress.zip
     *
     * @since 5.69
     */
    class CLI_Tools_CiviCRM_Command_Upgrade extends CLI_Tools_CiviCRM_Command {
    
      /**
       * Upgrade the CiviCRM plugin files and database. Deprecated: use `wp civicrm core update` instead.
       *
       * ## OPTIONS
       *
       * [--zipfile=<zipfile>]
       * : Path to your CiviCRM zip file.
       *
       * [--tarfile=<tarfile>]
       * : Path to your CiviCRM .tar.gz file. Not currently available.
       *
       * [--backup-dir=<backup-dir>]
       * : Path to your CiviCRM backup directory. Default is one level above ABSPATH.
       *
       * [--v]
       * : Run the upgrade queue with verbose output.
       *
       * [--vv]
       * : Run the upgrade queue with extra verbose output.
       *
       * [--yes]
       * : Answer yes to the confirmation messages.
       *
       * ## EXAMPLES
       *
       *     # Update to the version of CiviCRM in the supplied archive.
       *     $ wp civicrm upgrade --zipfile=~/civicrm-5.57.1-wordpress.zip
       *
       * @since 5.69
       *
       * @param array $args The WP-CLI positional arguments.
       * @param array $assoc_args The WP-CLI associative arguments.
       */
      public function __invoke($args, $assoc_args) {
    
        WP_CLI::log(WP_CLI::colorize('%CDeprecated command:%n %cuse `wp civicrm core update` instead.%n'));
    
        // Grab associative arguments.
        $zipfile = (string) \WP_CLI\Utils\get_flag_value($assoc_args, 'zipfile', '');
        $tarfile = (string) \WP_CLI\Utils\get_flag_value($assoc_args, 'l10n-tarfile', '');
        $backup_root_dir = (string) \WP_CLI\Utils\get_flag_value($assoc_args, 'backup-dir', '');
        $v = (bool) \WP_CLI\Utils\get_flag_value($assoc_args, 'v', FALSE);
        $vv = (bool) \WP_CLI\Utils\get_flag_value($assoc_args, 'vv', FALSE);
        $yes = (bool) \WP_CLI\Utils\get_flag_value($assoc_args, 'yes', FALSE);
    
        // Bail when .tar.gz archive is specified.
        if (!empty($tarfile)) {
          WP_CLI::error('CiviCRM .tar.gz archives are not supported.');
        }
    
        // Bail when no .zip archive is specified.
        if (empty($zipfile)) {
          WP_CLI::error('You must supply a CiviCRM zip archive.');
        }
    
        // Choose higher verbosity when both are specified.
        if (!empty($v) && !empty($vv)) {
          $v = FALSE;
        }
    
        // ----------------------------------------------------------------------------
        // We can't use "wp civicrm core backup" because of its new backup schema.
        // ----------------------------------------------------------------------------
    
        // Build backup directory when not specified.
        if (empty($backup_root_dir)) {
          $backup_root_dir = trailingslashit(dirname(ABSPATH)) . 'backup';
        }
    
        // Maybe create destination directory.
        $backup_root_dir = untrailingslashit($backup_root_dir);
        if (!is_dir($backup_root_dir)) {
          if (!is_writable(dirname($backup_root_dir))) {
            WP_CLI::error("Insufficient permission to create directory '{$backup_root_dir}'.");
          }
          WP_CLI::log("Creating directory '{$backup_root_dir}'.");
          // Recursively create directory.
          if (!@mkdir($backup_root_dir, 0777, TRUE)) {
            $error = error_get_last();
            WP_CLI::error("Failed to create directory '{$backup_root_dir}': {$error['message']}.");
          }
        }
    
        // Sanity check.
        if (!is_writable($backup_root_dir)) {
          WP_CLI::error("'{$backup_root_dir}' is not writable by current user.");
        }
    
        // Get the path to the CiviCRM plugin directory.
        $plugin_path = $this->plugin_path_get();
    
        // Build backup filename and path.
        $date = date('YmdHis');
        $filename = 'civicrm';
        $backup_working_dir = trailingslashit($backup_root_dir) . trailingslashit('plugins') . $date;
        $backup_sql_file = trailingslashit($backup_working_dir) . $filename . '.sql';
        $backup_plugin_path = trailingslashit($backup_working_dir) . $filename;
    
        WP_CLI::log('');
        WP_CLI::log('The upgrade process involves:');
        WP_CLI::log(sprintf('1. Backing up database as => %s', $backup_sql_file));
        WP_CLI::log(sprintf('2. Backing up current CiviCRM code as => %s', $backup_plugin_path));
        WP_CLI::log(sprintf('3. Unpacking zipfile to => %s', $plugin_path));
        WP_CLI::log('4. Executing "civicrm/upgrade?reset=1" just as a browser would.');
        WP_CLI::log('');
    
        // Let's give folks a chance to exit now.
        WP_CLI::confirm(WP_CLI::colorize('%GDo you want to continue?%n'), $assoc_args);
    
        // ----------------------------------------------------------------------------
        // Backup procedure.
        // ----------------------------------------------------------------------------
    
        // Create working backup directory.
        if (!@mkdir($backup_working_dir, 0777, TRUE)) {
          $error = error_get_last();
          WP_CLI::error("Failed to create directory '{$backup_working_dir}': {$error['message']}.");
        }
    
        // Use "wp civicrm sql-dump" to dump database.
        $options = ['launch' => FALSE, 'return' => FALSE];
        WP_CLI::runcommand("civicrm sql-dump --result-file={$backup_sql_file}", $options);
        WP_CLI::success('1. Database backed up.');
    
        // Move existing CiviCRM plugin directory to backup directory.
        if (!@rename($plugin_path, $backup_plugin_path)) {
          $error = error_get_last();
          WP_CLI::error(sprintf('Failed to backup CiviCRM project directory %s to %s: %s', $project_path, $backup_plugin_path, $error['message']));
        }
        WP_CLI::log('');
        WP_CLI::success('2. Code backed up.');
    
        // ----------------------------------------------------------------------------
        // Subsequent commands can remain the same.
        // ----------------------------------------------------------------------------
    
        // Use "wp civicrm core update" to upgrade CiviCRM.
        $command = 'civicrm core update --zipfile=' . $zipfile . (empty($yes) ? '' : ' --yes');
        $options = ['launch' => FALSE, 'return' => FALSE];
        WP_CLI::runcommand($command, $options);
    
        // Use "wp civicrm core update-db" to upgrade the CiviCRM database.
        $command = 'civicrm core update-db' . (empty($v) ? '' : ' --v') . (empty($vv) ? '' : ' --vv') . (empty($yes) ? '' : ' --yes');
        $options = ['launch' => TRUE, 'return' => FALSE];
        WP_CLI::runcommand($command, $options);
    
      }
    
    }