149 lines
3.4 KiB
Bash
149 lines
3.4 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
REPO_URL="${REPO_URL:-https://fun-md.com/Fun_MD/devops-skills.git}"
|
|
SKILL_NAME="gitea-issue-devops-agent"
|
|
CODEX_HOME="${CODEX_HOME:-$HOME/.codex}"
|
|
TARGET_DIR="${CODEX_HOME}/skills/${SKILL_NAME}"
|
|
TMP_DIR="$(mktemp -d)"
|
|
INSTALL_JJ="${INSTALL_JJ:-1}"
|
|
JJ_INSTALL_METHOD="${JJ_INSTALL_METHOD:-auto}"
|
|
JJ_CHANNEL="${JJ_CHANNEL:-release}"
|
|
|
|
log() {
|
|
echo "[install] $*"
|
|
}
|
|
|
|
warn() {
|
|
echo "[install] warning: $*" >&2
|
|
}
|
|
|
|
manual_jj_help() {
|
|
warn "jj was not installed automatically."
|
|
warn "Manual options:"
|
|
warn " - Homebrew: brew install jj"
|
|
warn " - cargo-binstall: cargo binstall --strategies crate-meta-data jj-cli"
|
|
if [ "$JJ_CHANNEL" = "prerelease" ]; then
|
|
warn " - cargo prerelease: cargo install --git https://github.com/jj-vcs/jj.git --locked --bin jj jj-cli"
|
|
else
|
|
warn " - cargo release: cargo install --locked --bin jj jj-cli"
|
|
fi
|
|
warn "After installation, verify with: jj --version"
|
|
}
|
|
|
|
install_jj_with_brew() {
|
|
if ! command -v brew >/dev/null 2>&1; then
|
|
return 1
|
|
fi
|
|
if [ "$JJ_CHANNEL" != "release" ]; then
|
|
warn "brew path skipped because prerelease jj is requested."
|
|
return 1
|
|
fi
|
|
|
|
log "attempting jj installation via Homebrew"
|
|
brew install jj
|
|
}
|
|
|
|
install_jj_with_binstall() {
|
|
if ! command -v cargo >/dev/null 2>&1 || ! command -v cargo-binstall >/dev/null 2>&1; then
|
|
return 1
|
|
fi
|
|
if [ "$JJ_CHANNEL" != "release" ]; then
|
|
warn "cargo-binstall path skipped because prerelease jj is requested."
|
|
return 1
|
|
fi
|
|
|
|
log "attempting jj installation via cargo-binstall"
|
|
cargo binstall --strategies crate-meta-data jj-cli
|
|
}
|
|
|
|
install_jj_with_cargo() {
|
|
if ! command -v cargo >/dev/null 2>&1; then
|
|
return 1
|
|
fi
|
|
|
|
log "attempting jj installation via cargo"
|
|
if [ "$JJ_CHANNEL" = "prerelease" ]; then
|
|
cargo install --git https://github.com/jj-vcs/jj.git --locked --bin jj jj-cli
|
|
else
|
|
cargo install --locked --bin jj jj-cli
|
|
fi
|
|
}
|
|
|
|
attempt_jj_install() {
|
|
if [ "$INSTALL_JJ" = "0" ]; then
|
|
log "skipping jj installation because INSTALL_JJ=0"
|
|
return 0
|
|
fi
|
|
|
|
if command -v jj >/dev/null 2>&1; then
|
|
log "jj already installed: $(jj --version)"
|
|
return 0
|
|
fi
|
|
|
|
case "$JJ_INSTALL_METHOD" in
|
|
auto)
|
|
install_jj_with_brew || install_jj_with_binstall || install_jj_with_cargo || {
|
|
manual_jj_help
|
|
return 0
|
|
}
|
|
;;
|
|
brew)
|
|
install_jj_with_brew || {
|
|
manual_jj_help
|
|
return 0
|
|
}
|
|
;;
|
|
binstall)
|
|
install_jj_with_binstall || {
|
|
manual_jj_help
|
|
return 0
|
|
}
|
|
;;
|
|
cargo)
|
|
install_jj_with_cargo || {
|
|
manual_jj_help
|
|
return 0
|
|
}
|
|
;;
|
|
*)
|
|
warn "unsupported JJ_INSTALL_METHOD='$JJ_INSTALL_METHOD'; skipping jj install."
|
|
manual_jj_help
|
|
return 0
|
|
;;
|
|
esac
|
|
|
|
if command -v jj >/dev/null 2>&1; then
|
|
log "jj installation succeeded: $(jj --version)"
|
|
else
|
|
manual_jj_help
|
|
fi
|
|
}
|
|
|
|
cleanup() {
|
|
rm -rf "$TMP_DIR"
|
|
}
|
|
trap cleanup EXIT
|
|
|
|
if ! command -v git >/dev/null 2>&1; then
|
|
log "git is required but not found."
|
|
exit 1
|
|
fi
|
|
|
|
log "downloading ${SKILL_NAME} from ${REPO_URL}"
|
|
git clone --depth 1 "$REPO_URL" "$TMP_DIR/repo" >/dev/null 2>&1
|
|
|
|
if [ ! -d "$TMP_DIR/repo/skills/${SKILL_NAME}" ]; then
|
|
log "skill directory not found in repository."
|
|
exit 1
|
|
fi
|
|
|
|
mkdir -p "${CODEX_HOME}/skills"
|
|
rm -rf "$TARGET_DIR"
|
|
cp -R "$TMP_DIR/repo/skills/${SKILL_NAME}" "$TARGET_DIR"
|
|
|
|
log "skill installed"
|
|
log "installed path: ${TARGET_DIR}"
|
|
attempt_jj_install
|
|
log "done"
|