136 lines
5.3 KiB
PHP
136 lines
5.3 KiB
PHP
<?php
|
|
|
|
namespace Drupal\BuildTests\Composer;
|
|
|
|
use Composer\Json\JsonFile;
|
|
use Drupal\BuildTests\Framework\BuildTestBase;
|
|
use Drupal\Composer\Composer;
|
|
|
|
/**
|
|
* @group Composer
|
|
* @group legacy
|
|
* @requires externalCommand composer
|
|
* @coversDefaultClass \Drupal\Core\Composer\Composer
|
|
*/
|
|
class LegacyScriptsTest extends BuildTestBase {
|
|
|
|
/**
|
|
* @covers ::vendorTestCodeCleanup
|
|
*/
|
|
public function testVendorTestCodeCleanup() {
|
|
$package_dir = 'composer/Template/RecommendedProject';
|
|
|
|
// Create a "Composer"-type repository containing one entry for every
|
|
// package in the vendor directory.
|
|
$vendor_packages_path = $this->getWorkspaceDirectory() . '/vendor_packages/packages.json';
|
|
$this->makeVendorPackage($vendor_packages_path);
|
|
|
|
// Make a copy of the code to alter in the workspace directory.
|
|
$this->copyCodebase();
|
|
|
|
// Remove the packages.drupal.org entry (and any other custom repository)
|
|
// from the site under test's repositories section. There is no way to do
|
|
// this via `composer config --unset`, so we read and rewrite composer.json.
|
|
$composer_json_path = $this->getWorkspaceDirectory() . "/$package_dir/composer.json";
|
|
$composer_json = json_decode(file_get_contents($composer_json_path), TRUE);
|
|
unset($composer_json['repositories']);
|
|
$json = json_encode($composer_json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
|
|
file_put_contents($composer_json_path, $json);
|
|
|
|
// Set up the template to use our path repos. Inclusion of metapackages is
|
|
// reported differently, so we load up a separate set for them.
|
|
$metapackage_path_repos = $this->getPathReposForType($this->getWorkspaceDirectory(), 'Metapackage');
|
|
$this->assertArrayHasKey('drupal/core-recommended', $metapackage_path_repos);
|
|
$path_repos = array_merge($metapackage_path_repos, $this->getPathReposForType($this->getWorkspaceDirectory(), 'Plugin'));
|
|
// Always add drupal/core as a path repo.
|
|
$path_repos['drupal/core'] = $this->getWorkspaceDirectory() . '/core';
|
|
foreach ($path_repos as $name => $path) {
|
|
$this->executeCommand("composer config --no-interaction repositories.$name path $path", $package_dir);
|
|
$this->assertCommandSuccessful();
|
|
}
|
|
|
|
// Add our vendor package repository to our site under test's repositories
|
|
// section. Call it "local" (although the name does not matter).
|
|
$this->executeCommand("composer config --no-interaction repositories.local composer file://" . $vendor_packages_path, $package_dir);
|
|
$this->assertCommandSuccessful();
|
|
|
|
// Add the vendorTestCodeCleanup script as a post-install command.
|
|
$this->executeCommand('composer config scripts.post-package-install "Drupal\\Core\\Composer\\Composer::vendorTestCodeCleanup"');
|
|
$this->assertCommandSuccessful();
|
|
|
|
// Attempt to install packages which will trigger the script.
|
|
$this->executeCommand('composer install');
|
|
$this->assertCommandSuccessful();
|
|
}
|
|
|
|
/**
|
|
* Get Composer items that we want to be path repos, from within a directory.
|
|
*
|
|
* @param string $workspace_directory
|
|
* The full path to the workspace directory.
|
|
* @param string $subdir
|
|
* The subdirectory to search under composer/.
|
|
*
|
|
* @return string[]
|
|
* Array of paths, indexed by package name.
|
|
*/
|
|
public function getPathReposForType($workspace_directory, $subdir) {
|
|
// Find the Composer items that we want to be path repos.
|
|
/** @var \SplFileInfo[] $path_repos */
|
|
$path_repos = Composer::composerSubprojectPaths($workspace_directory, $subdir);
|
|
|
|
$data = [];
|
|
foreach ($path_repos as $path_repo) {
|
|
$json_file = new JsonFile($path_repo->getPathname());
|
|
$json = $json_file->read();
|
|
$data[$json['name']] = $path_repo->getPath();
|
|
}
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* Creates a test package that points to all the projects in vendor.
|
|
*
|
|
* @param string $repository_path
|
|
* The path where to create the test package.
|
|
*/
|
|
protected function makeVendorPackage($repository_path) {
|
|
$root = $this->getDrupalRoot();
|
|
$process = $this->executeCommand("composer --working-dir=$root info --format=json");
|
|
$this->assertCommandSuccessful();
|
|
$installed = json_decode($process->getOutput(), TRUE);
|
|
|
|
// Build out package definitions for everything installed in
|
|
// the vendor directory.
|
|
$packages = [];
|
|
foreach ($installed['installed'] as $project) {
|
|
$name = $project['name'];
|
|
$version = $project['version'];
|
|
$path = "vendor/$name";
|
|
$full_path = "$root/$path";
|
|
// We are building a set of path repositories to projects in the vendor
|
|
// directory, so we will skip any project that does not exist in vendor.
|
|
// Also skip the projects that are symlinked in vendor. These are in our
|
|
// metapackage. They will be represented as path repositories in the test
|
|
// project's composer.json.
|
|
if (is_dir($full_path) && !is_link($full_path)) {
|
|
$packages['packages'][$name] = [
|
|
$version => [
|
|
"name" => $name,
|
|
"dist" => [
|
|
"type" => "path",
|
|
"url" => $full_path,
|
|
],
|
|
"version" => $version,
|
|
],
|
|
];
|
|
}
|
|
}
|
|
|
|
$json = json_encode($packages, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
|
|
mkdir(dirname($repository_path));
|
|
file_put_contents($repository_path, $json);
|
|
}
|
|
|
|
}
|