| #!/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" |
|
|
|
|