Commit a68ff423 authored by alexpott's avatar alexpott

Issue #3080649 by greg.1.anderson, larowlan, BinaryBlock, alexpott,...

Issue #3080649 by greg.1.anderson, larowlan, BinaryBlock, alexpott, danielnv18, Mile23: Drupal core scaffolding : path to vendor directory in generated autoload.php file is incorrect
parent 73972cc6
......@@ -38,12 +38,11 @@ private function __construct() {
*/
public static function generateAutoload(IOInterface $io, $package_name, $web_root, $vendor) {
$autoload_path = static::autoloadPath($package_name, $web_root);
$location = dirname($autoload_path->fullPath());
// Calculate the relative path from the webroot (location of the project
// autoload.php) to the vendor directory.
$fs = new Filesystem();
$relative_vendor_path = $fs->findShortestPath(realpath($location), $vendor);
file_put_contents($autoload_path->fullPath(), static::autoLoadContents($relative_vendor_path));
$relative_autoload_path = $fs->findShortestPath($autoload_path->fullPath(), "$vendor/autoload.php");
file_put_contents($autoload_path->fullPath(), static::autoLoadContents($relative_autoload_path));
return new ScaffoldResult($autoload_path, TRUE);
}
......@@ -91,14 +90,14 @@ protected static function autoloadPath($package_name, $web_root) {
/**
* Builds the contents of the autoload file.
*
* @param string $vendor_path
* The relative path to vendor.
* @param string $relative_autoload_path
* The relative path to the autoloader in vendor.
*
* @return string
* Return the contents for the autoload.php.
*/
protected static function autoLoadContents($vendor_path) {
$vendor_path = rtrim($vendor_path, '/');
protected static function autoLoadContents($relative_autoload_path) {
$relative_autoload_path = preg_replace('#^\./#', '', $relative_autoload_path);
return <<<EOF
<?php
......@@ -115,7 +114,7 @@ protected static function autoLoadContents($vendor_path) {
* @see core/modules/statistics/statistics.php
*/
return require __DIR__ . '/{$vendor_path}/autoload.php';
return require __DIR__ . '/{$relative_autoload_path}';
EOF;
}
......
......@@ -2,6 +2,8 @@
namespace Drupal\Composer\Plugin\Scaffold;
use Composer\Util\Filesystem;
/**
* Manage the path to a file to scaffold.
*
......@@ -61,6 +63,14 @@ public function __construct($path_type, $package_name, $rel_path, $full_path) {
$this->packageName = $package_name;
$this->relativePath = $rel_path;
$this->fullPath = $full_path;
// Ensure that the full path really is a full path. We do not use
// 'realpath' here because the file specified by the full path might
// not exist yet.
$fs = new Filesystem();
if (!$fs->isAbsolutePath($this->fullPath)) {
$this->fullPath = getcwd() . '/' . $this->fullPath;
}
}
/**
......
......@@ -194,6 +194,7 @@ public function testProjectThatScaffoldsEmptyProject() {
$result = $this->scaffoldSut($fixture_name, FALSE, FALSE);
$this->assertContains('The allowed package fixtures/empty-fixture does not provide a file mapping for Composer Scaffold', $result->scaffoldOutput());
$this->assertCommonDrupalAssetsWereScaffolded($result->docroot(), FALSE);
$this->assertAutoloadFileCorrect($result->docroot());
}
public function scaffoldOverridingSettingsExcludingHtaccessValues() {
......@@ -229,6 +230,7 @@ public function testScaffoldOverridingSettingsExcludingHtaccess($fixture_name, $
$result = $this->scaffoldSut($fixture_name, $is_link, $relocated_docroot);
$this->assertCommonDrupalAssetsWereScaffolded($result->docroot(), $is_link);
$this->assertAutoloadFileCorrect($result->docroot(), $relocated_docroot);
$this->assertDefaultSettingsFromScaffoldOverride($result->docroot(), $is_link);
$this->assertHtaccessExcluded($result->docroot());
}
......@@ -248,6 +250,7 @@ public function testDrupalDrupalFileWasReplaced() {
$this->assertScaffoldedFile($result->docroot() . '/keep-me.txt', FALSE, 'File in drupal-drupal-test-overwrite that is not replaced');
$this->assertScaffoldedFile($result->docroot() . '/make-me.txt', FALSE, 'from assets that replaces file');
$this->assertCommonDrupalAssetsWereScaffolded($result->docroot(), FALSE);
$this->assertAutoloadFileCorrect($result->docroot());
$this->assertScaffoldedFile($result->docroot() . '/robots.txt', FALSE, $fixture_name);
}
......@@ -322,6 +325,7 @@ public function testDrupalDrupalFileWasAppended($fixture_name, $is_link, $robots
$this->assertScaffoldedFile($result->docroot() . '/robots.txt', FALSE, $robots_txt_contents);
$this->assertCommonDrupalAssetsWereScaffolded($result->docroot(), $is_link);
$this->assertAutoloadFileCorrect($result->docroot());
}
/**
......@@ -361,9 +365,7 @@ protected function assertHtaccessExcluded($docroot) {
* Whether or not symlinking is used.
*/
protected function assertCommonDrupalAssetsWereScaffolded($docroot, $is_link) {
// Ensure that the autoload.php file was written.
$this->assertFileExists($docroot . '/autoload.php');
// Assert other scaffold files are written in the correct locations.
// Assert scaffold files are written in the correct locations.
$this->assertScaffoldedFile($docroot . '/.csslintrc', $is_link, 'Test version of .csslintrc from drupal/core.');
$this->assertScaffoldedFile($docroot . '/.editorconfig', $is_link, 'Test version of .editorconfig from drupal/core.');
$this->assertScaffoldedFile($docroot . '/.eslintignore', $is_link, 'Test version of .eslintignore from drupal/core.');
......@@ -378,4 +380,27 @@ protected function assertCommonDrupalAssetsWereScaffolded($docroot, $is_link) {
$this->assertScaffoldedFile($docroot . '/web.config', $is_link, 'Test version of web.config from drupal/core.');
}
/**
* Assert that the autoload file was scaffolded and contains correct path.
*
* @param string $docroot
* Location of the doc root, where autoload.php should be written.
* @param bool $relocated_docroot
* Whether the document root is relocated or now.
*/
protected function assertAutoloadFileCorrect($docroot, $relocated_docroot = FALSE) {
$autoload_path = $docroot . '/autoload.php';
// Ensure that the autoload.php file was written.
$this->assertFileExists($autoload_path);
$contents = file_get_contents($autoload_path);
$expected = "return require __DIR__ . '/vendor/autoload.php';";
if ($relocated_docroot) {
$expected = "return require __DIR__ . '/../vendor/autoload.php';";
}
$this->assertContains($expected, $contents);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment