Merge pull request #12340 from eileenmcnaughton/merge_cleanup
[civicrm-core.git] / bin / setup.sh
index 96049cb97088aa2a3068028b89f879c63ab2336f..fc59804214d07d7a9af6066d29b578543388f105 100755 (executable)
@@ -1,6 +1,5 @@
 #!/usr/bin/env bash
 set -e
-set -x
 
 CALLEDPATH=`dirname $0`
 
@@ -21,10 +20,95 @@ source "$CALLEDPATH/setup.conf"
 source "$CALLEDPATH/setup.lib.sh"
 
 if [ "$1" = '-h' ] || [ "$1" = '--help' ]; then
-  echo; echo Usage: setup.sh [schema file] [database data file] [database name] [database user] [database password] [database host] [database port] [additional args]; echo
+  echo
+  echo "Usage: setup.sh [options] [schema file] [database data file] [database name] [database user] [database password] [database host] [database port] [additional args]"
+  echo "[options] is a mix of zero or more of following:"
+  echo "  -a     (All)            Implies -Dgsef (default)"
+  echo "  -D     (Download)       Download dependencies"
+  echo "  -g     (GenCode)        Generate DAO files, SQL files, etc"
+  echo "  -s     (Schema)         Load new schema in DB"
+  echo "  -d     (Data-Plain)     Load basic dataset in DB"
+  echo "  -e     (Data-Examples)  Load example dataset in DB"
+  echo "  -f     (Flush)          Flush caches and settings"
+  echo
+  echo "Example: Perform a full setup"
+  echo "   setup.sh -a"
+  echo
+  echo "Example: Setup all the code but leave the DB alone"
+  echo "   setup.sh -Dg"
+  echo
+  echo "Example: Keep the existing code but reset the DB"
+  echo "   setup.sh -sef"
   exit 0
 fi
 
+###############################################################################
+## Parse command line options
+
+FOUND_ACTION=
+DO_DOWNLOAD=
+DO_GENCODE=
+DO_SCHEMA=
+DO_DATA=
+DO_FLUSH=
+DEFAULT_DATA=
+
+while getopts "aDgsdef" opt; do
+  case $opt in
+    a)
+      DO_DOWNLOAD=1
+      DO_GENCODE=1
+      DO_SCHEMA=1
+      DO_DATA=1
+      DO_FLUSH=1
+      FOUND_ACTION=1
+      ;;
+    D)
+      DO_DOWNLOAD=1
+      FOUND_ACTION=1
+      ;;
+    g)
+      DO_GENCODE=1
+      FOUND_ACTION=1
+      ;;
+    s)
+      DO_SCHEMA=1
+      FOUND_ACTION=1
+      ;;
+    d)
+      DO_DATA=1
+      DEFAULT_DATA=civicrm_data.mysql
+      FOUND_ACTION=1
+      ;;
+    e)
+      DO_DATA=1
+      DEFAULT_DATA=civicrm_generated.mysql
+      FOUND_ACTION=1
+      ;;
+    f)
+      DO_FLUSH=1
+      FOUND_ACTION=1
+      ;;
+    \?)
+      echo "Invalid option: -$OPTARG" >&2
+      exit 1
+      ;;
+    :)
+      echo "Option -$OPTARG requires an argument." >&2
+      exit 1
+      ;;
+  esac
+done
+if [ -z "$FOUND_ACTION" ]; then
+  DO_DOWNLOAD=1
+  DO_GENCODE=1
+  DO_SCHEMA=1
+  DO_DATA=1
+  DO_FLUSH=1
+  DEFAULT_DATA=civicrm_generated.mysql
+fi
+
+shift $((OPTIND-1))
 
 # fetch command line arguments if available
 if [ ! -z "$1" ] ; then SCHEMA="$1"; fi
@@ -49,61 +133,106 @@ if [ -z $DBPASS ] ; then
   DBPASS=$REPLY
 fi
 
