uv/crates
Charlie Marsh 1f3b5bb093
Add hash-checking support to `install` and `sync` (#2945)
## Summary

This PR adds support for hash-checking mode in `pip install` and `pip
sync`. It's a large change, both in terms of the size of the diff and
the modifications in behavior, but it's also one that's hard to merge in
pieces (at least, with any test coverage) since it needs to work
end-to-end to be useful and testable.

Here are some of the most important highlights:

- We store hashes in the cache. Where we previously stored pointers to
unzipped wheels in the `archives` directory, we now store pointers with
a set of known hashes. So every pointer to an unzipped wheel also
includes its known hashes.
- By default, we don't compute any hashes. If the user runs with
`--require-hashes`, and the cache doesn't contain those hashes, we
invalidate the cache, redownload the wheel, and compute the hashes as we
go. For users that don't run with `--require-hashes`, there will be no
change in performance. For users that _do_, the only change will be if
they don't run with `--generate-hashes` -- then they may see some
repeated work between resolution and installation, if they use `pip
compile` then `pip sync`.
- Many of the distribution types now include a `hashes` field, like
`CachedDist` and `LocalWheel`.
- Our behavior is similar to pip, in that we enforce hashes when pulling
any remote distributions, and when pulling from our own cache. Like pip,
though, we _don't_ enforce hashes if a distribution is _already_
installed.
- Hash validity is enforced in a few different places:
1. During resolution, we enforce hash validity based on the hashes
reported by the registry. If we need to access a source distribution,
though, we then enforce hash validity at that point too, prior to
running any untrusted code. (This is enforced in the distribution
database.)
2. In the install plan, we _only_ add cached distributions that have
matching hashes. If a cached distribution is missing any hashes, or the
hashes don't match, we don't return them from the install plan.
3. In the downloader, we _only_ return distributions with matching
hashes.
4. The final combination of "things we install" are: (1) the wheels from
the cache, and (2) the downloaded wheels. So this ensures that we never
install any mismatching distributions.
- Like pip, if `--require-hashes` is provided, we require that _all_
distributions are pinned with either `==` or a direct URL. We also
require that _all_ distributions have hashes.

There are a few notable TODOs:

- We don't support hash-checking mode for unnamed requirements. These
should be _somewhat_ rare, though? Since `pip compile` never outputs
unnamed requirements. I can fix this, it's just some additional work.
- We don't automatically enable `--require-hashes` with a hash exists in
the requirements file. We require `--require-hashes`.

Closes #474.

## Test Plan

I'd like to add some tests for registries that report incorrect hashes,
but otherwise: `cargo test`
2024-04-10 19:09:03 +00:00
..
bench Avoid repeating paths of workspace packages (#2573) 2024-03-20 16:16:02 -04:00
cache-key Preserve `.git` suffixes and casing in Git dependencies (#2789) 2024-04-03 00:24:29 +00:00
distribution-filename Update miette v7, pubgrub and small Cargo.toml cleanup (#2610) 2024-03-22 10:42:48 +00:00
distribution-types Add hash-checking support to `install` and `sync` (#2945) 2024-04-10 19:09:03 +00:00
install-wheel-rs Use `Resolver` in `pip sync` (#2696) 2024-03-27 17:36:38 -04:00
once-map Remove unused deps (#1273) 2024-02-11 18:53:58 +00:00
pep440-rs Update pubgrub to use a dependency provider (#2648) 2024-03-25 15:51:31 +01:00
pep508-rs Add hash-checking support to `install` and `sync` (#2945) 2024-04-10 19:09:03 +00:00
platform-tags Drop `macosx_10_0` from compatible wheel tags on `aarch64` (#2496) 2024-03-18 14:52:54 +00:00
pypi-types Replace PyPI-internal Hashes representation with flat vector (#2925) 2024-04-09 16:56:16 +00:00
requirements-txt Split configuration options out of `uv-types` (#2924) 2024-04-09 11:35:53 -05:00
uv Add hash-checking support to `install` and `sync` (#2945) 2024-04-10 19:09:03 +00:00
uv-auth Upgrade `reqwest` to v0.12.3 (#2817) 2024-04-10 11:20:44 -04:00
uv-build Allow profiling tests with tracing instrumentation (#2957) 2024-04-10 10:15:27 +00:00
uv-cache Add hash-checking support to `install` and `sync` (#2945) 2024-04-10 19:09:03 +00:00
uv-client Add hash-checking support to `install` and `sync` (#2945) 2024-04-10 19:09:03 +00:00
uv-configuration Remove unused `task-local-extensions` dependency (#2974) 2024-04-10 14:56:39 -04:00
uv-dev Add hash-checking support to `install` and `sync` (#2945) 2024-04-10 19:09:03 +00:00
uv-dispatch Add hash-checking support to `install` and `sync` (#2945) 2024-04-10 19:09:03 +00:00
uv-distribution Add hash-checking support to `install` and `sync` (#2945) 2024-04-10 19:09:03 +00:00
uv-extract Add hash-checking support to `install` and `sync` (#2945) 2024-04-10 19:09:03 +00:00
uv-fs Fix windows lock race: Lock exclusive after all try lock errors (#2800) 2024-04-03 16:02:40 +02:00
uv-git Respect Git tags and branches that look like short commits (#2795) 2024-04-03 22:05:54 -04:00
uv-installer Add hash-checking support to `install` and `sync` (#2945) 2024-04-10 19:09:03 +00:00
uv-interpreter Replace Python bootstrapping script with Rust implementation (#2842) 2024-04-10 11:22:41 -05:00
uv-normalize Update miette v7, pubgrub and small Cargo.toml cleanup (#2610) 2024-03-22 10:42:48 +00:00
uv-requirements Add hash-checking support to `install` and `sync` (#2945) 2024-04-10 19:09:03 +00:00
uv-resolver Add hash-checking support to `install` and `sync` (#2945) 2024-04-10 19:09:03 +00:00
uv-toolchain Replace Python bootstrapping script with Rust implementation (#2842) 2024-04-10 11:22:41 -05:00
uv-trampoline Use c-string literals and update trampolines (#2590) 2024-03-21 15:36:00 +00:00
uv-types Add hash-checking support to `install` and `sync` (#2945) 2024-04-10 19:09:03 +00:00
uv-version Bump version to v0.1.31 (#2944) 2024-04-09 19:20:43 +00:00
uv-virtualenv Avoid repeating paths of workspace packages (#2573) 2024-03-20 16:16:02 -04:00
uv-warnings Rename to `uv` (#1302) 2024-02-15 11:19:46 -06:00
README.md Rename `uv-traits` and split into separate modules (#2674) 2024-03-26 15:39:43 -05:00

README.md

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.

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-types.

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-requirements

Utilities for reading package requirements from pyproject.toml and requirements.txt files.

uv-resolver

Functionality for resolving Python packages and their dependencies.

uv-types

Shared traits for uv, to avoid circular dependencies.

pypi-types

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

uv-virtualenv

A venv replacement to create virtual environments in Rust.

uv-warnings

User-facing warnings for uv.

requirements-txt

Functionality for parsing requirements.txt files.