5 * Contains \Drupal\Console\Command\Migrate\RollBackCommand
8 namespace Drupal\Console\Command\Migrate;
10 use Symfony\Component\Console\Input\InputArgument;
11 use Symfony\Component\Console\Input\InputOption;
12 use Symfony\Component\Console\Input\InputInterface;
13 use Symfony\Component\Console\Output\OutputInterface;
14 use Drupal\Console\Command\Shared\MigrationTrait;
15 use Drupal\Console\Core\Style\DrupalStyle;
16 use Drupal\Console\Annotations\DrupalCommand;
17 use Symfony\Component\Console\Command\Command;
18 use Drupal\Console\Core\Command\Shared\CommandTrait;
19 use Drupal\migrate_plus\Entity\MigrationGroup;
20 use Drupal\migrate\Plugin\MigrationInterface;
21 use Drupal\migrate\MigrateExecutable;
22 use Drupal\Console\Utils\MigrateExecuteMessageCapture;
23 use Drupal\migrate\Plugin\MigrationPluginManagerInterface;
27 * extension = "migrate",
28 * extensionType = "module"
32 class RollBackCommand extends Command
38 * @var MigrationPluginManagerInterface $pluginManagerMigration
40 protected $pluginManagerMigration;
43 * RollBackCommand constructor.
45 * @param MigrationPluginManagerInterface $pluginManagerMigration
47 public function __construct(MigrationPluginManagerInterface $pluginManagerMigration)
49 $this->pluginManagerMigration = $pluginManagerMigration;
50 parent::__construct();
53 protected function configure()
56 ->setName('migrate:rollback')
57 ->setDescription($this->trans('commands.migrate.rollback.description'))
58 ->addArgument('migration-ids', InputArgument::IS_ARRAY, $this->trans('commands.migrate.rollback.arguments.id'))
62 InputOption::VALUE_OPTIONAL,
63 $this->trans('commands.migrate.setup.options.source-base_path')
67 protected function execute(InputInterface $input, OutputInterface $output)
69 $io = new DrupalStyle($input, $output);
71 $sourceBasepath = $input->getOption('source-base_path');
72 $configuration['source']['constants']['source_base_path'] = rtrim($sourceBasepath, '/') . '/';
73 // --migration-id prefix
74 $migration_id = $input->getArgument('migration-ids');
75 $migrations_list = array_keys($this->getMigrations($version_tag));
76 // If migrations weren't provided finish execution
77 if (empty($migration_id)) {
82 if (!in_array('all', $migration_id)) {
83 $migration_ids = $migration_id;
85 $migration_ids = $migrations_list;
88 foreach ($migration_ids as $migration) {
89 if (!in_array($migration, $migrations_list)) {
92 $this->trans('commands.migrate.rollback.messages.not-available'),
98 $migration_service = $this->pluginManagerMigration->createInstance($migration, $configuration);
99 if ($migration_service) {
100 $messages = new MigrateExecuteMessageCapture();
101 $executable = new MigrateExecutable($migration_service, $messages);
103 $migration_status = $executable->rollback();
104 switch ($migration_status) {
105 case MigrationInterface::RESULT_COMPLETED:
108 $this->trans('commands.migrate.rollback.messages.processing'),
113 case MigrationInterface::RESULT_INCOMPLETE:
116 $this->trans('commands.migrate.execute.messages.importing-incomplete'),
121 case MigrationInterface::RESULT_STOPPED:
124 $this->trans('commands.migrate.execute.messages.import-stopped'),
139 protected function interact(InputInterface $input, OutputInterface $output)
141 $io = new DrupalStyle($input, $output);
143 $migrations_list = $this->getMigrations($version_tag);
145 // --migration-id prefix
146 $migration_id = $input->getArgument('migration-ids');
149 if (!$migration_id) {
150 $migrations_ids = [];
153 $migration_id = $io->choiceNoList(
154 $this->trans('commands.migrate.execute.questions.id'),
155 array_keys($migrations_list),
159 if (empty($migration_id) || $migration_id == 'all') {
160 // Only add all if it's the first option
161 if (empty($migrations_ids) && $migration_id == 'all') {
162 $migrations_ids[] = $migration_id;
166 $migrations_ids[] = $migration_id;
170 $input->setArgument('migration-ids', $migrations_ids);
173 // --source-base_path
174 $sourceBasepath = $input->getOption('source-base_path');
175 if (!$sourceBasepath) {
176 $sourceBasepath = $io->ask(
177 $this->trans('commands.migrate.setup.questions.source-base_path'),
180 $input->setOption('source-base_path', $sourceBasepath);