+MYSQLCMD=$(mysql_cmd)
+###############################################################################
+## Execute tasks
+set -x
+
+if [ -n "$DO_DOWNLOAD" ]; then
+  pushd "$CALLEDPATH/.."
+    COMPOSER=$(pickcmd composer composer.phar)
+    $COMPOSER install
+
+    if has_commands bower karma ; then
+      ## dev dependencies have been installed globally; don't force developer to redownload
+      npm install --production
+    else
+      npm install
+    fi
+
+    BOWER=$(pickcmd node_modules/bower/bin/bower bower)
+    if [ -f "$BOWER" ]; then
+      NODE=$(pickcmd node nodejs)
+      BOWER="$NODE $BOWER"
+    fi
+    # Without the force flag, bower may not check for new versions or verify that installed software matches version specified in bower.json
+    # With the force flag, bower will ignore all caches and download all deps.
+    if [ -n "$OFFLINE" ]; then
+      BOWER_OPT=
+    elif [ ! -f "bower_components/.setupsh.ts" ]; then
+      ## First run -- or cleanup from failed run
+      BOWER_OPT=-f
+    elif [ "bower.json" -nt "bower_components/.setupsh.ts" ]; then
+      ## Bower.json has changed since last run
+      BOWER_OPT=-f
+    fi
+    [ -f "bower_components/.setupsh.ts" ] && rm -f "bower_components/.setupsh.ts"
+    $BOWER install $BOWER_OPT
+    touch bower_components/.setupsh.ts
+  popd
+fi
+
 # run code generator if it's there - which means it's
 # checkout, not packaged code
-if [ -d "$CALLEDPATH/../xml" ]; then
-  cd "$CALLEDPATH/../xml"
-  if [ -z "$DBPORT" ]; then
-    PHP_MYSQL_HOSTPORT="$DBHOST"
-  else
-    PHP_MYSQL_HOSTPORT="$DBHOST:$DBPORT"
-  fi
-  "$PHP5PATH"php -d mysql.default_host="$PHP_MYSQL_HOSTPORT" -d mysql.default_user=$DBUSER -d mysql.default_password=$DBPASS GenCode.php $SCHEMA '' ${GENCODE_CMS}
+if [ -n "$DO_GENCODE" -a -d "$CALLEDPATH/../xml" ]; then
+  pushd "$CALLEDPATH/../xml"
+    if [ -z "$DBPORT" ]; then
+      PHP_MYSQL_HOSTPORT="$DBHOST"
+    else
+      PHP_MYSQL_HOSTPORT="$DBHOST:$DBPORT"
+    fi
+    "$PHP5PATH"php -d mysql.default_host="$PHP_MYSQL_HOSTPORT" -d mysql.default_user=$DBUSER -d mysql.default_password=$DBPASS GenCode.php $SCHEMA '' ${GENCODE_CMS}
+  popd
 fi
 
