Skip to content

install.sh gives up where install.ps1 bootstraps: no uv and no Python means a manual install #2322

Description

@Q00

Problem

The two installers behave differently on a machine with nothing preinstalled.

install.ps1 (added in #2309) installs its prerequisites: Git via winget, uv via winget with the astral.sh script as fallback. uv downloads its own Python, so a bare Windows machine completes the install with no preparation. Its own step banner says so: "Both are installed automatically when missing. No Python is required."

install.sh only detects. It never installs uv and never installs Python:

state outcome
uv present works — uv provisions Python via --python '>=3.12'
no uv, pipx + supported Python works
no uv, pipx, Python too old exit 1 (install.sh:1216)
no uv, no pipx, no supported Python exit 1 (install.sh:1237)

In the failing cases it prints remediation and stops. The string curl -LsSf https://astral.sh/uv/install.sh | sh does appear in the script, but only inside _print_python_install_remediation() as text on screen (install.sh:937) — it is never executed.

So the documented one-liner install (curl -fsSL .../install.sh | bash) works on Windows from a clean machine but not on a clean macOS or Linux machine.

Why this is worth fixing rather than documenting

uv carries its own Python. Installing that one thing turns every failing row above into a working install — there is no separate "install Python first" step to ask the user for.

Proposal

At the two points where the script currently exits, install uv from astral.sh — the same script install.ps1 already falls back to — then continue. Re-probe the directories the installer writes to (XDG_BIN_HOME, CARGO_HOME/bin, ~/.local/bin), since it cannot change the running shell's PATH.

Leave every currently-working path untouched: an existing uv, or pipx with a supported Python, reaches its installer before the bootstrap is reached.

Fetching and running an installer from the network is something a caller may reasonably refuse, so it should be declinable — an env var that restores today's instructions-and-exit behaviour.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions