Chris@0: getConnection($db_spec); Chris@0: $this->version = $this->getLegacyDrupalVersion($connection); Chris@0: $this->createDatabaseStateSettings($db_spec, $this->version); Chris@0: $this->databaseStateKey = 'migrate_drupal_' . $this->version; Chris@0: $migrations = $this->getMigrations($this->databaseStateKey, $this->version); Chris@0: $this->migrationList = []; Chris@0: foreach ($migrations as $migration) { Chris@0: $destination = $migration->get('destination'); Chris@0: if ($destination['plugin'] === 'entity:file') { Chris@0: // Make sure we have a single trailing slash. Chris@0: $source_base_path = rtrim(drush_get_option('legacy-root'), '/') . '/'; Chris@0: $destination['source_base_path'] = $source_base_path; Chris@0: $migration->set('destination', $destination); Chris@0: } Chris@0: $this->migrationList[$migration->id()] = $migration; Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * Run the configured migrations. Chris@0: */ Chris@0: public function import() { Chris@0: static::$messages = new DrushLogMigrateMessage(); Chris@0: if (drush_get_option('debug')) { Chris@0: \Drupal::service('event_dispatcher')->addListener(MigrateEvents::IDMAP_MESSAGE, Chris@0: [get_class(), 'onIdMapMessage']); Chris@0: } Chris@0: foreach ($this->migrationList as $migration_id => $migration) { Chris@0: drush_print(dt('Upgrading @migration', ['@migration' => $migration_id])); Chris@0: $executable = new MigrateExecutable($migration, static::$messages); Chris@0: // drush_op() provides --simulate support. Chris@0: drush_op([$executable, 'import']); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * Export the configured migration plugins as configuration entities. Chris@0: */ Chris@0: public function export() { Chris@0: $db_info = \Drupal::state()->get($this->databaseStateKey); Chris@0: Chris@0: // Create a group to hold the database configuration. Chris@0: $group = [ Chris@0: 'id' => $this->databaseStateKey, Chris@0: 'label' => 'Import from Drupal ' . $this->version, Chris@0: 'description' => 'Migrations originally generated from drush migrate-upgrade --configure-only', Chris@0: 'source_type' => 'Drupal ' . $this->version, Chris@0: 'shared_configuration' => [ Chris@0: 'source' => [ Chris@0: 'key' => 'drupal_' . $this->version, Chris@0: 'database' => $db_info['database'], Chris@0: ] Chris@0: ] Chris@0: ]; Chris@0: $group = MigrationGroup::create($group); Chris@0: $group->save(); Chris@0: foreach ($this->migrationList as $migration_id => $migration) { Chris@0: drush_print(dt('Exporting @migration as @new_migration', Chris@0: ['@migration' => $migration_id, '@new_migration' => $this->modifyId($migration_id)])); Chris@0: $entity_array['id'] = $migration_id; Chris@0: $entity_array['migration_group'] = $this->databaseStateKey; Chris@0: $entity_array['migration_tags'] = $migration->get('migration_tags'); Chris@0: $entity_array['label'] = $migration->get('label'); Chris@0: $entity_array['source'] = $migration->getSourceConfiguration(); Chris@0: $entity_array['destination'] = $migration->getDestinationConfiguration(); Chris@0: $entity_array['process'] = $migration->get('process'); Chris@0: $entity_array['migration_dependencies'] = $migration->getMigrationDependencies(); Chris@0: $migration_entity = Migration::create($this->substituteIds($entity_array)); Chris@0: $migration_entity->save(); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * Rewrite any migration plugin IDs so they won't conflict with the core Chris@0: * IDs. Chris@0: * Chris@0: * @param $entity_array Chris@0: * A configuration array for a migration. Chris@0: * Chris@0: * @return array Chris@0: * The migration configuration array modified with new IDs. Chris@0: */ Chris@0: protected function substituteIds($entity_array) { Chris@0: $entity_array['id'] = $this->modifyId($entity_array['id']); Chris@0: foreach ($entity_array['migration_dependencies'] as $type => $dependencies) { Chris@0: foreach ($dependencies as $key => $dependency) { Chris@0: $entity_array['migration_dependencies'][$type][$key] = $this->modifyId($dependency); Chris@0: } Chris@0: } Chris@0: foreach ($entity_array['process'] as $destination => $process) { Chris@0: if (is_array($process)) { Chris@0: if ($process['plugin'] == 'migration') { Chris@0: $entity_array['process'][$destination]['migration'] = Chris@0: $this->modifyId($process['migration']); Chris@0: } Chris@0: } Chris@0: } Chris@0: return $entity_array; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @param $id Chris@0: * The original core plugin ID. Chris@0: * Chris@0: * @return string Chris@0: * The ID modified to serve as a configuration entity ID. Chris@0: */ Chris@0: protected function modifyId($id) { Chris@0: return drush_get_option('migration-prefix', 'upgrade_') . str_replace(':', '_', $id); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Rolls back the configured migrations. Chris@0: */ Chris@0: public function rollback() { Chris@0: static::$messages = new DrushLogMigrateMessage(); Chris@0: $database_state_key = \Drupal::state()->get('migrate.fallback_state_key'); Chris@0: $database_state = \Drupal::state()->get($database_state_key); Chris@0: $db_spec = $database_state['database']; Chris@0: $connection = $this->getConnection($db_spec); Chris@0: $version = $this->getLegacyDrupalVersion($connection); Chris@0: $migrations = $this->getMigrations('migrate_drupal_' . $version, $version); Chris@0: Chris@0: // Roll back in reverse order. Chris@0: $this->migrationList = array_reverse($migrations); Chris@0: Chris@0: foreach ($migrations as $migration) { Chris@0: drush_print(dt('Rolling back @migration', ['@migration' => $migration->id()])); Chris@0: $executable = new MigrateExecutable($migration, static::$messages); Chris@0: // drush_op() provides --simulate support. Chris@0: drush_op([$executable, 'rollback']); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * Display any messages being logged to the ID map. Chris@0: * Chris@0: * @param \Drupal\migrate\Event\MigrateIdMapMessageEvent $event Chris@0: * The message event. Chris@0: */ Chris@0: public static function onIdMapMessage(MigrateIdMapMessageEvent $event) { Chris@0: if ($event->getLevel() == MigrationInterface::MESSAGE_NOTICE || Chris@0: $event->getLevel() == MigrationInterface::MESSAGE_INFORMATIONAL) { Chris@0: $type = 'status'; Chris@0: } Chris@0: else { Chris@0: $type = 'error'; Chris@0: } Chris@0: $source_id_string = implode(',', $event->getSourceIdValues()); Chris@0: $message = t('Source ID @source_id: @message', Chris@0: ['@source_id' => $source_id_string, '@message' => $event->getMessage()]); Chris@0: static::$messages->display($message, $type); Chris@0: } Chris@0: Chris@0: }