diff --git a/.gitignore b/.gitignore index 798fe514b48f09eb08869b4122363efab5397e37..68cd19d26977cd8379e6baff04067b821c0ebf5e 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 d3fa24ec134d6f75dc10606c7d86be8c21c6c9a2..34d696c9a14061293b2e05e4679ee8b32560139f 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