Ian province abbreviation patch - issue 724
[civicrm-core.git] / bin / setup.sh
1 #!/usr/bin/env bash
2 set -e
3
4 CALLEDPATH=`dirname $0`
5
6 # Convert to an absolute path if necessary
7 case "$CALLEDPATH" in
8 .*)
9 CALLEDPATH="$PWD/$CALLEDPATH"
10 ;;
11 esac
12
13 if [ ! -f "$CALLEDPATH/setup.conf" ]; then
14 echo
15 echo "Missing configuration file. Please copy $CALLEDPATH/setup.conf.txt to $CALLEDPATH/setup.conf and edit it."
16 exit 1
17 fi
18
19 source "$CALLEDPATH/setup.conf"
20 source "$CALLEDPATH/setup.lib.sh"
21
22 if [ "$1" = '-h' ] || [ "$1" = '--help' ]; then
23 echo
24 echo "Usage: setup.sh [options] [schema file] [database data file] [database name] [database user] [database password] [database host] [database port] [additional args]"
25 echo "[options] is a mix of zero or more of following:"
26 echo " -a (All) Implies -Dgsef (default)"
27 echo " -D (Download) Download dependencies"
28 echo " -g (GenCode) Generate DAO files, SQL files, etc"
29 echo " -s (Schema) Load new schema in DB"
30 echo " -d (Data-Plain) Load basic dataset in DB"
31 echo " -e (Data-Examples) Load example dataset in DB"
32 echo " -f (Flush) Flush caches and settings"
33 echo
34 echo "Example: Perform a full setup"
35 echo " setup.sh -a"
36 echo
37 echo "Example: Setup all the code but leave the DB alone"
38 echo " setup.sh -Dg"
39 echo
40 echo "Example: Keep the existing code but reset the DB"
41 echo " setup.sh -sef"
42 exit 0
43 fi
44
45 ###############################################################################
46 ## Parse command line options
47
48 FOUND_ACTION=
49 DO_DOWNLOAD=
50 DO_GENCODE=
51 DO_SCHEMA=
52 DO_DATA=
53 DO_FLUSH=
54 DEFAULT_DATA=
55
56 while getopts "aDgsdef" opt; do
57 case $opt in
58 a)
59 DO_DOWNLOAD=1
60 DO_GENCODE=1
61 DO_SCHEMA=1
62 DO_DATA=1
63 DO_FLUSH=1
64 FOUND_ACTION=1
65 ;;
66 D)
67 DO_DOWNLOAD=1
68 FOUND_ACTION=1
69 ;;
70 g)
71 DO_GENCODE=1
72 FOUND_ACTION=1
73 ;;
74 s)
75 DO_SCHEMA=1
76 FOUND_ACTION=1
77 ;;
78 d)
79 DO_DATA=1
80 DEFAULT_DATA=civicrm_data.mysql
81 FOUND_ACTION=1
82 ;;
83 e)
84 DO_DATA=1
85 DEFAULT_DATA=civicrm_generated.mysql
86 FOUND_ACTION=1
87 ;;
88 f)
89 DO_FLUSH=1
90 FOUND_ACTION=1
91 ;;
92 \?)
93 echo "Invalid option: -$OPTARG" >&2
94 exit 1
95 ;;
96 :)
97 echo "Option -$OPTARG requires an argument." >&2
98 exit 1
99 ;;
100 esac
101 done
102 if [ -z "$FOUND_ACTION" ]; then
103 DO_DOWNLOAD=1
104 DO_GENCODE=1
105 DO_SCHEMA=1
106 DO_DATA=1
107 DO_FLUSH=1
108 DEFAULT_DATA=civicrm_generated.mysql
109 fi
110
111 shift $((OPTIND-1))
112
113 # fetch command line arguments if available
114 if [ ! -z "$1" ] ; then SCHEMA="$1"; fi
115 if [ ! -z "$2" ] ; then DBLOAD="$2"; fi
116 if [ ! -z "$3" ] ; then DBNAME="$3"; fi
117 if [ ! -z "$4" ] ; then DBUSER="$4"; fi
118 if [ ! -z "$5" ] ; then DBPASS="$5"; fi
119 if [ ! -z "$6" ] ; then DBHOST="$6"; fi
120 if [ ! -z "$7" ] ; then DBPORT="$7"; fi
121
122 # verify if we have at least DBNAME given
123 if [ -z $DBNAME ] ; then
124 echo "No database name defined!"
125 exit 1
126 fi
127 if [ -z $DBUSER ] ; then
128 echo "No database username defined!"
129 exit 1
130 fi
131 if [ -z $DBPASS ] ; then
132 read -p "Database password:"
133 DBPASS=$REPLY
134 fi
135
136 MYSQLCMD=$(mysql_cmd)
137 ###############################################################################
138 ## Execute tasks
139 set -x
140
141 if [ -n "$DO_DOWNLOAD" ]; then
142 pushd "$CALLEDPATH/.."
143 COMPOSER=$(pickcmd composer composer.phar)
144 $COMPOSER install
145
146 if has_commands bower karma ; then
147 ## dev dependencies have been installed globally; don't force developer to redownload
148 npm install --production
149 else
150 npm install
151 fi
152
153 BOWER=$(pickcmd node_modules/bower/bin/bower bower)
154 if [ -f "$BOWER" ]; then
155 NODE=$(pickcmd node nodejs)
156 BOWER="$NODE $BOWER"
157 fi
158 # Without the force flag, bower may not check for new versions or verify that installed software matches version specified in bower.json
159 # With the force flag, bower will ignore all caches and download all deps.
160 if [ -n "$OFFLINE" ]; then
161 BOWER_OPT=
162 elif [ ! -f "bower_components/.setupsh.ts" ]; then
163 ## First run -- or cleanup from failed run
164 BOWER_OPT=-f
165 elif [ "bower.json" -nt "bower_components/.setupsh.ts" ]; then
166 ## Bower.json has changed since last run
167 BOWER_OPT=-f
168 fi
169 [ -f "bower_components/.setupsh.ts" ] && rm -f "bower_components/.setupsh.ts"
170 $BOWER install $BOWER_OPT
171 touch bower_components/.setupsh.ts
172 popd
173 fi
174
175 # run code generator if it's there - which means it's
176 # checkout, not packaged code
177 if [ -n "$DO_GENCODE" -a -d "$CALLEDPATH/../xml" ]; then
178 pushd "$CALLEDPATH/../xml"
179 if [ -z "$DBPORT" ]; then
180 PHP_MYSQL_HOSTPORT="$DBHOST"
181 else
182 PHP_MYSQL_HOSTPORT="$DBHOST:$DBPORT"
183 fi
184 "$PHP5PATH"php -d mysql.default_host="$PHP_MYSQL_HOSTPORT" -d mysql.default_user=$DBUSER -d mysql.default_password=$DBPASS GenCode.php $SCHEMA '' ${GENCODE_CMS}
185 popd
186 fi
187
188 if [ -n "$DO_SCHEMA" ]; then
189 pushd "$CALLEDPATH/../sql"
190 echo; echo "Dropping civicrm_* tables from database $DBNAME"
191 echo "SELECT table_name FROM information_schema.TABLES WHERE TABLE_SCHEMA='${DBNAME}' AND TABLE_TYPE = 'VIEW'" \
192 | $MYSQLCMD \
193 | grep '^\(civicrm_\|log_civicrm_\)' \
194 | awk -v NOFOREIGNCHECK='SET FOREIGN_KEY_CHECKS=0;' 'BEGIN {print NOFOREIGNCHECK}{print "drop view " $1 ";"}' \
195 | $MYSQLCMD
196 echo "SELECT table_name FROM information_schema.TABLES WHERE TABLE_SCHEMA='${DBNAME}' AND TABLE_TYPE = 'BASE TABLE'" \
197 | $MYSQLCMD \
198 | grep '^\(civicrm_\|log_civicrm_\)' \
199 | awk -v NOFOREIGNCHECK='SET FOREIGN_KEY_CHECKS=0;' 'BEGIN {print NOFOREIGNCHECK}{print "drop table " $1 ";"}' \
200 | $MYSQLCMD
201
202 echo; echo Creating database structure
203 $MYSQLCMD < civicrm.mysql
204 popd
205 fi
206
207 if [ -n "$DO_DATA" ]; then
208 pushd "$CALLEDPATH/../sql"
209 # load default data set unless system is configured with override
210 if [ -z $DBLOAD ]; then
211 echo;
212 echo "Populating database with dataset - $DEFAULT_DATA"
213 $MYSQLCMD < "$DEFAULT_DATA"
214 else
215 echo; echo Populating database with required data - civicrm_data.mysql
216 $MYSQLCMD < civicrm_data.mysql
217 echo; echo Populating database with $DBLOAD data
218 $MYSQLCMD < $DBLOAD
219 fi
220
221 # load additional script if DBADD defined
222 if [ ! -z $DBADD ]; then
223 echo; echo Loading $DBADD
224 $MYSQLCMD < $DBADD
225 fi
226 popd
227 fi
228
229 if [ -n "$DO_FLUSH" ]; then
230 pushd "$CALLEDPATH/.."
231 # run the cli script to build the menu and the triggers
232 "$PHP5PATH"php bin/cli.php -e System -a flush --triggers 1 --session 1
233
234 # reset config_backend and userFrameworkResourceURL which gets set
235 # when config object is initialized
236 $MYSQLCMD -e "UPDATE civicrm_domain SET config_backend = NULL; UPDATE civicrm_setting SET value = NULL WHERE name = 'userFrameworkResourceURL';"
237 popd
238 fi
239
240 echo; echo "NOTE: Logout from your CMS to avoid session conflicts."
241