You are here

public function ScaffoldFileCollection::__construct in Drupal 10

Same name and namespace in other branches
  1. 8 composer/Plugin/Scaffold/Operations/ScaffoldFileCollection.php \Drupal\Composer\Plugin\Scaffold\Operations\ScaffoldFileCollection::__construct()
  2. 9 composer/Plugin/Scaffold/Operations/ScaffoldFileCollection.php \Drupal\Composer\Plugin\Scaffold\Operations\ScaffoldFileCollection::__construct()

ScaffoldFileCollection constructor.

Parameters

\Drupal\Composer\Plugin\Scaffold\Operations\OperationInterface[][] $file_mappings: A multidimensional array of file mappings.

\Drupal\Composer\Plugin\Scaffold\Interpolator $location_replacements: An object with the location mappings (e.g. [web-root]).

File

composer/Plugin/Scaffold/Operations/ScaffoldFileCollection.php, line 37

Class

ScaffoldFileCollection
Collection of scaffold files.

Namespace

Drupal\Composer\Plugin\Scaffold\Operations

Code

public function __construct(array $file_mappings, Interpolator $location_replacements) {

  // Collection of all destination paths to be scaffolded. Used to determine
  // when two projects scaffold the same file and we have to either replace or
  // combine them together.
  // @see OperationInterface::scaffoldOverExistingTarget().
  $scaffoldFiles = [];

  // Build the list of ScaffoldFileInfo objects by project.
  foreach ($file_mappings as $package_name => $package_file_mappings) {
    foreach ($package_file_mappings as $destination_rel_path => $op) {
      $destination = ScaffoldFilePath::destinationPath($package_name, $destination_rel_path, $location_replacements);

      // If there was already a scaffolding operation happening at this path,
      // allow the new operation to decide how to handle the override.
      // Usually, the new operation will replace whatever was there before.
      if (isset($scaffoldFiles[$destination_rel_path])) {
        $previous_scaffold_file = $scaffoldFiles[$destination_rel_path];
        $op = $op
          ->scaffoldOverExistingTarget($previous_scaffold_file
          ->op());

        // Remove the previous op so we only touch the destination once.
        $message = "  - Skip <info>[dest-rel-path]</info>: overridden in <comment>{$package_name}</comment>";
        $this->scaffoldFilesByProject[$previous_scaffold_file
          ->packageName()][$destination_rel_path] = new ScaffoldFileInfo($destination, new SkipOp($message));
      }
      else {
        $op = $op
          ->scaffoldAtNewLocation($destination);
      }

      // Combine the scaffold operation with the destination and record it.
      $scaffold_file = new ScaffoldFileInfo($destination, $op);
      $scaffoldFiles[$destination_rel_path] = $scaffold_file;
      $this->scaffoldFilesByProject[$package_name][$destination_rel_path] = $scaffold_file;
    }
  }
}