#!/bin/sh set -eu PROJECT_ROOT=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) UV_VERSION="0.11.32" UV_INSTALLER_SHA256="43aff33a967fe40e8c17949d8c85c65bc43f3b5c94742393c957f56ab5ba80f4" PYTHON_VERSION="3.12.13" TOOL_DIR="$PROJECT_ROOT/environment/bin" CACHE_DIR="$PROJECT_ROOT/environment/cache" INSTALLER="$PROJECT_ROOT/environment/uv-installer-$UV_VERSION.sh" mkdir -p "$TOOL_DIR" "$CACHE_DIR" "$PROJECT_ROOT/logs/setup" if [ ! -x "$TOOL_DIR/uv" ]; then curl --proto '=https' --tlsv1.2 -fL \ "https://astral.sh/uv/$UV_VERSION/install.sh" \ -o "$INSTALLER.part" printf '%s %s\n' "$UV_INSTALLER_SHA256" "$INSTALLER.part" | sha256sum --check --status mv "$INSTALLER.part" "$INSTALLER" UV_UNMANAGED_INSTALL="$TOOL_DIR" UV_NO_MODIFY_PATH=1 sh "$INSTALLER" fi if [ -x "$PROJECT_ROOT/.venv/bin/python" ]; then ACTUAL_PYTHON_VERSION=$($PROJECT_ROOT/.venv/bin/python -c 'import platform; print(platform.python_version())') if [ "$ACTUAL_PYTHON_VERSION" != "$PYTHON_VERSION" ]; then echo "existing .venv uses Python $ACTUAL_PYTHON_VERSION, expected $PYTHON_VERSION; refusing to overwrite" >&2 exit 1 fi else UV_CACHE_DIR="$CACHE_DIR" "$TOOL_DIR/uv" venv \ --python "$PYTHON_VERSION" --python-preference only-managed "$PROJECT_ROOT/.venv" fi UV_CACHE_DIR="$CACHE_DIR" "$TOOL_DIR/uv" pip install \ --python "$PROJECT_ROOT/.venv/bin/python" \ -r "$PROJECT_ROOT/environment/requirements-runtime.lock" UV_CACHE_DIR="$CACHE_DIR" "$TOOL_DIR/uv" pip freeze \ --python "$PROJECT_ROOT/.venv/bin/python" \ > "$PROJECT_ROOT/environment/installed-packages.txt" sha256sum \ "$PROJECT_ROOT/environment/requirements-runtime.lock" \ "$PROJECT_ROOT/environment/installed-packages.txt" \ > "$PROJECT_ROOT/environment/installed-packages.sha256" "$PROJECT_ROOT/.venv/bin/python" "$PROJECT_ROOT/scripts/capture_environment.py" \ --output "$PROJECT_ROOT/environment/tool_versions.json"