bootstrap.sh: don't force RewriteBase, it's not generally needed
[drupal-init-tools.git] / libexec / bootstrap.sh
index 3b52f26..b599825 100755 (executable)
@@ -20,13 +20,15 @@ set -e
 
 usage() {
   cat <<EOF
-usage: drin $(basename $0 .sh) [--devel|-h|--help]
+usage: drin $(basename "$0" .sh) [--devel|--overwrite-profile|-h|--help]
 
 Bootstrap a Drupal project, using settings from a 'bootstrap.conf' file.
 
 Options:
-  --devel             install drupal/devel and use a settings.local.php file
-  -h, --help          display this usage message and exit
+  --devel              install drupal/devel and use a settings.local.php file
+  --overwrite-profile  allow overwriting the installation profile of the site
+                       with a profile copied from the current working directory
+  -h, --help           display this usage message and exit
 
 EOF
 }
@@ -41,6 +43,9 @@ do
     --devel)
       DEVEL_MODE="true"
       ;;
+    --overwrite-profile)
+      OVERWRITE_PROFILE="true"
+      ;;
     -*)
       echo "Error: Unknown option '${1}'" 1>&2
       ;;
@@ -48,6 +53,9 @@ do
   shift
 done
 
+[ -f "bootstrap.conf" ] || { echo "Aborting, run this command from the Drupal project directory." 1>&2; exit 1; }
+
+# shellcheck disable=SC1091
 . bootstrap.conf
 
 declare -p DB_NAME
@@ -68,54 +76,108 @@ declare -p WEB_SERVER_GROUP
 
 [ "x$INSTALLATION_PROFILE" = "x" ] && { echo "INSTALLATION_PROFILE not specified, using the \"standard\" profile!"; INSTALLATION_PROFILE="standard"; }
 
-if [ "x$MYSQL_ROOT_PASSWORD" = "x" ];
+if [ "$MYSQL_PASSWORDLESS_ACCESS" = true ];
 then
-  read -s -p "MySQL root password: " MYSQL_ROOT_PASSWORD
-  echo
+  MYSQL_SU_USER="${USER}"
+else
+  # XXX Deprecate MYSQL_ROOT_PASSWORD, it will be removed eventually,
+  # but for now add some backwards compatibility mapping.
+  if [ "x$MYSQL_ROOT_PASSWORD" != "x" ];
+  then
+    echo "WARN: MYSQL_ROOT_PASSWORD is deprecated, use MYSQL_SU_USER and MYSQL_SU_PASSWORD" 1>&2
+    MYSQL_SU_USER="root"
+    MYSQL_SU_PASSWORD="$MYSQL_ROOT_PASSWORD"
+  fi
+
+  if [ "x$MYSQL_SU_USER" = "x" ];
+  then
+    echo "Aborting, for password regulated access specify MYSQL_SU_USER in bootstrap.conf" 1>&2
+    exit 1
+  fi
+
+  if [ "x$MYSQL_SU_PASSWORD" = "x" ];
+  then
+    read -r -s -p "MySQL password for \"${MYSQL_SU_USER}\": " MYSQL_SU_PASSWORD
+    echo
+  fi
+
+  DRUSH_DB_SU_CREDENTIALS=(--db-su-pw'='"${MYSQL_SU_PASSWORD}")
 fi
 
-SITE_LOCAL_PATH="${PWD}/web"
+DRUSH_DB_SU_CREDENTIALS+=(--db-su'='"${MYSQL_SU_USER}")
+
+WEB_ROOT="${PWD}/web"
 
 command -v composer &> /dev/null || { echo "Aborting, 'composer' not available." 1>&2; exit 1; }
 command -v git &> /dev/null || { echo "Aborting, 'git' not available." 1>&2; exit 1; }
 
-[ -d "$SITE_LOCAL_PATH" ] || composer install
+[ -d "$WEB_ROOT" ] || composer install
 
-# TODO check if the commands are available
 DRUSH="${PWD}/vendor/bin/drush"
 DRUPAL_CONSOLE="${PWD}/vendor/bin/drupal"
 
 [ -x "$DRUSH" ] || { echo "Aborting, '$DRUSH' not available." 1>&2; exit 1; }
 [ -x "$DRUPAL_CONSOLE" ] || { echo "Aborting, '$DRUPAL_CONSOLE' not available." 1>&2; exit 1; }
 
-# This becomes unnecessary if the installation profile gets pulled in by
-# composer.json, like suggested in
+# The following becomes unnecessary if the installation profile gets pulled in
+# by composer.json, like suggested in
 # https://github.com/drupal-composer/drupal-project/issues/249
-if ! echo $INSTALLATION_PROFILE | egrep -q "^(minimal|standard)$";
+if ! echo "$INSTALLATION_PROFILE" | grep -q -E "^(minimal|standard)$";
 then
-  if [ -d $SITE_LOCAL_PATH/profiles/$INSTALLATION_PROFILE ];
+  if [ -d "${WEB_ROOT}/profiles/${INSTALLATION_PROFILE}" ] && [ "$OVERWRITE_PROFILE" != "true" ];
   then
-    echo "Installation profile '$INSTALLATION_PROFILE' already there."
+    echo "Installation profile '$INSTALLATION_PROFILE' already there." 1>&2
+    echo "Use --overwrite-profile to copy over it." 1>&2
+    exit 1
   else
