feca-mailshots-plugin/scripts/package_plugin.sh

121 lines
2.7 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
INSTALL_SCRIPT="${REPO_ROOT}/scripts/install_dependencies.sh"
PLUGIN_SLUG="${PLUGIN_SLUG:-feca_mailshots_plugin}"
SOURCE_DIR="${SOURCE_DIR:-${REPO_ROOT}/${PLUGIN_SLUG}}"
OUTPUT_DIR="${OUTPUT_DIR:-${REPO_ROOT}/dist}"
usage() {
cat <<'USAGE'
Usage: scripts/package_plugin.sh [--source /path/to/plugin] [--output /path/to/dist]
Creates a versioned, uploadable WordPress plugin zip from the plugin directory.
Defaults:
source: ./feca_mailshots_plugin
output: ./dist
USAGE
}
while [[ $# -gt 0 ]]; do
case "$1" in
--source)
SOURCE_DIR="${2:-}"
shift 2
;;
--output)
OUTPUT_DIR="${2:-}"
shift 2
;;
-h|--help)
usage
exit 0
;;
*)
echo "Unknown argument: $1" >&2
usage >&2
exit 1
;;
esac
done
if [[ ! -d "${SOURCE_DIR}" ]]; then
echo "Error: source directory not found: ${SOURCE_DIR}" >&2
exit 1
fi
PLUGIN_BASENAME="$(basename "${SOURCE_DIR}")"
PLUGIN_MAIN_FILE="${SOURCE_DIR}/${PLUGIN_BASENAME}.php"
if [[ ! -f "${PLUGIN_MAIN_FILE}" ]]; then
echo "Error: plugin main file not found: ${PLUGIN_MAIN_FILE}" >&2
exit 1
fi
if [[ ! -x "${INSTALL_SCRIPT}" ]]; then
echo "Error: install script not found or not executable: ${INSTALL_SCRIPT}" >&2
exit 1
fi
if ! command -v zip >/dev/null 2>&1; then
echo "Error: 'zip' command is required but not installed." >&2
exit 1
fi
VERSION="$(awk '
/Version:/ {
line = $0
sub(/^.*Version:[[:space:]]*/, "", line)
if (match(line, /^[0-9]+\.[0-9]+\.[0-9]+/)) {
print substr(line, RSTART, RLENGTH)
exit
}
}
' "${PLUGIN_MAIN_FILE}")"
if [[ -z "${VERSION}" ]]; then
echo "Error: could not parse semantic version from ${PLUGIN_MAIN_FILE}" >&2
exit 1
fi
mkdir -p "${OUTPUT_DIR}"
TMP_DIR="$(mktemp -d)"
trap 'rm -rf "${TMP_DIR}"' EXIT
STAGE_DIR="${TMP_DIR}/${PLUGIN_BASENAME}"
mkdir -p "${STAGE_DIR}"
"${INSTALL_SCRIPT}" --skip-node
if [[ ! -f "${REPO_ROOT}/vendor/autoload.php" ]]; then
echo "Error: vendor/autoload.php is missing after dependency install." >&2
exit 1
fi
rsync -a \
--delete \
--exclude '.git/' \
--exclude '.DS_Store' \
--exclude '.codex/' \
--exclude '.idea/' \
--exclude '.vscode/' \
--exclude 'node_modules/' \
--exclude 'vendor/' \
"${SOURCE_DIR}/" "${STAGE_DIR}/"
mkdir -p "${STAGE_DIR}/vendor"
rsync -a --delete "${REPO_ROOT}/vendor/" "${STAGE_DIR}/vendor/"
ARCHIVE_PATH="${OUTPUT_DIR}/${PLUGIN_BASENAME}-${VERSION}.zip"
rm -f "${ARCHIVE_PATH}"
(
cd "${TMP_DIR}"
zip -qr "${ARCHIVE_PATH}" "${PLUGIN_BASENAME}"
)
echo "Created package: ${ARCHIVE_PATH}"