#!/usr/bin/env php read(); $fixture_core_composer_file = new JsonFile(static::FIXTURE_PATH . "/../path_repos/drupal--core/composer.json"); $fixture_core_composer_data = $fixture_core_composer_file->read(); $fixture_core_composer_data['extra']['drupal-scaffold']['file-mapping'] = $core_composer_data['extra']['drupal-scaffold']['file-mapping']; $fixture_core_composer_file->write($fixture_core_composer_data); $fixture_packages_json = new JsonFile(static::FIXTURE_PATH . '/packages.json'); $fixture_packages_data = $fixture_packages_json->read(); foreach ($fixture_packages_data['packages']['drupal/core'] as &$release) { $release['extra']['drupal-scaffold']['file-mapping'] = $core_composer_data['extra']['drupal-scaffold']['file-mapping']; } $fixture_packages_json->write($fixture_packages_data); $fs = new Filesystem(); $fs->remove(static::FIXTURE_PATH . "/composer.lock"); // Remove all the vendor folders but leave our 2 test files. // @see \Drupal\Tests\package_manager\Kernel\PathExcluder\VendorHardeningExcluderTest self::removeAllExcept(static::FIXTURE_PATH . "/vendor", ['.htaccess', 'web.config']); self::runComposerCommand(['install']); static::removeAllExcept(static::FIXTURE_PATH . '/vendor/composer', ['installed.json', 'installed.php']); $fs->remove(static::FIXTURE_PATH . '/vendor/autoload.php'); print "\nFixture updated.\nRunning phpcbf"; $process = new Process(['composer', 'phpcbf', static::FIXTURE_PATH], static::CORE_ROOT_PATH); $process->run(); print "\nFixture created 🎉."; } /** * Runs a Composer command at the fixture root. * * @param array $command * The command to run as passed to * \Symfony\Component\Process\Process::__construct. * * @return string * The Composer command output. */ private static function runComposerCommand(array $command): string { array_unshift($command, 'composer'); $command[] = "--working-dir=" . static::FIXTURE_PATH; $process = new Process($command, env: [ 'COMPOSER_MIRROR_PATH_REPOS' => '1', ]); $process->run(); if (!$process->isSuccessful()) { throw new ProcessFailedException($process); } return $process->getOutput(); } /** * Removes all files in a directory except the ones specified. * * @param string $directory * The directory path. * @param string[] $files_to_keep * The files to not delete. */ private static function removeAllExcept(string $directory, array $files_to_keep): void { if (!is_dir($directory)) { throw new \LogicException("Expected directory $directory"); } $paths_to_remove = glob("$directory/*"); $fs = new Filesystem(); foreach ($paths_to_remove as $path_to_remove) { $base_name = basename($path_to_remove); if (!in_array($base_name, $files_to_keep, TRUE)) { $fs->remove($path_to_remove); } } } }