Files
bjd-cms-content/install/install.sh
T

85 lines
2.4 KiB
Bash
Executable File

#!/usr/bin/env sh
set -eu
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
RELEASE_ROOT=$(CDPATH= cd -- "$SCRIPT_DIR/.." && pwd)
PREFIX=${XDG_DATA_HOME:-"$HOME/.local/share"}/bjd-cms
while [ "$#" -gt 0 ]; do
case "$1" in
--prefix)
[ "$#" -ge 2 ] || { echo "--prefix requires an absolute directory" >&2; exit 2; }
PREFIX=$2
shift 2
;;
*)
echo "usage: sh install/install.sh [--prefix ABSOLUTE_DIRECTORY]" >&2
exit 2
;;
esac
done
case "$PREFIX" in
/*) ;;
*) echo "installation prefix must be absolute" >&2; exit 2 ;;
esac
[ "$PREFIX" != "/" ] || { echo "refusing broad installation prefix /" >&2; exit 2; }
VERSION=$(tr -d '\r\n' < "$RELEASE_ROOT/VERSION")
case "$VERSION" in
*[!0-9A-Za-z.+-]*|'') echo "release VERSION is invalid" >&2; exit 2 ;;
esac
[ -f "$RELEASE_ROOT/plugin/bjd-cms-content/scripts/server.py" ] || {
echo "release plugin is incomplete" >&2
exit 2
}
[ -f "$RELEASE_ROOT/skill/bjd-cms-content/SKILL.md" ] || {
echo "release skill is incomplete" >&2
exit 2
}
VERSIONS="$PREFIX/versions"
DESTINATION="$VERSIONS/$VERSION"
STAGING="$VERSIONS/.install-$VERSION-$$"
CURRENT_NEXT="$PREFIX/.current-$VERSION-$$"
mkdir -p -- "$VERSIONS"
[ ! -e "$DESTINATION" ] && [ ! -L "$DESTINATION" ] || {
echo "version $VERSION is already installed at $DESTINATION" >&2
exit 2
}
[ ! -e "$STAGING" ] && [ ! -L "$STAGING" ] || {
echo "private staging path already exists" >&2
exit 2
}
if [ -e "$PREFIX/current" ] && [ ! -L "$PREFIX/current" ]; then
echo "refusing to replace non-symlink current path" >&2
exit 2
fi
cleanup() {
case "$STAGING" in
"$VERSIONS"/.install-*) rm -rf -- "$STAGING" ;;
esac
[ ! -L "$CURRENT_NEXT" ] || rm -- "$CURRENT_NEXT"
}
trap cleanup EXIT HUP INT TERM
mkdir -m 0755 -- "$STAGING"
cp -a -- "$RELEASE_ROOT/plugin" "$STAGING/plugin"
cp -a -- "$RELEASE_ROOT/skill" "$STAGING/skill"
cp -a -- "$RELEASE_ROOT/install" "$STAGING/install"
cp -- "$RELEASE_ROOT/VERSION" "$RELEASE_ROOT/RELEASE.json" "$STAGING/"
mv -- "$STAGING" "$DESTINATION"
ln -s -- "versions/$VERSION" "$CURRENT_NEXT"
mv -f -- "$CURRENT_NEXT" "$PREFIX/current"
trap - EXIT HUP INT TERM
echo "Installed BJD CMS Content $VERSION"
echo "Plugin: $DESTINATION/plugin/bjd-cms-content"
echo "Skill: $DESTINATION/skill/bjd-cms-content"
echo "Current pointer: $PREFIX/current"
echo "Next: read $DESTINATION/install/generic-mcp.md"