Prevents git clone failure on re-runs when the destination directory already exists from a previous test suite installation. Closes #74
187 lines
6.1 KiB
Bash
Executable File
187 lines
6.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
if [ $# -lt 3 ]; then
|
|
echo "usage: $0 <db-name> <db-user> <db-pass> [db-host] [wp-version] [skip-database-creation] [multisite]"
|
|
exit 1
|
|
fi
|
|
|
|
DB_NAME=$1
|
|
DB_USER=$2
|
|
DB_PASS=$3
|
|
DB_HOST=${4-localhost}
|
|
WP_VERSION=${5-latest}
|
|
SKIP_DB_CREATE=${6-false}
|
|
MULTISITE=${7-false}
|
|
|
|
WP_TESTS_DIR=${WP_TESTS_DIR-/tmp/wordpress-tests-lib}
|
|
WP_CORE_DIR=${WP_CORE_DIR-/tmp/wordpress/}
|
|
|
|
download() {
|
|
if command -v curl >/dev/null 2>&1; then
|
|
curl -fsSL "$1" -o "$2"
|
|
elif command -v wget >/dev/null 2>&1; then
|
|
wget -qO "$2" "$1"
|
|
else
|
|
echo "Error: Neither curl nor wget is installed" >&2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
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
|
|
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
|
|
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
|
|
LATEST_VERSION=$(grep -o '"version":"[^"]*' /tmp/wp-latest.json | sed 's/"version":"//' | head -1)
|
|
if [[ -z "$LATEST_VERSION" ]]; then
|
|
echo "Latest WordPress version could not be found"
|
|
exit 1
|
|
fi
|
|
WP_TESTS_TAG="tags/$LATEST_VERSION"
|
|
fi
|
|
|
|
# Derive a git ref from WP_TESTS_TAG by stripping the SVN-style prefix.
|
|
# WP_TESTS_TAG uses "tags/X.Y.Z", "branches/X.Y", or "trunk".
|
|
# git clone --branch requires the bare ref name ("X.Y.Z", "X.Y", or "trunk").
|
|
if [[ "$WP_TESTS_TAG" == tags/* ]]; then
|
|
GIT_REF="${WP_TESTS_TAG#tags/}"
|
|
elif [[ "$WP_TESTS_TAG" == branches/* ]]; then
|
|
GIT_REF="${WP_TESTS_TAG#branches/}"
|
|
else
|
|
GIT_REF="$WP_TESTS_TAG"
|
|
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
|
|
mkdir -p "$WP_CORE_DIR"
|
|
download https://wordpress.org/nightly-builds/wordpress-latest.zip "$WP_CORE_DIR/wordpress-nightly.zip"
|
|
unzip -q "$WP_CORE_DIR/wordpress-nightly.zip" -d "$WP_CORE_DIR"
|
|
rm "$WP_CORE_DIR/wordpress-nightly.zip"
|
|
else
|
|
if [ "$WP_VERSION" == 'latest' ]; then
|
|
local ARCHIVE_NAME='latest'
|
|
elif [[ $WP_VERSION =~ [0-9]+\.[0-9]+ ]]; then
|
|
download https://api.wordpress.org/core/version-check/1.7/ "$WP_CORE_DIR/wp-latest.json"
|
|
if [[ $WP_VERSION =~ [0-9]+\.[0-9]+\.[0] ]]; then
|
|
LATEST_VERSION=${WP_VERSION%??}
|
|
else
|
|
# shellcheck disable=SC2001
|
|
VERSION_ESCAPED=$(echo "$WP_VERSION" | sed 's/\./\\\\./g')
|
|
LATEST_VERSION=$(grep -o '"version":"'"$VERSION_ESCAPED"'[^"]*' "$WP_CORE_DIR/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
|
|
else
|
|
local ARCHIVE_NAME="wordpress-$WP_VERSION"
|
|
fi
|
|
download https://wordpress.org/"${ARCHIVE_NAME}".tar.gz "$WP_CORE_DIR/wordpress.tar.gz"
|
|
tar --strip-components=1 -zxmf "$WP_CORE_DIR/wordpress.tar.gz" -C "$WP_CORE_DIR"
|
|
rm "$WP_CORE_DIR/wordpress.tar.gz"
|
|
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
|
|
local ioption='-i.bak'
|
|
else
|
|
local ioption='-i'
|
|
fi
|
|
|
|
# set up testing suite if it doesn't yet exist
|
|
if [ ! -d "$WP_TESTS_DIR" ]; then
|
|
mkdir -p "$WP_TESTS_DIR"
|
|
rm -rf /tmp/wordpress-develop
|
|
if ! git clone --quiet --depth=1 --branch "$GIT_REF" https://github.com/WordPress/wordpress-develop.git /tmp/wordpress-develop; then
|
|
echo "Error: Failed to clone wordpress-develop at branch/tag $GIT_REF" >&2
|
|
exit 1
|
|
fi
|
|
if [ -d /tmp/wordpress-develop/tests/phpunit/includes ]; then
|
|
if ! cp -r /tmp/wordpress-develop/tests/phpunit/includes "$WP_TESTS_DIR/"; then
|
|
echo "Error: Failed to copy phpunit includes to $WP_TESTS_DIR" >&2
|
|
exit 1
|
|
fi
|
|
fi
|
|
if [ -d /tmp/wordpress-develop/tests/phpunit/data ]; then
|
|
if ! cp -r /tmp/wordpress-develop/tests/phpunit/data "$WP_TESTS_DIR/"; then
|
|
echo "Error: Failed to copy phpunit data to $WP_TESTS_DIR" >&2
|
|
exit 1
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
if [ ! -f wp-tests-config.php ]; then
|
|
if [ -f /tmp/wordpress-develop/wp-tests-config-sample.php ]; then
|
|
cp /tmp/wordpress-develop/wp-tests-config-sample.php "$WP_TESTS_DIR"/wp-tests-config.php
|
|
else
|
|
download https://raw.githubusercontent.com/WordPress/wordpress-develop/master/wp-tests-config-sample.php "$WP_TESTS_DIR"/wp-tests-config.php
|
|
fi
|
|
WP_CORE_DIR="${WP_CORE_DIR%/}"
|
|
sed "$ioption" "s:dirname( __FILE__ ) . '/src/':'$WP_CORE_DIR/':" "$WP_TESTS_DIR"/wp-tests-config.php
|
|
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
|
|
|
|
if [ "$MULTISITE" = "true" ]; then
|
|
sed "$ioption" "s:// define( 'WP_TESTS_MULTISITE', true );:define( 'WP_TESTS_MULTISITE', true );:" "$WP_TESTS_DIR"/wp-tests-config.php
|
|
fi
|
|
fi
|
|
|
|
}
|
|
|
|
install_db() {
|
|
|
|
if [ "${SKIP_DB_CREATE}" = "true" ]; then
|
|
return 0
|
|
fi
|
|
|
|
local PARTS
|
|
IFS=':' read -ra PARTS <<<"$DB_HOST"
|
|
local DB_HOSTNAME=${PARTS[0]}
|
|
local DB_SOCK_OR_PORT=${PARTS[1]}
|
|
local EXTRA=""
|
|
|
|
if [ -n "$DB_HOSTNAME" ]; then
|
|
if [[ $DB_SOCK_OR_PORT =~ ^[0-9]+$ ]]; then
|
|
EXTRA=" --host=$DB_HOSTNAME --port=$DB_SOCK_OR_PORT --protocol=tcp"
|
|
elif [ -n "$DB_SOCK_OR_PORT" ]; then
|
|
EXTRA=" --socket=$DB_SOCK_OR_PORT"
|
|
elif [ -n "$DB_HOSTNAME" ]; then
|
|
EXTRA=" --host=$DB_HOSTNAME --protocol=tcp"
|
|
fi
|
|
fi
|
|
|
|
mysqladmin create "$DB_NAME" --user="$DB_USER" --password="$DB_PASS""$EXTRA" || true
|
|
}
|
|
|
|
install_wp
|
|
install_test_suite
|
|
install_db
|