Files

97 lines
2.8 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
TOOL_ROOT="$(CDPATH= cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd -P)"
MCP_REPOSITORY="https://github.com/jasonjgardner/blockbench-mcp-plugin.git"
MCP_COMMIT="6b069e308fdfc9b0a1c15bc924ca78150815f143"
MCP_PATCH="${TOOL_ROOT}/patches/0001-projectcapture-hardening.patch"
MCP_PATCH_SHA256="092d5446fcdd1f28d6abcc931be2895727fd9ab3dd56728874b6847a614ed8fa"
BUN_VERSION="1.3.14"
require_command() {
command -v "$1" >/dev/null 2>&1 || {
printf 'Fehlendes Werkzeug: %s\n' "$1" >&2
exit 1
}
}
sha256_file() {
if command -v shasum >/dev/null 2>&1; then
shasum -a 256 "$1" | awk '{print $1}'
elif command -v sha256sum >/dev/null 2>&1; then
sha256sum "$1" | awk '{print $1}'
else
printf 'Weder shasum noch sha256sum ist verfügbar.\n' >&2
exit 1
fi
}
verify_patch() {
local actual
actual="$(sha256_file "${MCP_PATCH}")"
if [[ "${actual}" != "${MCP_PATCH_SHA256}" ]]; then
printf 'Patch-Hash stimmt nicht: erwartet %s, erhalten %s\n' \
"${MCP_PATCH_SHA256}" "${actual}" >&2
exit 1
fi
}
prepare_source() {
local destination="$1"
if [[ -z "${destination}" || -e "${destination}" ]]; then
printf 'Temporäres Ziel muss neu und nicht vorhanden sein: %s\n' "${destination}" >&2
exit 1
fi
verify_patch
git clone --quiet --filter=blob:none --no-checkout "${MCP_REPOSITORY}" "${destination}"
git -C "${destination}" checkout --quiet --detach "${MCP_COMMIT}"
local resolved
resolved="$(git -C "${destination}" rev-parse HEAD)"
if [[ "${resolved}" != "${MCP_COMMIT}" ]]; then
printf 'Upstream-Commit stimmt nicht: %s\n' "${resolved}" >&2
exit 1
fi
git -C "${destination}" apply --check "${MCP_PATCH}"
git -C "${destination}" apply "${MCP_PATCH}"
git -C "${destination}" diff --check
}
make_stage_parent() {
mktemp -d "${TMPDIR:-/tmp}/projectcapture-blockbench-mcp.XXXXXX"
}
safe_remove_stage() {
local stage="$1"
local leaf
leaf="$(basename -- "${stage}")"
if [[ -d "${stage}" && ! -L "${stage}" && "${leaf}" == projectcapture-blockbench-mcp.* ]]; then
rm -rf -- "${stage}"
else
printf 'Unsicheres temporäres Löschziel wurde nicht entfernt: %s\n' "${stage}" >&2
fi
}
run_bun() {
pnpm dlx "bun@${BUN_VERSION}" "$@"
}
write_dist_checksums() {
local output_dir="$1"
local checksum_file="${output_dir}/SHA256SUMS"
local temporary_file="${checksum_file}.tmp.$$"
local artifact
: > "${temporary_file}"
for artifact in \
hytale_plugin-0.9.1.js \
mcp-about.md \
mcp-icon.svg \
mcp-projectcapture-1.6.1.js; do
if [[ -f "${output_dir}/${artifact}" && ! -L "${output_dir}/${artifact}" ]]; then
printf '%s %s\n' "$(sha256_file "${output_dir}/${artifact}")" "${artifact}" \
>> "${temporary_file}"
fi
done
mv -- "${temporary_file}" "${checksum_file}"
}