#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR=$(realpath -- "$(dirname -- "${BASH_SOURCE[0]}")") echo "Script dir: ${SCRIPT_DIR}" BASE_DIR="${OPENCODE_DEV_HOME:-$HOME/opencode-dev}" IMAGE_REPO="${IMAGE_REPO:-localhost/opencode-dev}" # OPENCODE_VERSION="${OPENCODE_VERSION:-1.18.32}" # IMAGE_TAG="${IMAGE_TAG:-${OPENCODE_VERSION}}" IMAGE="${IMAGE_REPO}" # Folders PROJECTS_DIR="${PROJECT_DIR:-$BASE_DIR/projects}" OPC_CONFIG="${OPENCODE_CONFIG:-$BASE_DIR/opencode-config}" OPC_DATA="${OPENCODE_SHARE_DATA:-$BASE_DIR/opencode-data}" OPC_CACHE="${OPENCODE_CACHE:-$BASE_DIR/opencode-cache}" M2_FOLDER="${M2_FOLDER:-$BASE_DIR/m2}" NPM_CACHE="${NPM_CACHE:-$BASE_DIR/npm-cache}" PIP_CACHE="${PIP_CACHE:-$BASE_DIR/pip-cache}" CERTIFICATES="${CERTIFICATES:-$BASE_DIR/certs}" BASH_FOLDER="${BASH_FOLDER:-$BASE_DIR/bash}" mkdir -p \ "$BASE_DIR" \ "$PROJECTS_DIR" \ "$OPC_CONFIG" \ "$OPC_DATA" \ "$OPC_CACHE" \ "$M2_FOLDER" \ "$NPM_CACHE" \ "$PIP_CACHE" \ "$CERTIFICATES" \ "$BASH_FOLDER" # chmod -R 777 "$BASE_DIR" if [[ ! -f "$HOME/.gitconfig" ]]; then echo "WARNING: $HOME/.gitconfig does not exist; Git will use container defaults." >&2 fi if ! podman image exists "$IMAGE"; then echo "Image $IMAGE does not exist. Build it first with ./build.sh" >&2 exit 1 fi START_DIR="${1:-$PROJECTS_DIR}" shift || true if [[ "$START_DIR" = /* ]]; then if [[ "$START_DIR" == "$PROJECTS_DIR"* ]]; then REL="${START_DIR#"$PROJECTS_DIR"}" START_DIR="/workspace${REL}" else echo "Absolute paths outside $PROJECTS_DIR require --mount and are not accepted as the initial directory." >&2 exit 2 fi else START_DIR="/workspace/${START_DIR#./}" fi if [[ ! -d "$PROJECTS_DIR" ]]; then echo "Project directory missing: $PROJECTS_DIR" >&2 exit 1 fi ARGS=( run --rm -it --name opencode-dev --user dev --userns=keep-id --security-opt=no-new-privileges --network=default --tz=local -e "HOST_LANG=${LANG:-C.UTF-8}" -e "HOST_LC_ALL=${LC_ALL:-}" -e "START_DIR=${START_DIR}" -v "$OPC_CONFIG:/home/dev/.config/opencode:rw" -v "$OPC_DATA:/home/dev/.local/share/opencode:rw" -v "$OPC_CACHE:/home/dev/.cache/opencode:rw" -v "$M2_FOLDER:/home/dev/.m2:rw" -v "$NPM_CACHE:/home/dev/.npm:rw" -v "$PIP_CACHE:/home/dev/.cache/pip:rw" -v "$CERTIFICATES:/host-certs:ro" -v "$PROJECTS_DIR:/workspace:rw" -v "$HOME/.gitconfig:/home/dev/.gitconfig:ro" -v "$HOME/.ssh:/home/dev/.ssh:ro" -v "$BASH_FOLDER:/host-bash:ro" -v "$SCRIPT_DIR/entrypoint.sh:/usr/local/bin/opencode-dev-entrypoint:ro" ) if [[ -n "${SSH_AUTH_SOCK:-}" && -S "$SSH_AUTH_SOCK" ]]; then ARGS+=( -e SSH_AUTH_SOCK=/tmp/ssh-agent.sock -v "$SSH_AUTH_SOCK:/tmp/ssh-agent.sock" ) fi # Additional bind mounts: # ./dev.sh /project --mount "$HOME/other:/extra" while (($#)); do case "$1" in --mount) [[ $# -ge 2 ]] || { echo "--mount requires host:container[:ro|rw]" >&2; exit 2; } ARGS+=(-v "$2") shift 2 ;; *) echo "Unknown option: $1" >&2 exit 2 ;; esac done # Load user Bash configuration after the image defaults, without persisting history. BASH_RC="${BASE_DIR}/bash/bashrc" if [[ -f "$BASH_RC" ]]; then ARGS+=(-e BASH_ENV=/host-bash/bashrc) fi echo "Calling with args: ${ARGS[@]}" exec podman "${ARGS[@]}" "$IMAGE" bash