/**
  * List available and applied migrations
  *
  * @param string $workspace
  * @return void
  * @see typo3.typo3cr.migration:node:listavailablemigrations
  */
 public function migrationStatusCommand($workspace = NULL)
 {
     /** @var $appliedMigration MigrationStatus */
     $this->outputLine();
     if ($workspace !== NULL) {
         $appliedMigrations = $this->migrationStatusRepository->findByWorkspaceName($workspace);
     } else {
         $appliedMigrations = $this->migrationStatusRepository->findAll();
     }
     $appliedMigrationsDictionary = array();
     foreach ($appliedMigrations as $appliedMigration) {
         $appliedMigrationsDictionary[$appliedMigration->getVersion()][] = $appliedMigration;
     }
     $availableMigrations = $this->migrationFactory->getAvailableMigrationsForCurrentConfigurationType();
     if (count($availableMigrations) > 0) {
         $this->outputLine('<b>Available migrations</b>');
         $this->outputLine();
         foreach ($availableMigrations as $version => $migration) {
             $this->outputLine($version . '   ' . $migration['formattedVersionNumber'] . '   ' . $migration['package']->getPackageKey());
             if (isset($appliedMigrationsDictionary[$version])) {
                 $migrationsInVersion = $appliedMigrationsDictionary[$version];
                 usort($migrationsInVersion, function (MigrationStatus $migrationA, MigrationStatus $migrationB) {
                     return $migrationA->getApplicationTimeStamp() > $migrationB->getApplicationTimeStamp();
                 });
                 foreach ($migrationsInVersion as $appliedMigration) {
                     $this->outputFormatted('%s applied on %s to workspace "%s"', array(str_pad(strtoupper($appliedMigration->getDirection()), 4, ' ', STR_PAD_LEFT), $appliedMigration->getApplicationTimeStamp()->format('d-m-Y H:i:s'), $appliedMigration->getWorkspaceName()), 2);
                     $this->outputLine();
                 }
             }
         }
     } else {
         $this->outputLine('No migrations available.');
     }
 }
 /**
  * List available and applied migrations
  *
  * @return void
  * @see typo3.typo3cr.migration:node:listavailablemigrations
  */
 public function migrationStatusCommand()
 {
     $this->outputLine();
     $availableMigrations = $this->migrationFactory->getAvailableMigrationsForCurrentConfigurationType();
     if (count($availableMigrations) === 0) {
         $this->outputLine('No migrations available.');
         $this->quit();
     }
     $appliedMigrations = $this->migrationStatusRepository->findAll();
     $appliedMigrationsDictionary = array();
     /** @var $appliedMigration MigrationStatus */
     foreach ($appliedMigrations as $appliedMigration) {
         $appliedMigrationsDictionary[$appliedMigration->getVersion()][] = $appliedMigration;
     }
     $tableRows = array();
     foreach ($availableMigrations as $version => $migration) {
         $migrationUpConfigurationComments = $this->migrationFactory->getMigrationForVersion($version)->getUpConfiguration()->getComments();
         if (isset($appliedMigrationsDictionary[$version])) {
             $applicationInformation = $this->phraseMigrationApplicationInformation($appliedMigrationsDictionary[$version]);
             if ($applicationInformation !== '') {
                 $migrationUpConfigurationComments .= PHP_EOL . '<b>Applied:</b>' . PHP_EOL . $applicationInformation;
             }
         }
         $tableRows[] = array($version, $migration['formattedVersionNumber'], $migration['package']->getPackageKey(), wordwrap($migrationUpConfigurationComments, 60));
     }
     $this->outputLine('<b>Available migrations</b>');
     $this->outputLine();
     $this->output->outputTable($tableRows, array('Version', 'Date', 'Package', 'Comments'));
 }