/** * Finishes clone operation * * @subcommand finish-restore-site * * @when before_wp_load * */ public function finishRestore($args, $assoc_args) { define('SHORTINIT', true); $wpConfigPath = \WP_CLI\Utils\locate_wp_config(); require_once $wpConfigPath; require ABSPATH . WPINC . '/formatting.php'; require ABSPATH . WPINC . '/link-template.php'; require ABSPATH . WPINC . '/shortcodes.php'; require ABSPATH . WPINC . '/taxonomy.php'; wp_plugin_directory_constants(); require_once WP_PLUGIN_DIR . '/versionpress/bootstrap.php'; $versionPressContainer = DIContainer::getConfiguredInstance(); /** @var ActionsDefinitionRepository $actionsDefinitionRepository */ $actionsDefinitionRepository = $versionPressContainer->resolve(VersionPressServices::ACTIONS_DEFINITION_REPOSITORY); $actionsDefinitionRepository->restoreAllDefinitionFilesFromHistory(); // Truncate tables /** @var Database $database */ $database = $versionPressContainer->resolve(VersionPressServices::DATABASE); /** @var DbSchemaInfo $dbSchema */ $dbSchema = $versionPressContainer->resolve(VersionPressServices::DB_SCHEMA); $tables = array_map(function ($entityName) use($dbSchema) { return $dbSchema->getPrefixedTableName($entityName); }, array_merge($dbSchema->getAllEntityNames(), array_map(function ($referenceDetails) { return $referenceDetails['junction-table']; }, $dbSchema->getAllMnReferences()))); $tables = array_filter($tables, function ($table) use($database) { return $table !== $database->options; }); foreach ($tables as $table) { $truncateCmd = "TRUNCATE TABLE `{$table}`"; @$database->query($truncateCmd); // Intentional @ - not existing table is ok for us but TRUNCATE ends with error } // Create VersionPress tables /** @var \VersionPress\Initialization\Initializer $initializer */ $initializer = $versionPressContainer->resolve(VersionPressServices::INITIALIZER); $initializer->createVersionPressTables(); WP_CLI::success("VersionPress tables created"); // Install Custom merge driver MergeDriverInstaller::installMergeDriver(VP_PROJECT_ROOT, VERSIONPRESS_PLUGIN_DIR, VP_VPDB_DIR); WP_CLI::success("Git merge driver added"); // Run synchronization /** @var SynchronizationProcess $syncProcess */ $syncProcess = $versionPressContainer->resolve(VersionPressServices::SYNCHRONIZATION_PROCESS); $syncProcess->synchronizeAll(); WP_CLI::success("Database synchronized"); VPCommandUtils::runWpCliCommand('vp-internal', 'flush-regenerable-values', ['require' => __FILE__]); }
<?php use Nette\Caching\Storages\FileStorage; use Nette\Loaders\RobotLoader; use Tracy\Debugger; use VersionPress\DI\DIContainer; use VersionPress\DI\VersionPressServices; define('VERSIONPRESS_PLUGIN_DIR', __DIR__); define('VERSIONPRESS_MIRRORING_DIR', WP_CONTENT_DIR . '/vpdb'); define('VERSIONPRESS_TEMP_DIR', VERSIONPRESS_PLUGIN_DIR . '/temp'); define('VERSIONPRESS_ACTIVATION_FILE', VERSIONPRESS_MIRRORING_DIR . '/.active'); require_once VERSIONPRESS_PLUGIN_DIR . '/versionpress-functions.php'; if (defined('DOING_AJAX')) { header("Content-Type: application/json"); } Debugger::enable(Debugger::DEVELOPMENT, VERSIONPRESS_PLUGIN_DIR . '/log'); $robotLoader = new RobotLoader(); $robotLoader->addDirectory(VERSIONPRESS_PLUGIN_DIR . '/src'); $robotLoader->setCacheStorage(new FileStorage(VERSIONPRESS_PLUGIN_DIR . '/temp')); $robotLoader->register(); global $versionPressContainer; $versionPressContainer = DIContainer::getConfiguredInstance();
/** * @return DIContainer */ public static function getConfiguredInstance() { if (self::$instance != null) { return self::$instance; } self::$instance = $dic = new DIContainer(); $dic->register(VersionPressServices::WPDB, function () { global $wpdb; return $wpdb; }); $dic->register(VersionPressServices::DATABASE, function () use($dic) { return new Database($dic->resolve(VersionPressServices::WPDB)); }); $dic->register(VersionPressServices::STORAGE_FACTORY, function () use($dic) { global $wp_taxonomies; return new StorageFactory(VP_VPDB_DIR, $dic->resolve(VersionPressServices::DB_SCHEMA), $dic->resolve(VersionPressServices::DATABASE), array_keys((array) $wp_taxonomies), $dic->resolve(VersionPressServices::CHANGEINFO_FACTORY), $dic->resolve(VersionPressServices::TABLE_SCHEMA_STORAGE)); }); $dic->register(VersionPressServices::MIRROR, function () use($dic) { return new Mirror($dic->resolve(VersionPressServices::STORAGE_FACTORY), $dic->resolve(VersionPressServices::URL_REPLACER)); }); $dic->register(VersionPressServices::DB_SCHEMA, function () { global $table_prefix, $wp_db_version; return new DbSchemaInfo(new ActivePluginsVPFilesIterator('schema.yml'), $table_prefix, $wp_db_version); }); $dic->register(VersionPressServices::ACTIONS_DEFINITION_REPOSITORY, function () use($dic) { return new ActionsDefinitionRepository(VERSIONPRESS_TEMP_DIR . '/actions', $dic->resolve(VersionPressServices::GIT_REPOSITORY)); }); $dic->register(VersionPressServices::ACTIONSINFO_PROVIDER_ALL_PLUGINS, function () use($dic) { return new ActionsInfoProvider($dic->resolve(VersionPressServices::ACTIONS_DEFINITION_REPOSITORY)->getAllDefinitionFiles()); }); $dic->register(VersionPressServices::ACTIONSINFO_PROVIDER_ACTIVE_PLUGINS, function () { return new ActionsInfoProvider(new ActivePluginsVPFilesIterator('actions.yml')); }); $dic->register(VersionPressServices::CHANGEINFO_FACTORY, function () use($dic) { return new ChangeInfoFactory($dic->resolve(VersionPressServices::DB_SCHEMA), $dic->resolve(VersionPressServices::ACTIONSINFO_PROVIDER_ACTIVE_PLUGINS)); }); $dic->register(VersionPressServices::COMMIT_MESSAGE_PARSER, function () use($dic) { return new CommitMessageParser($dic->resolve(VersionPressServices::DB_SCHEMA), $dic->resolve(VersionPressServices::ACTIONSINFO_PROVIDER_ALL_PLUGINS)); }); $dic->register(VersionPressServices::WPDB_MIRROR_BRIDGE, function () use($dic) { return new WpdbMirrorBridge($dic->resolve(VersionPressServices::DATABASE), $dic->resolve(VersionPressServices::MIRROR), $dic->resolve(VersionPressServices::DB_SCHEMA), $dic->resolve(VersionPressServices::VPID_REPOSITORY), $dic->resolve(VersionPressServices::SHORTCODES_REPLACER)); }); $dic->register(VersionPressServices::COMMITTER, function () use($dic) { return new Committer($dic->resolve(VersionPressServices::MIRROR), $dic->resolve(VersionPressServices::GIT_REPOSITORY), $dic->resolve(VersionPressServices::STORAGE_FACTORY)); }); $dic->register(VersionPressServices::INITIALIZER, function () use($dic) { return new Initializer($dic->resolve(VersionPressServices::DATABASE), $dic->resolve(VersionPressServices::DB_SCHEMA), $dic->resolve(VersionPressServices::STORAGE_FACTORY), $dic->resolve(VersionPressServices::SYNCHRONIZER_FACTORY), $dic->resolve(VersionPressServices::GIT_REPOSITORY), $dic->resolve(VersionPressServices::URL_REPLACER), $dic->resolve(VersionPressServices::VPID_REPOSITORY), $dic->resolve(VersionPressServices::SHORTCODES_REPLACER), $dic->resolve(VersionPressServices::CHANGEINFO_FACTORY), $dic->resolve(VersionPressServices::ACTIONS_DEFINITION_REPOSITORY)); }); $dic->register(VersionPressServices::SYNCHRONIZER_FACTORY, function () use($dic) { return new SynchronizerFactory($dic->resolve(VersionPressServices::STORAGE_FACTORY), $dic->resolve(VersionPressServices::DATABASE), $dic->resolve(VersionPressServices::DB_SCHEMA), $dic->resolve(VersionPressServices::VPID_REPOSITORY), $dic->resolve(VersionPressServices::URL_REPLACER), $dic->resolve(VersionPressServices::SHORTCODES_REPLACER), $dic->resolve(VersionPressServices::TABLE_SCHEMA_STORAGE)); }); $dic->register(VersionPressServices::SYNCHRONIZATION_PROCESS, function () use($dic) { return new SynchronizationProcess($dic->resolve(VersionPressServices::SYNCHRONIZER_FACTORY)); }); $dic->register(VersionPressServices::REVERTER, function () use($dic) { return new Reverter($dic->resolve(VersionPressServices::SYNCHRONIZATION_PROCESS), $dic->resolve(VersionPressServices::DATABASE), $dic->resolve(VersionPressServices::COMMITTER), $dic->resolve(VersionPressServices::GIT_REPOSITORY), $dic->resolve(VersionPressServices::DB_SCHEMA), $dic->resolve(VersionPressServices::STORAGE_FACTORY), $dic->resolve(VersionPressServices::COMMIT_MESSAGE_PARSER)); }); $dic->register(VersionPressServices::GIT_REPOSITORY, function () { return new GitRepository(VP_PROJECT_ROOT, VERSIONPRESS_TEMP_DIR, VERSIONPRESS_COMMIT_MESSAGE_PREFIX, VP_GIT_BINARY); }); $dic->register(VersionPressServices::VPID_REPOSITORY, function () use($dic) { return new VpidRepository($dic->resolve(VersionPressServices::DATABASE), $dic->resolve(VersionPressServices::DB_SCHEMA)); }); $dic->register(VersionPressServices::URL_REPLACER, function () { return new AbsoluteUrlReplacer(get_home_url()); }); $dic->register(VersionPressServices::SHORTCODES_REPLACER, function () use($dic) { return new ShortcodesReplacer($dic->resolve(VersionPressServices::SHORTCODES_INFO), $dic->resolve(VersionPressServices::VPID_REPOSITORY)); }); $dic->register(VersionPressServices::SHORTCODES_INFO, function () { return new ShortcodesInfo(new ActivePluginsVPFilesIterator('shortcodes.yml')); }); $dic->register(VersionPressServices::SQL_QUERY_PARSER, function () use($dic) { return new SqlQueryParser($dic->resolve(VersionPressServices::DB_SCHEMA), $dic->resolve(VersionPressServices::DATABASE)); }); $dic->register(VersionPressServices::TABLE_SCHEMA_STORAGE, function () use($dic) { return new TableSchemaStorage($dic->resolve(VersionPressServices::DATABASE), VP_VPDB_DIR . '/.schema'); }); return self::$instance; }
/** * @return DIContainer */ public static function getConfiguredInstance() { if (self::$instance != null) { return self::$instance; } self::$instance = $dic = new DIContainer(); $dic->register(VersionPressServices::VP_CONFIGURATION, function () { return new VersionPressConfig(); }); $dic->register(VersionPressServices::WPDB, function () { global $wpdb; return $wpdb; }); $dic->register(VersionPressServices::STORAGE_FACTORY, function () use($dic) { global $wp_taxonomies; return new StorageFactory(VERSIONPRESS_MIRRORING_DIR, $dic->resolve(VersionPressServices::DB_SCHEMA), $dic->resolve(VersionPressServices::WPDB), array_keys((array) $wp_taxonomies)); }); $dic->register(VersionPressServices::MIRROR, function () use($dic) { return new Mirror($dic->resolve(VersionPressServices::STORAGE_FACTORY), $dic->resolve(VersionPressServices::URL_REPLACER)); }); $dic->register(VersionPressServices::DB_SCHEMA, function () { global $table_prefix, $wp_db_version; return new DbSchemaInfo(VERSIONPRESS_PLUGIN_DIR . '/src/Database/wordpress-schema.neon', $table_prefix, $wp_db_version); }); $dic->register(VersionPressServices::WPDB_MIRROR_BRIDGE, function () use($dic) { return new WpdbMirrorBridge($dic->resolve(VersionPressServices::WPDB), $dic->resolve(VersionPressServices::MIRROR), $dic->resolve(VersionPressServices::DB_SCHEMA), $dic->resolve(VersionPressServices::VPID_REPOSITORY)); }); $dic->register(VersionPressServices::COMMITTER, function () use($dic) { return new Committer($dic->resolve(VersionPressServices::MIRROR), $dic->resolve(VersionPressServices::REPOSITORY), $dic->resolve(VersionPressServices::STORAGE_FACTORY)); }); $dic->register(VersionPressServices::INITIALIZER, function () use($dic) { return new Initializer($dic->resolve(VersionPressServices::WPDB), $dic->resolve(VersionPressServices::DB_SCHEMA), $dic->resolve(VersionPressServices::STORAGE_FACTORY), $dic->resolve(VersionPressServices::SYNCHRONIZER_FACTORY), $dic->resolve(VersionPressServices::REPOSITORY), $dic->resolve(VersionPressServices::URL_REPLACER), $dic->resolve(VersionPressServices::VPID_REPOSITORY)); }); $dic->register(VersionPressServices::SYNCHRONIZER_FACTORY, function () use($dic) { return new SynchronizerFactory($dic->resolve(VersionPressServices::STORAGE_FACTORY), $dic->resolve(VersionPressServices::WPDB), $dic->resolve(VersionPressServices::DB_SCHEMA), $dic->resolve(VersionPressServices::URL_REPLACER)); }); $dic->register(VersionPressServices::SYNCHRONIZATION_PROCESS, function () use($dic) { return new SynchronizationProcess($dic->resolve(VersionPressServices::SYNCHRONIZER_FACTORY)); }); $dic->register(VersionPressServices::REVERTER, function () use($dic) { return new Reverter($dic->resolve(VersionPressServices::SYNCHRONIZATION_PROCESS), $dic->resolve(VersionPressServices::WPDB), $dic->resolve(VersionPressServices::COMMITTER), $dic->resolve(VersionPressServices::REPOSITORY), $dic->resolve(VersionPressServices::DB_SCHEMA), $dic->resolve(VersionPressServices::STORAGE_FACTORY)); }); $dic->register(VersionPressServices::REPOSITORY, function () use($dic) { /** @var VersionPressConfig $vpConfig */ $vpConfig = $dic->resolve(VersionPressServices::VP_CONFIGURATION); return new GitRepository(ABSPATH, VERSIONPRESS_TEMP_DIR, "[VP] ", $vpConfig->gitBinary); }); $dic->register(VersionPressServices::VPID_REPOSITORY, function () use($dic) { return new VpidRepository($dic->resolve(VersionPressServices::WPDB), $dic->resolve(VersionPressServices::DB_SCHEMA)); }); $dic->register(VersionPressServices::URL_REPLACER, function () { return new AbsoluteUrlReplacer(get_site_url()); }); return self::$instance; }
/** * Defines global constants, container and wpdb dynamic mapping of value references. * It's not pretty, but makes the mapping functions very flexible (they can have various dependecies). */ private static function defineGlobalVariables() { global $versionPressContainer, $wpdb, $wp_taxonomies; defined('VERSIONPRESS_PLUGIN_DIR') || define('VERSIONPRESS_PLUGIN_DIR', self::$testConfig->testSite->path . '/wp-content/plugins/versionpress'); defined('VP_VPDB_DIR') || define('VP_VPDB_DIR', self::$testConfig->testSite->path . '/wp-content/vpdb'); $versionPressContainer = DIContainer::getConfiguredInstance(); $wpdb = self::$wpdb; $rawTaxonomies = self::$wpAutomation->runWpCliCommand('taxonomy', 'list', ['format' => 'json', 'fields' => 'name']); $taxonomies = array_column(json_decode($rawTaxonomies, true), 'name'); $wp_taxonomies = array_combine($taxonomies, $taxonomies); }