From e63fecb7e090a4a3c1067eb292741df4ffbc76d8 Mon Sep 17 00:00:00 2001
From: jurgenhaas <juergen@paragon-es.de>
Date: Mon, 3 Apr 2017 14:01:13 +0200
Subject: [PATCH] Fix dependency with lakedrops/d8-project-scaffold and the
 order of plugin events

---
 src/Handler.php | 83 ++++++++++++++++++++++++++-----------------------
 src/Plugin.php  | 15 ++-------
 2 files changed, 47 insertions(+), 51 deletions(-)

diff --git a/src/Handler.php b/src/Handler.php
index 64561fd..20bc100 100644
--- a/src/Handler.php
+++ b/src/Handler.php
@@ -72,22 +72,14 @@ class Handler {
    * Configure Drupal Project for Docker.
    *
    * @param ScriptEvent $event
-   * @param bool $force
    */
-  public function configureProject($event, $force = FALSE) {
+  public function configureProject($event) {
 
     // We only do the fancy stuff for developers
     if (!$event->isDevMode()) {
       return;
     }
 
-    // If the d8-project-scaffold plugin is present we only execute this one
-    // if $force is TRUE. This way we can make sure that we get executed after
-    // d8-project-scaffold.
-    if ($this->getPackage('lakedrops/d8-project-scaffold') && !$force) {
-      return;
-    }
-
     $options = $this->getOptions();
     $fs = new Filesystem();
     $installationManager = $this->composer->getInstallationManager();
@@ -102,17 +94,28 @@ class Handler {
     // Directory where this plugin is being installed
     $pluginRoot = $installationManager->getInstallPath($this->getPackage('lakedrops/docker4drupal'));
 
+    // If the d8-project-scaffold plugin is present we only execute this one
+    // if $force is TRUE. This way we can make sure that we get executed after
+    // d8-project-scaffold.
+    $settingsPath = $webRoot . '/sites/default';
+    if ($this->getPackage('lakedrops/d8-project-scaffold')) {
+      if (!$fs->exists($projectRoot . '/settings/default')) {
+        return;
+      }
+      $settingsPath = 'settings/default';
+    }
+
     // Link Drupal site's settings files
     $twig_loader = new \Twig_Loader_Array([]);
     $twig = new \Twig_Environment($twig_loader);
-    foreach ($this->getFiles($projectRoot, $webRoot) as $template => $def) {
+    foreach ($this->getFiles($projectRoot, $webRoot, $settingsPath) as $template => $def) {
       $file = $def['dest'] . '/' . $template;
       if (!$fs->exists($file)) {
         $twig_loader->setTemplate($template, file_get_contents($pluginRoot . '/templates/' . $template . '.twig'));
         $rendered = $twig->render($template, $options);
         file_put_contents($file, $rendered);
       }
-      if (isset($def['link'])) {
+      if (isset($def['link']) && ($def['link'] != $settingsPath)) {
         $link = $def['link'] . '/' . $template;
         if (!$fs->exists($link)) {
           $rel = substr($fs->makePathRelative($file, $projectRoot . '/' . $link), 3, -1);
@@ -123,11 +126,13 @@ class Handler {
     }
 
     // Make sure that settings.docker.php gets called from settings.php
-    $settingsPhpFile = $webRoot . '/sites/default/settings.php';
-    $settingsPhp = file_get_contents($settingsPhpFile);
-    if (strpos($settingsPhp, 'settings.docker.php') === FALSE) {
-      $settingsPhp .= "\n\nif (file_exists(__DIR__ . '/settings.docker.php')) {include __DIR__ . '/settings.docker.php';}\n";
-      file_put_contents($settingsPhpFile, $settingsPhp);
+    $settingsPhpFile = $settingsPath . '/settings.php';
+    if ($fs->exists(($settingsPhpFile))) {
+      $settingsPhp = file_get_contents($settingsPhpFile);
+      if (strpos($settingsPhp, 'settings.docker.php') === FALSE) {
+        $settingsPhp .= "\n\nif (file_exists(__DIR__ . '/settings.docker.php')) {include __DIR__ . '/settings.docker.php';}\n";
+        file_put_contents($settingsPhpFile, $settingsPhp);
+      }
     }
 
     // Initialize local git working copy
@@ -141,10 +146,10 @@ class Handler {
 
   }
 
-  protected function getFiles($projectRoot, $webRoot) {
+  protected function getFiles($projectRoot, $webRoot, $settingsPath) {
     return [
       'settings.docker.php' => [
-        'dest' => $projectRoot . '/settings/default',
+        'dest' => $projectRoot . '/' . $settingsPath,
         'link' => $webRoot . '/sites/default',
       ],
       'docker-compose.yml' => [
@@ -161,27 +166,27 @@ class Handler {
   protected function getOptions() {
     $extra = $this->composer->getPackage()->getExtra() + ['docker4drupal' => []];
     $options = $extra['docker4drupal'] + [
-      'port' => 8000,
-      'drupal' => [
-        'version' => '8',
-      ],
-      'php' => [
-        'version' => '7.0',# 5.3|5.6|7.1
-        'xdebug' => 1,
-      ],
-      'nginx' => [
-        'version' => '1.10',
-      ],
-      'varnish' => [
-        'enable' => 0,
-      ],
-      'solr' => [
-        'enable' => 0,
-      ],
-      'node' => [
-        'enable' => 0,
-      ],
-    ];
+        'port' => 8000,
+        'drupal' => [
+          'version' => '8',
+        ],
+        'php' => [
+          'version' => '7.0',# 5.3|5.6|7.1
+          'xdebug' => 1,
+        ],
+        'nginx' => [
+          'version' => '1.10',
+        ],
+        'varnish' => [
+          'enable' => 0,
+        ],
+        'solr' => [
+          'enable' => 0,
+        ],
+        'node' => [
+          'enable' => 0,
+        ],
+      ];
     return $options;
   }
 
diff --git a/src/Plugin.php b/src/Plugin.php
index 858eb53..5897d0d 100644
--- a/src/Plugin.php
+++ b/src/Plugin.php
@@ -35,8 +35,8 @@ class Plugin implements PluginInterface, EventSubscriberInterface {
   public static function getSubscribedEvents() {
     return array(
       ScriptEvents::POST_CREATE_PROJECT_CMD => 'configureProject',
-      ScriptEvents::POST_INSTALL_CMD => 'configureProjectForce',
-      ScriptEvents::POST_UPDATE_CMD => 'configureProjectForce',
+      ScriptEvents::POST_INSTALL_CMD => 'configureProject',
+      ScriptEvents::POST_UPDATE_CMD => 'configureProject',
     );
   }
 
@@ -49,15 +49,6 @@ class Plugin implements PluginInterface, EventSubscriberInterface {
     $this->handler->configureProject($event);
   }
 
-  /**
-   * Configure project event callback.
-   *
-   * @param \Composer\Script\Event $event
-   */
-  public function configureProjectForce($event) {
-    $this->handler->configureProject($event, TRUE);
-  }
-
   /**
    * Script callback for putting in composer scripts to configure the project.
    *
@@ -65,7 +56,7 @@ class Plugin implements PluginInterface, EventSubscriberInterface {
    */
   public static function config($event) {
     $handler = new Handler($event->getComposer(), $event->getIO());
-    $handler->configureProject($event, TRUE);
+    $handler->configureProject($event);
   }
 
 }
-- 
GitLab