2018-09-24 20:53:23 +02:00
#!/usr/bin/env bash
if [ $# -lt 3 ] ; then
2020-02-11 09:58:04 +01:00
echo " usage: $0 <db-name> <db-user> <db-pass> [db-host] [wp-version] [skip-database-creation] "
2018-09-24 20:53:23 +02:00
exit 1
fi
DB_NAME = $1
DB_USER = $2
DB_PASS = $3
DB_HOST = ${ 4 -localhost }
WP_VERSION = ${ 5 -latest }
2020-02-11 09:58:04 +01:00
SKIP_DB_CREATE = ${ 6 -false }
2018-09-24 20:53:23 +02:00
2020-02-11 09:58:04 +01:00
TMPDIR = ${ TMPDIR -/tmp }
TMPDIR = $( echo $TMPDIR | sed -e " s/\/ $// " )
WP_TESTS_DIR = ${ WP_TESTS_DIR - $TMPDIR /wordpress-tests-lib }
WP_CORE_DIR = ${ WP_CORE_DIR - $TMPDIR /wordpress/ }
2018-09-24 20:53:23 +02:00
download( ) {
2020-02-11 09:58:04 +01:00
if [ ` which curl` ] ; then
curl -s " $1 " > " $2 " ;
elif [ ` which wget` ] ; then
wget -nv -O " $2 " " $1 "
fi
2018-09-24 20:53:23 +02:00
}
2020-05-14 22:25:29 +02:00
if [ [ $WP_VERSION = ~ ^[ 0-9] +\. [ 0-9] +\- ( beta| RC) [ 0-9] +$ ] ] ; then
WP_BRANCH = ${ WP_VERSION % \- * }
WP_TESTS_TAG = " branches/ $WP_BRANCH "
elif [ [ $WP_VERSION = ~ ^[ 0-9] +\. [ 0-9] +$ ] ] ; then
2020-02-11 09:58:04 +01:00
WP_TESTS_TAG = " branches/ $WP_VERSION "
elif [ [ $WP_VERSION = ~ [ 0-9] +\. [ 0-9] +\. [ 0-9] + ] ] ; then
if [ [ $WP_VERSION = ~ [ 0-9] +\. [ 0-9] +\. [ 0] ] ] ; then
# version x.x.0 means the first release of the major version, so strip off the .0 and download version x.x
WP_TESTS_TAG = " tags/ ${ WP_VERSION %?? } "
else
WP_TESTS_TAG = " tags/ $WP_VERSION "
fi
2018-09-24 20:53:23 +02:00
elif [ [ $WP_VERSION = = 'nightly' || $WP_VERSION = = 'trunk' ] ] ; then
WP_TESTS_TAG = "trunk"
else
# http serves a single offer, whereas https serves multiple. we only want one
download http://api.wordpress.org/core/version-check/1.7/ /tmp/wp-latest.json
grep '[0-9]+\.[0-9]+(\.[0-9]+)?' /tmp/wp-latest.json
LATEST_VERSION = $( grep -o '"version":"[^"]*' /tmp/wp-latest.json | sed 's/"version":"//' )
if [ [ -z " $LATEST_VERSION " ] ] ; then
echo "Latest WordPress version could not be found"
exit 1
fi
WP_TESTS_TAG = " tags/ $LATEST_VERSION "
fi
set -ex
install_wp( ) {
if [ -d $WP_CORE_DIR ] ; then
return ;
fi
mkdir -p $WP_CORE_DIR
if [ [ $WP_VERSION = = 'nightly' || $WP_VERSION = = 'trunk' ] ] ; then
2020-02-11 09:58:04 +01:00
mkdir -p $TMPDIR /wordpress-nightly
download https://wordpress.org/nightly-builds/wordpress-latest.zip $TMPDIR /wordpress-nightly/wordpress-nightly.zip
unzip -q $TMPDIR /wordpress-nightly/wordpress-nightly.zip -d $TMPDIR /wordpress-nightly/
mv $TMPDIR /wordpress-nightly/wordpress/* $WP_CORE_DIR
2018-09-24 20:53:23 +02:00
else
if [ $WP_VERSION = = 'latest' ] ; then
local ARCHIVE_NAME = 'latest'
2020-02-11 09:58:04 +01:00
elif [ [ $WP_VERSION = ~ [ 0-9] +\. [ 0-9] + ] ] ; then
# https serves multiple offers, whereas http serves single.
download https://api.wordpress.org/core/version-check/1.7/ $TMPDIR /wp-latest.json
if [ [ $WP_VERSION = ~ [ 0-9] +\. [ 0-9] +\. [ 0] ] ] ; then
# version x.x.0 means the first release of the major version, so strip off the .0 and download version x.x
LATEST_VERSION = ${ WP_VERSION %?? }
else
# otherwise, scan the releases and get the most up to date minor version of the major release
local VERSION_ESCAPED = ` echo $WP_VERSION | sed 's/\./\\\\./g' `
LATEST_VERSION = $( grep -o '"version":"' $VERSION_ESCAPED '[^"]*' $TMPDIR /wp-latest.json | sed 's/"version":"//' | head -1)
fi
if [ [ -z " $LATEST_VERSION " ] ] ; then
local ARCHIVE_NAME = " wordpress- $WP_VERSION "
else
local ARCHIVE_NAME = " wordpress- $LATEST_VERSION "
fi
2018-09-24 20:53:23 +02:00
else
local ARCHIVE_NAME = " wordpress- $WP_VERSION "
fi
2020-02-11 09:58:04 +01:00
download https://wordpress.org/${ ARCHIVE_NAME } .tar.gz $TMPDIR /wordpress.tar.gz
tar --strip-components= 1 -zxmf $TMPDIR /wordpress.tar.gz -C $WP_CORE_DIR
2018-09-24 20:53:23 +02:00
fi
download https://raw.github.com/markoheijnen/wp-mysqli/master/db.php $WP_CORE_DIR /wp-content/db.php
}
install_test_suite( ) {
# portable in-place argument for both GNU sed and Mac OSX sed
if [ [ $( uname -s) = = 'Darwin' ] ] ; then
2020-05-14 22:25:29 +02:00
local ioption = '-i.bak'
2018-09-24 20:53:23 +02:00
else
local ioption = '-i'
fi
# set up testing suite if it doesn't yet exist
if [ ! -d $WP_TESTS_DIR ] ; then
# set up testing suite
mkdir -p $WP_TESTS_DIR
2020-05-14 22:25:29 +02:00
svn co --quiet --ignore-externals https://develop.svn.wordpress.org/${ WP_TESTS_TAG } /tests/phpunit/includes/ $WP_TESTS_DIR /includes
svn co --quiet --ignore-externals https://develop.svn.wordpress.org/${ WP_TESTS_TAG } /tests/phpunit/data/ $WP_TESTS_DIR /data
2018-09-24 20:53:23 +02:00
fi
if [ ! -f wp-tests-config.php ] ; then
download https://develop.svn.wordpress.org/${ WP_TESTS_TAG } /wp-tests-config-sample.php " $WP_TESTS_DIR " /wp-tests-config.php
2020-02-11 09:58:04 +01:00
# remove all forward slashes in the end
WP_CORE_DIR = $( echo $WP_CORE_DIR | sed " s:/\+ $:: " )
sed $ioption " s:dirname( __FILE__ ) . '/src/':' $WP_CORE_DIR /': " " $WP_TESTS_DIR " /wp-tests-config.php
2020-05-14 22:25:29 +02:00
sed $ioption " s:__DIR__ . '/src/':' $WP_CORE_DIR /': " " $WP_TESTS_DIR " /wp-tests-config.php
2018-09-24 20:53:23 +02:00
sed $ioption " s/youremptytestdbnamehere/ $DB_NAME / " " $WP_TESTS_DIR " /wp-tests-config.php
sed $ioption " s/yourusernamehere/ $DB_USER / " " $WP_TESTS_DIR " /wp-tests-config.php
sed $ioption " s/yourpasswordhere/ $DB_PASS / " " $WP_TESTS_DIR " /wp-tests-config.php
sed $ioption " s|localhost| ${ DB_HOST } | " " $WP_TESTS_DIR " /wp-tests-config.php
fi
}
2020-05-14 22:25:29 +02:00
recreate_db( ) {
shopt -s nocasematch
if [ [ $1 = ~ ^( y| yes) $ ] ]
then
mysqladmin drop $DB_NAME -f --user= " $DB_USER " --password= " $DB_PASS " $EXTRA
create_db
echo " Recreated the database ( $DB_NAME ). "
else
echo " Leaving the existing database ( $DB_NAME ) in place. "
fi
shopt -u nocasematch
}
2023-12-04 22:42:50 +01:00
create_db( ) {
2023-12-04 22:28:21 +01:00
mysqladmin create $DB_NAME --user= " $DB_USER " --password= " $DB_PASS " $EXTRA
2023-12-04 23:09:38 +01:00
mysql -u root -p " ${ DB_PASS } " -e " GRANT ALL PRIVILEGES ON *.* TO ' ${ DB_USER } '@'localhost' IDENTIFIED BY ' ${ DB_PASS } ' WITH GRANT OPTION; FLUSH PRIVILEGES; "
2020-05-14 22:25:29 +02:00
}
2018-09-24 20:53:23 +02:00
install_db( ) {
2023-11-30 09:03:11 +01:00
# the mariadb commands are not available on some self-hosted runner images
2023-12-04 22:12:42 +01:00
apt update && apt-get install mariadb-server mariadb-client -y
2023-12-04 22:36:08 +01:00
service mariadb start
2020-02-11 09:58:04 +01:00
if [ ${ SKIP_DB_CREATE } = "true" ] ; then
return 0
fi
2018-09-24 20:53:23 +02:00
# parse DB_HOST for port or socket references
local PARTS = ( ${ DB_HOST // \: / } )
local DB_HOSTNAME = ${ PARTS [0] } ;
local DB_SOCK_OR_PORT = ${ PARTS [1] } ;
local EXTRA = ""
if ! [ -z $DB_HOSTNAME ] ; then
if [ $( echo $DB_SOCK_OR_PORT | grep -e '^[0-9]\{1,\}$' ) ] ; then
EXTRA = " --host= $DB_HOSTNAME --port= $DB_SOCK_OR_PORT --protocol=tcp "
elif ! [ -z $DB_SOCK_OR_PORT ] ; then
EXTRA = " --socket= $DB_SOCK_OR_PORT "
elif ! [ -z $DB_HOSTNAME ] ; then
EXTRA = " --host= $DB_HOSTNAME --protocol=tcp "
fi
fi
# create database
2020-05-14 22:25:29 +02:00
if [ $( mysql --user= " $DB_USER " --password= " $DB_PASS " --execute= 'show databases;' | grep ^$DB_NAME $) ]
then
echo " Reinstalling will delete the existing test database ( $DB_NAME ) "
read -p 'Are you sure you want to proceed? [y/N]: ' DELETE_EXISTING_DB
recreate_db $DELETE_EXISTING_DB
else
create_db
fi
2018-09-24 20:53:23 +02:00
}
install_wp
install_test_suite
install_db