Commit Graph

4437 Commits

Author SHA1 Message Date
Zanie Blue ca5b840275
Add test case for `uv pip install` with incompatible virtual environment Python version (#11139)
Test case for https://github.com/astral-sh/uv/issues/11138
2025-01-31 14:54:46 -06:00
Charlie Marsh 26f84e5699
Percent-decode URLs in canonical comparisons (#11088)
## Summary

This PR adds an additional normalization step to `CanonicalUrl` whereby
we now percent-decode the path, to ensure that (e.g.)
`torch-2.5.1%2Bcpu.cxx11.abi-cp39-cp39-linux_x86_64.whl` and
`torch-2.5.1+cpu.cxx11.abi-cp39-cp39-linux_x86_64.whl` are considered
equal. Further, when generating the "reinstall" report, we use the
canonical URL rather than the verbatim URL.

In making this change, I also learned that we don't apply any of the
normalization passes to `file://` URLs. I inadvertently removed it in
93d606aba2,
since setting the password or URL on ` file://` URL errors -- but now
suppress those errors anyway.

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

## Test Plan

- Downloaded a [PyTorch
wheel](https://download.pytorch.org/whl/cpu-cxx11-abi/torch-2.5.1%2Bcpu.cxx11.abi-cp39-cp39-linux_x86_64.whl)
- `python3.9 -m pip install
torch-2.5.1+cpu.cxx11.abi-cp39-cp39-linux_x86_64.whl --platform
linux_x86_64 --target foo --no-deps`
- `cargo run pip install
torch-2.5.1+cpu.cxx11.abi-cp39-cp39-linux_x86_64.whl --python-platform
linux --python-version 3.9 --target foo --no-deps`
- Verified that the package had the `~` symbol for the reinstall.
2025-01-31 15:45:48 -05:00
Charles Tapley Hoyt c6713f5751
Use explicit _GLibCVersion tuple in uv-python crate (#11122) 2025-01-31 11:52:38 +01:00
JackDyre 00eb9cc545
removed unneeded `.clone()` (#11127) 2025-01-31 11:12:18 +01:00
Zanie Blue 5ef3d51390
Bump version to 0.5.26 (#11119) 2025-01-30 15:37:00 -06:00
Charlie Marsh bf9fe1d36d
Error when `--script` is passing a non-PEP 723 script (#11118)
## Summary

We now show a custom error if (1) the file doesn't exist at all, or (2)
it's not a PEP 723 script.

In the future, `uv lock --script` should probably initialize the script,
but that requires a more extensive refactor. At present, we just
silently lock the project instead, which is pretty bad!

Closes https://github.com/astral-sh/uv/issues/10979.
2025-01-30 20:49:59 +00:00
Zanie Blue 5c0fdfd7ce
Consistently write log messages with capitalized first word (#11111) 2025-01-30 18:56:46 +00:00
Charlie Marsh ee31e1f11b
Remove unnecessary UTF-8 conversion in hash parsing (#11110)
## Summary

I believe this is a no-op?
2025-01-30 13:55:46 -05:00
Zanie Blue d514743b1a
Improve retry trace message (#11108) 2025-01-30 12:53:33 -06:00
Charlie Marsh a440735fac
Ignore non-hash fragments in HTML API responses (#11107)
## Summary

I'm not a fan of registries including fragments here that aren't hashes,
but the spec doesn't expressly forbid it. I think it's reasonable to
ignore them.

Specifically, the spec is here:
https://packaging.python.org/en/latest/specifications/simple-repository-api/.
It says that:

> The URL **SHOULD** include a hash in the form of a URL fragment with
the following syntax: `#<hashname>=<hashvalue>`, where `<hashname>`he
lowercase name of the hash function (such as sha256) and `<hashvalue>`
is the hex encoded digest.

But it doesn't mention other fragments.

Closes https://github.com/astral-sh/uv/issues/7257.
2025-01-30 12:35:11 -06:00
Zanie Blue 220821bc39
Add support for `uvx python` (#11076)
Supersedes https://github.com/astral-sh/uv/pull/7491
Closes https://github.com/astral-sh/uv/issues/7430

Thanks @mikeleppane for starting this implementation. I took a bit of a
different approach and it was easier to start over fresh, but I used
some of the test cases there.
2025-01-30 11:53:58 -06:00
Charlie Marsh d106ab1a9a
Make metadata deserialization failures non-fatal in the cache (#11105)
## Summary

If we fail to deserialize cached metadata in the cache, we should just
ignore it, rather than failing.

Ideally, this never happens. If it does, it means we missed a cache
version bump. But if it does happen, it should still be non-fatal.

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

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

## Test Plan

Prior to this PR, the following would fail:

- `uvx uv@0.5.25 venv --python 3.12 --cache-dir foo`
- `uvx uv@0.5.25 pip install ./scripts/packages/hatchling_dynamic
--no-deps --python 3.12 --cache-dir foo`
- `uvx uv@0.5.18 venv --python 3.12 --cache-dir foo`
- `uvx uv@0.5.18 pip install ./scripts/packages/hatchling_dynamic
--no-deps --python 3.12 --cache-dir foo`

We can't go back and fix 0.5.18, but this will prevent such regressions
in the future.
2025-01-30 12:48:35 -05:00
Zanie Blue 1dfa650ab4
Propagate credentials for `<index>/simple` to `<index>/...` endpoints (#11074)
Closes https://github.com/astral-sh/uv/issues/11017
Closes https://github.com/astral-sh/uv/issues/8565

Sort of an minimal implementation of
https://github.com/astral-sh/uv/issues/4583
2025-01-30 10:22:21 -06:00
Zanie Blue d281f49103
Avoid resolving symbolic links when querying Python interpreters (#11083)
Closes https://github.com/astral-sh/uv/issues/11048

This brings the `PythonEnvironment::from_root` behavior in-line with the
rest of uv Python discovery behavior (and in-line with pip). It's not
clear why we were canonicalizing the path in the first place here.
2025-01-30 10:10:33 -06:00
Zanie Blue 586bab32b9
Update `uv python install --reinstall` to reinstall all previous versions (#11072)
Since we're shipping substantive updates to Python versions frequently,
I want to lower the bar for reinstalling with the latest distributions.

There's a follow-up task that's documented in a test case at
https://github.com/astral-sh/uv/pull/11072/files#diff-f499c776e1d8cc5e55d7620786e32e8732b675abd98e246c0971130f5de9ed50R157-R158
2025-01-30 10:08:06 -06:00
konsti d517b1ca26
Use dependency groups in transformers ecosystem test (#11066)
When we originally created the transformers test case, dependency groups
did not yet exist, but now they are the more realistic case.
2025-01-29 20:22:03 -05:00
Charlie Marsh 329de04758
Use a mirror with upload timestamps for PyTorch (#11086)
## Summary

This PR migrates all of our PyTorch tests to use our own mirror, which
includes upload timestamps that we can use to enforce
`--excludes-newer`, making the tests far more stable over time. (Today,
if you checkout old versions of `uv`, many of the PyTorch tests will
fail, since the index contents drift over time.)

Some snapshots changed in this PR (see, e.g.,
`universal_nested_overlapping_local_requirement`). The underlying reason
is that I used the current timestamp when setting upload times in the
PyTorch mirror, but those tests read from both the PyTorch
`--find-links` index _and_ PyPI. I guess we don't omit `--find-links`
entries based on `--excludes-newer`? That might be a bug. But I had to
_increase_ the `--excludes-newer` to include the PyTorch mirror's
`--find-links`, which meant pulling in some newer packages from PyPI
too. This is fine: it's a one-time churn, and they'll be stable going
forward.
2025-01-29 20:02:30 -05:00
Charlie Marsh b871d2d102
Allow `--exclude-newer` to be set at the test context level (#11085)
## Summary

This is a lot simpler, since you don't need tor remember to set it on
every command.
2025-01-30 00:44:20 +00:00
Andrew Gallant 35ded6d7e1 uv-resolver: fix conflicting extra bug during `uv sync`
In #10875, I relaxed the error checking during resolution to permit
dependencies like `foo[x1]`, where `x1` was defined to be conflicting.
In exchange, the error was, roughly speaking, moved to installation
time. This was achieved by looking at the full set of enabled extras
and checking whether any conflicts occurred. If so, an error was
reported. This ends up being more expressive and permits more valid
configurations.

However, in so doing, there was a bug in how the accumulated extras
were being passed to conflict marker evaluation. Namely, we weren't
accounting for the fact that if `foo[x1]` was enabled, then that fact
should be carried through to all conflict marker evaluations. This is
because some of those will use things like `extra != 'x1'` to indicate
that it should only be included if an extra *isn't* enabled.

In #10985, this manifested with PyTorch where `torch==2.4.1` and
`torch==2.4.1+cpu` were being installed simultaneously. Namely, the
choice to install `torch==2.4.1` was not taking into account that
the `cpu` extra has been enabled. If it did, then it's conflict
marker would evaluate to `false`. Since it didn't, and since
`torch==2.4.1+cpu` was also being included, we ended up installing both
versions.

The approach I took in this PR was to add a second breadth first
traversal (which comes first) over the dependency tree to accumulate all
of the activated extras. Then, only in the second traversal do we
actually build up the resolution graph.

Unfortunately, I have no automatic regression test to include here. The
regression test we _ought_ to include involves `torch`. And while we are
generally find to use those in tests that only generate a lock file, the
regression test here actually requires running installation. And
downloading and installing `torch` in tests is bad juju. So adding a
regression test for this is blocked on better infrastructure for PyTorch
tests. With that said, I did manually verify that the test case in #10985
no longer installs multiple versions of `torch`.

Fixes #10985
2025-01-29 17:21:10 -05:00
Sede Soukossi d5461d8d34
Do not suggest --package when --backend is used, but --build-backend (#10958)
## Summary

Closes #8743

## Test Plan

Snapshot tests
2025-01-29 16:15:05 -06:00
Zanie Blue ae76a4b7f5
Add test case for multiple indexes on the same realm (#11080)
A test case for https://github.com/astral-sh/uv/pull/11074 (and related
issues)
2025-01-29 14:45:03 -06:00
Zanie Blue d866c58ea2
Refactor `uv tool run` hint into separate function (#11069) 2025-01-29 11:55:54 -06:00
titipoco 3af3af5039
Fix typo in no-deps docs/comments/cli description (#11073)
## Summary
Fixes a recurring typo.

## Details
There's a typo appearing in a particular sentence...

> Ignore package dependencies, instead only add those packages
explicitly listed on the command line to the resulting **the**
requirements file.

... used in:
* `crates/uv-cli/src/lib.rs`
* `crates/uv-settings-src-settings.rs`
* `docs/reference/settings.md`
* `uv.schem.json`

Docs, comments and a CLI command description seem affected.

This PR fixes it.

---------

Co-authored-by: bujnok01 <bujnok01@heiway.net>
2025-01-29 11:55:40 -06:00
Charlie Marsh f6a15b79f7
Allow `--no-dev --invert` in `uv tree` (#11068)
## Summary

Closes https://github.com/astral-sh/uv/issues/11062.
2025-01-29 16:18:13 +00:00
Zanie Blue e7fc05e460
Add a bit more context about SIGTERM and PID 1 (#11036) 2025-01-29 08:21:47 -06:00
Zanie Blue 7633f1db83
Reflow CLI documentation comments (#11040)
I'm sorry, but I was writing some new content here and the inconsistent
wrapping was very hard to maintain and I didn't want to muddy the diff
there with reflowing.

I don't think we need to be strict about the reflow (I'm not sure we
even can be) but some of these were very far off from our typical wrap
length.
2025-01-29 08:21:32 -06:00
konsti b59238fcaa
Document `gather_credentials` (#11024) 2025-01-29 09:47:18 +00:00
Charlie Marsh bc3eac2bc9
Avoid sharing state between universal and non-universal resolves (#11051)
## Summary

This is a really subtle issue. I'm actually having trouble writing a
test for it, though the problem makes sense. In short, we're sharing the
`SharedState` between the `BuildContext` and the universal resolver. The
`SharedState` includes `VersionMap`, which tracks incompatibilities...
The incompatibilities use the platform tags, which are only present when
resolving from the `BuildContext` (i.e., when resolving build
dependencies). The universal resolver then fails because it sees a bunch
of "incompatible" wheels that are incompatible with the current platform
(i.e., the current Python interpreter).

In short, we _cannot_ share a `SharedState` across two operations that
perform a universal and then a platform-specific resolution. So this PR
adds separate types and fixes up any overlapping usages.

A better setup, for the future, would be to somehow share the underlying
simple metadata, and only track separate `VersionMap` -- since there
_is_ a bunch of data we can share. But that's a larger change.

Closes https://github.com/astral-sh/uv/issues/10977.
2025-01-29 03:27:28 +00:00
Charlie Marsh 3878c00dbd
Mark metadata as dynamic when reading from built wheel cache (#11046)
## Summary

The issue here boils down to: when we write metadata that came from
building the wheel itself, we aren't setting the `dynamic` field.

We now _always_ set the dynamic field when reading, even when we read
cached data.

Closes https://github.com/astral-sh/uv/issues/11047.
2025-01-29 01:27:09 +00:00
Victorien 7868d5df95
Fix formatting of `RUST_LOG` documentation (#10053)
<!--
Thank you for contributing to uv! To help us out with reviewing, please
consider the following:

- Does this pull request include a summary of the change? (See below.)
- Does this pull request include a descriptive title?
- Does this pull request include references to any relevant issues?
-->

## Summary

<!-- What's the purpose of the change? What does it do, and why? -->

## Test Plan

<!-- How was it tested? -->
2025-01-28 17:31:10 -06:00
Zanie Blue 9c07c3fc5b
Bump version to 0.5.25 (#11042) 2025-01-28 15:40:43 -06:00
Charlie Marsh f1840c77b6
Guard against concurrent cache writes on Windows (#11007)
## Summary

On Windows, we have a lot of issues with atomic replacement and such.
There are a bunch of different failure modes, but they generally
involve: trying to persist a fail to a path at which the file already
exists, trying to replace or remove a file while someone else is reading
it, etc.

This PR adds locks to all of the relevant database paths. We already use
these advisory locks when building source distributions; now we use them
when unzipping wheels, storing metadata, etc.

Closes #11002.

## Test Plan

I ran the following script:

```shell
# Define the cache directory path
$cacheDir = "C:\Users\crmar\workspace\uv\cache"

# Clear the cache directory if it exists
if (Test-Path $cacheDir) {
    Remove-Item -Recurse -Force $cacheDir
}

# Create the cache directory again
New-Item -ItemType Directory -Force -Path $cacheDir

# Define the command to run with --cache-dir flag
$command = {
    param ($venvPath)

    # Create a virtual environment in the specified path with --python
    uv venv $venvPath

    # Run the pip install command with --cache-dir flag
    C:\Users\crmar\workspace\uv\target\profiling\uv.exe pip install flask==1.0.4 --no-binary flask --cache-dir C:\Users\crmar\workspace\uv\cache -v --python $venvPath
}

# Define the paths for the different virtual environments
$venv1 = "C:\Users\crmar\workspace\uv\venv1"
$venv2 = "C:\Users\crmar\workspace\uv\venv2"
$venv3 = "C:\Users\crmar\workspace\uv\venv3"
$venv4 = "C:\Users\crmar\workspace\uv\venv4"
$venv5 = "C:\Users\crmar\workspace\uv\venv5"

# Start the command in parallel five times using Start-Job, each with a different venv
$job1 = Start-Job -ScriptBlock $command -ArgumentList $venv1
$job2 = Start-Job -ScriptBlock $command -ArgumentList $venv2
$job3 = Start-Job -ScriptBlock $command -ArgumentList $venv3
$job4 = Start-Job -ScriptBlock $command -ArgumentList $venv4
$job5 = Start-Job -ScriptBlock $command -ArgumentList $venv5

# Wait for all jobs to complete
$jobs = @($job1, $job2, $job3, $job4, $job5)
$jobs | ForEach-Object { Wait-Job $_ }

# Retrieve the results (optional)
$jobs | ForEach-Object { Receive-Job -Job $_ }

# Clean up the jobs
$jobs | ForEach-Object { Remove-Job -Job $_ }
```

And ensured it succeeded in five straight invocations (whereas on
`main`, it consistently fails with a variety of different traces).
2025-01-28 15:33:49 -05:00
Zanie Blue fe6126a92b
Improve SIGINT handling in `uv run` (#11009)
There should be two functional changes here:

- If we receive SIGINT twice, forward it to the child process
- If the `uv run` child process changes its PGID, then forward SIGINT

Previously, we never forwarded SIGINT to a child process. Instead, we
relied on shell to do so.

On Windows, we still do nothing but eat the Ctrl-C events we receive.
I cannot see an easy way to send them to the child.

The motivation for these changes should be explained in the comments.

Closes https://github.com/astral-sh/uv/issues/10952 (in which Ray
changes its PGID)
Replaces the (much simpler) #10989 with a more comprehensive approach.

See https://github.com/astral-sh/uv/pull/6738#issuecomment-2315451358
for some previous context.
2025-01-28 14:00:38 -06:00
Zanie Blue e26affd27c
Fix best-interpreter lookups when there is an invalid interpreter in the PATH (#11030)
Closes https://github.com/astral-sh/uv/issues/10978

The root cause is the same as #10908 — I should have been more careful
with the original change.
2025-01-28 13:44:32 -06:00
Zanie Blue 4b8e157ba7
Add upper bound constraints to (more) test cases that use pytorch index (#11034)
Closes https://github.com/astral-sh/uv/issues/11025
2025-01-28 19:28:54 +00:00
Zanie Blue 0ae3fce599
Add test coverage for #10978 (#11029) 2025-01-28 19:15:15 +00:00
Zanie Blue 7949672cab
Add upper bounds to `lock_pytorch_cpu` torch versions (#11033)
Presumably this is a better alternative to
https://github.com/astral-sh/uv/pull/11031
2025-01-28 18:52:58 +00:00
Andrew Gallant 2c7b14da70
tests: update snapshots again (#11026)
It looks like an sdist got uploaded after-the-fact for `MarkupSafe
2.1.5` and this has changed some of our lock files.
2025-01-28 17:48:23 +00:00
Andrew Gallant 4a735461b5
tests: update snapshots (#11023)
I'm getting these updates locally, and wondering if they specific to my
local setup or if there was a recent release. So let's see what CI says.
2025-01-28 11:29:05 -06:00
micolous 52870c587c
Fix incorrect error message when specifying `tool.uv.sources.(package).workspace` with other options (#11013)
## Summary

When a `pyproject.toml` `[tool.uv.sources.(package)]` section specifies
`workspace` and one or more of (`index`, `git`, `url`, `path`, `rev`,
`tag`, `branch`, `editable`), running `uv` to build or sync the package
gives the error:

```
cannot specify both `index` and `(parameter name)`
```

The error should actually say:

```
cannot specify both `workspace` and `(parameter name)`
```

## Test Plan

I ran `cargo test`, and all tests still passed.
2025-01-28 09:25:33 -05:00
Aria Desires a2db48d649
fix async windows file persist retries (#11008)
The previous two versions of the code were bugged and would always
produce None when you retried (producing a hard LostState error).
2025-01-27 18:51:36 -05:00
konsti c1a2ef12d2
Respect `--no-sources` for `uv pip install` workspace discovery (#11003) 2025-01-28 00:10:27 +01:00
Charlie Marsh bbba2c7bce
Remove unnecessary distribution clone (#11004) 2025-01-27 18:07:13 -05:00
Charlie Marsh a00f6f5d3d
Reject `--editable` flag on non-directory requirements (#10994)
## Summary

Closes https://github.com/astral-sh/uv/issues/10992.
2025-01-27 19:37:23 +00:00
Charlie Marsh c88a4baaac
Update `compile_enumerate_no_versions ` snapshot (#10998)
## Summary

I think the "available versions" may not filter on `--exclude-newer`,
since it's marked as an incompatibility? In which case, this error
message can change as versions are published.
2025-01-27 14:18:15 -05:00
Charlie Marsh f1c02182b7
Reference workspaces in `--no-sources` documentation (#10995)
## Summary

See:
https://github.com/astral-sh/uv/issues/10991#issuecomment-2616543018
2025-01-27 13:33:14 -05:00
Charlie Marsh 86ec6c86dd
Prefer preferences with greater package versions (#10963)
## Summary

Closes https://github.com/astral-sh/uv/issues/10957.
2025-01-25 16:37:25 -05:00
Charlie Marsh a681905e12
Allow optional `=` for editables in `requirements.txt` (#10954)
## Summary

We allow this for all other argument flags; seems like an oversight.

Closes https://github.com/astral-sh/uv/issues/10941.
2025-01-24 21:55:51 -05:00
Zanie Blue eeab865194
Update `riscv64` Python downloads to allow install on `riscv64gc` (#10937)
Closes https://github.com/astral-sh/uv/issues/10883
2025-01-24 09:33:29 -06:00
konsti f645499dbd
Child exit with signal n returns 128+n (#10781) 2025-01-24 16:20:32 +01:00