Unverified Commit a68ff423 authored by Alex Pott's avatar Alex Pott
Browse files

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
Loading
Loading
Loading
Loading
+7 −8
Original line number Diff line number Diff line
@@ -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;
  }
+10 −0
Original line number Diff line number Diff line
@@ -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;
    }
  }

  /**
+28 −3
Original line number Diff line number Diff line
@@ -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);
  }

}