diff --git a/bin/install-wp-tests.sh b/bin/install-wp-tests.sh index bf50908..462a59f 100755 --- a/bin/install-wp-tests.sh +++ b/bin/install-wp-tests.sh @@ -17,15 +17,19 @@ 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; then - curl -s "$1" > "$2"; - elif command -v wget > /dev/null; then - wget -nv -O "$2" "$1" - fi + 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 @@ -40,27 +44,38 @@ elif [[ $WP_VERSION == 'nightly' || $WP_VERSION == 'trunk' ]]; then 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":"//') + 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; + 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" + 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 @@ -71,6 +86,7 @@ install_wp() { 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 @@ -82,7 +98,7 @@ install_wp() { else local ARCHIVE_NAME="wordpress-$WP_VERSION" fi - download https://wordpress.org/"${ARCHIVE_NAME}".tar.gz "$WP_CORE_DIR/wordpress.tar.gz" + 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 @@ -101,12 +117,21 @@ install_test_suite() { # set up testing suite if it doesn't yet exist if [ ! -d "$WP_TESTS_DIR" ]; then mkdir -p "$WP_TESTS_DIR" - git clone --quiet --depth=1 https://github.com/WordPress/wordpress-develop.git /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 - cp -r /tmp/wordpress-develop/tests/phpunit/includes "$WP_TESTS_DIR/" + 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 - cp -r /tmp/wordpress-develop/tests/phpunit/data "$WP_TESTS_DIR/" + 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 @@ -116,15 +141,15 @@ install_test_suite() { 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=$(echo "$WP_CORE_DIR" | sed "s:/\+$::") - 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 + 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 + sed "$ioption" "s:// define( 'WP_TESTS_MULTISITE', true );:define( 'WP_TESTS_MULTISITE', true );:" "$WP_TESTS_DIR"/wp-tests-config.php fi fi @@ -132,27 +157,27 @@ install_test_suite() { install_db() { - if [ ${SKIP_DB_CREATE} = "true" ]; then + 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]}; + 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 [ -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 + elif [ -n "$DB_SOCK_OR_PORT" ]; then EXTRA=" --socket=$DB_SOCK_OR_PORT" - elif [ -n "$DB_HOSTNAME" ] ; then + 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 + mysqladmin create "$DB_NAME" --user="$DB_USER" --password="$DB_PASS""$EXTRA" || true } install_wp