From a2ec8303d7acf16dc1d09254364fef492af0dd8d Mon Sep 17 00:00:00 2001 From: Michael Priest Date: Wed, 6 Sep 2017 12:57:14 +0930 Subject: [PATCH] Delegate to Drupal scaffold to handle creating settings.php and services.yml. Squashed commit of the following: Merged feature branch 'feature/less-work-for-scaffold' commit 5d1bbeb6e7e0e55e33b2e1c2a81faa90c4ae9203 Author: Michael Priest Date: Wed Sep 6 12:52:06 2017 +0930 Invoke Drupal scaffold from Shepherd scaffold to fix order of operations. commit 165bb60beb6499a431a4e76f8e140b364d9deca6 Author: Michael Priest Date: Wed Sep 6 11:14:50 2017 +0930 Drupal scaffold can handle creating settings.php and services.yml. --- composer.json | 2 +- src/Handler.php | 138 ++++++++++++++++++++++++------------------------ 2 files changed, 69 insertions(+), 71 deletions(-) diff --git a/composer.json b/composer.json index 7627189..a851403 100644 --- a/composer.json +++ b/composer.json @@ -5,7 +5,7 @@ "license": "GPL-2.0+", "require": { "php": ">=5.4.5", - "composer-plugin-api": "^1.0.0", + "composer-plugin-api": "^1.1", "drupal-composer/drupal-scaffold": "^2.2", "symfony/filesystem": "~2.8|~3.0" }, diff --git a/src/Handler.php b/src/Handler.php index 995fe4e..9897ba3 100644 --- a/src/Handler.php +++ b/src/Handler.php @@ -5,6 +5,7 @@ use Composer\Composer; use Composer\IO\IOInterface; use Composer\Util\Filesystem as ComposerFilesystem; +use DrupalComposer\DrupalScaffold\Handler as DrupalScaffoldHandler; use Symfony\Component\Filesystem\Filesystem; class Handler @@ -45,18 +46,30 @@ public function __construct(Composer $composer, IOInterface $io) */ public function onPostCmdEvent(\Composer\Script\Event $event) { + $event->getIO()->write("Execute Drupal scaffold."); + $this->executeDrupalScaffold($event); $event->getIO()->write("Updating Shepherd scaffold files."); $this->updateShepherdScaffoldFiles(); $event->getIO()->write("Creating necessary directories."); $this->createDirectories(); $event->getIO()->write("Creating settings.php file if not present."); - $this->createSettingsFile(); - $event->getIO()->write("Creating services.yml file if not present."); - $this->createServicesFile(); + $this->modifySettingsFile(); $event->getIO()->write("Removing write permissions on settings files."); $this->removeWritePermissions(); } + /** + * Run Drupal scaffold handler. + */ + public function executeDrupalScaffold($event) + { + $root = $this->getDrupalRootPath(); + $this->filesystem->chmod($root . '/sites/default', 0775); + $drupalScaffoldHandler = new DrupalScaffoldHandler($event->getComposer(), $event->getIO()); + $drupalScaffoldHandler->downloadScaffold(); + $drupalScaffoldHandler->generateAutoload(); + } + /** * Update the Shepherd scaffold files. */ @@ -113,77 +126,62 @@ public function createDirectories() * * Note: does nothing if the file already exists. */ - public function createSettingsFile() + public function modifySettingsFile() { $root = $this->getDrupalRootPath(); - // If the settings.php is not present, and the default version is... - if (!$this->filesystem->exists($root . '/sites/default/settings.php') && $this->filesystem->exists($root . '/sites/default/default.settings.php')) { - $this->filesystem->copy($root . '/sites/default/default.settings.php', $root . '/sites/default/settings.php'); - $this->filesystem->chmod($root . '/sites/default/settings.php', 0666); + // Assume Drupal scaffold created the settings.php + $this->filesystem->chmod($root . '/sites/default/settings.php', 0664); - $shepherdSettings = "\n/**\n * START SHEPHERD CONFIG\n */\n" . - "\$databases['default']['default'] = array (\n" . - " 'database' => getenv('DATABASE_NAME'),\n" . - " 'username' => getenv('DATABASE_USER'),\n" . - " 'password' => getenv('DATABASE_PASSWORD_FILE') ? file_get_contents(getenv('DATABASE_PASSWORD_FILE')) : getenv('DATABASE_PASSWORD'),\n" . - " 'host' => getenv('DATABASE_HOST'),\n" . - " 'port' => getenv('DATABASE_PORT') ?: '3306',\n" . - " 'driver' => getenv('DATABASE_DRIVER') ?: 'mysql',\n" . - " 'prefix' => getenv('DATABASE_PREFIX') ?: '',\n" . - " 'collation' => getenv('DATABASE_COLLATION') ?: 'utf8mb4_general_ci',\n" . - " 'namespace' => getenv('DATABASE_NAMESPACE') ?: 'Drupal\\\\Core\\\\Database\\\\Driver\\\\mysql',\n" . - ");\n" . - "\$settings['file_private_path'] = getenv('PRIVATE_DIR');\n" . - "\$settings['hash_salt'] = getenv('HASH_SALT') ?: '" . str_replace(['+', '/', '='], ['-', '_', ''], base64_encode(random_bytes(55))) . "';\n" . - "\$config_directories['sync'] = getenv('CONFIG_SYNC_DIRECTORY') ?: 'sites/default/files/config_" . str_replace(['+', '/', '='], ['-', '_', ''], base64_encode(random_bytes(55))) . "/sync';\n" . - "if (! is_dir(\$app_root . '/' . \$config_directories['sync'])) mkdir(\$app_root . '/' . \$config_directories['sync'], 0777, true);\n" . - "\$settings['shepherd_site_id'] = getenv('SHEPHERD_SITE_ID');\n" . - "\$settings['shepherd_url'] = getenv('SHEPHERD_URL');\n" . - "\$settings['shepherd_token'] = getenv('SHEPHERD_TOKEN_FILE') ? file_get_contents(getenv('SHEPHERD_TOKEN_FILE')) : getenv('SHEPHERD_TOKEN');\n\n" . - "\$settings['install_profile'] = getenv('SHEPHERD_INSTALL_PROFILE') ?: 'standard';\n" . - "if (getenv('REDIS_ENABLED')) {\n" . - " \$settings['redis.connection']['interface'] = 'PhpRedis';\n" . - " \$settings['redis.connection']['host'] = getenv('REDIS_HOST') ?: 'redis';\n" . - " \$settings['cache']['default'] = 'cache.backend.redis';\n\n" . - " // Always set the fast backend for bootstrap, discover and config, otherwise\n" . - " // this gets lost when redis is enabled.\n" . - " \$settings['cache']['bins']['bootstrap'] = 'cache.backend.chainedfast';\n" . - " \$settings['cache']['bins']['discovery'] = 'cache.backend.chainedfast';\n" . - " \$settings['cache']['bins']['config'] = 'cache.backend.chainedfast';\n\n" . - " // If we're not installing, include the redis services.\n" . - " if (!isset(\$GLOBALS['install_state'])) {\n" . - " \$settings['container_yamls'][] = 'modules/contrib/redis/example.services.yml';\n" . - " }\n" . - "}\n" . - "/**\n * END SHEPHERD CONFIG\n */\n" . - "\n" . - "/**\n * START LOCAL CONFIG\n */\n" . - "if (file_exists(__DIR__ . '/settings.local.php')) {\n" . - " include __DIR__ . '/settings.local.php';\n" . - "}\n" . - "/**\n * END LOCAL CONFIG\n */\n" - ; + $shepherdSettings = "\n/**\n * START SHEPHERD CONFIG\n */\n" . + "\$databases['default']['default'] = array (\n" . + " 'database' => getenv('DATABASE_NAME'),\n" . + " 'username' => getenv('DATABASE_USER'),\n" . + " 'password' => getenv('DATABASE_PASSWORD_FILE') ? file_get_contents(getenv('DATABASE_PASSWORD_FILE')) : getenv('DATABASE_PASSWORD'),\n" . + " 'host' => getenv('DATABASE_HOST'),\n" . + " 'port' => getenv('DATABASE_PORT') ?: '3306',\n" . + " 'driver' => getenv('DATABASE_DRIVER') ?: 'mysql',\n" . + " 'prefix' => getenv('DATABASE_PREFIX') ?: '',\n" . + " 'collation' => getenv('DATABASE_COLLATION') ?: 'utf8mb4_general_ci',\n" . + " 'namespace' => getenv('DATABASE_NAMESPACE') ?: 'Drupal\\\\Core\\\\Database\\\\Driver\\\\mysql',\n" . + ");\n" . + "\$settings['file_private_path'] = getenv('PRIVATE_DIR');\n" . + "\$settings['hash_salt'] = getenv('HASH_SALT') ?: '" . str_replace(['+', '/', '='], ['-', '_', ''], base64_encode(random_bytes(55))) . "';\n" . + "\$config_directories['sync'] = getenv('CONFIG_SYNC_DIRECTORY') ?: 'sites/default/files/config_" . str_replace(['+', '/', '='], ['-', '_', ''], base64_encode(random_bytes(55))) . "/sync';\n" . + "if (! is_dir(\$app_root . '/' . \$config_directories['sync'])) mkdir(\$app_root . '/' . \$config_directories['sync'], 0777, true);\n" . + "\$settings['shepherd_site_id'] = getenv('SHEPHERD_SITE_ID');\n" . + "\$settings['shepherd_url'] = getenv('SHEPHERD_URL');\n" . + "\$settings['shepherd_token'] = getenv('SHEPHERD_TOKEN_FILE') ? file_get_contents(getenv('SHEPHERD_TOKEN_FILE')) : getenv('SHEPHERD_TOKEN');\n\n" . + "\$settings['install_profile'] = getenv('SHEPHERD_INSTALL_PROFILE') ?: 'standard';\n" . + "if (getenv('REDIS_ENABLED')) {\n" . + " \$settings['redis.connection']['interface'] = 'PhpRedis';\n" . + " \$settings['redis.connection']['host'] = getenv('REDIS_HOST') ?: 'redis';\n" . + " \$settings['cache']['default'] = 'cache.backend.redis';\n\n" . + " // Always set the fast backend for bootstrap, discover and config, otherwise\n" . + " // this gets lost when redis is enabled.\n" . + " \$settings['cache']['bins']['bootstrap'] = 'cache.backend.chainedfast';\n" . + " \$settings['cache']['bins']['discovery'] = 'cache.backend.chainedfast';\n" . + " \$settings['cache']['bins']['config'] = 'cache.backend.chainedfast';\n\n" . + " // If we're not installing, include the redis services.\n" . + " if (!isset(\$GLOBALS['install_state'])) {\n" . + " \$settings['container_yamls'][] = 'modules/contrib/redis/example.services.yml';\n" . + " }\n" . + "}\n" . + "/**\n * END SHEPHERD CONFIG\n */\n" . + "\n" . + "/**\n * START LOCAL CONFIG\n */\n" . + "if (file_exists(__DIR__ . '/settings.local.php')) {\n" . + " include __DIR__ . '/settings.local.php';\n" . + "}\n" . + "/**\n * END LOCAL CONFIG\n */\n" + ; - // Append Shepherd-specific environment variable settings to settings.php. - file_put_contents( - $root . '/sites/default/settings.php', - $shepherdSettings, - FILE_APPEND - ); - } - } - - /** - * Create services.yml file if not present. - */ - public function createServicesFile() - { - $root = $this->getDrupalRootPath(); - - if (!$this->filesystem->exists($root . '/sites/default/services.yml') && $this->filesystem->exists($root . '/sites/default/default.services.yml')) { - $this->filesystem->copy($root . '/sites/default/default.services.yml', $root . '/sites/default/services.yml'); - } + // Append Shepherd-specific environment variable settings to settings.php. + file_put_contents( + $root . '/sites/default/settings.php', + $shepherdSettings, + FILE_APPEND + ); } /** @@ -198,7 +196,7 @@ public function removeWritePermissions() } /** - * Copy files from origin to destination, optionally overwritting existing. + * Copy files from origin to destination, optionally overwriting existing. * * @param bool $overwriteExisting * If true, replace existing files. Defaults to false.