uv/crates
Charlie Marsh e811070ef1
Wrap unsafe script shebangs in /bin/sh (#2097)
## Summary

This is based on Pradyun's installer branch
(d01624e5f2/src/installer/scripts.py (L54)),
which is itself based on pip
(0ad4c94be7/src/pip/_vendor/distlib/scripts.py (L136)).

The gist of it is: on Posix platforms, if a path contains a space (or is
too long), we wrap the shebang in a `/bin/sh` invocation.

Closes https://github.com/astral-sh/uv/issues/2076.

## Test Plan

```
❯ cargo run venv "foo"
    Finished dev [unoptimized + debuginfo] target(s) in 0.14s
     Running `target/debug/uv venv foo`
Using Python 3.12.0 interpreter at: /Users/crmarsh/.local/share/rtx/installs/python/3.12.0/bin/python3
Creating virtualenv at: foo
Activate with: source foo/bin/activate

❯ source "foo bar/bin/activate"

❯ which black
black not found

❯ cargo run pip install black
Resolved 6 packages in 177ms
Installed 6 packages in 17ms
 + black==24.2.0
 + click==8.1.7
 + mypy-extensions==1.0.0
 + packaging==23.2
 + pathspec==0.12.1
 + platformdirs==4.2.0

❯ which black
/Users/crmarsh/workspace/uv/foo bar/bin/black

❯ black
Usage: black [OPTIONS] SRC ...

One of 'SRC' or 'code' is required.

❯ cat "foo bar/bin/black"
#!/bin/sh
'''exec' '/Users/crmarsh/workspace/uv/foo bar/bin/python' "$0" "$@"
' '''
# -*- coding: utf-8 -*-
import re
import sys
from black import patched_main
if __name__ == "__main__":
    sys.argv[0] = re.sub(r"(-script\.pyw|\.exe)?$", "", sys.argv[0])
    sys.exit(patched_main())
```
2024-02-29 23:19:06 +00:00
..
bench Rename to uv (#1302) 2024-02-15 11:19:46 -06:00
cache-key Clippy pedantic (#1963) 2024-02-25 14:04:05 -05:00
distribution-filename Clippy pedantic (#1963) 2024-02-25 14:04:05 -05:00
distribution-types tweak the order of index priority (#2083) 2024-02-29 11:57:07 -05:00
gourgeist virtualenv: determine 'site-packages' based on implementation name 2024-02-29 15:57:57 -05:00
install-wheel-rs Wrap unsafe script shebangs in /bin/sh (#2097) 2024-02-29 23:19:06 +00:00
once-map Remove unused deps (#1273) 2024-02-11 18:53:58 +00:00
pep440-rs pep440: remove redundant without_local() (#2019) 2024-02-27 11:00:58 -05:00
pep508-rs feat: expose uv_normalize types (#2082) 2024-02-29 15:06:56 +00:00
platform-host Clippy pedantic (#1963) 2024-02-25 14:04:05 -05:00
platform-tags Clippy pedantic (#1963) 2024-02-25 14:04:05 -05:00
pypi-types Bump serde_json from 1.0.113 to 1.0.114 (#1996) 2024-02-26 23:12:54 +00:00
requirements-txt Use Simplified instead of Normalized for path prefix stripping (#2071) 2024-02-29 01:44:50 +00:00
uv Bump version to v0.1.13 (#2090) 2024-02-29 17:39:28 +00:00
uv-auth Clippy pedantic (#1963) 2024-02-25 14:04:05 -05:00
uv-build Add option pass environment variables for SDist building (#2039) 2024-02-29 10:55:10 +00:00
uv-cache Support environment variables in index URLs in requirements files (#2036) 2024-02-28 19:36:20 +00:00
uv-client tweak the order of index priority (#2083) 2024-02-29 11:57:07 -05:00
uv-dev Add option pass environment variables for SDist building (#2039) 2024-02-29 10:55:10 +00:00
uv-dispatch Add option pass environment variables for SDist building (#2039) 2024-02-29 10:55:10 +00:00
uv-distribution Support environment variables in index URLs in requirements files (#2036) 2024-02-28 19:36:20 +00:00
uv-extract Add fs_err to disallowed_method in clippy.toml (#1950) 2024-02-26 14:15:07 +00:00
uv-fs Avoid canonicalizing user-provided interpreters (#2072) 2024-02-28 21:32:52 -05:00
uv-git Use Simplified instead of Normalized for path prefix stripping (#2071) 2024-02-29 01:44:50 +00:00
uv-installer Use Simplified instead of Normalized for path prefix stripping (#2071) 2024-02-29 01:44:50 +00:00
uv-interpreter Wrap unsafe script shebangs in /bin/sh (#2097) 2024-02-29 23:19:06 +00:00
uv-normalize Clippy pedantic (#1963) 2024-02-25 14:04:05 -05:00
uv-resolver Allow pre-releases for requirements in constraints files (#2069) 2024-02-29 01:16:23 +00:00
uv-traits Rename Virtualenv and PythonPlatform structs (#2034) 2024-02-28 15:04:55 +00:00
uv-trampoline Win Trampoline: Use Python executable path encoded in binary (#1803) 2024-02-22 16:10:02 +01:00
uv-warnings Rename to uv (#1302) 2024-02-15 11:19:46 -06:00
README.md Rename to uv (#1302) 2024-02-15 11:19:46 -06:00

Crates

bench

Functionality for benchmarking uv.

cache-key

Generic functionality for caching paths, URLs, and other resources across platforms.

distribution-filename

Parse built distribution (wheel) and source distribution (sdist) filenames to extract structured metadata.

distribution-types

Abstractions for representing built distributions (wheels) and source distributions (sdists), and the sources from which they can be downloaded.

gourgeist

A venv replacement to create virtual environments in Rust.

install-wheel-rs

Install built distributions (wheels) into a virtual environment.]

once-map

A waitmap-like concurrent hash map for executing tasks exactly once.

pep440-rs

Utilities for interacting with Python version numbers and specifiers.

pep508-rs

Utilities for interacting with PEP 508 dependency specifiers.

platform-host

Functionality for detecting the current platform (operating system, architecture, etc.).

platform-tags

Functionality for parsing and inferring Python platform tags as per PEP 425.

uv

Command-line interface for the uv package manager.

uv-build

A PEP 517-compatible build frontend for uv.

uv-cache

Functionality for caching Python packages and associated metadata.

uv-client

Client for interacting with PyPI-compatible HTTP APIs.

uv-dev

Development utilities for uv.

uv-dispatch

A centralized struct for resolving and building source distributions in isolated environments. Implements the traits defined in uv-traits.

uv-distribution

Client for interacting with built distributions (wheels) and source distributions (sdists). Capable of fetching metadata, distribution contents, etc.

uv-extract

Utilities for extracting files from archives.

uv-fs

Utilities for interacting with the filesystem.

uv-git

Functionality for interacting with Git repositories.

uv-installer

Functionality for installing Python packages into a virtual environment.

uv-interpreter

Functionality for detecting and leveraging the current Python interpreter.

uv-normalize

Normalize package and extra names as per Python specifications.

uv-package

Types and functionality for working with Python packages, e.g., parsing wheel files.

uv-resolver

Functionality for resolving Python packages and their dependencies.

uv-traits

Shared traits for uv, to avoid circular dependencies.

pypi-types

General-purpose type definitions for types used in PyPI-compatible APIs.

uv-warnings

User-facing warnings for uv.

requirements-txt

Functionality for parsing requirements.txt files.