From c98cb4a55ff3bf33c2253c288560edf961d7dda9 Mon Sep 17 00:00:00 2001
From: TravisCarden <traviscarden@236758.no-reply.drupal.org>
Date: Thu, 8 Sep 2022 17:19:38 +0000
Subject: [PATCH] Issue #3307103 by tedbow: Make setup_local_dev.sh configure
 PHPUnit, and other enhancements

---
 .gitignore                 |   1 +
 scripts/setup_local_dev.sh | 104 +++++++++++++++++++++++++------------
 2 files changed, 72 insertions(+), 33 deletions(-)

diff --git a/.gitignore b/.gitignore
index 798fe514b4..68cd19d269 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
+/.idea
 /auto-updates-dev
diff --git a/scripts/setup_local_dev.sh b/scripts/setup_local_dev.sh
index d3fa24ec13..34d696c9a1 100755
--- a/scripts/setup_local_dev.sh
+++ b/scripts/setup_local_dev.sh
@@ -12,28 +12,45 @@
 #     installing the module and its dependencies. It does NOT set up a web
 #     server or install Drupal in a database.
 
+# GNU realpath can't be depended upon to always be available. Simulate it.
+# https://stackoverflow.com/questions/3572030/bash-script-absolute-path-with-os-x
+safe_realpath() {
+  [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
+}
+
 # Customizations: set any of these environment variables in your shell (i.e.,
 # your terminal session) to override their default values.
 # @see https://www.serverlab.ca/tutorials/linux/administration-linux/how-to-set-environment-variables-in-linux/
+# Variables beginning with an underscore (_) cannot be overridden.
 DRUPAL_CORE_BRANCH=${DRUPAL_CORE_BRANCH:="9.5.x"}
 DRUPAL_CORE_SHALLOW_CLONE=${DRUPAL_CORE_SHALLOW_CLONE:="TRUE"}
 AUTOMATIC_UPDATES_BRANCH=${AUTOMATIC_UPDATES_BRANCH:="8.x-2.x"}
 SITE_DIRECTORY=${SITE_DIRECTORY:="auto_updates_dev"}
-SITE_HOST=${SITE_HOST:="$SITE_DIRECTORY.test"}
-
-# GNU realpath can't be depended upon to always be available. Simulate it.
-# https://stackoverflow.com/questions/3572030/bash-script-absolute-path-with-os-x
-safe_realpath() {
-  [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
-}
-
-SITE_DIRECTORY_REALPATH=$(safe_realpath "$SITE_DIRECTORY")
+_SITE_DIRECTORY_REALPATH=$(safe_realpath "$SITE_DIRECTORY")
+_SITE_DIRECTORY_BASENAME=$(basename "$_SITE_DIRECTORY_REALPATH")
+SITE_HOST=${SITE_HOST:="$_SITE_DIRECTORY_BASENAME.test"}
+
+MODULE_CLONE_DIRECTORY="modules/contrib/automatic_updates"
+
+# Handle command-line options. (Usable when run from a local clone.)
+while getopts ":fn" option; do
+   case $option in
+      f) # Force: delete existing site directory, if present.
+         FORCE="TRUE"
+         ;;
+      n) # No interaction: skip prompt and continue automatically.
+         NO_INTERACTION="TRUE"
+         ;;
+   esac
+done
 
 # Prevent the user from losing work in case the site directory already exists.
 if test -e "$SITE_DIRECTORY"; then
-  cat << DANGER
+  if test ! "$FORCE"; then
+    # Exit with a warning.
+    cat << DANGER
 
-$(printf "\e[1;41m DANGER! \e[0m \e[33m")"$SITE_DIRECTORY_REALPATH" already exists.
+$(printf "\e[1;41m DANGER! \e[0m \e[33m")"$_SITE_DIRECTORY_REALPATH" already exists.
 $(printf "\e[1;41m         \e[0m")
 $(printf "\e[1;41m         \e[0m") If you destroy it, any changes to the Automatic Updates module inside it will be lost forever.
 $(printf "\e[1;41m         \e[0m") Consider moving the directory to another location as a backup instead.
@@ -41,25 +58,32 @@ $(printf "\e[1;41m         \e[0m")
 $(printf "\e[1;41m         \e[0m") Otherwise, if you know what you're doing and still want to continue, make sure any changes you want to
 $(printf "\e[1;41m         \e[0m") keep have been committed and pushed to an appropriate remote. Then delete the directory and try again:
 $(printf "\e[1;41m         \e[0m")
-$(printf "\e[1;41m         \e[0m") rm -rf "$SITE_DIRECTORY_REALPATH"
+$(printf "\e[1;41m         \e[0m") rm -rf "$_SITE_DIRECTORY_REALPATH"
 
 DANGER
-  exit 1
+    exit 1
+  else
+    # Automatically delete the existing site directory.
+    chmod -R u+w "$_SITE_DIRECTORY_REALPATH"
+    rm -rf "$_SITE_DIRECTORY_REALPATH"
+  fi
 fi
 
 # Prompt for confirmation.
-cat << WARNING
+if test ! "$NO_INTERACTION"; then
+  cat << WARNING
 You are about to create an Automatic Updates development environment at "$SITE_DIRECTORY". This will download
 as much as 100 MB of data and may take several minutes to complete, depending on your Internet connection.
 
 WARNING
-read -p "Do you want to continue? [yN] " -n 1 -r
-echo
-if [[ ! $REPLY =~ ^[Yy]$ ]]; then
-  # Exit from a function or non-interactive shell but not an interactive one.
-  [[ "$0" = "$BASH_SOURCE" ]] && exit 1 || return 1
+  read -p "Do you want to continue? [yN] " -n 1 -r
+  echo
+  if [[ ! $REPLY =~ ^[Yy]$ ]]; then
+    # Exit from a function or non-interactive shell but not an interactive one.
+    [[ "$0" = "$BASH_SOURCE" ]] && exit 1 || return 1
+  fi
+  echo
 fi
-echo
 
 # Clone Drupal core.
 if [[ "$DRUPAL_CORE_SHALLOW_CLONE" == "TRUE" ]]; then
@@ -89,28 +113,37 @@ sites
 vendor
 " | tee -a .git/info/exclude
 
+# Create default site settings.
+cp "$_SITE_DIRECTORY_REALPATH/sites/default/default.settings.php" \
+   "$_SITE_DIRECTORY_REALPATH/sites/default/settings.php"
+
 # Set trusted_host_patterns configuration.
 TRUSTED_HOST_PATTERN="${SITE_HOST//\./\\.}"
   echo "
 \$settings['trusted_host_patterns'] = [
   '^$TRUSTED_HOST_PATTERN\$',
 ];" \
-  | tee -a sites/default/default.settings.php
+  | tee -a sites/default/settings.php
 
 # Set path to Composer configuration, if possible.
 COMPOSER_PATH=$(which composer);
 if test ! -z "$COMPOSER_PATH"; then
   echo "
-\$config['package_manager.settings']['executables']['composer'] = '$COMPOSER_PATH';
-" | tee -a sites/default/default.settings.php
+\$config['package_manager.settings']['executables']['composer'] = '$COMPOSER_PATH';" \
+  | tee -a sites/default/settings.php
 fi
 
+# Enable verbose error display in the browser.
+echo "
+\$config['system.logging']['error_level'] = 'verbose';" \
+  | tee -a sites/default/settings.php
+
 # Clone the Automatic Updates repo into place. (It will still be
 # `composer require`d below to bring in its dependencies.)
 git clone \
   --branch "$AUTOMATIC_UPDATES_BRANCH" -- \
   https://git.drupalcode.org/project/automatic_updates.git \
-  modules/contrib/automatic_updates
+  "$MODULE_CLONE_DIRECTORY"
 
 # Tell Composer to look for the package in the local clone. This is done rather
 # than MERELY cloning the module so that the composer.json of the code under
@@ -119,12 +152,10 @@ git clone \
 composer config \
   repositories.automatic_updates \
   path \
-  modules/contrib/automatic_updates
+  "$MODULE_CLONE_DIRECTORY"
 
-# Prevent Composer from symlinking path repositories by setting their "symlink"
-# option to FALSE in composer.json.
-JSON=$(sed 's/"type": "path"/"type": "path", "options": {"symlink": false}/g' composer.json)
-echo "$JSON" > composer.json
+# Prevent Composer from symlinking path repositories.
+export COMPOSER_MIRROR_PATH_REPOS=1
 
 # Update the Composer platform PHP requirement.
 composer config platform.php 7.4.0
@@ -135,12 +166,19 @@ composer config platform.php 7.4.0
 composer config --json extra.drupal-core-vendor-hardening.drush/drush '["docs"]'
 composer config --json extra.drupal-core-vendor-hardening.grasmash/yaml-expander '["scenarios"]'
 
-# Require the module using the checked out dev branch, ignoring the PHP version
-# requirement.
+# Require the module using the checked out dev branch.
 composer require \
   --no-ansi \
   drupal/automatic_updates:dev-"$AUTOMATIC_UPDATES_BRANCH"
 
+# Revert needless changes to Core Composer metapackages.
+git checkout -- "$_SITE_DIRECTORY_REALPATH/composer/Metapackage"
+
+# Configure PHPUnit.
+PHPUNIT_XML=$(sed 's/env name="SIMPLETEST_BASE_URL" value=""/env name="SIMPLETEST_BASE_URL" value="http:\/\/'$SITE_HOST'"/' "$_SITE_DIRECTORY_REALPATH/core/phpunit.xml.dist")
+PHPUNIT_XML=$(sed 's/env name="SIMPLETEST_DB" value=""/env name="SIMPLETEST_DB" value="sqlite:\/\/sites\/default\/files\/db.sqlite"/' <<< "$PHPUNIT_XML")
+echo "$PHPUNIT_XML" > "$_SITE_DIRECTORY_REALPATH/core/phpunit.xml"
+
 cat << DONE
 
 $(printf "\e[1;34m")================================================================================
@@ -160,13 +198,13 @@ $(printf "\e[0m")
    - Point your web server at the configured site directory below. (No
      instructions are provided for this step yet.)
 
-         Web root: $SITE_DIRECTORY_REALPATH
+         Web root: $_SITE_DIRECTORY_REALPATH
          Site URL: http://$SITE_HOST
 
    - Make and commit code changes to the module repository below. Changes made
      anywhere else will not be captured.
 
-         Module repo: $SITE_DIRECTORY_REALPATH/modules/contrib/automatic_updates
+         Module repo: $_SITE_DIRECTORY_REALPATH/$MODULE_CLONE_DIRECTORY
 
   For information on creating issue forks and merge requests see
   https://www.drupal.org/docs/develop/git/using-git-to-contribute-to-drupal/creating-issue-forks-and-merge-requests
-- 
GitLab