Files
nolimit-discounts/ci/lib.sh
T
kristianwindandClaude Opus 5 4a5e3d8879 Run the text-domain check in a container when the runner has no PHP
The first Gitea run failed on `php: command not found`. GitHub's hosted
runners ship PHP; the Gitea runner image does not, and the whole static job
went red on one line after everything else in it had passed.

ci_php() now uses the local php when there is one — a laptop, GitHub's
runners — and a php:8.4-cli container otherwise. The repository goes in over a
tarball and `docker cp` rather than a bind mount, because a Gitea Actions job
runs inside a container talking to the HOST's docker daemon, so a host path
there lands on an empty directory nobody created.

Also: the include scan now says when it found nothing to check instead of
reporting success. Running the suite with a deliberately crippled PATH showed
it printing "0 plugin-relative include(s) checked" and then "green" — a check
passing by checking nothing, which is the same failure the PHP lint step
already guards against.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 10:40:19 +02:00

85 lines
2.8 KiB
Bash

# Shared helpers for the ci/ scripts. Sourced, never executed.
#
# Nothing in here is specific to one plugin — ci/plugin.conf holds that.
# shellcheck shell=bash
ci_repo_root() {
cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd
}
# Load ci/plugin.conf and fail loudly on anything it forgot to set. A missing
# value would otherwise turn into an empty path and a test that passes by
# testing nothing.
ci_load_conf() {
local root
root="$(ci_repo_root)"
# shellcheck source=/dev/null
. "$root/ci/plugin.conf"
local missing=
for var in PLUGIN_SLUG PLUGIN_MAIN TEXT_DOMAIN NEEDS_WOOCOMMERCE; do
[ -n "${!var:-}" ] || missing="$missing $var"
done
if [ -n "$missing" ]; then
echo "ci/plugin.conf is missing:$missing" >&2
return 1
fi
if [ ! -f "$root/$PLUGIN_MAIN" ]; then
echo "ci/plugin.conf points PLUGIN_MAIN at '$PLUGIN_MAIN', which does not exist." >&2
return 1
fi
}
# The version WordPress will compare against the update feed. Read from the
# plugin header, which is the only copy WordPress ever looks at.
ci_plugin_version() {
sed -n -E 's/^[[:space:]]*\*?[[:space:]]*Version:[[:space:]]*([^[:space:]]+).*/\1/p' \
"$(ci_repo_root)/$PLUGIN_MAIN" | head -1
}
# Read any other plugin header field, e.g. ci_plugin_header 'Requires at least'.
ci_plugin_header() {
sed -n -E "s/^[[:space:]]*\*?[[:space:]]*$1:[[:space:]]*(.*)/\1/p" \
"$(ci_repo_root)/$PLUGIN_MAIN" | head -1 | sed -E 's/[[:space:]]+$//'
}
# Run one of this repository's PHP scripts.
#
# Uses the local php when there is one — a laptop, GitHub's hosted runners —
# and a container otherwise. The Gitea runner image has no php, and losing a
# build to "php: command not found" after everything else passed is a silly way
# to spend an afternoon. Measured: it happened on the very first Gitea run.
#
# The repository goes in over a tarball and `docker cp`, never a bind mount: a
# Gitea Actions job runs inside a container talking to the HOST's docker
# daemon, so a host path here lands on an empty directory nobody created.
ci_php() {
if command -v php >/dev/null 2>&1; then
php "$@"
return
fi
local tarball cid code=0
tarball=$(mktemp -t wpci-php-XXXXXX.tar)
( cd "$(ci_repo_root)" && git ls-files -z | tar --null -T - -cf "$tarball" )
cid=$(docker create "php:8.4-cli" sh -c \
"mkdir -p /src && tar -xf /tmp/src.tar -C /src && cd /src && exec php $(printf '%q ' "$@")")
docker cp "$tarball" "$cid:/tmp/src.tar" >/dev/null
docker start -a "$cid" || code=$?
docker rm -f "$cid" >/dev/null
rm -f "$tarball"
return "$code"
}
ci_step() { printf '\n\033[1m→ %s\033[0m\n' "$*"; }
ci_fail() { printf '\033[31mFAIL\033[0m %s\n' "$*" >&2; }
# GitHub and Gitea both render these as annotations on the file and line.
ci_annotate() { # level file line message
printf '::%s file=%s,line=%s::%s\n' "$1" "$2" "$3" "$4"
}