$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, // and the new operation is Conjoinable, then use a ConjunctionOp to // join together both operations. This will cause both operations to // run, one after the other. At the moment, only AppendOp is // conjoinable; all other operations simply replace anything at the same // path. if (isset($scaffoldFiles[$destination_rel_path])) { $previous_scaffold_file = $scaffoldFiles[$destination_rel_path]; if ($op instanceof ConjoinableInterface) { $op = new ConjunctionOp($previous_scaffold_file->op(), $op); } // Remove the previous op so we only touch the destination once. $message = " - Skip [dest-rel-path]: overridden in {$package_name}"; $this->scaffoldFilesByProject[$previous_scaffold_file->packageName()][$destination_rel_path] = new ScaffoldFileInfo($destination, new SkipOp($message)); } $scaffold_file = new ScaffoldFileInfo($destination, $op); $scaffoldFiles[$destination_rel_path] = $scaffold_file; $this->scaffoldFilesByProject[$package_name][$destination_rel_path] = $scaffold_file; } } } /** * {@inheritdoc} */ public function getIterator() { return new \RecursiveArrayIterator($this->scaffoldFilesByProject, \RecursiveArrayIterator::CHILD_ARRAYS_ONLY); } /** * Processes the iterator created by ScaffoldFileCollection::create(). * * @param \Drupal\Composer\Plugin\Scaffold\Operations\ScaffoldFileCollection $collection * The iterator to process. * @param \Composer\IO\IOInterface $io * The Composer IO object. * @param \Drupal\Composer\Plugin\Scaffold\ScaffoldOptions $scaffold_options * The scaffold options. * * @return \Drupal\Composer\Plugin\Scaffold\Operations\ScaffoldResult[] * The results array. */ public static function process(ScaffoldFileCollection $collection, IOInterface $io, ScaffoldOptions $scaffold_options) { $results = []; foreach ($collection as $project_name => $scaffold_files) { $io->write("Scaffolding files for {$project_name}:"); foreach ($scaffold_files as $scaffold_file) { $results[$scaffold_file->destination()->relativePath()] = $scaffold_file->process($io, $scaffold_options); } } return $results; } }