-cd "$CALLEDPATH/../sql"
-echo; echo "Dropping civicrm_* tables from database $DBNAME"
-# mysqladmin -f -u $DBUSER $PASSWDSECTION $DBARGS drop $DBNAME
-MYSQLCMD=$(mysql_cmd)
-echo "SELECT table_name FROM information_schema.TABLES  WHERE TABLE_SCHEMA='${DBNAME}' AND TABLE_TYPE = 'VIEW'" \
-  | $MYSQLCMD \
-  | grep '^\(civicrm_\|log_civicrm_\)' \
-  | awk -v NOFOREIGNCHECK='SET FOREIGN_KEY_CHECKS=0;' 'BEGIN {print NOFOREIGNCHECK}{print "drop view " $1 ";"}' \
-  | $MYSQLCMD
-echo "SELECT table_name FROM information_schema.TABLES  WHERE TABLE_SCHEMA='${DBNAME}' AND TABLE_TYPE = 'BASE TABLE'" \
-  | $MYSQLCMD \
-  | grep '^\(civicrm_\|log_civicrm_\)' \
-  | awk -v NOFOREIGNCHECK='SET FOREIGN_KEY_CHECKS=0;' 'BEGIN {print NOFOREIGNCHECK}{print "drop table " $1 ";"}' \
-  | $MYSQLCMD
-
-
-echo; echo Creating database structure
-$MYSQLCMD < civicrm.mysql
-
-# load civicrm_generated.mysql sample data unless special DBLOAD is passed
-if [ -z $DBLOAD ]; then
-    echo; echo Populating database with example data - civicrm_generated.mysql
-    $MYSQLCMD < civicrm_generated.mysql
-else
-    echo; echo Populating database with required data - civicrm_data.mysql
-    $MYSQLCMD < civicrm_data.mysql
-    echo; echo Populating database with $DBLOAD data
-    $MYSQLCMD < $DBLOAD
+if [ -n "$DO_SCHEMA" ]; then
+  pushd "$CALLEDPATH/../sql"
+    echo; echo "Dropping civicrm_* tables from database $DBNAME"
+    echo "SELECT table_name FROM information_schema.TABLES  WHERE TABLE_SCHEMA='${DBNAME}' AND TABLE_TYPE = 'VIEW'" \
+      | $MYSQLCMD \
+      | grep '^\(civicrm_\|log_civicrm_\)' \
+      | awk -v NOFOREIGNCHECK='SET FOREIGN_KEY_CHECKS=0;' 'BEGIN {print NOFOREIGNCHECK}{print "drop view " $1 ";"}' \
+      | $MYSQLCMD
+    echo "SELECT table_name FROM information_schema.TABLES  WHERE TABLE_SCHEMA='${DBNAME}' AND TABLE_TYPE = 'BASE TABLE'" \
+      | $MYSQLCMD \
+      | grep '^\(civicrm_\|log_civicrm_\)' \
+      | awk -v NOFOREIGNCHECK='SET FOREIGN_KEY_CHECKS=0;' 'BEGIN {print NOFOREIGNCHECK}{print "drop table " $1 ";"}' \
+      | $MYSQLCMD
+
+    echo; echo Creating database structure
+    $MYSQLCMD < civicrm.mysql
+  popd
 fi
 
-# load additional script if DBADD defined
-if [ ! -z $DBADD ]; then
-    echo; echo Loading $DBADD
-    $MYSQLCMD < $DBADD
+if [ -n "$DO_DATA" ]; then
+  pushd "$CALLEDPATH/../sql"
+    # load default data set unless system is configured with override
+    if [ -z $DBLOAD ]; then
+        echo;
+        echo "Populating database with dataset - $DEFAULT_DATA"
+        $MYSQLCMD < "$DEFAULT_DATA"
+    else
+        echo; echo Populating database with required data - civicrm_data.mysql
+        $MYSQLCMD < civicrm_data.mysql
+        echo; echo Populating database with $DBLOAD data
+        $MYSQLCMD < $DBLOAD
+    fi
+
+    # load additional script if DBADD defined
+    if [ ! -z $DBADD ]; then
+        echo; echo Loading $DBADD
+        $MYSQLCMD < $DBADD
+    fi
+  popd
 fi
 
-# run the cli script to build the menu and the triggers
-cd "$CALLEDPATH/.."
-"$PHP5PATH"php bin/cli.php -e System -a flush --triggers 1 --session 1
-
-# reset config_backend and userFrameworkResourceURL which gets set
-# when config object is initialized
-$MYSQLCMD -e "UPDATE civicrm_domain SET config_backend = NULL; UPDATE civicrm_setting SET value = NULL WHERE name = 'userFrameworkResourceURL';"
+if [ -n "$DO_FLUSH" ]; then
+  pushd "$CALLEDPATH/.."
+    # reset config_backend and userFrameworkResourceURL which gets set
+    # when config object is initialized
+    $MYSQLCMD -e "UPDATE civicrm_domain SET config_backend = NULL; UPDATE civicrm_setting SET value = NULL WHERE name = 'userFrameworkResourceURL';"
+  popd
+fi
 
-echo; echo "Setup Complete. Logout from your CMS to avoid session conflicts."
+echo; echo "NOTE: Logout from your CMS to avoid session conflicts."