Spaces:
Build error
Build error
| #!/bin/bash | |
| # Check for disallowed module invocations | |
| for arg in "$@"; do | |
| case "$arg" in | |
| -mpip|-m\ pip|pip) | |
| echo "Error: 'python -m pip' is disabled. Use uv instead:" >&2 | |
| echo "" >&2 | |
| echo " To install a package for a script: uv run --with PACKAGE python script.py" >&2 | |
| echo " To add a dependency to the project: uv add PACKAGE" >&2 | |
| echo "" >&2 | |
| exit 1 | |
| ;; | |
| -mvenv|-m\ venv|venv) | |
| echo "Error: 'python -m venv' is disabled. Use uv instead:" >&2 | |
| echo "" >&2 | |
| echo " To create a virtual environment: uv venv" >&2 | |
| echo "" >&2 | |
| exit 1 | |
| ;; | |
| -mpy_compile|-m\ py_compile|py_compile) | |
| echo "Error: 'python -m py_compile' is disabled because it writes .pyc files to __pycache__." >&2 | |
| echo "" >&2 | |
| echo " To verify syntax without bytecode output: uv run python -m ast path/to/file.py >/dev/null" >&2 | |
| echo "" >&2 | |
| exit 1 | |
| ;; | |
| esac | |
| done | |
| # Check for -m flag followed by pip or venv | |
| prev="" | |
| for arg in "$@"; do | |
| if [ "$prev" = "-m" ]; then | |
| case "$arg" in | |
| pip) | |
| echo "Error: 'python -m pip' is disabled. Use uv instead:" >&2 | |
| echo "" >&2 | |
| echo " To install a package for a script: uv run --with PACKAGE python script.py" >&2 | |
| echo " To add a dependency to the project: uv add PACKAGE" >&2 | |
| echo "" >&2 | |
| exit 1 | |
| ;; | |
| venv) | |
| echo "Error: 'python -m venv' is disabled. Use uv instead:" >&2 | |
| echo "" >&2 | |
| echo " To create a virtual environment: uv venv" >&2 | |
| echo "" >&2 | |
| exit 1 | |
| ;; | |
| py_compile) | |
| echo "Error: 'python -m py_compile' is disabled because it writes .pyc files to __pycache__." >&2 | |
| echo "" >&2 | |
| echo " To verify syntax without bytecode output: uv run python -m ast path/to/file.py >/dev/null" >&2 | |
| echo "" >&2 | |
| exit 1 | |
| ;; | |
| esac | |
| fi | |
| prev="$arg" | |
| done | |
| # Resolve a Python interpreter for uv. Prefer uv-managed Python to match | |
| # `uv run python` defaults, while still avoiding shim recursion. | |
| resolve_uv_python() { | |
| local shim_dir candidate candidate_dir | |
| shim_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" | |
| candidate="$(uv python find --managed-python 2>/dev/null || true)" | |
| if [ -n "$candidate" ] && [ -x "$candidate" ]; then | |
| candidate_dir="$(cd "$(dirname "$candidate")" && pwd)" | |
| if [ "$candidate_dir" != "$shim_dir" ]; then | |
| echo "$candidate" | |
| return 0 | |
| fi | |
| fi | |
| while IFS= read -r candidate; do | |
| [ -n "$candidate" ] || continue | |
| candidate_dir="$(cd "$(dirname "$candidate")" && pwd)" | |
| [ "$candidate_dir" = "$shim_dir" ] && continue | |
| echo "$candidate" | |
| return 0 | |
| done < <(type -aP python3 2>/dev/null) | |
| while IFS= read -r candidate; do | |
| [ -n "$candidate" ] || continue | |
| candidate_dir="$(cd "$(dirname "$candidate")" && pwd)" | |
| [ "$candidate_dir" = "$shim_dir" ] && continue | |
| echo "$candidate" | |
| return 0 | |
| done < <(type -aP python 2>/dev/null) | |
| return 1 | |
| } | |
| UV_PYTHON="$(resolve_uv_python)" | |
| if [ -z "$UV_PYTHON" ]; then | |
| echo "Error: Unable to locate a Python interpreter outside intercepted-commands." >&2 | |
| exit 1 | |
| fi | |
| # Dispatch through uv with an explicit interpreter path to avoid recursion. | |
| exec uv run --python "$UV_PYTHON" python "$@" | |