Compare commits

..

No commits in common. "main" and "0.9.17" have entirely different histories.
main ... 0.9.17

195 changed files with 1295 additions and 2674 deletions

View File

@ -184,13 +184,13 @@ jobs:
- buildpack-deps:trixie,trixie,debian
- debian:bookworm-slim,bookworm-slim
- buildpack-deps:bookworm,bookworm
- python:3.14-alpine3.23,python3.14-alpine3.23,python3.14-alpine
- python:3.13-alpine3.23,python3.13-alpine3.23,python3.13-alpine
- python:3.12-alpine3.23,python3.12-alpine3.23,python3.12-alpine
- python:3.11-alpine3.23,python3.11-alpine3.23,python3.11-alpine
- python:3.10-alpine3.23,python3.10-alpine3.23,python3.10-alpine
- python:3.9-alpine3.22,python3.9-alpine3.22,python3.9-alpine
- python:3.8-alpine3.20,python3.8-alpine3.20,python3.8-alpine
- python:3.14-alpine,python3.14-alpine
- python:3.13-alpine,python3.13-alpine
- python:3.12-alpine,python3.12-alpine
- python:3.11-alpine,python3.11-alpine
- python:3.10-alpine,python3.10-alpine
- python:3.9-alpine,python3.9-alpine
- python:3.8-alpine,python3.8-alpine
- python:3.14-trixie,python3.14-trixie
- python:3.13-trixie,python3.13-trixie
- python:3.12-trixie,python3.12-trixie

View File

@ -233,7 +233,7 @@ jobs:
with:
persist-credentials: false
- name: "Install cargo shear"
uses: taiki-e/install-action@d850aa816998e5cf15f67a78c7b933f2a5033f8a # v2.63.3
uses: taiki-e/install-action@a416ddeedbd372e614cc1386e8b642692f66865e # v2.57.1
with:
tool: cargo-shear
- run: cargo shear
@ -289,7 +289,6 @@ jobs:
UV_HTTP_RETRIES: 5
run: |
cargo nextest run \
--cargo-profile fast-build \
--features python-patch,native-auth,secret-service \
--workspace \
--status-level skip --failure-output immediate-final --no-fail-fast -j 20 --final-status-level slow
@ -331,7 +330,6 @@ jobs:
UV_HTTP_RETRIES: 5
run: |
cargo nextest run \
--cargo-profile fast-build \
--no-default-features \
--features python,python-managed,pypi,git,git-lfs,performance,crates-io,native-auth,apple-native \
--workspace \
@ -387,7 +385,6 @@ jobs:
shell: bash
run: |
cargo nextest run \
--cargo-profile fast-build \
--no-default-features \
--features python,pypi,python-managed,native-auth,windows-native \
--workspace \
@ -564,15 +561,15 @@ jobs:
- uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2.8.2
- name: "Build"
run: cargo build --profile no-debug
run: cargo build
- name: "Upload binary"
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: uv-linux-libc-${{ github.sha }}
path: |
./target/no-debug/uv
./target/no-debug/uvx
./target/debug/uv
./target/debug/uvx
retention-days: 1
build-binary-linux-aarch64:
@ -591,15 +588,15 @@ jobs:
- uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2.8.2
- name: "Build"
run: cargo build --profile no-debug
run: cargo build
- name: "Upload binary"
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: uv-linux-aarch64-${{ github.sha }}
path: |
./target/no-debug/uv
./target/no-debug/uvx
./target/debug/uv
./target/debug/uvx
retention-days: 1
build-binary-linux-musl:
@ -623,15 +620,15 @@ jobs:
- uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2.8.2
- name: "Build"
run: cargo build --profile no-debug --target x86_64-unknown-linux-musl --bin uv --bin uvx
run: cargo build --target x86_64-unknown-linux-musl --bin uv --bin uvx
- name: "Upload binary"
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: uv-linux-musl-${{ github.sha }}
path: |
./target/x86_64-unknown-linux-musl/no-debug/uv
./target/x86_64-unknown-linux-musl/no-debug/uvx
./target/x86_64-unknown-linux-musl/debug/uv
./target/x86_64-unknown-linux-musl/debug/uvx
retention-days: 1
build-binary-macos-aarch64:
@ -649,15 +646,15 @@ jobs:
- uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2.8.2
- name: "Build"
run: cargo build --profile no-debug --bin uv --bin uvx
run: cargo build --bin uv --bin uvx
- name: "Upload binary"
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: uv-macos-aarch64-${{ github.sha }}
path: |
./target/no-debug/uv
./target/no-debug/uvx
./target/debug/uv
./target/debug/uvx
retention-days: 1
build-binary-macos-x86_64:
@ -675,15 +672,15 @@ jobs:
- uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2.8.2
- name: "Build"
run: cargo build --profile no-debug --bin uv --bin uvx
run: cargo build --bin uv --bin uvx
- name: "Upload binary"
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: uv-macos-x86_64-${{ github.sha }}
path: |
./target/no-debug/uv
./target/no-debug/uvx
./target/debug/uv
./target/debug/uvx
retention-days: 1
build-binary-windows-x86_64:
@ -711,15 +708,15 @@ jobs:
- name: "Build"
working-directory: ${{ env.UV_WORKSPACE }}
run: cargo build --profile no-debug --bin uv --bin uvx
run: cargo build --bin uv --bin uvx
- name: "Upload binary"
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: uv-windows-x86_64-${{ github.sha }}
path: |
${{ env.UV_WORKSPACE }}/target/no-debug/uv.exe
${{ env.UV_WORKSPACE }}/target/no-debug/uvx.exe
${{ env.UV_WORKSPACE }}/target/debug/uv.exe
${{ env.UV_WORKSPACE }}/target/debug/uvx.exe
retention-days: 1
build-binary-windows-aarch64:
@ -751,15 +748,15 @@ jobs:
- name: "Build"
working-directory: ${{ env.UV_WORKSPACE }}
run: cargo build --profile no-debug --target aarch64-pc-windows-msvc
run: cargo build --target aarch64-pc-windows-msvc
- name: "Upload binary"
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: uv-windows-aarch64-${{ github.sha }}
path: |
${{ env.UV_WORKSPACE }}/target/aarch64-pc-windows-msvc/no-debug/uv.exe
${{ env.UV_WORKSPACE }}/target/aarch64-pc-windows-msvc/no-debug/uvx.exe
${{ env.UV_WORKSPACE }}/target/aarch64-pc-windows-msvc/debug/uv.exe
${{ env.UV_WORKSPACE }}/target/aarch64-pc-windows-msvc/debug/uvx.exe
retention-days: 1
build-binary-msrv:
@ -784,10 +781,10 @@ jobs:
- name: "Install mold"
uses: rui314/setup-mold@725a8794d15fc7563f59595bd9556495c0564878 # v1
- uses: Swatinem/rust-cache@779680da715d629ac1d338a641029a2f4372abb5 # v2.8.2
- run: cargo +${MSRV} build --profile no-debug
- run: cargo +${MSRV} build
env:
MSRV: ${{ steps.msrv.outputs.value }}
- run: ./target/no-debug/uv --version
- run: ./target/debug/uv --version
build-binary-freebsd:
needs: determine_changes
@ -808,7 +805,7 @@ jobs:
chmod +x cross
mv cross /usr/local/bin/cross
cross build --target x86_64-unknown-freebsd --profile no-debug
cross build --target x86_64-unknown-freebsd
- name: Test in Firecracker VM
uses: acj/freebsd-firecracker-action@a5a3fc1709c5b5368141a5699f10259aca3cd965 # v0.6.0
@ -822,8 +819,8 @@ jobs:
cat <<EOF > $include_path
target
target/x86_64-unknown-freebsd
target/x86_64-unknown-freebsd/no-debug
target/x86_64-unknown-freebsd/no-debug/uv
target/x86_64-unknown-freebsd/debug
target/x86_64-unknown-freebsd/debug/uv
EOF
rsync -r -e "ssh" \
@ -833,7 +830,7 @@ jobs:
--exclude "*" \
. firecracker:
run-in-vm: |
mv target/x86_64-unknown-freebsd/no-debug/uv uv
mv target/x86_64-unknown-freebsd/debug/uv uv
chmod +x uv
./uv --version

View File

