123 lines
2.8 KiB
Bash
Executable File
123 lines
2.8 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
|
|
php "${REPO_ROOT}/scripts/validate_composer_vendor.php" "${REPO_ROOT}/vendor"
|
|
|
|
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/"
|
|
php "${REPO_ROOT}/scripts/validate_composer_vendor.php" "${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}"
|