You are here

public function FeaturesCommands::diff in Features 8.4

Same name and namespace in other branches
  1. 8.3 src/Commands/FeaturesCommands.php \Drupal\features\Commands\FeaturesCommands::diff()

Show the difference between active|default config from a feature package.

@command features:diff

@option ctypes Comma-separated list of component types to limit the output to. Defaults to all types. @option lines Generate diffs with <n> lines of context instead of the usual two. @option bundle Use a specific bundle namespace.

@aliases fd,features-diff

Parameters

string $feature: The feature in question.

Throws

\Exception

File

src/Commands/FeaturesCommands.php, line 591

Class

FeaturesCommands
Drush commands for Features.

Namespace

Drupal\features\Commands

Code

public function diff($feature, $options = self::OPTIONS_DIFF) {
  $manager = $this->manager;
  $assigner = $this
    ->featuresOptions($options);
  $assigner
    ->assignConfigPackages();
  $module = $feature;

  // @FIXME Actually do something with the "ctypes" option.
  $filter_ctypes = $options['ctypes'];
  if ($filter_ctypes) {
    $filter_ctypes = explode(',', $filter_ctypes);
  }
  $feature = $manager
    ->loadPackage($module, TRUE);
  if (empty($feature)) {
    throw new DomainException(dt('No such feature is available: @module', [
      '@module' => $module,
    ]));
  }
  $lines = $options['lines'];
  $lines = isset($lines) ? $lines : 2;
  $formatter = new DiffFormatter();
  $formatter->leading_context_lines = $lines;
  $formatter->trailing_context_lines = $lines;
  $formatter->show_header = FALSE;
  if ($this
    ->output()
    ->isDecorated()) {
    $red = "\33[31;40m\33[1m%s\33[0m";
    $green = "\33[0;32;40m\33[1m%s\33[0m";
  }
  else {
    $red = '%s';
    $green = "%s";
  }
  $overrides = $manager
    ->detectOverrides($feature);
  $missing = $manager
    ->reorderMissing($manager
    ->detectMissing($feature));
  $overrides = array_merge($overrides, $missing);
  $output = $this
    ->output();
  if (empty($overrides)) {
    $output
      ->writeln(dt('Active config matches stored config for @module.', [
      '@module' => $module,
    ]));
  }
  else {
    $config_diff = $this->configDiff;

    // Print key for colors.
    $output
      ->writeln(dt('Legend: '));
    $output
      ->writeln(sprintf($red, dt('Code:   drush features-import will replace the active config with the displayed code.')));
    $output
      ->writeln(sprintf($green, dt('Active: drush features-export will update the exported feature with the displayed active config')));
    foreach ($overrides as $name) {
      $message = '';
      if (in_array($name, $missing)) {
        $extension = [];
        $message = sprintf($red, dt('(missing from active)'));
      }
      else {
        $active = $manager
          ->getActiveStorage()
          ->read($name);
        $extension = $manager
          ->getExtensionStorages()
          ->read($name);
        if (empty($extension)) {
          $extension = [];
          $message = sprintf($green, dt('(not exported)'));
        }
        $diff = $config_diff
          ->diff($extension, $active);
        $rows = explode("\n", $formatter
          ->format($diff));
      }
      $output
        ->writeln('');
      $output
        ->writeln(dt("Config @name @message", [
        '@name' => $name,
        '@message' => $message,
      ]));
      if (!empty($extension)) {
        foreach ($rows as $row) {
          if (strpos($row, '>') === 0) {
            $output
              ->writeln(sprintf($green, $row));
          }
          elseif (strpos($row, '<') === 0) {
            $output
              ->writeln(sprintf($red, $row));
          }
          else {
            $output
              ->writeln($row);
          }
        }
      }
    }
  }
}