@ -3,43 +3,6 @@
<!-- prettier-ignore-start -->
## 0.9.18
Released on 2025-12-16.
### Enhancements
- Add value hints to command line arguments to improve shell completion accuracy ([#17080](https://github.com/astral-sh/uv/pull/17080))
- Improve error handling in `uv publish` ([#17096](https://github.com/astral-sh/uv/pull/17096))
- Improve rendering of multiline error messages ([#17132](https://github.com/astral-sh/uv/pull/17132))
- Support redirects in `uv publish` ([#17130](https://github.com/astral-sh/uv/pull/17130))
- Include Docker images with the alpine version, e.g., `python3.x-alpine3.23` ([#17100](https://github.com/astral-sh/uv/pull/17100))
### Configuration
- Accept `--torch-backend` in `[tool.uv]` ([#17116](https://github.com/astral-sh/uv/pull/17116))
### Performance
- Speed up `uv cache size` ([#17015](https://github.com/astral-sh/uv/pull/17015))
- Initialize S3 signer once ([#17092](https://github.com/astral-sh/uv/pull/17092))
### Bug fixes
- Avoid panics due to reads on failed requests ([#17098](https://github.com/astral-sh/uv/pull/17098))
- Enforce latest-version in `@latest` requests ([#17114](https://github.com/astral-sh/uv/pull/17114))
- Explicitly set `EntryType` for file entries in tar ([#17043](https://github.com/astral-sh/uv/pull/17043))
- Ignore `pyproject.toml` index username in lockfile comparison ([#16995](https://github.com/astral-sh/uv/pull/16995))
- Relax error when using `uv add` with `UV_GIT_LFS` set ([#17127](https://github.com/astral-sh/uv/pull/17127))
- Support file locks on ExFAT on macOS ([#17115](https://github.com/astral-sh/uv/pull/17115))
- Change schema for `exclude-newer` into optional string ([#17121](https://github.com/astral-sh/uv/pull/17121))
### Documentation
- Drop arm musl caveat from Docker documentation ([#17111](https://github.com/astral-sh/uv/pull/17111))
- Fix version reference in resolver example ([#17085](https://github.com/astral-sh/uv/pull/17085))
- Better documentation for `exclude-newer*` ([#17079](https://github.com/astral-sh/uv/pull/17079))
## 0.9.17
Released on 2025-12-09.

View File

@ -1,125 +0,0 @@
# Contributor Covenant Code of Conduct
- [Our Pledge](#our-pledge)
- [Our Standards](#our-standards)
- [Enforcement Responsibilities](#enforcement-responsibilities)
- [Scope](#scope)
- [Enforcement](#enforcement)
- [Enforcement Guidelines](#enforcement-guidelines)
- [1. Correction](#1-correction)
- [2. Warning](#2-warning)
- [3. Temporary Ban](#3-temporary-ban)
- [4. Permanent Ban](#4-permanent-ban)
- [Attribution](#attribution)
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our community a
harassment-free experience for everyone, regardless of age, body size, visible or invisible
disability, ethnicity, sex characteristics, gender identity and expression, level of experience,
education, socio-economic status, nationality, personal appearance, race, religion, or sexual
identity and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and
healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our community include:
- Demonstrating empathy and kindness toward other people
- Being respectful of differing opinions, viewpoints, and experiences
- Giving and gracefully accepting constructive feedback
- Accepting responsibility and apologizing to those affected by our mistakes, and learning from the
experience
- Focusing on what is best not just for us as individuals, but for the overall community
Examples of unacceptable behavior include:
- The use of sexualized language or imagery, and sexual attention or advances of any kind
- Trolling, insulting or derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or email address, without their
explicit permission
- Other conduct which could reasonably be considered inappropriate in a professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior
and will take appropriate and fair corrective action in response to any behavior that they deem
inappropriate, threatening, offensive, or harmful.
Community leaders have the right and responsibility to remove, edit, or reject comments, commits,
code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and
will communicate reasons for moderation decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when an individual is
officially representing the community in public spaces. Examples of representing our community
include using an official e-mail address, posting via an official social media account, or acting as
an appointed representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community
leaders responsible for enforcement at <hey@astral.sh>. All complaints will be reviewed and
investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the reporter of any
incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining the consequences for
any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or
unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing clarity around the
nature of the violation and an explanation of why the behavior was inappropriate. A public apology
may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series of actions.
**Consequence**: A warning with consequences for continued behavior. No interaction with the people
involved, including unsolicited interaction with those enforcing the Code of Conduct, for a
specified period of time. This includes avoiding interactions in community spaces as well as
external channels like social media. Violating these terms may lead to a temporary or permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including sustained inappropriate
behavior.
**Consequence**: A temporary ban from any sort of interaction or public communication with the
community for a specified period of time. No public or private interaction with the people involved,
including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this
period. Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community standards, including
sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement
of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0, available
[here](https://www.contributor-covenant.org/version/2/0/code_of_conduct.html).
Community Impact Guidelines were inspired by
[Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity).
For answers to common questions about this code of conduct, see the
[FAQ](https://www.contributor-covenant.org/faq). Translations are available
[here](https://www.contributor-covenant.org/translations).
[homepage]: https://www.contributor-covenant.org

View File

@ -102,15 +102,6 @@ cargo run -- venv
cargo run -- pip install requests
```
## Crate structure
Rust does not allow circular dependencies between crates. To visualize the crate hierarchy, install
[cargo-depgraph](https://github.com/jplatte/cargo-depgraph) and graphviz, then run:
```shell
cargo depgraph --dedup-transitive-deps --workspace-only | dot -Tpng > graph.png
```
## Running inside a Docker container
Source distributions can run arbitrary code on build and can make unwanted modifications to your

166
Cargo.lock generated
View File

@ -1038,15 +1038,6 @@ dependencies = [
"itertools 0.10.5",
]
[[package]]
name = "crossbeam-channel"
version = "0.5.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2"
dependencies = [
"crossbeam-utils",
]
[[package]]
name = "crossbeam-deque"
version = "0.8.6"
@ -1264,16 +1255,6 @@ dependencies = [
"windows-sys 0.61.0",
]
[[package]]
name = "diskus"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec07379c016f78e7ddcd953663b9ed17928ff384928d34d824ed7e463bd3d908"
dependencies = [
"crossbeam-channel",
"rayon",
]
[[package]]
name = "dispatch2"
version = "0.3.0"
@ -3462,9 +3443,9 @@ dependencies = [
[[package]]
name = "rayon"
version = "1.11.0"
version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f"
checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa"
dependencies = [
"either",
"rayon-core",
@ -3472,9 +3453,9 @@ dependencies = [
[[package]]
name = "rayon-core"
version = "1.13.0"
version = "1.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91"
checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2"
dependencies = [
"crossbeam-deque",
"crossbeam-utils",
@ -4397,9 +4378,9 @@ dependencies = [
[[package]]
name = "spdx"
version = "0.13.2"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "35107b1c818f4e9cb9e6c4444ca560ba03b4ee1288dcecc6d7830c2023a7609e"
checksum = "41cf87c0efffc158b9dde4d6e0567a43e4383adc4c949e687a2039732db2f23a"
dependencies = [
"smallvec",
]
@ -5406,7 +5387,7 @@ dependencies = [
[[package]]
name = "uv"
version = "0.9.18"
version = "0.9.17"
dependencies = [
"anstream",
"anyhow",
@ -5421,7 +5402,6 @@ dependencies = [
"clap",
"console 0.16.1",
"ctrlc",
"diskus",
"dotenvy",
"dunce",
"embed-manifest",
@ -5429,6 +5409,7 @@ dependencies = [
"flate2",
"fs-err",
"futures",
"h2",
"http",
"ignore",
"indexmap",
@ -5525,7 +5506,7 @@ dependencies = [
[[package]]
name = "uv-auth"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"anyhow",
"arcstr",
@ -5568,7 +5549,7 @@ dependencies = [
[[package]]
name = "uv-bench"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"anyhow",
"codspeed-criterion-compat",
@ -5595,7 +5576,7 @@ dependencies = [
[[package]]
name = "uv-bin-install"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"astral-reqwest-middleware",
"astral-reqwest-retry",
@ -5612,6 +5593,7 @@ dependencies = [
"uv-client",
"uv-distribution-filename",
"uv-extract",
"uv-fs",
"uv-pep440",
"uv-platform",
"uv-redacted",
@ -5619,7 +5601,7 @@ dependencies = [
[[package]]
name = "uv-build"
version = "0.9.18"
version = "0.9.17"
dependencies = [
"anstream",
"anyhow",
@ -5631,7 +5613,7 @@ dependencies = [
[[package]]
name = "uv-build-backend"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"astral-version-ranges",
"base64 0.22.1",
@ -5647,7 +5629,7 @@ dependencies = [
"schemars",
"serde",
"sha2",
"spdx 0.13.2",
"spdx 0.12.0",
"tar",
"tempfile",
"thiserror 2.0.17",
@ -5671,7 +5653,7 @@ dependencies = [
[[package]]
name = "uv-build-frontend"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"anstream",
"fs-err",
@ -5709,7 +5691,7 @@ dependencies = [
[[package]]
name = "uv-cache"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"clap",
"fs-err",
@ -5719,7 +5701,6 @@ dependencies = [
"same-file",
"serde",
"tempfile",
"thiserror 2.0.17",
"tracing",
"uv-cache-info",
"uv-cache-key",
@ -5735,7 +5716,7 @@ dependencies = [
[[package]]
name = "uv-cache-info"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"anyhow",
"fs-err",
@ -5752,7 +5733,7 @@ dependencies = [
[[package]]
name = "uv-cache-key"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"hex",
"memchr",
@ -5764,7 +5745,7 @@ dependencies = [
[[package]]
name = "uv-cli"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"anstream",
"anyhow",
@ -5796,7 +5777,7 @@ dependencies = [
[[package]]
name = "uv-client"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"anyhow",
"astral-reqwest-middleware",
@ -5859,7 +5840,7 @@ dependencies = [
[[package]]
name = "uv-configuration"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"anyhow",
"clap",
@ -5888,14 +5869,14 @@ dependencies = [
[[package]]
name = "uv-console"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"console 0.16.1",
]
[[package]]
name = "uv-dev"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"anstream",
"anyhow",
@ -5944,7 +5925,7 @@ dependencies = [
[[package]]
name = "uv-dirs"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"assert_fs",
"etcetera",
@ -5956,7 +5937,7 @@ dependencies = [
[[package]]
name = "uv-dispatch"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"anyhow",
"futures",
@ -5988,7 +5969,7 @@ dependencies = [
[[package]]
name = "uv-distribution"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"anyhow",
"astral-reqwest-middleware",
@ -6037,7 +6018,7 @@ dependencies = [
[[package]]
name = "uv-distribution-filename"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"insta",
"memchr",
@ -6054,7 +6035,7 @@ dependencies = [
[[package]]
name = "uv-distribution-types"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"arcstr",
"astral-version-ranges",
@ -6094,7 +6075,7 @@ dependencies = [
[[package]]
name = "uv-extract"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"astral-tokio-tar",
"astral_async_zip",
@ -6124,14 +6105,14 @@ dependencies = [
[[package]]
name = "uv-flags"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"bitflags 2.9.4",
]
[[package]]
name = "uv-fs"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"backon",
"dunce",
@ -6155,7 +6136,7 @@ dependencies = [
[[package]]
name = "uv-git"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"anyhow",
"astral-reqwest-middleware",
@ -6181,7 +6162,7 @@ dependencies = [
[[package]]
name = "uv-git-types"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"serde",
"thiserror 2.0.17",
@ -6193,7 +6174,7 @@ dependencies = [
[[package]]
name = "uv-globfilter"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"anstream",
"fs-err",
@ -6210,7 +6191,7 @@ dependencies = [
[[package]]
name = "uv-install-wheel"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"anyhow",
"assert_fs",
@ -6250,7 +6231,7 @@ dependencies = [
[[package]]
name = "uv-installer"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"anyhow",
"async-channel",
@ -6291,7 +6272,7 @@ dependencies = [
[[package]]
name = "uv-keyring"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"async-trait",
"byteorder",
@ -6308,7 +6289,7 @@ dependencies = [
[[package]]
name = "uv-logging"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"jiff",
"owo-colors",
@ -6318,7 +6299,7 @@ dependencies = [
[[package]]
name = "uv-macros"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"proc-macro2",
"quote",
@ -6328,7 +6309,7 @@ dependencies = [
[[package]]
name = "uv-metadata"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"astral_async_zip",
"fs-err",
@ -6345,7 +6326,7 @@ dependencies = [
[[package]]
name = "uv-normalize"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"rkyv",
"schemars",
@ -6355,7 +6336,7 @@ dependencies = [
[[package]]
name = "uv-once-map"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"dashmap",
"futures",
@ -6364,14 +6345,14 @@ dependencies = [
[[package]]
name = "uv-options-metadata"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"serde",
]
[[package]]
name = "uv-pep440"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"astral-version-ranges",
"indoc",
@ -6385,7 +6366,7 @@ dependencies = [
[[package]]
name = "uv-pep508"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"arcstr",
"astral-version-ranges",
@ -6414,7 +6395,7 @@ dependencies = [
[[package]]
name = "uv-performance-memory-allocator"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"mimalloc",
"tikv-jemallocator",
@ -6422,7 +6403,7 @@ dependencies = [
[[package]]
name = "uv-platform"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"fs-err",
"goblin",
@ -6439,7 +6420,7 @@ dependencies = [
[[package]]
name = "uv-platform-tags"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"insta",
"memchr",
@ -6452,7 +6433,7 @@ dependencies = [
[[package]]
name = "uv-preview"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"bitflags 2.9.4",
"thiserror 2.0.17",
@ -6461,10 +6442,9 @@ dependencies = [
[[package]]
name = "uv-publish"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"ambient-id",
"anstream",
"astral-reqwest-middleware",
"astral-reqwest-retry",
"astral-tokio-tar",
@ -6498,12 +6478,11 @@ dependencies = [
"uv-redacted",
"uv-static",
"uv-warnings",
"wiremock",
]
[[package]]
name = "uv-pypi-types"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"anyhow",
"hashbrown 0.16.1",
@ -6535,7 +6514,7 @@ dependencies = [
[[package]]
name = "uv-python"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"anyhow",
"assert_fs",
@ -6597,7 +6576,7 @@ dependencies = [
[[package]]
name = "uv-redacted"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"ref-cast",
"schemars",
@ -6608,7 +6587,7 @@ dependencies = [
[[package]]
name = "uv-requirements"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"anyhow",
"configparser",
@ -6643,7 +6622,7 @@ dependencies = [
[[package]]
name = "uv-requirements-txt"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"anyhow",
"assert_fs",
@ -6676,7 +6655,7 @@ dependencies = [
[[package]]
name = "uv-resolver"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"arcstr",
"astral-pubgrub",
@ -6741,7 +6720,7 @@ dependencies = [
[[package]]
name = "uv-scripts"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"fs-err",
"indoc",
@ -6765,7 +6744,7 @@ dependencies = [
[[package]]
name = "uv-settings"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"clap",
"fs-err",
@ -6800,7 +6779,7 @@ dependencies = [
[[package]]
name = "uv-shell"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"anyhow",
"fs-err",
@ -6817,7 +6796,7 @@ dependencies = [
[[package]]
name = "uv-small-str"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"arcstr",
"rkyv",
@ -6827,7 +6806,7 @@ dependencies = [
[[package]]
name = "uv-state"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"fs-err",
"tempfile",
@ -6836,14 +6815,14 @@ dependencies = [
[[package]]
name = "uv-static"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"uv-macros",
]
[[package]]
name = "uv-tool"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"fs-err",
"pathdiff",
@ -6872,7 +6851,7 @@ dependencies = [
[[package]]
name = "uv-torch"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"clap",
"either",
@ -6892,7 +6871,7 @@ dependencies = [
[[package]]
name = "uv-trampoline-builder"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"anyhow",
"assert_cmd",
@ -6909,7 +6888,7 @@ dependencies = [
[[package]]
name = "uv-types"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"anyhow",
"dashmap",
@ -6931,11 +6910,11 @@ dependencies = [
[[package]]
name = "uv-version"
version = "0.9.18"
version = "0.9.17"
[[package]]
name = "uv-virtualenv"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"console 0.16.1",
"fs-err",
@ -6957,19 +6936,16 @@ dependencies = [
[[package]]
name = "uv-warnings"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"anstream",
"anyhow",
"indoc",
"insta",
"owo-colors",
"rustc-hash",
]
[[package]]
name = "uv-workspace"
version = "0.0.8"
version = "0.0.7"
dependencies = [
"anyhow",
"assert_fs",

View File

@ -16,64 +16,64 @@ authors = ["uv"]
license = "MIT OR Apache-2.0"
[workspace.dependencies]
uv-auth = { version = "0.0.8", path = "crates/uv-auth" }
uv-bin-install = { version = "0.0.8", path = "crates/uv-bin-install" }
uv-build-backend = { version = "0.0.8", path = "crates/uv-build-backend" }
uv-build-frontend = { version = "0.0.8", path = "crates/uv-build-frontend" }
uv-cache = { version = "0.0.8", path = "crates/uv-cache" }
uv-cache-info = { version = "0.0.8", path = "crates/uv-cache-info" }
uv-cache-key = { version = "0.0.8", path = "crates/uv-cache-key" }
uv-cli = { version = "0.0.8", path = "crates/uv-cli" }
uv-client = { version = "0.0.8", path = "crates/uv-client" }
uv-configuration = { version = "0.0.8", path = "crates/uv-configuration" }
uv-console = { version = "0.0.8", path = "crates/uv-console" }
uv-dirs = { version = "0.0.8", path = "crates/uv-dirs" }
uv-dispatch = { version = "0.0.8", path = "crates/uv-dispatch" }
uv-distribution = { version = "0.0.8", path = "crates/uv-distribution" }
uv-distribution-filename = { version = "0.0.8", path = "crates/uv-distribution-filename" }
uv-distribution-types = { version = "0.0.8", path = "crates/uv-distribution-types" }
uv-extract = { version = "0.0.8", path = "crates/uv-extract" }
uv-flags = { version = "0.0.8", path = "crates/uv-flags" }
uv-fs = { version = "0.0.8", path = "crates/uv-fs", features = ["serde", "tokio"] }
uv-git = { version = "0.0.8", path = "crates/uv-git" }
uv-git-types = { version = "0.0.8", path = "crates/uv-git-types" }
uv-globfilter = { version = "0.0.8", path = "crates/uv-globfilter" }
uv-install-wheel = { version = "0.0.8", path = "crates/uv-install-wheel", default-features = false }
uv-installer = { version = "0.0.8", path = "crates/uv-installer" }
uv-keyring = { version = "0.0.8", path = "crates/uv-keyring" }
uv-logging = { version = "0.0.8", path = "crates/uv-logging" }
uv-macros = { version = "0.0.8", path = "crates/uv-macros" }
uv-metadata = { version = "0.0.8", path = "crates/uv-metadata" }
uv-normalize = { version = "0.0.8", path = "crates/uv-normalize" }
uv-once-map = { version = "0.0.8", path = "crates/uv-once-map" }
uv-options-metadata = { version = "0.0.8", path = "crates/uv-options-metadata" }
uv-performance-memory-allocator = { version = "0.0.8", path = "crates/uv-performance-memory-allocator" }
uv-pep440 = { version = "0.0.8", path = "crates/uv-pep440", features = ["tracing", "rkyv", "version-ranges"] }
uv-pep508 = { version = "0.0.8", path = "crates/uv-pep508", features = ["non-pep508-extensions"] }
uv-platform = { version = "0.0.8", path = "crates/uv-platform" }
uv-platform-tags = { version = "0.0.8", path = "crates/uv-platform-tags" }
uv-preview = { version = "0.0.8", path = "crates/uv-preview" }
uv-publish = { version = "0.0.8", path = "crates/uv-publish" }
uv-pypi-types = { version = "0.0.8", path = "crates/uv-pypi-types" }
uv-python = { version = "0.0.8", path = "crates/uv-python" }
uv-redacted = { version = "0.0.8", path = "crates/uv-redacted" }
uv-requirements = { version = "0.0.8", path = "crates/uv-requirements" }
uv-requirements-txt = { version = "0.0.8", path = "crates/uv-requirements-txt" }
uv-resolver = { version = "0.0.8", path = "crates/uv-resolver" }
uv-scripts = { version = "0.0.8", path = "crates/uv-scripts" }
uv-settings = { version = "0.0.8", path = "crates/uv-settings" }
uv-shell = { version = "0.0.8", path = "crates/uv-shell" }
uv-small-str = { version = "0.0.8", path = "crates/uv-small-str" }
uv-state = { version = "0.0.8", path = "crates/uv-state" }
uv-static = { version = "0.0.8", path = "crates/uv-static" }
uv-tool = { version = "0.0.8", path = "crates/uv-tool" }
uv-torch = { version = "0.0.8", path = "crates/uv-torch" }
uv-trampoline-builder = { version = "0.0.8", path = "crates/uv-trampoline-builder" }
uv-types = { version = "0.0.8", path = "crates/uv-types" }
uv-version = { version = "0.9.18", path = "crates/uv-version" }
uv-virtualenv = { version = "0.0.8", path = "crates/uv-virtualenv" }
uv-warnings = { version = "0.0.8", path = "crates/uv-warnings" }
uv-workspace = { version = "0.0.8", path = "crates/uv-workspace" }
uv-auth = { version = "0.0.7", path = "crates/uv-auth" }
uv-bin-install = { version = "0.0.7", path = "crates/uv-bin-install" }
uv-build-backend = { version = "0.0.7", path = "crates/uv-build-backend" }
uv-build-frontend = { version = "0.0.7", path = "crates/uv-build-frontend" }
uv-cache = { version = "0.0.7", path = "crates/uv-cache" }
uv-cache-info = { version = "0.0.7", path = "crates/uv-cache-info" }
uv-cache-key = { version = "0.0.7", path = "crates/uv-cache-key" }
uv-cli = { version = "0.0.7", path = "crates/uv-cli" }
uv-client = { version = "0.0.7", path = "crates/uv-client" }
uv-configuration = { version = "0.0.7", path = "crates/uv-configuration" }
uv-console = { version = "0.0.7", path = "crates/uv-console" }
uv-dirs = { version = "0.0.7", path = "crates/uv-dirs" }
uv-dispatch = { version = "0.0.7", path = "crates/uv-dispatch" }
uv-distribution = { version = "0.0.7", path = "crates/uv-distribution" }
uv-distribution-filename = { version = "0.0.7", path = "crates/uv-distribution-filename" }
uv-distribution-types = { version = "0.0.7", path = "crates/uv-distribution-types" }
uv-extract = { version = "0.0.7", path = "crates/uv-extract" }
uv-flags = { version = "0.0.7", path = "crates/uv-flags" }
uv-fs = { version = "0.0.7", path = "crates/uv-fs", features = ["serde", "tokio"] }
uv-git = { version = "0.0.7", path = "crates/uv-git" }
uv-git-types = { version = "0.0.7", path = "crates/uv-git-types" }
uv-globfilter = { version = "0.0.7", path = "crates/uv-globfilter" }
uv-install-wheel = { version = "0.0.7", path = "crates/uv-install-wheel", default-features = false }
uv-installer = { version = "0.0.7", path = "crates/uv-installer" }
uv-keyring = { version = "0.0.7", path = "crates/uv-keyring" }
uv-logging = { version = "0.0.7", path = "crates/uv-logging" }
uv-macros = { version = "0.0.7", path = "crates/uv-macros" }
uv-metadata = { version = "0.0.7", path = "crates/uv-metadata" }
uv-normalize = { version = "0.0.7", path = "crates/uv-normalize" }
uv-once-map = { version = "0.0.7", path = "crates/uv-once-map" }
uv-options-metadata = { version = "0.0.7", path = "crates/uv-options-metadata" }
uv-performance-memory-allocator = { version = "0.0.7", path = "crates/uv-performance-memory-allocator" }
uv-pep440 = { version = "0.0.7", path = "crates/uv-pep440", features = ["tracing", "rkyv", "version-ranges"] }
uv-pep508 = { version = "0.0.7", path = "crates/uv-pep508", features = ["non-pep508-extensions"] }
uv-platform = { version = "0.0.7", path = "crates/uv-platform" }
uv-platform-tags = { version = "0.0.7", path = "crates/uv-platform-tags" }
uv-preview = { version = "0.0.7", path = "crates/uv-preview" }
uv-publish = { version = "0.0.7", path = "crates/uv-publish" }
uv-pypi-types = { version = "0.0.7", path = "crates/uv-pypi-types" }
uv-python = { version = "0.0.7", path = "crates/uv-python" }
uv-redacted = { version = "0.0.7", path = "crates/uv-redacted" }
uv-requirements = { version = "0.0.7", path = "crates/uv-requirements" }
uv-requirements-txt = { version = "0.0.7", path = "crates/uv-requirements-txt" }
uv-resolver = { version = "0.0.7", path = "crates/uv-resolver" }
uv-scripts = { version = "0.0.7", path = "crates/uv-scripts" }
uv-settings = { version = "0.0.7", path = "crates/uv-settings" }
uv-shell = { version = "0.0.7", path = "crates/uv-shell" }
uv-small-str = { version = "0.0.7", path = "crates/uv-small-str" }
uv-state = { version = "0.0.7", path = "crates/uv-state" }
uv-static = { version = "0.0.7", path = "crates/uv-static" }
uv-tool = { version = "0.0.7", path = "crates/uv-tool" }
uv-torch = { version = "0.0.7", path = "crates/uv-torch" }
uv-trampoline-builder = { version = "0.0.7", path = "crates/uv-trampoline-builder" }
uv-types = { version = "0.0.7", path = "crates/uv-types" }
uv-version = { version = "0.9.17", path = "crates/uv-version" }
uv-virtualenv = { version = "0.0.7", path = "crates/uv-virtualenv" }
uv-warnings = { version = "0.0.7", path = "crates/uv-warnings" }
uv-workspace = { version = "0.0.7", path = "crates/uv-workspace" }
ambient-id = { version = "0.0.7", default-features = false, features = ["astral-reqwest-middleware"] }
anstream = { version = "0.6.15" }
@ -103,7 +103,6 @@ ctrlc = { version = "3.4.5" }
cyclonedx-bom = { version = "0.8.0" }
dashmap = { version = "6.1.0" }
data-encoding = { version = "2.6.0" }
diskus = { version = "0.9.0", default-features = false }
dotenvy = { version = "0.15.7" }
dunce = { version = "1.0.5" }
either = { version = "1.13.0" }
@ -170,7 +169,7 @@ serde-untagged = { version = "0.1.6" }
serde_json = { version = "1.0.128" }
sha2 = { version = "0.10.8" }
smallvec = { version = "1.13.2" }
spdx = { version = "0.13.0" }
spdx = { version = "0.12.0" }
syn = { version = "2.0.77" }
sys-info = { version = "0.9.1" }
tar = { version = "0.4.43" }
@ -225,6 +224,9 @@ test-log = { version = "0.2.16", features = ["trace"], default-features = false
tokio-rustls = { version = "0.26.2", default-features = false }
whoami = { version = "1.6.0" }
[workspace.metadata.cargo-shear]
ignored = ["flate2", "xz2", "h2", "uv-performance-memory-allocator"]
[workspace.lints.rust]
unsafe_code = "warn"
unreachable_pub = "warn"
@ -310,21 +312,12 @@ strip = false
debug = "full"
lto = false
# Profile for fast test execution: Skip debug info generation, and
# apply basic optimization, which speed up build and running tests.
[profile.fast-build]
inherits = "dev"
opt-level = 1
debug = 0
strip = "debuginfo"
# Profile for faster builds: Skip debug info generation, for faster
# builds of smaller binaries.
[profile.no-debug]
inherits = "dev"
debug = 0
strip = "debuginfo"
# Profile to build a minimally sized binary for uv-build
[profile.minimal-size]
inherits = "release"

View File

@ -42,7 +42,7 @@ An extremely fast Python package and project manager, written in Rust.
- 🖥️ Supports macOS, Linux, and Windows.
uv is backed by [Astral](https://astral.sh), the creators of
[Ruff](https://github.com/astral-sh/ruff) and [ty](https://github.com/astral-sh/ty).
[Ruff](https://github.com/astral-sh/ruff).
## Installation
@ -192,12 +192,14 @@ uv installs Python and allows quickly switching between versions.
Install multiple Python versions:
```console
$ uv python install 3.12 3.13 3.14
Installed 3 versions in 972ms
+ cpython-3.12.12-macos-aarch64-none (python3.12)
+ cpython-3.13.9-macos-aarch64-none (python3.13)
+ cpython-3.14.0-macos-aarch64-none (python3.14)
$ uv python install 3.10 3.11 3.12
Searching for Python versions matching: Python 3.10
Searching for Python versions matching: Python 3.11
Searching for Python versions matching: Python 3.12
Installed 3 versions in 3.42s
+ cpython-3.10.14-macos-aarch64-none
+ cpython-3.11.9-macos-aarch64-none
+ cpython-3.12.4-macos-aarch64-none
```
Download Python versions as needed:
@ -268,6 +270,14 @@ Installed 43 packages in 208ms
See the [pip interface documentation](https://docs.astral.sh/uv/pip/index/) to get started.
## Platform support
See uv's [platform support](https://docs.astral.sh/uv/reference/platforms/) document.
## Versioning policy
See uv's [versioning policy](https://docs.astral.sh/uv/reference/versioning/) document.
## Contributing
We are passionate about supporting contributors of all levels of experience and would love to see
@ -284,15 +294,6 @@ It's pronounced as "you - vee" ([`/juː viː/`](https://en.wikipedia.org/wiki/He
Just "uv", please. See the [style guide](./STYLE.md#styling-uv) for details.
#### What platforms does uv support?
See uv's [platform support](https://docs.astral.sh/uv/reference/platforms/) document.
#### Is uv ready for production?
Yes, uv is stable and widely used in production. See uv's
[versioning policy](https://docs.astral.sh/uv/reference/versioning/) document for details.
## Acknowledgements
uv's dependency resolver uses [PubGrub](https://github.com/pubgrub-rs/pubgrub) under the hood. We're

View File

@ -1,6 +1,6 @@
[package]
name = "uv-auth"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-auth).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-auth).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -129,15 +129,6 @@ enum TokenState {
Initialized(Option<AccessToken>),
}
#[derive(Clone)]
enum S3CredentialState {
/// The S3 credential state has not yet been initialized.
Uninitialized,
/// The S3 credential state has been initialized, with either a signer or `None` if
/// no S3 endpoint is configured.
Initialized(Option<Arc<Authentication>>),
}
/// A middleware that adds basic authentication to requests.
///
/// Uses a cache to propagate credentials from previously seen requests and
@ -159,8 +150,6 @@ pub struct AuthMiddleware {
pyx_token_store: Option<PyxTokenStore>,
/// Tokens to use for persistent credentials.
pyx_token_state: Mutex<TokenState>,
/// Cached S3 credentials to avoid running the credential helper multiple times.
s3_credential_state: Mutex<S3CredentialState>,
preview: Preview,
}
@ -183,7 +172,6 @@ impl AuthMiddleware {
base_client: None,
pyx_token_store: None,
pyx_token_state: Mutex::new(TokenState::Uninitialized),
s3_credential_state: Mutex::new(S3CredentialState::Uninitialized),
preview: Preview::default(),
}
}
@ -690,26 +678,13 @@ impl AuthMiddleware {
return Some(credentials);
}
if S3EndpointProvider::is_s3_endpoint(url, self.preview) {
let mut s3_state = self.s3_credential_state.lock().await;
// If the S3 credential state is uninitialized, initialize it.
let credentials = match &*s3_state {
S3CredentialState::Uninitialized => {
trace!("Initializing S3 credentials for {url}");
let signer = S3EndpointProvider::create_signer();
let credentials = Arc::new(Authentication::from(signer));
*s3_state = S3CredentialState::Initialized(Some(credentials.clone()));
Some(credentials)
}
S3CredentialState::Initialized(credentials) => credentials.clone(),
};
if let Some(credentials) = credentials {
debug!("Found S3 credentials for {url}");
self.cache().fetches.done(key, Some(credentials.clone()));
return Some(credentials);
}
if let Some(credentials) = S3EndpointProvider::credentials_for(url, self.preview)
.map(Authentication::from)
.map(Arc::new)
{
debug!("Found S3 credentials for {url}");
self.cache().fetches.done(key, Some(credentials.clone()));
return Some(credentials);
}
// If this is a known URL, authenticate it via the token store.

View File

@ -66,8 +66,8 @@ static S3_ENDPOINT_REALM: LazyLock<Option<Realm>> = LazyLock::new(|| {
pub(crate) struct S3EndpointProvider;
impl S3EndpointProvider {
/// Returns `true` if the URL matches the configured S3 endpoint.
pub(crate) fn is_s3_endpoint(url: &Url, preview: Preview) -> bool {
/// Returns the credentials for the S3 endpoint, if available.
pub(crate) fn credentials_for(url: &Url, preview: Preview) -> Option<DefaultSigner> {
if let Some(s3_endpoint_realm) = S3_ENDPOINT_REALM.as_ref().map(RealmRef::from) {
if !preview.is_enabled(PreviewFeatures::S3_ENDPOINT) {
warn_user_once!(
@ -79,26 +79,19 @@ impl S3EndpointProvider {
// Treat any URL on the same domain or subdomain as available for S3 signing.
let realm = RealmRef::from(url);
if realm == s3_endpoint_realm || realm.is_subdomain_of(s3_endpoint_realm) {
return true;
// TODO(charlie): Can `reqsign` infer the region for us? Profiles, for example,
// often have a region set already.
let region = std::env::var(EnvVars::AWS_REGION)
.map(Cow::Owned)
.unwrap_or_else(|_| {
std::env::var(EnvVars::AWS_DEFAULT_REGION)
.map(Cow::Owned)
.unwrap_or_else(|_| Cow::Borrowed("us-east-1"))
});
let signer = reqsign::aws::default_signer("s3", &region);
return Some(signer);
}
}
false
}
/// Creates a new S3 signer with the configured region.
///
/// This is potentially expensive as it may invoke credential helpers, so the result
/// should be cached.
pub(crate) fn create_signer() -> DefaultSigner {
// TODO(charlie): Can `reqsign` infer the region for us? Profiles, for example,
// often have a region set already.
let region = std::env::var(EnvVars::AWS_REGION)
.map(Cow::Owned)
.unwrap_or_else(|_| {
std::env::var(EnvVars::AWS_DEFAULT_REGION)
.map(Cow::Owned)
.unwrap_or_else(|_| Cow::Borrowed("us-east-1"))
});
reqsign::aws::default_signer("s3", &region)
None
}
}

View File

@ -1,6 +1,6 @@
[package]
name = "uv-bench"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
publish = false
authors = { workspace = true }
@ -22,14 +22,14 @@ name = "uv"
path = "benches/uv.rs"
harness = false
[dev-dependencies]
[dependencies]
uv-cache = { workspace = true }
uv-client = { workspace = true }
uv-configuration = { workspace = true }
uv-dispatch = { workspace = true }
uv-distribution = { workspace = true }
uv-distribution-types = { workspace = true }
uv-extract = { workspace = true }
uv-extract = { workspace = true, optional = true }
uv-install-wheel = { workspace = true }
uv-pep440 = { workspace = true }
uv-pep508 = { workspace = true }

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-bench).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-bench).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -1,6 +1,6 @@
[package]
name = "uv-bin-install"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }
@ -20,6 +20,7 @@ uv-cache = { workspace = true }
uv-client = { workspace = true }
uv-distribution-filename = { workspace = true }
uv-extract = { workspace = true }
uv-fs = { workspace = true }
uv-pep440 = { workspace = true }
uv-platform = { workspace = true }
uv-redacted = { workspace = true }

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-bin-install).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-bin-install).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -19,9 +19,10 @@ use tracing::debug;
use url::Url;
use uv_distribution_filename::SourceDistExtension;
use uv_cache::{Cache, CacheBucket, CacheEntry, Error as CacheError};
use uv_cache::{Cache, CacheBucket, CacheEntry};
use uv_client::{BaseClient, is_transient_network_error};
use uv_extract::{Error as ExtractError, stream};
use uv_fs::LockedFileError;
use uv_pep440::Version;
use uv_platform::Platform;
use uv_redacted::DisplaySafeUrl;
@ -136,7 +137,7 @@ pub enum Error {
Io(#[from] std::io::Error),
#[error(transparent)]
Cache(#[from] CacheError),
LockedFile(#[from] LockedFileError),
#[error("Failed to detect platform")]
Platform(#[from] uv_platform::Error),

View File

@ -1,6 +1,6 @@
[package]
name = "uv-build-backend"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-build-backend).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-build-backend).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -662,7 +662,7 @@ mod tests {
// Check that the source dist is reproducible across platforms.
assert_snapshot!(
format!("{:x}", sha2::Sha256::digest(fs_err::read(&source_dist_path).unwrap())),
@"bb74bff575b135bb39e5c9bce56349441fb0923bb8857e32a5eaf34ec1843967"
@"871d1f859140721b67cbeaca074e7a2740c88c38028d0509eba87d1285f1da9e"
);
// Check both the files we report and the actual files
assert_snapshot!(format_file_list(build.source_dist_list_files, src.path()), @r"

View File

@ -299,10 +299,6 @@ impl TarGzWriter {
impl DirectoryWriter for TarGzWriter {
fn write_bytes(&mut self, path: &str, bytes: &[u8]) -> Result<(), Error> {
let mut header = Header::new_gnu();
// Work around bug in Python's std tar module
// https://github.com/python/cpython/issues/141707
// https://github.com/astral-sh/uv/pull/17043#issuecomment-3636841022
header.set_entry_type(EntryType::Regular);
header.set_size(bytes.len() as u64);
// Reasonable default to avoid 0o000 permissions, the user's umask will be applied on
// unpacking.
@ -316,10 +312,6 @@ impl DirectoryWriter for TarGzWriter {
fn write_file(&mut self, path: &str, file: &Path) -> Result<(), Error> {
let metadata = fs_err::metadata(file)?;
let mut header = Header::new_gnu();
// Work around bug in Python's std tar module
// https://github.com/python/cpython/issues/141707
// https://github.com/astral-sh/uv/pull/17043#issuecomment-3636841022
header.set_entry_type(EntryType::Regular);
// Preserve the executable bit, especially for scripts
#[cfg(unix)]
let executable_bit = {

View File

@ -1,6 +1,6 @@
[package]
name = "uv-build-frontend"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-build-frontend).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-build-frontend).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -1,6 +1,6 @@
[package]
name = "uv-build"
version = "0.9.18"
version = "0.9.17"
description = "A Python build backend"
edition = { workspace = true }
rust-version = { workspace = true }

View File

@ -1,6 +1,6 @@
[project]
name = "uv-build"
version = "0.9.18"
version = "0.9.17"
description = "The uv build backend"
authors = [{ name = "Astral Software Inc.", email = "hey@astral.sh" }]
requires-python = ">=3.8"

View File

@ -1,6 +1,6 @@
[package]
name = "uv-cache-info"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-cache-info).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-cache-info).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -1,6 +1,6 @@
[package]
name = "uv-cache-key"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-cache-key).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-cache-key).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -1,6 +1,6 @@
[package]
name = "uv-cache"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }
@ -34,6 +34,5 @@ rustc-hash = { workspace = true }
same-file = { workspace = true }
serde = { workspace = true, features = ["derive"] }
tempfile = { workspace = true }
thiserror = { workspace = true }
tracing = { workspace = true }
walkdir = { workspace = true }

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-cache).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-cache).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -3,7 +3,7 @@ use std::path::{Path, PathBuf};
use uv_static::EnvVars;
use crate::Cache;
use clap::{Parser, ValueHint};
use clap::Parser;
use tracing::{debug, warn};
#[derive(Parser, Debug, Clone)]
@ -27,7 +27,7 @@ pub struct CacheArgs {
/// `%LOCALAPPDATA%\uv\cache` on Windows.
///
/// To view the location of the cache directory, run `uv cache dir`.
#[arg(global = true, long, env = EnvVars::UV_CACHE_DIR, value_hint = ValueHint::DirPath)]
#[arg(global = true, long, env = EnvVars::UV_CACHE_DIR)]
pub cache_dir: Option<PathBuf>,
}

View File

@ -35,17 +35,6 @@ mod wheel;
/// Must be kept in-sync with the version in [`CacheBucket::to_str`].
pub const ARCHIVE_VERSION: u8 = 0;
/// Error locking a cache entry or shard
#[derive(Debug, thiserror::Error)]
pub enum Error {
#[error(transparent)]
Io(#[from] io::Error),
#[error("Could not make the path absolute")]
Absolute(#[source] io::Error),
#[error("Could not acquire lock")]
Acquire(#[from] LockedFileError),
}
/// A [`CacheEntry`] which may or may not exist yet.
#[derive(Debug, Clone)]
pub struct CacheEntry(PathBuf);
@ -91,14 +80,14 @@ impl CacheEntry {
}
/// Acquire the [`CacheEntry`] as an exclusive lock.
pub async fn lock(&self) -> Result<LockedFile, Error> {
pub async fn lock(&self) -> Result<LockedFile, LockedFileError> {
fs_err::create_dir_all(self.dir())?;
Ok(LockedFile::acquire(
LockedFile::acquire(
self.path(),
LockedFileMode::Exclusive,
self.path().display(),
)
.await?)
.await
}
}
@ -125,14 +114,14 @@ impl CacheShard {
}
/// Acquire the cache entry as an exclusive lock.
pub async fn lock(&self) -> Result<LockedFile, Error> {
pub async fn lock(&self) -> Result<LockedFile, LockedFileError> {
fs_err::create_dir_all(self.as_ref())?;
Ok(LockedFile::acquire(
LockedFile::acquire(
self.join(".lock"),
LockedFileMode::Exclusive,
self.display(),
)
.await?)
.await
}
/// Return the [`CacheShard`] as a [`PathBuf`].
@ -402,7 +391,7 @@ impl Cache {
}
/// Populate the cache scaffold.
fn create_base_files(root: &PathBuf) -> io::Result<()> {
fn create_base_files(root: &PathBuf) -> Result<(), io::Error> {
// Create the cache directory, if it doesn't exist.
fs_err::create_dir_all(root)?;
@ -452,7 +441,7 @@ impl Cache {
}
/// Initialize the [`Cache`].
pub async fn init(self) -> Result<Self, Error> {
pub async fn init(self) -> Result<Self, LockedFileError> {
let root = &self.root;
Self::create_base_files(root)?;
@ -477,18 +466,18 @@ impl Cache {
);
None
}
Err(err) => return Err(err.into()),
Err(err) => return Err(err),
};
Ok(Self {
root: std::path::absolute(root).map_err(Error::Absolute)?,
root: std::path::absolute(root)?,
lock_file,
..self
})
}
/// Initialize the [`Cache`], assuming that there are no other uv processes running.
pub fn init_no_wait(self) -> Result<Option<Self>, Error> {
pub fn init_no_wait(self) -> Result<Option<Self>, io::Error> {
let root = &self.root;
Self::create_base_files(root)?;
@ -502,7 +491,7 @@ impl Cache {
return Ok(None);
};
Ok(Some(Self {
root: std::path::absolute(root).map_err(Error::Absolute)?,
root: std::path::absolute(root)?,
lock_file: Some(Arc::new(lock_file)),
..self
}))
@ -542,7 +531,7 @@ impl Cache {
/// Remove a package from the cache.
///
/// Returns the number of entries removed from the cache.
pub fn remove(&self, name: &PackageName) -> io::Result<Removal> {
pub fn remove(&self, name: &PackageName) -> Result<Removal, io::Error> {
// Collect the set of referenced archives.
let references = self.find_archive_references()?;

View File

@ -1,6 +1,6 @@
[package]
name = "uv-cli"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-cli).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-cli).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

File diff suppressed because it is too large Load Diff

View File

@ -366,7 +366,6 @@ pub fn resolver_options(
exclude_newer_package.unwrap_or_default(),
),
link_mode,
torch_backend: None,
no_build: flag(no_build, build, "build"),
no_build_package: Some(no_build_package),
no_binary: flag(no_binary, binary, "binary"),
@ -496,6 +495,5 @@ pub fn resolver_installer_options(
Some(no_binary_package)
},
no_sources: if no_sources { Some(true) } else { None },
torch_backend: None,
}
}

View File

@ -1,6 +1,6 @@
[package]
name = "uv-client"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-client).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-client).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -50,7 +50,7 @@ pub const DEFAULT_RETRIES: u32 = 3;
/// Maximum number of redirects to follow before giving up.
///
/// This is the default used by [`reqwest`].
pub const DEFAULT_MAX_REDIRECTS: u32 = 10;
const DEFAULT_MAX_REDIRECTS: u32 = 10;
/// Selectively skip parts or the entire auth middleware.
#[derive(Debug, Clone, Copy, Default)]
@ -104,8 +104,6 @@ pub enum RedirectPolicy {
BypassMiddleware,
/// Handle redirects manually, re-triggering our custom middleware for each request.
RetriggerMiddleware,
/// No redirect for non-cloneable (e.g., streaming) requests with custom redirect logic.
NoRedirect,
}
impl RedirectPolicy {
@ -113,7 +111,6 @@ impl RedirectPolicy {
match self {
Self::BypassMiddleware => reqwest::redirect::Policy::default(),
Self::RetriggerMiddleware => reqwest::redirect::Policy::none(),
Self::NoRedirect => reqwest::redirect::Policy::none(),
}
}
}
@ -732,7 +729,6 @@ impl RedirectClientWithMiddleware {
match self.redirect_policy {
RedirectPolicy::BypassMiddleware => self.client.execute(req).await,
RedirectPolicy::RetriggerMiddleware => self.execute_with_redirect_handling(req).await,
RedirectPolicy::NoRedirect => self.client.execute(req).await,
}
}

View File

@ -5,8 +5,8 @@ use std::fmt::{Display, Formatter};
use std::ops::Deref;
use std::path::PathBuf;
use uv_cache::Error as CacheError;
use uv_distribution_filename::{WheelFilename, WheelFilenameError};
use uv_fs::LockedFileError;
use uv_normalize::PackageName;
use uv_redacted::DisplaySafeUrl;
@ -339,7 +339,7 @@ pub enum ErrorKind {
CacheWrite(#[source] std::io::Error),
#[error("Failed to acquire lock on the client cache")]
CacheLock(#[source] CacheError),
CacheLock(#[source] LockedFileError),
#[error(transparent)]
Io(std::io::Error),

View File

@ -1,7 +1,7 @@
pub use base_client::{
AuthIntegration, BaseClient, BaseClientBuilder, DEFAULT_MAX_REDIRECTS, DEFAULT_RETRIES,
ExtraMiddleware, RedirectClientWithMiddleware, RedirectPolicy, RequestBuilder,
RetryParsingError, UvRetryableStrategy, is_transient_network_error,
AuthIntegration, BaseClient, BaseClientBuilder, DEFAULT_RETRIES, ExtraMiddleware,
RedirectClientWithMiddleware, RequestBuilder, RetryParsingError, UvRetryableStrategy,
is_transient_network_error,
};
pub use cached_client::{CacheControl, CachedClient, CachedClientError, DataWithCachePolicy};
pub use error::{Error, ErrorKind, WrappedReqwestError};

View File

@ -1,6 +1,6 @@
[package]
name = "uv-configuration"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-configuration).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-configuration).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -94,32 +94,3 @@ wheels/
# Virtual environments
.venv
";
/// Setting for Git LFS (Large File Storage) support.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum GitLfsSetting {
/// Git LFS is disabled (default).
#[default]
Disabled,
/// Git LFS is enabled. Tracks whether it came from an environment variable.
Enabled { from_env: bool },
}
impl GitLfsSetting {
pub fn new(from_arg: Option<bool>, from_env: Option<bool>) -> Self {
match (from_arg, from_env) {
(Some(true), _) => Self::Enabled { from_env: false },
(_, Some(true)) => Self::Enabled { from_env: true },
_ => Self::Disabled,
}
}
}
impl From<GitLfsSetting> for Option<bool> {
fn from(setting: GitLfsSetting) -> Self {
match setting {
GitLfsSetting::Enabled { .. } => Some(true),
GitLfsSetting::Disabled => None,
}
}
}

View File

@ -1,6 +1,6 @@
[package]
name = "uv-console"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-console).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-console).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -1,6 +1,6 @@
[package]
name = "uv-dev"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
publish = false
@ -79,4 +79,4 @@ performance-memory-allocator = ["dep:uv-performance-memory-allocator"]
render = ["poloto", "resvg", "tagu"]
[package.metadata.cargo-shear]
ignored = ["uv-performance-memory-allocator"]
ignored = ["flate2", "uv-extract", "uv-performance-memory-allocator"]

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-dev).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-dev).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -1,6 +1,6 @@
[package]
name = "uv-dirs"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-dirs).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-dirs).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -1,6 +1,6 @@
[package]
name = "uv-dispatch"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-dispatch).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-dispatch).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -1,6 +1,6 @@
[package]
name = "uv-distribution-filename"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-distribution-filename).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-distribution-filename).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -1,6 +1,6 @@
[package]
name = "uv-distribution-types"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-distribution-types).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-distribution-types).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -159,9 +159,9 @@ pub enum InstalledVersion<'a> {
Url(&'a DisplaySafeUrl, &'a Version),
}
impl<'a> InstalledVersion<'a> {
impl InstalledVersion<'_> {
/// If it is a URL, return its value.
pub fn url(&self) -> Option<&'a DisplaySafeUrl> {
pub fn url(&self) -> Option<&DisplaySafeUrl> {
match self {
Self::Version(_) => None,
Self::Url(url, _) => Some(url),
@ -169,7 +169,7 @@ impl<'a> InstalledVersion<'a> {
}
/// If it is a version, return its value.
pub fn version(&self) -> &'a Version {
pub fn version(&self) -> &Version {
match self {
Self::Version(version) => version,
Self::Url(_, version) => version,

View File

@ -1,6 +1,6 @@
[package]
name = "uv-distribution"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-distribution).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-distribution).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -5,11 +5,10 @@ use tokio::task::JoinError;
use zip::result::ZipError;
use crate::metadata::MetadataError;
use uv_cache::Error as CacheError;
use uv_client::WrappedReqwestError;
use uv_distribution_filename::{WheelFilename, WheelFilenameError};
use uv_distribution_types::{InstalledDist, InstalledDistError, IsBuildBackendError};
use uv_fs::Simplified;
use uv_fs::{LockedFileError, Simplified};
use uv_git::GitError;
use uv_normalize::PackageName;
use uv_pep440::{Version, VersionSpecifiers};
@ -43,7 +42,7 @@ pub enum Error {
#[error("Failed to write to the distribution cache")]
CacheWrite(#[source] std::io::Error),
#[error("Failed to acquire lock on the distribution cache")]
CacheLock(#[source] CacheError),
CacheLock(#[source] LockedFileError),
#[error("Failed to deserialize cache entry")]
CacheDecode(#[from] rmp_serde::decode::Error),
#[error("Failed to serialize cache entry")]

View File

@ -1,6 +1,6 @@
[package]
name = "uv-extract"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-extract).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-extract).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -1,6 +1,6 @@
[package]
name = "uv-flags"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-flags).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-flags).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -1,6 +1,6 @@
[package]
name = "uv-fs"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-fs).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-fs).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -1,4 +1,3 @@
use std::convert::Into;
use std::fmt::Display;
use std::path::{Path, PathBuf};
use std::sync::LazyLock;
@ -60,18 +59,10 @@ pub enum LockedFileError {
source: io::Error,
},
#[error(transparent)]
Io(#[from] io::Error),
#[error(transparent)]
#[cfg(feature = "tokio")]
JoinError(#[from] tokio::task::JoinError),
#[error("Could not create temporary file")]
CreateTemporary(#[source] io::Error),
#[error("Could not persist temporary file `{}`", path.user_display())]
PersistTemporary {
path: PathBuf,
#[source]
source: io::Error,
},
#[error(transparent)]
Io(#[from] io::Error),
}
impl LockedFileError {
@ -81,8 +72,6 @@ impl LockedFileError {
#[cfg(feature = "tokio")]
Self::JoinError(_) => None,
Self::Lock { source, .. } => Some(source),
Self::CreateTemporary(err) => Some(err),
Self::PersistTemporary { source, .. } => Some(source),
Self::Io(err) => Some(err),
}
}
@ -212,7 +201,7 @@ impl LockedFile {
mode: LockedFileMode,
resource: impl Display,
) -> Result<Self, LockedFileError> {
let file = Self::create(&path)?;
let file = Self::create(path)?;
let resource = resource.to_string();
Self::lock_file(file, mode, &resource).await
}
@ -233,25 +222,10 @@ impl LockedFile {
}
#[cfg(unix)]
fn create(path: impl AsRef<Path>) -> Result<fs_err::File, LockedFileError> {
use rustix::io::Errno;
#[allow(clippy::disallowed_types)]
use std::{fs::File, os::unix::fs::PermissionsExt};
fn create(path: impl AsRef<Path>) -> Result<fs_err::File, std::io::Error> {
use std::os::unix::fs::PermissionsExt;
use tempfile::NamedTempFile;
/// The permissions the lockfile should end up with
const DESIRED_MODE: u32 = 0o666;
#[allow(clippy::disallowed_types)]
fn try_set_permissions(file: &File, path: &Path) {
if let Err(err) = file.set_permissions(std::fs::Permissions::from_mode(DESIRED_MODE)) {
warn!(
"Failed to set permissions on temporary file `{path}`: {err}",
path = path.user_display()
);
}
}
// If path already exists, return it.
if let Ok(file) = fs_err::OpenOptions::new()
.read(true)
@ -264,12 +238,16 @@ impl LockedFile {
// Otherwise, create a temporary file with 666 permissions. We must set
// permissions _after_ creating the file, to override the `umask`.
let file = if let Some(parent) = path.as_ref().parent() {
NamedTempFile::new_in(parent)
NamedTempFile::new_in(parent)?
} else {
NamedTempFile::new()
NamedTempFile::new()?
};
if let Err(err) = file
.as_file()
.set_permissions(std::fs::Permissions::from_mode(0o666))
{
warn!("Failed to set permissions on temporary file: {err}");
}
.map_err(LockedFileError::CreateTemporary)?;
try_set_permissions(file.as_file(), file.path());
// Try to move the file to path, but if path exists now, just open path
match file.persist_noclobber(path.as_ref()) {
@ -280,60 +258,20 @@ impl LockedFile {
.read(true)
.write(true)
.open(path.as_ref())
.map_err(Into::into)
} else if matches!(
Errno::from_io_error(&err.error),
Some(Errno::NOTSUP | Errno::INVAL)
) {
// Fallback in case `persist_noclobber`, which uses `renameat2` or
// `renameatx_np` under the hood, is not supported by the FS. Linux reports this
// with `EINVAL` and MacOS with `ENOTSUP`. For these reasons and many others,
// there isn't an ErrorKind we can use here, and in fact on MacOS `ENOTSUP` gets
// mapped to `ErrorKind::Other`
// There is a race here where another process has just created the file, and we
// try to open it and get permission errors because the other process hasn't set
// the permission bits yet. This will lead to a transient failure, but unlike
// alternative approaches it won't ever lead to a situation where two processes
// are locking two different files. Also, since `persist_noclobber` is more
// likely to not be supported on special filesystems which don't have permission
// bits, it's less likely to ever matter.
let file = fs_err::OpenOptions::new()
.read(true)
.write(true)
.create(true)
.open(path.as_ref())?;
// We don't want to `try_set_permissions` in cases where another user's process
// has already created the lockfile and changed its permissions because we might
// not have permission to change the permissions which would produce a confusing
// warning.
if file
.metadata()
.is_ok_and(|metadata| metadata.permissions().mode() != DESIRED_MODE)
{
try_set_permissions(file.file(), path.as_ref());
}
Ok(file)
} else {
let temp_path = err.file.into_temp_path();
Err(LockedFileError::PersistTemporary {
path: <tempfile::TempPath as AsRef<Path>>::as_ref(&temp_path).to_path_buf(),
source: err.error,
})
Err(err.error)
}
}
}
}
#[cfg(not(unix))]
fn create(path: impl AsRef<Path>) -> Result<fs_err::File, LockedFileError> {
fn create(path: impl AsRef<Path>) -> std::io::Result<fs_err::File> {
fs_err::OpenOptions::new()
.read(true)
.write(true)
.create(true)
.open(path.as_ref())
.map_err(Into::into)
}
}

View File

@ -1,6 +1,6 @@
[package]
name = "uv-git-types"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-git-types).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-git-types).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -1,6 +1,6 @@
[package]
name = "uv-git"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-git).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-git).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -1,6 +1,6 @@
[package]
name = "uv-globfilter"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
readme = "README.md"
edition = { workspace = true }

View File

@ -1,6 +1,6 @@
[package]
name = "uv-install-wheel"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
keywords = ["wheel", "python"]

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-install-wheel).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-install-wheel).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -1,6 +1,6 @@
[package]
name = "uv-installer"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-installer).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-installer).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -1,6 +1,6 @@
[package]
name = "uv-keyring"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }

View File

@ -1,6 +1,6 @@
[package]
name = "uv-logging"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-logging).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-logging).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -1,6 +1,6 @@
[package]
name = "uv-macros"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-macros).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-macros).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -1,6 +1,6 @@
[package]
name = "uv-metadata"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-metadata).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-metadata).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -1,6 +1,6 @@
[package]
name = "uv-normalize"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-normalize).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-normalize).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -1,6 +1,6 @@
[package]
name = "uv-once-map"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-once-map).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-once-map).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -1,6 +1,6 @@
[package]
name = "uv-options-metadata"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-options-metadata).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-options-metadata).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -1,6 +1,6 @@
[package]
name = "uv-pep440"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
license = "Apache-2.0 OR BSD-2-Clause"
include = ["/src", "Changelog.md", "License-Apache", "License-BSD", "Readme.md", "pyproject.toml"]

View File

@ -1,13 +0,0 @@
<!-- This file is generated. DO NOT EDIT -->
# uv-pep440
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-pep440).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)
for details on versioning.

View File

@ -0,0 +1,44 @@
# PEP440 in rust
[![Crates.io](https://img.shields.io/crates/v/pep440_rs.svg?logo=rust&style=flat-square)](https://crates.io/crates/pep440_rs)
[![PyPI](https://img.shields.io/pypi/v/pep440_rs.svg?logo=python&style=flat-square)](https://pypi.org/project/pep440_rs)
A library for python version numbers and specifiers, implementing
[PEP 440](https://peps.python.org/pep-0440). See
[Reimplementing PEP 440](https://cohost.org/konstin/post/514863-reimplementing-pep-4) for some
background.
Higher level bindings to the requirements syntax are available in
[pep508_rs](https://github.com/konstin/pep508_rs).
```rust
use std::str::FromStr;
use pep440_rs::{parse_version_specifiers, Version, VersionSpecifier};
let version = Version::from_str("1.19").unwrap();
let version_specifier = VersionSpecifier::from_str("==1.*").unwrap();
assert!(version_specifier.contains(&version));
let version_specifiers = parse_version_specifiers(">=1.16, <2.0").unwrap();
assert!(version_specifiers.contains(&version));
```
PEP 440 has a lot of unintuitive features, including:
- An epoch that you can prefix the version with, e.g., `1!1.2.3`. Lower epoch always means lower
version (`1.0 <=2!0.1`)
- Post versions, which can be attached to both stable releases and pre-releases
- Dev versions, which can be attached to both stable releases and pre-releases. When attached to a
pre-release the dev version is ordered just below the normal pre-release, however when attached to
a stable version, the dev version is sorted before a pre-releases
- Pre-release handling is a mess: "Pre-releases of any kind, including developmental releases, are
implicitly excluded from all version specifiers, unless they are already present on the system,
explicitly requested by the user, or if the only available version that satisfies the version
specifier is a pre-release.". This means that we can't say whether a specifier matches without
also looking at the environment
- Pre-release vs. pre-release incl. dev is fuzzy
- Local versions on top of all the others, which are added with a + and have implicitly typed string
and number segments
- No semver-caret (`^`), but a pseudo-semver tilde (`~=`)
- Ordering contradicts matching: We have, e.g., `1.0+local > 1.0` when sorting, but `==1.0` matches
`1.0+local`. While the ordering of versions itself is a total order the version matching needs to
catch all sorts of special cases

View File

@ -1,6 +1,6 @@
[package]
name = "uv-pep508"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
include = ["/src", "Changelog.md", "License-Apache", "License-BSD", "Readme.md", "pyproject.toml"]
license = "Apache-2.0 OR BSD-2-Clause"

View File

@ -1,13 +0,0 @@
<!-- This file is generated. DO NOT EDIT -->
# uv-pep508
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-pep508).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)
for details on versioning.

View File

@ -0,0 +1,31 @@
# Dependency specifiers (PEP 508) in Rust
[![Crates.io](https://img.shields.io/crates/v/pep508_rs.svg?logo=rust&style=flat-square)](https://crates.io/crates/pep508_rs)
[![PyPI](https://img.shields.io/pypi/v/pep508_rs.svg?logo=python&style=flat-square)](https://pypi.org/project/pep508_rs)
A library for
[dependency specifiers](https://packaging.python.org/en/latest/specifications/dependency-specifiers/),
previously known as [PEP 508](https://peps.python.org/pep-0508/).
## Usage
```rust
use std::str::FromStr;
use pep508_rs::Requirement;
let marker = r#"requests [security,tests] >= 2.8.1, == 2.8.* ; python_version > "3.8""#;
let dependency_specification = Requirement::from_str(marker).unwrap();
assert_eq!(dependency_specification.name, "requests");
assert_eq!(dependency_specification.extras, Some(vec!["security".to_string(), "tests".to_string()]));
```
## Markers
Markers allow you to install dependencies only in specific environments (python version, operating
system, architecture, etc.) or when a specific feature is activated. E.g., you can say
`importlib-metadata ; python_version < "3.8"` or `itsdangerous (>=1.1.0) ; extra == 'security'`.
Unfortunately, the marker grammar has some oversights (e.g.
<https://github.com/pypa/packaging.python.org/pull/1181>) and the design of comparisons (PEP 440
comparisons with lexicographic fallback) leads to confusing outcomes. This implementation tries to
carefully validate everything and emit warnings whenever bogus comparisons with unintended semantics
are made.

View File

@ -1,6 +1,6 @@
[package]
name = "uv-performance-memory-allocator"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }

View File

@ -5,9 +5,9 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found
[here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-performance-memory-allocator).
[here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-performance-memory-allocator).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

View File

@ -1,6 +1,6 @@
[package]
name = "uv-platform-tags"
version = "0.0.8"
version = "0.0.7"
description = "This is an internal component crate of uv"
edition = { workspace = true }
rust-version = { workspace = true }

View File

@ -5,8 +5,8 @@
This crate is an internal component of [uv](https://crates.io/crates/uv). The Rust API exposed here
is unstable and will have frequent breaking changes.
This version (0.0.8) is a component of [uv 0.9.18](https://crates.io/crates/uv/0.9.18). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.18/crates/uv-platform-tags).
This version (0.0.7) is a component of [uv 0.9.17](https://crates.io/crates/uv/0.9.17). The source
can be found [here](https://github.com/astral-sh/uv/blob/0.9.17/crates/uv-platform-tags).
See uv's
[crate versioning policy](https://docs.astral.sh/uv/reference/policies/versioning/#crate-versioning)

Some files were not shown because too many files have changed in this diff Show More