uv/crates
liam d51a1e7456
Deduplicate marker-specific dependencies in uv pip tree output (#16078)
Resolves https://github.com/astral-sh/uv/issues/16067

When we build the dependency graph we add an edge per `Requires-Dist`.
If a package publishes multiple marker-guarded requirements (like
pylint’s `dill>=…` for different Python versions), more than one marker
can evaluate to true at runtime, which gives us several edges pointing
to the same installed package node.

To avoid printing the package multiple times, we gather all edges
targeting that node, pass them through a `Cursor`, and aggregate their
requirement details before we print the dependency line. That
aggregation does two things:
  1. If any edge carries a URL, we return that URL immediately.
2. Otherwise we merge all version specifiers into one canonical PEP 440
string.

I've added an integration test, namely `cargo test -p uv --test it
--features pypi -- no_duplicate_dependencies_with_markers` exercises the
new snapshot that installs pylint (with the real dill duplication
scenario present in the original issue) and asserts the tree output,
both with and without `--show-version-specifiers`, now shows a single
dill entry with the merged constraint.
2025-10-01 11:01:41 -05:00
..
uv Deduplicate marker-specific dependencies in uv pip tree output (#16078) 2025-10-01 11:01:41 -05:00
uv-auth Add S3 request signing (#15925) 2025-09-22 23:59:52 +00:00
uv-bench Use a global BaseClientBuilder (#15548) 2025-08-29 13:30:51 -05:00
uv-bin-install Retry streaming Python and bin download errors (#15567) 2025-08-31 15:07:22 +00:00
uv-build Bump version to 0.8.22 (#16005) 2025-09-23 14:43:48 -05:00
uv-build-backend Better warning for no direct build (#15898) 2025-09-17 13:18:41 +02:00
uv-build-frontend fix misleading debug message in uv sync (#15881) 2025-09-16 18:39:08 +00:00
uv-cache Add --force flag for uv cache clean (#15992) 2025-09-22 22:15:14 +00:00
uv-cache-info Follow links when cache-key is a glob (#13438) 2025-07-14 11:35:34 -04:00
uv-cache-key Add DisplaySafeUrl newtype to prevent leaking of credentials by default (#13560) 2025-05-27 00:05:30 +02:00
uv-cli Add install_mirrors to EnvironmentOptions (#15937) 2025-09-25 10:35:09 -05:00
uv-client Use EnvVars in linehaul (#15931) 2025-09-18 14:08:58 +00:00
uv-configuration Allow escaping spaces in --env-file handling (#15815) 2025-09-12 18:11:51 -04:00
uv-console Bump MSRV to 1.88 (#15935) 2025-09-18 14:00:39 -04:00
uv-dev Sync latest Python releases (#15958) 2025-09-20 02:25:21 +00:00
uv-dirs Use workspace dependencies for crate dev-dependencies (#14903) 2025-07-25 13:57:49 -05:00
uv-dispatch Fix uv sync --no-sources not switching from editable to registry installations (#15234) 2025-09-17 06:35:32 -05:00
uv-distribution Add S3 request signing (#15925) 2025-09-22 23:59:52 +00:00
uv-distribution-filename Add logging of incompatible tags on satisfies check (#15663) 2025-09-03 11:45:49 -05:00
uv-distribution-types Ignore origin when comparing installed tools (#16055) 2025-09-29 17:23:18 +00:00
uv-extract Respect UV_INSECURE_NO_ZIP_VALIDATION=1 in duplicate header errors (#15912) 2025-09-17 14:34:49 +00:00
uv-flags Use a global flags instance for wheel check (#16047) 2025-09-30 00:10:11 +00:00
uv-fs Add --force flag for uv cache clean (#15992) 2025-09-22 22:15:14 +00:00
uv-git Update Rust toolchain to 1.89 (#15157) 2025-08-08 13:01:52 +00:00
uv-git-types Include SHA when listing lockfile changes (#15817) 2025-09-12 17:57:58 +00:00
uv-globfilter additional use of Self, remove * and & where not needed (#15091) 2025-08-05 15:19:56 -05:00
uv-install-wheel Use a global flags instance for wheel check (#16047) 2025-09-30 00:10:11 +00:00
uv-installer Avoid ANSI codes in debug! messages (#15843) 2025-09-17 14:30:43 +00:00
uv-keyring Use the windows crate facade consistently (#15737) 2025-09-09 15:07:14 +00:00
uv-logging Add logging to the uv build backend (#15533) 2025-08-27 09:14:00 +02:00
uv-macros Use consistent workspace inheritance (#15031) 2025-08-02 22:03:51 +02:00
uv-metadata Harden ZIP streaming to reject repeated entries and other malformed ZIP files (#15136) 2025-08-07 15:31:48 +01:00
uv-normalize Add rkyv implementation for Core Metadata (#15532) 2025-08-26 10:22:50 -04:00
uv-once-map Make the use of Self consistent. (#15074) 2025-08-05 20:17:12 +01:00
uv-options-metadata Make the use of Self consistent. (#15074) 2025-08-05 20:17:12 +01:00
uv-pep440 Update Rust toolchain to 1.89 (#15157) 2025-08-08 13:01:52 +00:00
uv-pep508 Add rkyv implementation for Core Metadata (#15532) 2025-08-26 10:22:50 -04:00
uv-performance-memory-allocator Update Rust crate mimalloc to v0.1.48 (#15724) 2025-09-08 07:08:37 +00:00
uv-platform Don't trace logs all architectures (#15710) 2025-09-07 17:31:50 +02:00
uv-platform-tags Improve BSD tag construction (#15829) 2025-09-14 10:48:37 -04:00
uv-preview Add S3 request signing (#15925) 2025-09-22 23:59:52 +00:00
uv-publish Rename provides_extras to provides_extra (#15825) 2025-09-14 13:27:45 +00:00
uv-pypi-types Remove tracking of inferred dependency conflicts (#15909) 2025-10-01 10:03:42 -05:00
uv-python Upgrade Pyodide to 0.28.3 (#15999) 2025-09-23 09:57:15 -05:00
uv-redacted Make the use of Self consistent. (#15074) 2025-08-05 20:17:12 +01:00
uv-requirements Avoid re-parsing pyproject.toml when provided as a source (#15851) 2025-09-15 10:07:38 -04:00
uv-requirements-txt Support recursive requirements and constraints inclusion (#15657) 2025-09-05 11:20:12 +02:00
uv-resolver Use a global flags instance for wheel check (#16047) 2025-09-30 00:10:11 +00:00
uv-scripts Import PackageName from uv-normalize (#15439) 2025-08-21 23:15:40 +00:00
uv-settings Use a global flags instance for wheel check (#16047) 2025-09-30 00:10:11 +00:00
uv-shell Use the windows crate facade consistently (#15737) 2025-09-09 15:07:14 +00:00
uv-small-str Update schemars 1.0.0 (#13693) 2025-06-24 21:43:31 +02:00
uv-state Add pyx support to uv auth commands (#15636) 2025-09-02 18:18:09 -04:00
uv-static Use a global flags instance for wheel check (#16047) 2025-09-30 00:10:11 +00:00
uv-tool fix misleading debug message in uv sync (#15881) 2025-09-16 18:39:08 +00:00
uv-torch Add PyG packages to torch backend (#15911) 2025-09-17 14:18:30 +00:00
uv-trampoline Update trampoline to ~1.87 nightly (#15052) 2025-08-06 12:45:04 +00:00
uv-trampoline-builder Use workspace dependencies for crate dev-dependencies (#14903) 2025-07-25 13:57:49 -05:00
uv-types Import PackageName from uv-normalize (#15439) 2025-08-21 23:15:40 +00:00
uv-version Bump version to 0.8.22 (#16005) 2025-09-23 14:43:48 -05:00
uv-virtualenv fix misleading debug message in uv sync (#15881) 2025-09-16 18:39:08 +00:00
uv-warnings Better warning chain styling (#14934) 2025-07-28 16:23:39 +00:00
uv-workspace Allow [project] to be missing from a pyproject.toml (#14113) 2025-09-17 10:48:56 -05:00
README.md Link to Dependency specifiers instead of PEP 508 (#8411) 2024-10-21 14:43:38 -04:00

Crates

uv-bench

Functionality for benchmarking uv.

uv-cache-key

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

uv-distribution-filename

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

uv-distribution-types

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

uv-install-wheel-rs

Install built distributions (wheels) into a virtual environment.

uv-once-map

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

uv-pep440-rs

Utilities for interacting with Python version numbers and specifiers.

uv-pep508-rs

Utilities for parsing and evaluating dependency specifiers, previously known as PEP 508.

uv-platform-tags

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

uv-cli

Command-line interface for the uv package manager.

uv-build-frontend

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

Functionality for detecting and leveraging the current Python interpreter.

uv-normalize

Normalize package and extra names as per Python specifications.

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

Utilities for detecting and manipulating shell environments.

uv-types

Shared traits for uv, to avoid circular dependencies.

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

uv-workspace

Workspace abstractions for uv.

uv-requirements-txt

Functionality for parsing requirements.txt files.