-    cp -a $INSTALLATION_PROFILE $SITE_LOCAL_PATH/profiles
+    if [ -d "$INSTALLATION_PROFILE" ];
+    then
+      cp -a "$INSTALLATION_PROFILE" "${WEB_ROOT}/profiles"
+    else
+      echo "Local installation profile '$INSTALLATION_PROFILE' not found." 1>&2
+      echo "Cannot honour the --overwrite-profile option." 1>&2
+    fi
   fi
 fi
 
-pushd "$SITE_LOCAL_PATH"
+# Make sure that drush knows what the actual base URI is, this is needed to
+# have a consistent behavior between the cli and the web interface, for
+# example in the case of modules that use base_path().
+if grep -q "^[[:space:]]*uri:" drush/drush.yml;
+then
+  sed -i -e "s@^\([[:space:]]*\)uri: .*@\1uri: 'http://localhost/${SITE_BASE_PATH}'@g" drush/drush.yml
+else
+  echo "" >> drush/drush.yml
+  echo "options:" >> drush/drush.yml
+  echo "  uri: 'http://localhost/${SITE_BASE_PATH}'" >> drush/drush.yml
+fi
+
+pushd "$WEB_ROOT" > /dev/null
+
+# Update the install_profile setting if it's already there
+if grep -q "^\\\$settings\['install_profile'\] =" sites/default/settings.php;
+then
+  chmod 755 sites/default
+  chmod 644 sites/default/settings.php
+  sed -i -e "s/^\(\$settings\['install_profile'\]\) = '[^']*';/\1 = '$INSTALLATION_PROFILE';/g" sites/default/settings.php
+  chmod 444 sites/default/settings.php
+  chmod 555 sites/default
+fi
 
+# Install the site
 $DRUSH --verbose --yes \
   site-install \
-  --db-su=root \
-  --db-su-pw="$MYSQL_ROOT_PASSWORD" \
+  "${DRUSH_DB_SU_CREDENTIALS[@]}" \
   --db-url="mysql://${DB_USER}:${DB_PASS}@localhost/${DB_NAME}" \
   --site-name="$SITE_NAME" \
   --site-mail="$SITE_MAIL" \
+  --sites-subdir="default" \
   --account-name="$ACCOUNT_NAME" \
   --account-pass="$ACCOUNT_PASS" \
   --account-mail="$ACCOUNT_MAIL" \
   "$INSTALLATION_PROFILE"
 
-if $DRUSH pm-info --fields=status locale | grep -q enabled;
+if $DRUSH pm-list --type=module --field=name --status=enabled --pipe | grep -q "^locale$";
 then
   # This is necessary for multi-language sites, it fixes some issues like:
   #   "The Translation source field needs to be installed."
@@ -131,9 +193,10 @@ sudo chgrp -R "$WEB_SERVER_GROUP" sites/default/files
 
 [ -d ../config/sync ] && sudo chgrp -R "$WEB_SERVER_GROUP" ../config/sync
 
-# Enables clean URLs
-sed -i "s@# RewriteBase /drupal\$@RewriteBase ${SITE_BASE_PATH}@" .htaccess
+# Don't force RewriteBase it is not generally needed
+#sed -i "s@RewriteBase /drupal\$@RewriteBase ${SITE_BASE_PATH}@" .htaccess
 
+chmod 755 sites/default
 chmod 644 sites/default/settings.php
 
 # Add some basic settings to settings.php
@@ -153,10 +216,16 @@ then
   composer --working-dir=../ require drupal/devel
   $DRUSH --yes en devel
 
-  chmod 755 sites/default
-  cp sites/example.settings.local.php sites/default/settings.local.php
-  chmod 444 sites/default/settings.local.php
-  chmod 555 sites/default
+  if [ ! -e sites/default/settings.local.php ];
+  then
+    cp sites/example.settings.local.php sites/default/settings.local.php
+
+    # Disable some overly permissive settings
+    sed -i -e "s/^\(\$settings\['rebuild_access'\]\).*$/\1 = FALSE;/g" sites/default/settings.local.php
+    sed -i -e "s/^\(\$settings\['skip_permissions_hardening'\]\).*$/\1 = FALSE;/g" sites/default/settings.local.php
+
+    chmod 444 sites/default/settings.local.php
+  fi
 
   if ! grep -q "^include \$app_root . '/' . \$site_path . '/settings.local.php';" sites/default/settings.php;
   then
@@ -165,6 +234,7 @@ then
 fi
 
 chmod 444 sites/default/settings.php
+chmod 555 sites/default
 
 # If using a git checkout of Drupal core, set up a diff alias.
 #
@@ -173,8 +243,10 @@ chmod 444 sites/default/settings.php
 if [ -d core/.git ];
 then
   git -C core/ config --local alias.core-diff "diff --src-prefix=a/core/ --dst-prefix=b/core/"
-  echo "Added a 'git core-diff' to the drupal/core repository clone."
-  echo "This command helps creating core patches ready for upstream."
+  git -C core/ config --local alias.core-format-patch "format-patch --src-prefix=a/core/ --dst-prefix=b/core/"
+  echo "Added 'git core-diff' and 'git core-format-patch' commands to the drupal/core"
+  echo "repository clone. These commands help creating core patches ready for upstream"
+  echo "in a split-core setup."
 fi
 
-popd
+popd > /dev/null