Commit Graph

4361 Commits

Author SHA1 Message Date
Charlie Marsh 15ec830bea
Use `matches` rather than `contains` in `requirements.txt` parsing (#10423) 2025-01-09 02:32:09 +00:00
Charlie Marsh 5551f9f3da
Remove unnecessary `.to_string()` call (#10419) 2025-01-08 23:59:13 +00:00
Charlie Marsh f65fcf23b3
Remove duplicated comment (#10416) 2025-01-08 23:06:09 +00:00
Charlie Marsh 53dd554919
Update PEP 723 lockfile in `uv remove --script` (#10162)
## Summary

Counterpart to #10145 covering `uv remove` for PEP 723 scripts with
lockfiles.
2025-01-08 22:05:37 +00:00
Charlie Marsh 18b53c5b45
Add `--script` support to `uv export` for PEP 723 scripts (#10160)
## Summary

You can now run `uv export --script main.py` to show the dependency tree
for a given script. If a lockfile doesn't exist, it will create one.

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

Closes https://github.com/astral-sh/uv/issues/9657.
2025-01-08 21:48:53 +00:00
Charlie Marsh 9d5779b68c
Add `--script` support to `uv tree` for PEP 723 scripts (#10159)
## Summary

You can now run `uv tree --script main.py` to show the dependency tree
for a given script. If a lockfile doesn't exist, it will create one.

Closes https://github.com/astral-sh/uv/issues/7328.
2025-01-08 21:32:46 +00:00
Charlie Marsh 31b2d3f988
Update PEP 723 lockfile in `uv add --script` (#10145)
## Summary

`uv add --script main.py anyio` will now update the lockfile, _if_ it
already exists. (If no such lockfile exists, the behavior is unchanged.)
2025-01-08 21:19:12 +00:00
Charlie Marsh e22b728e3f
Respect PEP 723 script lockfiles in uv run (#10136)
## Summary

If a script has a lockfile, then `uv run` will now reuse it.

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

Closes https://github.com/astral-sh/uv/issues/9688.
2025-01-08 20:34:45 +00:00
Burak Varlı 391ab757b8
Add `ls` alias to `uv {tool, python, pip} list` (#10240)
## Summary

This PR adds `ls` alias to `uv {tool, python, pip} list` for
convenience.

Not sure if folks previously discussed this or have any opinion on
having aliases – but I have a muscle memory for `ls` for listing things
in commands I'm using (like `docker images ls`, `zellij ls`, `helm ls`
etc.) and thought having `ls` alias for `list` command would be useful.

## Test Plan

I simply compiled `uv` and manually checked `./target/release/uv {tool,
python, pip} ls`.
2025-01-08 14:09:20 -05:00
Charlie Marsh 5d33b94c42
Add support for locking PEP 723 scripts (#10135)
## Summary

You can now run `uv lock --script main.py` to lock a given script
(though as of this PR, the script itself isn't used anywhere).

Closes https://github.com/astral-sh/uv/issues/6318.
2025-01-08 18:36:53 +00:00
Aria Desires 2f7f9ea571
improve shell compatibility of venv activate scripts (#10397)
The shellcheck action we uses misses some files, so they fell out of
spec for what we support. This PR first and foremost adds them to the
scanning list, and then fixes the issues found.

Fixes #7480
2025-01-08 13:12:29 -05:00
Charlie Marsh 4c161d284b
Respect `requires-python` when installing tools (#10401)
## Summary

This PR revives https://github.com/astral-sh/uv/pull/7827 to improve
tool resolutions such that, if the resolution fails, and the selected
interpreter doesn't match the required Python version from the solve, we
attempt to re-solve with a newly-discovered interpreter that _does_
match the required Python version.

For now, we attempt to choose a Python interpreter that's greater than
the inferred `requires-python`, but compatible with the same Python
minor. This helps avoid successive failures for cases like Posting,
where choosing Python 3.13 fails because it has a dependency that lacks
source distributions and doesn't publish any Python 3.13 wheels. We
should further improve the strategy to solve _that_ case too, but this
is at least the more conservative option...

In short, if you do `uv tool instal posting`, and we find Python 3.8 on
your machine, we'll detect that `requires-python: >=3.11`, then search
for the latest Python 3.11 interpreter and re-resolve.

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

## Test Plan

The following should succeed:

```
cargo run python uninstall --all
cargo run python install 3.8
cargo run tool install posting
```

In the logs, we see:

```
...
DEBUG No compatible version found for: posting
DEBUG Refining interpreter with: Python >=3.11, <3.12
DEBUG Searching for Python >=3.11, <3.12 in managed installations or search path
DEBUG Searching for managed installations at `/Users/crmarsh/.local/share/uv/python`
DEBUG Skipping incompatible managed installation `cpython-3.8.20-macos-aarch64-none`
DEBUG Found `cpython-3.13.1-macos-aarch64-none` at `/opt/homebrew/bin/python3` (search path)
DEBUG Skipping interpreter at `/opt/homebrew/opt/python@3.13/bin/python3.13` from search path: does not satisfy request `>=3.11, <3.12`
DEBUG Found `cpython-3.11.7-macos-aarch64-none` at `/opt/homebrew/bin/python3.11` (search path)
DEBUG Re-resolving with Python 3.11.7
DEBUG Using request timeout of 30s
DEBUG Solving with installed Python version: 3.11.7
DEBUG Solving with target Python version: >=3.11.7
DEBUG Adding direct dependency: posting*
DEBUG Searching for a compatible version of posting (*)
...
```
2025-01-08 12:38:17 -05:00
Charlie Marsh 333f03f112
Bump version to v0.5.16 (#10395) 2025-01-08 10:29:32 -05:00
konsti c5583b326f
Shrink `Dist` from 352 to 288 bytes (#10389)
Found this when looking at #10385. Since we're constructing a lot of
`Dist`s, we should keep it small.
2025-01-08 09:33:19 -05:00
konsti 15c81e9a02
Force a niche into `VersionSmall` (#10385) 2025-01-08 14:33:39 +01:00
konsti 68adadf806
Improve file pinning comments (#10387) 2025-01-08 11:42:25 +00:00
konsti fa305bd244
Fix `invalid_platform` test on main (#10388)
This test started failing on main.

I don't understand why this changed (there was a new release but exclude-newer is supposed to exclude those), but the error message improved.
2025-01-08 10:55:06 +00:00
Charlie Marsh 1ee17afd79
Avoid enforcing project-level required version for `uv self` (#10374)
## Summary

Closes https://github.com/astral-sh/uv/issues/10355.
2025-01-07 13:17:42 -05:00
Charlie Marsh 2ae0ed3b35
Re-enable zlib-ng on all platforms (except s390x, PowerPC, and FreeBSD) (#10370)
PowerPC seems to build without errors if we upgrade `zlib-ng`, but
upgrading `zlib-ng` causes Windows to break
(https://github.com/rust-lang/libz-sys/issues/225), and Cargo doesn't
let us include two different versions.

s390x fails because it can't find `stfle`. It's possible that we could
fix this by by upgrading our manylinux version and/or by upgrading GCC
(which may necessitate upgrading our manylinux version), but I don't
know if it's fixable without one of those things? And it's not worth
bumping compatibility for that reason. \cc @konstin
2025-01-07 13:04:34 -05:00
Kevin Marchais a2a2662d43
Fix ruff linting warnings from generated template files for extension modules (#10371)
## Summary

This PR fixes two ruff linting issues in the generated template files
when using: `uv init --build-backend` for extension modules.

1. Removes unnecessary `from __future__ import annotations` imports from
generated .pyi files
([PYI044](https://docs.astral.sh/ruff/rules/future-annotations-in-stub/))
2. Adds missing blank line after `hello_from_bin` import to comply with
isort formatting
([I001](https://docs.astral.sh/ruff/rules/unsorted-imports/))

## Test Plan

```bash
cargo run -- init --build-backend scikit-build-core example-ext
uvx ruff check example-ext --select ALL

cargo run -- init --build-backend maturin example-ext
uvx ruff check example-ext --select ALL
```

## Remaining warnings

There are still warnings remainings in the generated `__init__.py`
files:
- [D104](https://docs.astral.sh/ruff/rules/undocumented-public-package/)
Missing docstring in public package
-
[D103](https://docs.astral.sh/ruff/rules/undocumented-public-function/)
Missing docstring in public function
- [T201](https://docs.astral.sh/ruff/rules/print/) `print` found
2025-01-07 17:07:44 +00:00
Charlie Marsh c8b3e8523c
Re-enable `zlib-ng` on x86 platforms (#10365)
## Summary

Closes https://github.com/astral-sh/uv/issues/10363.
2025-01-07 11:00:32 -05:00
Andrew Gallant 043bdcec8b
uv-pep440: fix bad merge (#10368)
This happened as a result of #10345 and #10362 being merged
independently. The latter used the old `Version::release` API, but the
former changed the `Version::release` API. This PR tweaks the new test
to use the new API (i.e., force a deref on the proxy type).
2025-01-07 15:11:41 +00:00
konsti 373e34f5dd
Remove `[u64; 4]` from small version to move `Arc` to full version (#10345) 2025-01-07 14:25:32 +00:00
Andrew Gallant fb29445999
uv-pep440: adds an explicit test for trailing zeros (#10362)
Basically, this explicitly checks that parsing a `1.2.0` into a
`Version` will roundtrip back to a `1.2.0`, and that parsing a `1.2`
will roundtrip back to a `1.2`.

I think this case is included in the other tests in this module, but
this test makes the behavior more clearly intentional I think.

Ref #10345
2025-01-07 14:16:23 +00:00
konsti 14a9008e54
Avoid overcounting versions in batch prefetcher (#10350) 2025-01-07 14:12:18 +00:00
konsti 3cbf8ab7b1
Optimize `requirements_for_extra` (#10348) 2025-01-07 14:12:12 +00:00
konsti c6ac121ed0
Refactor batch prefetch (#10349) 2025-01-07 14:58:36 +01:00
konsti 3dc481b063
Speed up file pins (#10346)
Ref https://github.com/astral-sh/uv/issues/10344

Avoid the nested hashmap, file pinning is called in the version
selection hot loop.

```
$ hyperfine --warmup 1 --prepare "uv venv -p 3.12" "./uv-2 pip compile scripts/requirements/airflow.in" "./uv-1 pip compile scripts/requirements/airflow.in"
    Finished `profiling` profile [optimized + debuginfo] target(s) in 0.12s
Benchmark 1: ./uv-2 pip compile scripts/requirements/airflow.in
  Time (mean ± σ):     420.1 ms ±   4.7 ms    [User: 585.4 ms, System: 195.1 ms]
  Range (min … max):   413.1 ms … 429.2 ms    10 runs

Benchmark 2: ./uv-1 pip compile scripts/requirements/airflow.in
  Time (mean ± σ):     473.0 ms ±   4.9 ms    [User: 654.4 ms, System: 209.4 ms]
  Range (min … max):   468.0 ms … 481.1 ms    10 runs

Summary
  ./uv-2 pip compile scripts/requirements/airflow.in ran
    1.13 ± 0.02 times faster than ./uv-1 pip compile scripts/requirements/airflow.in
```
2025-01-07 08:51:08 -05:00
konsti d8fcf2a58f
Simplify `requirements_for_extra` (#10347)
Ref https://github.com/astral-sh/uv/issues/10344

Not a performance optimization, but the function had become too large.
No logic changes, just code moving around. Looks slightly better when
ignoring whitespace changes.

It's still too complex but i haven't found an apt simplification.
2025-01-07 08:50:13 -05:00
Charlie Marsh 0fcccb8994
Accept requirements in `uv remove` (#10338)
## Summary

This allows, e.g., `uv remove flask[dotenv]` to remove `flask`. Like
`pip install` and `uv pip install`, the content after the package name
has no effect.

Closes https://github.com/astral-sh/uv/issues/9764.
2025-01-07 08:47:05 -05:00
Andrew Tulloch 671e93816a
Buffer file reads in `serde_json::from_reader` (#10341)
<!--
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

https://docs.rs/serde_json/latest/serde_json/fn.from_reader.html
suggests that

> When reading from a source against which short reads are not
efficient, such as a
[File](https://doc.rust-lang.org/std/fs/struct.File.html), you will want
to apply your own buffering because serde_json will not buffer the
input. See
[std::io::BufReader](https://doc.rust-lang.org/std/io/struct.BufReader.html).

Without this buffering, we observe a sequence of single byte reads which
can be quite inefficient depending on the underlying filesystem.

This adds buffering with `std::io::BufReader` to resolve this.


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

## Test Plan

Unit tests cover this code.

<!-- How was it tested? -->
2025-01-07 08:02:33 -05:00
konsti a1a4d820d5
Add `Send + 'static` bounds to cache deserialization (#10352) 2025-01-07 09:55:37 +00:00
konsti 180a138161
Deactivate tracing for choose version (#10351) 2025-01-07 09:55:06 +00:00
Zanie Blue eb6ad9a4fa
Bump version to 0.5.15 (#10337) 2025-01-06 18:04:25 -06:00
Charlie Marsh 0d57d298e6
Avoid downgrading packages when `--upgrade` is provided (#10097)
## Summary

When `--upgrade` is provided, we should retain already-installed
packages _if_ they're newer than whatever is available from the
registry.

Closes https://github.com/astral-sh/uv/issues/10089.
2025-01-06 17:41:43 -05:00
github-actions[bot] eaaf8896ed
Sync latest Python releases (#10333)
Automated update for Python releases.

---------

Co-authored-by: zanieb <2586601+zanieb@users.noreply.github.com>
Co-authored-by: Zanie Blue <contact@zanie.dev>
2025-01-06 13:19:35 -06:00
Charlie Marsh 243d2f8d5d
Redact new index credentials in `uv add` (#10329)
## Summary

Closes https://github.com/astral-sh/uv/issues/10328.
2025-01-06 17:24:05 +00:00
Charlie Marsh 66a603b6c4
Use dynamic dispatch to simplify reporters (#10086)
## Summary

Sort of undecided on this. These are already stored as `dyn Reporter` in
each struct, so we're already using dynamic dispatch in that sense. But
all the methods take `impl Reporter`. This is sometimes nice (the
callsites are simpler?), but it also means that in practice, you often
_can't_ pass `None` to these methods that accept `Option<impl
Reporter>`, because Rust can't infer the generic type.

Anyway, this adds more consistency and simplifies the setup by using
`Arc<dyn Reporter>` everywhere.
2025-01-06 12:04:00 -05:00
Trevor Manz 54b9e8ff82
Clarify exclude-newer only allows full timestamps in settings docs (#9135)
<!--
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

Follow up to #8553

Clarifies that the `exclude-newer` setting must be a full timestamp and
not a date.

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

## Test Plan

N/A

<!-- How was it tested? -->
2025-01-06 10:03:21 -05:00
renovate[bot] 5aefe69ecf
Update Rust crate itertools to 0.14.0 (#10316) 2025-01-05 21:27:14 -05:00
Charlie Marsh f7fc85f4e9
Respect `FORCE_COLOR` environment variable (#10315)
## Summary

Closes https://github.com/astral-sh/uv/issues/10303.
2025-01-06 02:18:16 +00:00
Charlie Marsh 7182a34aa4
Avoid generating unused hashes during `uv lock` (#10307)
## Summary

We don't even use these! See the comment inline.

Closes https://github.com/astral-sh/uv/issues/9651.
2025-01-06 00:58:07 +00:00
Charlie Marsh 833519d5d8
Extract supported architectures from wheel tags (#10179)
## Summary

This PR extends #10046 to also handle architectures, which allows us to
correctly include `2.5.1` on the `cu124` index for ARM Linux.

Closes https://github.com/astral-sh/uv/issues/9655.
2025-01-04 02:42:17 +00:00
Charlie Marsh 5b334313e5
Visit source distributions before wheels (#10291)
## Summary

This should address the comment here:
https://github.com/astral-sh/uv/pull/10179#issuecomment-2569189265. We
don't compute implied markers if the marker is already `TRUE`, and we
set it to `TRUE` as soon as we see a source distribution. So if we visit
the source distribution before the wheels, we'll avoid computing these
for any irrelevant distributions.
2025-01-03 12:07:29 -05:00
Charlie Marsh 9f1ba2b967
Bump version to v0.5.14 (#10279) 2025-01-02 14:31:04 -05:00
Charlie Marsh 906511fa23
Ignore empty or missing hrefs in Simple HTML (#10276)
## Summary

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

## Test Plan

`cargo run pip install -f https://whl.smartgic.io/ ggwave
--python-platform linux` (fails prior to this PR; passes after)
2025-01-02 17:43:15 +00:00
Charlie Marsh d1a5a27da9
Gate performance feature on cfg (#10277) 2025-01-02 12:31:19 -05:00
Charlie Marsh 2eba52f674
Avoid forking on version in non-universal resolutions (#10274)
## Summary

Closes https://github.com/astral-sh/uv/issues/10275.
2025-01-02 11:40:48 -05:00
konsti a3307d91a3
Actually use jemalloc (#10269)
The uv-performance-memory-allocator is currently optimized out at least
on musl due to the crate being otherwise unused
(https://github.com/rust-lang/rust/issues/64402), causing musl to not
use jemalloc and being slow.

Command:
```
cargo build --target x86_64-unknown-linux-musl --profile profiling
hyperfine --warmup 1 --runs 10 --prepare "uv venv -p 3.12" "target/x86_64-unknown-linux-musl/profiling/uv pip compile scripts/requirements/airflow.in"
```

Before:
```
Time (mean ± σ):      1.149 s ±  0.013 s    [User: 1.498 s, System: 0.433 s]
Range (min … max):    1.131 s …  1.173 s    10 runs
```

After:
```
Time (mean ± σ):     552.6 ms ±   4.7 ms    [User: 771.7 ms, System: 197.5 ms]
Range (min … max):   546.4 ms … 561.6 ms    10 runs
2025-01-02 10:03:14 -05:00
konsti f5a60d1a18
Fix musl cdylib warning (#10268)
The `cdylib` was used for the pyo3 bindings to uv-pep508, which don't
exist anymore. It was now creating warnings on musl due to musl
(statically linked) no supporting shared libraries.
2025-01-02 09:40:38 -05:00
konsti 475e33af7e
Fix `lock_pytorch_cpu` (#10271)
A new release of pillow broke the test. By pinning the upper versions,
we make the test stable.
2025-01-02 09:40:23 -05:00
Charlie Marsh ed4e4ff4b5
Use `BTreeMap::range` to avoid iterating over unnecessary versions (#10266)
## Summary

Closes https://github.com/astral-sh/uv/issues/6174.
2025-01-02 01:21:36 +00:00
Charlie Marsh 7bbec6b2e4
Parse URLs lazily in resolver (#10259)
## Summary

The idea here is to avoid parsing all registry URLs upfront, and instead
parse them when we need them.

Closes #6133.
2025-01-01 12:35:30 -05:00
Charlie Marsh 9e0b35ad82
Detect cyclic dependencies during builds (#10258)
## Summary

Closes
https://github.com/astral-sh/uv/issues/10255#issuecomment-2566782671.
2024-12-31 22:22:42 -05:00
Charlie Marsh 9ebd94cb93
Add tests for `UrlString` methods (#10256) 2024-12-31 19:16:08 +00:00
Charlie Marsh cf88828e55
Avoid stripping query parameters from URLs (#10253)
## Summary

Closes https://github.com/astral-sh/uv/issues/10251.
2024-12-31 12:59:26 -05:00
Charlie Marsh c77aa5820b
Add a required version setting to uv (#10248)
## Summary

This follows Ruff's design exactly: you can provide a version specifier
(like `>=0.5`), and we'll enforce it at runtime.

Closes https://github.com/astral-sh/uv/issues/8605.
2024-12-31 15:37:46 +00:00
吴小白 a2f436f79b
Add loongarch64 to supported Python platform tags (#10223) 2024-12-31 03:00:37 +00:00
Charlie Marsh 7f1ee9c6dd
Accept directories with space names in `uv init` (#10246)
## Summary

Closes https://github.com/astral-sh/uv/issues/10245.
2024-12-30 21:05:00 -05:00
Charlie Marsh dcd96a83aa
Respect static metadata for already-installed distributions (#10242)
## Summary

Closes
https://github.com/astral-sh/uv/issues/10239#issuecomment-2565663046
2024-12-30 12:47:06 -05:00
Luca Leonardo Scorcia dec6f5aa02
Initial support for ARMv5TE platform via cross compilation (#10234)
## Summary
Allows uv to recognize the ARMv5TE platform. This platform is currently
supported on Debian distributions. It is an older 32 bit platform mostly
used in embedded devices, currently in rust tier 2.5 so it requires
cross compilation.

Fixes #10157 .

## Test Plan
Tested directly on device by applying a slightly different patch to tag
0.5.4 which is used by the current Home Assistant version (2024.12.5).
After the patch Home Assistant is able to recognize the Python venv and
setup its dependencies.

Patched uv was built with 
```
$ CARGO_TARGET_ARMV5TE_UNKNOWN_LINUX_GNUEABI_LINKER="/usr/bin/arm-linux-gnueabi-gcc" maturin build --release --target armv5te-unknown-linux-gnueabi --manylinux off
``` 

The target wheel was then moved on the device and installed via pip
install.
2024-12-30 11:49:57 -05:00
Charlie Marsh cecff3a726
Guard against self-deletion in `uv venv` and `uv tool` (#10206)
## Summary

Closes https://github.com/astral-sh/uv/issues/1327.
2024-12-29 10:46:45 -05:00
Charlie Marsh 4b5a89dbff
Add manylinux2014 aliases for `--python-platform` (#10217)
## Summary

Closes https://github.com/astral-sh/uv/issues/10210.
2024-12-29 01:36:02 +00:00
Charlie Marsh b316d780bf
Consider workspace dependencies to be 'direct' (#10197)
## Summary

Closes https://github.com/astral-sh/uv/issues/7863.
2024-12-28 20:32:45 -05:00
Arnav Gupta 3733008e6c
Add support for optional `--description` in `uv init` (#10209)
## Summary
Closes #7913 by adding an optional `--description` argument to `uv init`
that fills the description field in the pyproject.toml with the supplied
arg value.

Updated `uv init` docs to describe this new optional argument.
<!-- What's the purpose of the change? What does it do, and why? -->

## Test Plan
Added snapshot tests in `uv/crates/uv/tests/it/init.rs` to test this
functionality.
<!-- How was it tested? -->

---------

Co-authored-by: Charlie Marsh <charlie.r.marsh@gmail.com>
2024-12-28 00:06:51 +00:00
Domenico 8992f5524c
fix: typo in uv main (#10205) 2024-12-27 13:43:00 -05:00
Charlie Marsh 1fb7f352b1
Add `--outdated` support to `uv pip tree` (#10199)
## Summary

Closes https://github.com/astral-sh/uv/issues/10181.
2024-12-27 17:03:06 +00:00
Charlie Marsh 49a2b6f85c
Add `--exact` flag to `uv run` (#10198)
## Summary

`uv run --exact` will remove any unnecessary packages prior to running
the given command. (By default, `uv run` uses "inexact" semantics.)

Closes https://github.com/astral-sh/uv/issues/7838.
2024-12-27 16:43:30 +00:00
Charlie Marsh 0bc33e87b8
Patch pkgconfig files after Python install (#10189)
## Summary

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

## Test Plan

Ran `cargo run python install 3.10.15 --reinstall`; verified that
`python3.pc` contained:

```
# See: man pkg-config
prefix=/Users/crmarsh/.local/share/uv/python/cpython-3.10.15-macos-aarch64-none
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: Python
Description: Build a C extension for Python
Requires:
Version: 3.10
Libs.private: -ldl   -framework CoreFoundation
Libs:
Cflags: -I${includedir}/python3.10
```
2024-12-27 00:50:41 +00:00
Charlie Marsh 4c49683f7b
Bump version to v0.5.13 (#10188) 2024-12-26 23:58:13 +00:00
Charlie Marsh 2f5badddbb
Avoid enforcing URL check on initial publish (#10182)
## Summary

Closes https://github.com/astral-sh/uv/issues/10174.
2024-12-26 23:46:36 +00:00
Charlie Marsh d3f06de4f5
Fix incorrect mismatched constraints reference (#10184) 2024-12-26 23:25:38 +00:00
Charlie Marsh 351d602d86
Bump version to v0.5.12 (#10175) 2024-12-26 14:16:19 -05:00
Charlie Marsh b6697a777c
Run `cargo update` (#10173) 2024-12-26 12:00:58 -05:00
Charlie Marsh 74112553bf
Avoid cloning script when discovering interpreter (#10172) 2024-12-26 15:43:55 +00:00
Charlie Marsh 79dce7391e
Avoid need for universal markers in `requirements.txt` export (#10171) 2024-12-26 15:32:32 +00:00
Charlie Marsh 0b5c0220b5
Allow environment variables to be included in cache keys (#10170)
## Summary

Closes https://github.com/astral-sh/uv/issues/8130.
2024-12-26 15:31:49 +00:00
Frost Ming e6126ce0dc
fix: always write slash paths to RECORD file (#10164)
Signed-off-by: Frost Ming <me@frostming.com>

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

This PR solves an issue on Windows that platform-specific paths are
written to the `RECORD` file when installing, which is inconsistent with
PEP 376, quoting:

> Each record is composed of three elements:
>
>the file’s path
> * a ‘/’-separated path, relative to the base location, if the file is
under the base location.
> * a ‘/’-separated path, relative to the base location, if the file is
under the installation prefix AND if the base location is a subpath of
the installation prefix.
> * an absolute path, using the local platform separator

## Test Plan

<!-- How was it tested? -->
Test case included

---------

Signed-off-by: Frost Ming <me@frostming.com>
Co-authored-by: Charlie Marsh <charlie.r.marsh@gmail.com>
2024-12-26 09:33:32 -05:00
Charlie Marsh 20df970a56
Nest setup code under unnamed requirements block (#10163) 2024-12-25 23:40:11 +00:00
Charlie Marsh f40da39baf
Store absolute paths in PEP 723 scripts (#10161) 2024-12-25 20:23:39 +00:00
Charlie Marsh bec8468183
Remove unnecessary prefixes (#10158) 2024-12-25 14:18:01 -05:00
Charlie Marsh 3cb723220e
Remove `anyhow::Result` for lock serialization (#10151) 2024-12-25 01:24:26 +00:00
Charlie Marsh facd21a679
Replace `Option<BTreeSet>` with `BTreeSet` for members (#10150) 2024-12-25 00:37:46 +00:00
Charlie Marsh f872b56124
Add a lock target abstraction (#10129)
## Summary

This PR introduces a `LockTarget`, which is peer to `InstallTarget` and
enables us to capture the common functionality necessary to support
locking.

For now, to minimize changes, only the `Workspace` target is
implemented. In a future PR, I'll add a `Script` target for both locking
and installing.
2024-12-24 19:26:31 -05:00
Charlie Marsh 7c47a457d9
Move installable targets out of `uv-resolver` crate (#10126)
## Summary

The proximate motivation is that I want to add new variant for scripts,
but `uv-resolver` can't depend on `uv-scripts` without creating a
circular dependency. However, I think this _does_ just make more sense
-- the resolver crate shouldn't be coupled to the various kinds of
workspaces, and these details are mostly encoded in `projects/lock.rs`
and similar files.
2024-12-24 19:01:50 -05:00
Charlie Marsh 6745a8b00a
Show non-project dependencies in `uv tree` (#10149)
## Summary

Closes #10147.
2024-12-24 23:34:58 +00:00
Charlie Marsh e09b1080f4
Store dependency groups separate from dependencies in lockfile (#10148)
## Summary

This is necessary for some future improvements to non-`[project]`
workspaces and PEP 723 scripts. It's not "breaking", but it will
invalidate lockfiles for non-`[project]` workspaces. I think that's
okay, since we consider those legacy right now, and they're really rare.
2024-12-24 17:32:29 -05:00
Charlie Marsh 3435777e87
Support `uv export` for non-project workspaces (#10144) 2024-12-24 15:23:28 +00:00
Charlie Marsh 473e274275
Rename `requires-python` validation method (#10133)
## Summary

I want to differentiate this from `validate_script_requires_python`.
2024-12-24 00:45:21 +00:00
Charlie Marsh 9279a125e9
Add a common abstraction to discover PEP 723 script interpreters (#10132)
## Summary

This logic is already repeated twice, and I'm on the verge of adding a
third.

(No behavioral changes.)
2024-12-24 00:29:37 +00:00
Charlie Marsh 6ed7302432
Move implementations next to definitions (#10131) 2024-12-23 19:16:48 -05:00
Mathieu Kniewallner b24fb774b1
docs: fix invalid syntax in some sources examples (#10127)
## Summary

TOML 1.0 doesn't support multi-line for inline tables, so those examples
are invalid.
2024-12-23 16:12:45 -05:00
Charlie Marsh 755ca8efb5
Respect sources credentials in non-project workspaces (#10125)
## Summary

We weren't looking at credentials in the workspace root, for workspaces
in which the root _isn't_ a project.
2024-12-23 14:25:37 -05:00
Charlie Marsh 561103bf68
Remove redundant alias in `uv init` CLI (#10124) 2024-12-23 19:05:19 +00:00
Charlie Marsh 340e30d91e
Include extras in `uv-build` `Requires-Dist` metadata (#10110)
## Summary

Closes https://github.com/astral-sh/uv/issues/10091.
2024-12-23 08:56:53 -05:00
renovate[bot] c329623770
Update Rust crate thiserror to v2.0.9 (#10112) 2024-12-23 08:48:06 -05:00
renovate[bot] 4008e313bf
Update Rust crate which to v7.0.1 (#10113) 2024-12-23 08:47:36 -05:00
renovate[bot] 9e33658ba9
Update Rust crate anyhow to v1.0.95 (#10102) 2024-12-23 00:49:18 +00:00
Charlie Marsh d9008595d7
Rename 'Expected' and 'Actual' in lockfile logging (#10101)
## Summary

I can never remember which is which.
2024-12-22 20:42:42 +00:00
Charlie Marsh 0e836bcbbc
Include both installed and request in satisfied logging (#10100) 2024-12-22 20:41:28 +00:00
Charlie Marsh 38a38fa8e2
Avoid erroring when subdirectories are provided in `uv add` (#10095)
## Summary

Closes https://github.com/astral-sh/uv/issues/10094.
2024-12-22 15:23:27 +00:00
Charlie Marsh 33cb3497aa
Strip fragment when storing direct URL (#10093)
## Summary

Closes
https://github.com/astral-sh/uv/issues/10088#issuecomment-2558280467.
2024-12-22 09:07:04 -05:00
Charlie Marsh ad92aaf186
Update PyTorch test to latest `numpy` (#10087) 2024-12-21 18:43:09 -05:00
Charlie Marsh 6e8114ae53
Update PyTorch test to latest `jinja2` (#10084)
## Summary

This index doesn't include `exclude_newer`, unfortunately, so this
happens from time to time.
2024-12-21 21:01:10 +00:00
Charlie Marsh 8ff1dfd9b5
Add test cases for hash enforcement from existing uv.lock (#10081) 2024-12-21 09:53:38 -05:00
Charlie Marsh 705b3da913
Preserve sort when deciding on requirement placement (#10078)
## Summary

We had the right logic for determining whether the list is already
sorted, but we forgot to apply the same logic when deciding where to
insert the requirement, which made the list _unsorted_ for future
operations.

Closes https://github.com/astral-sh/uv/issues/10076.
2024-12-21 09:43:43 -05:00
Charlie Marsh 19a6b5fe4b
Include hashes for local source archives (#10080)
## Summary

Closes https://github.com/astral-sh/uv/issues/10077
2024-12-21 09:31:28 -05:00
Charlie Marsh 3da4fdeeb3
Use portable path in requirements wire (#10071) 2024-12-20 23:10:24 -05:00
Charlie Marsh 9128fe1866
Use portable path instead of string for subdirectory (#10069)
## Summary

A few places where there are extra conversions to and from string that
seem unnecessary; a few places where we're using `PathBuf` instead of
`PortablePathBuf`.
2024-12-21 00:28:36 +00:00
Charlie Marsh ddc290feb4
Add support for subdirectories in direct URLs in `uv.lock` (#10068)
## Summary

There were some subtle bugs here and no test coverage.
2024-12-20 19:00:50 -05:00
Charlie Marsh 2c68dfd4a9
Backtrack to non-local versions when wheels are missing platform support (#10046)
## Summary

This is yet another variation on
https://github.com/astral-sh/uv/pull/9928, with a few minor changes:

1. It only applies to local versions (e.g., `2.5.1+cpu`).
2. It only _considers_ the non-local version as an alternative (e.g.,
`2.5.1`).
3. It only _considers_ the non-local alternative if it _does_ support
the unsupported platform.
4. Instead of failing, it falls back to using the local version.

So, this is far less strict, and is effectively designed to solve
PyTorch but nothing else. It's also not user-configurable, except by way
of using `environments` to exclude platforms.
2024-12-20 19:11:27 +00:00
Charlie Marsh f3c5b63095
Avoid duplicating backslashes in sysconfig parser (#10063)
## Summary

We had a bug in our handling of escape sequences that caused us to
duplicate backslashes. If you installed repeatedly, we'd keep doubling
them, leading to an exponential blowup.

Closes #10060.
2024-12-20 13:52:42 -05:00
konsti cf14a62de7
Remove uv-pep440 cdylib (#10058) 2024-12-20 15:38:13 +00:00
konsti ae659c8bfe
Stable order for virtual packages (#10024)
uv gives priorities to packages by package name, not by virtual package
(`PubGrubPackage`). pubgrub otoh when prioritizing order the virtual
packages. When the order of virtual packages changes, uv changes its
resolutions and error messages. This means uv was depending on
implementation details of pubgrub's prioritization caching.

This broke with https://github.com/pubgrub-rs/pubgrub/pull/299, which
added a tiebreaker term that made pubgrub's sorting deterministic given
a deterministic ordering of allocating the packages (which happens the
first time pubgrub sees a package).

The new custom tiebreaker decreases the difference to upstream pubgrub.
2024-12-20 09:28:46 +00:00
Zanie Blue c4d0caaee5
Bump version to 0.5.11 (#10044) 2024-12-19 18:01:45 -06:00
github-actions[bot] 7cfa1fd204
Sync latest Python releases (#10045)
Automated update for Python releases.

Co-authored-by: zanieb <2586601+zanieb@users.noreply.github.com>
2024-12-19 17:58:25 -06:00
Charlie Marsh 4513ce0e2a
Allow `--script` to be provided with `uv run -` (#10035)
## Summary

Closes #10021.
2024-12-19 17:52:57 +00:00
Charlie Marsh 5a3826d9ff
Remove references to deprecated `first-match` (#10036)
## Summary

This is a backwards-compatible alias for `first-index`.

Closes https://github.com/astral-sh/uv/issues/10031.
2024-12-19 12:40:14 -05:00
Charlie Marsh 5c6e584987
Allow `uv run` arguments when reading from `stdin` (#10034)
## Summary

Closes https://github.com/astral-sh/uv/issues/10033.
2024-12-19 12:39:56 -05:00
konsti 557e750199
Build backend: Preserve executable bit (#10027)
Fixes #9968
2024-12-19 17:54:44 +01:00
konsti ac348eecdf
Batch prefetch per fork (#10029)
Previously, the batch prefetcher was part of the solver loop, used
across forks. This would lead to each preference in a fork being counted
as a tried version, so that after 5 forks with the identical version, we
would start batch prefetching. The reported numbers of tried versions
are also reported. By tracking the batch prefetcher on the fork the
numbers are corrected.

An alternative would be tracking the actually tried versions, but that
would mean more overhead in the top level solver loop when the current
heuristic works.

In `ecosystem/transformers`:

```
$ hyperfine --runs 10 --prepare "rm -f uv.lock" "../../target/release/uv lock --exclude-newer 2024-08-08T00:00:00Z" "uv lock --exclude-newer 2024-08-08T00:00:00Z"
Benchmark 1: ../../target/release/uv lock --exclude-newer 2024-08-08T00:00:00Z
  Time (mean ± σ):     386.2 ms ±   6.1 ms    [User: 396.0 ms, System: 144.5 ms]
  Range (min … max):   378.5 ms … 397.9 ms    10 runs

Benchmark 2: uv lock --exclude-newer 2024-08-08T00:00:00Z
  Time (mean ± σ):     422.0 ms ±   5.5 ms    [User: 459.6 ms, System: 190.3 ms]
  Range (min … max):   415.0 ms … 430.5 ms    10 runs

Summary
  ../../target/release/uv lock --exclude-newer 2024-08-08T00:00:00Z ran
    1.09 ± 0.02 times faster than uv lock --exclude-newer 2024-08-08T00:00:00Z
```
2024-12-19 15:47:01 +01:00
Jp dd442450b0
Retry mechanisms on Windows for copy_atomic and write_atomic (#10026)
Hello! 🙂 


## Summary

After submitting retry mechanisms on scripts installation for windows:
#9543 , I noticed that some other functions were using the same
`persist` features of temporary files. This could lead to the same issue
spotted before (temporary lock by AV/EDR software). I validated that it
was possible.

So I updated them to go through the same function on Windows, which is
using the retry mechanisms if needed.
In order to do so, I add to add an async version of the
`persist_with_retry`.

There is a little trick to make the borrow-checker happy line 306,
curious of your opinion on it? This is just a pointer move so it should
not induce some performance regression if I'm not mistaking.

I also updated them to use `fs_err` on Unix for better error messages.

Also, one of the error messages I introduced was badly formatted, I
fixed it. 🙂

## Test Plan

The changes should be iso functional and covered with the existing
test-suite.
2024-12-19 08:43:57 -05:00
samypr100 e65a273f1b
Sync env vars with uv-static crate 🧹 (#10016)
## Summary

Updates some env vars references to use `EnvVars` accordingly.
2024-12-18 22:10:27 -05:00
Zanie Blue 1d8dac17fd
Fix `uv python install --default` note about multiple requests (#10011) 2024-12-18 22:12:54 +00:00
Charlie Marsh 4d3c1b325e
Prefer higher Python lower-bounds when forking (#10007)
## Summary

With the advent of `--fork-strategy requires-python` (the default), we
actually _want_ to solve higher lower-bound forks before lower
lower-bound forks. The former ensures we get the most compatible
versions, while the latter ensures we get fewer overall versions. These
two strategies match up with `--fork-strategy`, but need to be respected
as such.

Closes https://github.com/astral-sh/uv/issues/9998.
2024-12-18 16:54:56 -05:00
konsti 8f88f98350
Update packse to 0.3.42 for backtracking test (#10009)
Add the missing test for #9843.
2024-12-18 19:53:34 +00:00
konsti cb325e2e2f
`metadata_directory` already contains dist-info directory (#10005)
From PEP 517:

```python
def prepare_metadata_for_build_wheel(metadata_directory, config_settings=None):
    ...
```

> Must create a .dist-info directory containing wheel metadata inside
the specified metadata_directory (i.e., creates a directory like
{metadata_directory}/{package}-{version}.dist-info/).

```python
def build_wheel(wheel_directory, config_settings=None, metadata_directory=None):
    ...
```

> If the build frontend has previously called
prepare_metadata_for_build_wheel and depends on the wheel resulting from
this call to have metadata matching this earlier call, then it should
provide the path to the created .dist-info directory as the
metadata_directory argument.

Notice that the `metadata_directory` is different for the both hooks:
For `prepare_metadata_for_build_wheel` is doesn't contain the
`.dist-info` directory as final segment, for `build_wheel` it does.

Previously, the code assumed that both directories didn't contain the
`.dist-info` for both cases.

Checked with:

```
maturin build
uv init test-uv-build-backend --build-backend uv
cd test-uv-build-backend
uv build --sdist --preview
cd ..
UV_PREVIEW=1 pip install test-uv-build-backend/dist/test_uv_build_backend-0.1.0.tar.gz --no-index --find-links target/wheels/ -v --no-cache-dir
```

Fixes #9969
2024-12-18 20:14:08 +01:00
Michał Górny 9305badcaf
Fix show_settings tests not to be affected by system configs (#9992)
<!--
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

Override XDG_CONFIG_DIRS in show_settings tests, in order to ensure that
they don't pick system configuration, and therefore fail due to value
mismatches. This specifically addresses test failures on Gentoo where a
default `/etc/xdg/uv/uv.toml` is installed, and users are free to modify
it.

Prior to #9914, we used to set `XDG_CONFIG_DIRS` locally before running
the test suite. However, since the test now wipes the environment, the
problem can no longer be resolved downstream.

## Test Plan

`cargo test` on a Gentoo system (with `/etc/xdg/uv/uv.toml` present).

---------

Co-authored-by: Charlie Marsh <charlie.r.marsh@gmail.com>
2024-12-18 11:02:15 -05:00
Charlie Marsh dd760ee507
Normalize `platform_system` to `sys_platform` (#9949)
## Summary

A revival of an old idea (#9344) that I have slightly more confidence in
now. I abandoned this idea because (1) it couldn't capture that, e.g.,
`platform_system == 'Windows' and sys_platform == 'foo'` (or some other
unknown value) are disjoint, and (2) I thought that Android returned
`"android"` for one of `sys_platform` or `platform_system`, which
would've made this logic incorrect.

However, it looks like Android... doesn't do that? And the values here
are almost always in a small, known set. So in the end, the tradeoffs
here actually seem pretty good.

Vis-a-vis our current solution, this can (e.g.) _simplify out_
expressions like `sys_platform == 'win32' or platform_system ==
'Windows'`.
2024-12-18 10:29:34 -05:00
github-actions[bot] eb6bf8b0ee
Sync latest Python releases (#9986)
Automated update for Python releases.

Co-authored-by: zanieb <2586601+zanieb@users.noreply.github.com>
2024-12-18 09:19:02 -06:00
Ben Beasley 45b9aa8f41
Make the backoff crate dependency Windows-only (#10002)
<!--
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

Since the `backoff` dependency is only *used* on Windows in practice,
this PR would ensure that it is only *compiled* on Windows, too. This is
helpful because it appears to be unmaintained upstream,
https://github.com/astral-sh/uv/issues/10001, and it would be nice to be
able to [drop it from
Fedora](https://bugzilla.redhat.com/show_bug.cgi?id=2329729).
<!-- What's the purpose of the change? What does it do, and why? -->

## Test Plan

<!-- How was it tested? -->
```
$ cargo run python install
$ cargo test
```
2024-12-18 10:04:54 -05:00
Charlie Marsh 294da52610
Add nuance to prefetch logging (#9984) 2024-12-17 22:52:45 +00:00
Zanie Blue 37b11ddb22
Bump version to 0.5.10 (#9983) 2024-12-17 14:53:19 -06:00
Zanie Blue 026a40d2a4
Improve styling of `uv remove` dependency hints (#9960)
Instead of using a warning, which is pretty aggressive feeling, use a
hint.
2024-12-17 14:23:29 -06:00
Zanie Blue d70160a57b
Update references to `python-build-standalone` to reflect the transferred project (#9977) 2024-12-17 20:19:58 +00:00
samypr100 e730ef19f1
Patch additional sysconfig values such as clang at install time (#9916)
## Summary

Minor follow up to https://github.com/astral-sh/uv/pull/9905 to patch
`clang` with `cc`.

Implements the replacements used in
[sysconfigpatcher](https://github.com/bluss/sysconfigpatcher/blob/main/src/sysconfigpatcher.py#L54),
namely

```python
DEFAULT_VARIABLE_UPDATES = {
    "CC": WordReplace("clang", "cc"),
    "CXX": WordReplace("clang++", "c++"),
    "BLDSHARED": WordReplace("clang", "cc"),
    "LDSHARED": WordReplace("clang", "cc"),
    "LDCXXSHARED": WordReplace("clang++", "c++"),
    "LINKCC": WordReplace("clang", "cc"),
    "AR": "ar",
}
```

## Test Plan

Added an additional test. Tested local python installs.

Related traces
```
TRACE Updated `AR` from `/tools/clang-linux64/bin/llvm-ar` to `ar`
TRACE Updated `CC` from `clang -pthread` to `cc -pthread`
TRACE Updated `CXX` from `clang++ -pthread` to `c++ -pthread`
TRACE Updated `BLDSHARED` from `clang -pthread -shared -L/tools/deps/lib` to `cc -pthread -shared -L/tools/deps/lib`
TRACE Updated `LDSHARED` from `clang -pthread -shared -L/tools/deps/lib` to `cc -pthread -shared -L/tools/deps/lib`
TRACE Updated `LDCXXSHARED` from `clang++ -pthread -shared` to `c++ -pthread -shared`
TRACE Updated `LINKCC` from `clang -pthread` to `cc -pthread
```

## Pending Discussion Items

https://github.com/astral-sh/uv/pull/9905#issuecomment-2543879587
2024-12-17 15:09:45 -05:00
Zanie Blue 6dfe1774e8
Use the build options value to improve hints for no wheel / source distribution errors (#9950)
Extends the hints from https://github.com/astral-sh/uv/pull/9948 with
`BuildOptions` context so we can explain a bit more.
2024-12-17 14:08:22 -06:00
Zanie Blue 515d72c6f9
Improve display of ranges when pre-releases are not allowed (#9944)
Closes https://github.com/astral-sh/uv/issues/9891

There are two changes here

1. We now exclude pre-releases (if they are not allowed) from the
available versions set when simplifying ranges, this means the
simplified range reflects the _allowed_ available versions — which is
what we want. We no longer segment ranges into arbitrary looking
segments..
2. We improve on #9885, expanding the scope to avoid regressions where
we would now otherwise enumerate a bunch of versions

---------

Co-authored-by: konsti <konstin@mailbox.org>
2024-12-17 17:05:15 +00:00
konsti ebc6d20d9d
Better build error messages (#9660)
Build failures are one of the most common user facing failures that
aren't "obivous" errors (such as typos) or resolver errors. Currently,
they show more technical details than being focussed on this being an
error in a subprocess that is either on the side of the package or -
more likely - in the build environment, e.g. the user needs to install a
dev package or their python version is incompatible.

The new error message clearly delineates the part that's important (this
is a build backend problem) from the internals (we called this hook) and
is consistent about which part of the dist building stage failed. We
have to calibrate the exact wording of the error message some more. Most
of the implementation is working around the orphan rule, (this)error
rules and trait rules, so it came out more of a refactoring than
intended.

Example:


![image](https://github.com/user-attachments/assets/2bc12992-db79-4362-a444-fd0d94594b77)
2024-12-17 09:44:32 -06:00
konsti b7df5dbaf3
Avoid `liblzma-dev` system dep in uv-dev and uv-bench (#9933)
Enable `lzma-sys/static` through the performance feature not only in uv,
but in uv-dev and uv-bench too, to avoid the system dependency on
`liblzma-dev`.

Ref #9880
2024-12-17 16:12:33 +01:00
Zanie Blue 052c1a6fd1
Collapse redundant Python version incompatibilities in resolver error message (#9957)
Part of https://github.com/astral-sh/uv/issues/9886

Technically could affect other redundant clauses, but that does not
appear to be the case in practice.
2024-12-17 14:27:07 +00:00
konsti 654ff8015a
Build backend: Fix pre-PEP 639 license files (#9965)
We were not copying the license file from a pre-PEP 639 declaration to
the source distribution.

Fixes #9947
2024-12-17 14:19:59 +00:00
Zanie Blue a78e7468a7
Omit trailing zeros on Python requirements inferred from versions (#9952)
In a message like

```
❯ echo "numpy>2" | uv pip compile -p 3.8 -
  × No solution found when resolving dependencies:
  ╰─▶ Because the requested Python version (>=3.8.0) does not satisfy Python>=3.10 and the requested 
  Python version (>=3.8.0) does not satisfy Python>=3.9,<3.10, we can conclude that Python>=3.9 is incompatible.
      And because numpy>=2.0.1,<=2.0.2 depends on Python>=3.9 and only the following versions of numpy are available:
          numpy<=2.0.2
```

I'm surprised that `-p 3.8` leads to expressions like `>=3.8.0` (I
understand it, of course, but it's not intuitive) and then all the
_other_ Python versions in the message omit the trailing zero. This
updates the `PythonRequirement` parsing to drop the trailing zeros. It's
easier to do there because the version is not yet abstracted.
2024-12-17 08:18:27 -06:00
Zanie Blue 2288905d46
Improve error messages for `uv remove` (#9959)
Closes https://github.com/astral-sh/uv/issues/9958
2024-12-17 08:16:01 -06:00
Zanie Blue 686f383fa4
Improve phrasing for single term incompatibilities (#9953)
It makes more sense to say "cannot be used" rather than "is
incompatible" when the term is a single package
2024-12-17 08:14:33 -06:00
konsti dde9a79fe7
Support 32-bit OS on 64-bit host (#9970)
When using a 32-bit OS on 64-bit host, almost all Python std methods
will report a 64-bit aarch64, but we most not install 64-bit executables
since Python is actually 32-bit, identifiable through
`struct.calcsize("P") == 4`.

Porting
4dc334c86d/src/packaging/tags.py (L539-L543)
to uv.

Tested on a raspberry pi 4 with a 64-bit host raspbian and `docker run
-it --rm -v arm32v7/ubuntu` as 32-bit "host".

Fixes #9842
2024-12-17 14:35:19 +01:00
Aarni Koskela 25db0e4988
Fix typo "operation system" (#9971)
## Summary

Just a tiny typo fix.
2024-12-17 08:33:45 -05:00
Charlie Marsh 9e4b842382
Add some misc. touch-ups in resolver (#9954) 2024-12-17 03:59:57 +00:00
Charlie Marsh 85e17ddfa7
Remove TODO around dev dependency edges (#9956)
## Summary

I think I fixed this?
2024-12-17 03:59:07 +00:00
Zanie Blue 5c3dafc1a5
Simplify ranges in the derivation tree before reporting (#9897)
An internal refactor to apply simplifications at the tree-level instead
of in the report formatter.
2024-12-16 19:42:05 -06:00
Zanie Blue d257bea720
Add resolver error hint for no-binary and no-build failures (#9948)
Moves some of the context out of the error chain to improve readability.
2024-12-16 18:47:40 -06:00
Zanie Blue 4091cce1f1
Fix redundant enumeration of all package versions in some resolver errors (#9885)
Closes #4075

There are many more redundant enumerations I want to look into as well.
2024-12-16 15:31:35 -06:00
Zanie Blue e6d7dc5a1a
Add test case for redundant enumeration of no versions (#9884)
Test case for https://github.com/astral-sh/uv/issues/4075
2024-12-16 18:51:02 +00:00
Richard Höchenberger 2e23abb1f0
Correctly document default value of `fork-strategy` setting (#9931)
<!--
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

The `fork-strategy` default value was overlooked in #9887.

---------

Co-authored-by: Charlie Marsh <charlie.r.marsh@gmail.com>
2024-12-16 18:41:22 +00:00
konsti 4b8cc3e29e
Include explicit indexes in publish index choice (#9932)
For publishing, we want to allow all simple `[[tool.uv.index]]` entries,
whether they are explicit or not. We don't allow flat indexes here,
assuming that an index you can upload to has a simple index URL (and
generally doesn't have a flat index URL, at least I don't know any case
that has).

The `no_index` branch isn't used atm, but I left it in case the method
gathers more users.

Fixes #9919
2024-12-16 11:40:30 +01:00
konsti 431ddc1d74
Change backtracking when packages conflict too much (#9843)
Background reading: https://github.com/astral-sh/uv/issues/8157
Companion PR: https://github.com/astral-sh/pubgrub/pull/36
Requires for test coverage: https://github.com/astral-sh/packse/pull/230

When two packages A and B conflict, we have the option to choose a lower
version of A, or a lower version of B. Currently, we determine this by
the order we saw a package (assuming equal specificity of the
requirement): If we saw A before B, we pin A until all versions of B are
exhausted. This can lead to undesirable outcomes, from cases where it's
just slow (sentry) to others cases without lower bounds where be
backtrack to a very old version of B. This old version may fail to build
(terminating the resolution), or it's a version so old that it doesn't
depend on A (or the shared conflicting package) anymore - but also is
too old for the user's application (fastapi). #8157 collects such cases,
and the `wrong-backtracking` packse scenario contains a minimized
example.

We try to solve this by tracking which packages are "A"s, culprits, and
"B"s, affected, and manually interfering with project selection and
backtracking. Whenever a version we just chose is rejected, we give the
current package a counter for being affected, and the package it
conflicted with a counter for being a culprit. If a package accumulates
more counts than a threshold, we reprioritize: Undecided after the
culprits, after the affected, after packages that only have a single
version (URLs, `==<version>`). We then ask pubgrub to backtrack just
before the culprit. Due to the changed priorities, we now select package
B, the affected, instead of package A, the culprit.

To do this efficiently, we ask pubgrub for the incompatibility that
caused backtracking, or just the last version to be discarded (due to
its dependencies). For backtracking, we use the last incompatibility
from unit propagation as a heuristic. When a version is discarded
because one of its dependencies conflicts with the partial solution, the
incompatibility tells us the package in the partial solution that
conflicted.

We only backtrack once per package, on the first time it passes the
threshold. This prevents backtracking loops in which we make the same
decisions over and over again. But we also changed the priority, so that
we shouldn't take the same path even after the one time we backtrack (it
would defeat the purpose of this change).

There are some parameters that can be tweaked: Currently, the threshold
is set to 5, which feels not too eager with so me of the conflicts that
we want to tolerate but also changes strategies quickly. The relative
order of the new priorities can also be changed, as for each (A, B) pair
the priority of B is afterwards lower than that for A. Currently,
culprits capture conflict for the whole package, but we could limit that
to a specific version. We could discard conflict counters after
backtracking instead of keeping them eternally as we do now. Note that
we're always taking about pairs (A, B), but in practice we track
individual packages, not pairs.

A case that we wouldn't capture is when B is only introduced to the
dependency graph after A, but I think that would require cyclical
dependency for A and B to conflict? There may also be cases where
looking at the last incompatibility is insufficient.

Another example that we can't repair with prioritization is
urllib3/boto3/botocore: We actually have to check all the newer versions
of boto3 and botocore to identify the version that allows with the older
urllib3, no shortcuts allowed.

```
urllib3<1.25.4
boto3
```

All examples I tested were cases with two packages where we only had to
switch the order, so I've abstracted them into a single packse case.

This PR changes the resolution for certain paths, and there is the risk
for regressions.

Fixes #8157

---

All tested examples improved.

Input fastapi:
```text
starlette<=0.36.0
fastapi<=0.115.2
```

```
# BEFORE
$ uv pip --no-progress compile -p 3.11 --exclude-newer 2024-10-01 --no-annotate debug/fastapi.txt
annotated-types==0.7.0
anyio==4.6.0
fastapi==0.1.17
idna==3.10
pydantic==2.9.2
pydantic-core==2.23.4
sniffio==1.3.1
starlette==0.36.0
typing-extensions==4.12.2

# AFTER
$ cargo run --profile fast-build --no-default-features pip compile -p 3.11 --no-progress --exclude-newer 2024-10-01 --no-annotate debug/fastapi.txt 
annotated-types==0.7.0
anyio==4.6.0
fastapi==0.109.1
idna==3.10
pydantic==2.9.2
pydantic-core==2.23.4
sniffio==1.3.1
starlette==0.35.1
typing-extensions==4.12.2
```


Input xarray:
```text
xarray[accel]
```

```
# BEFORE
$ uv pip --no-progress compile -p 3.11 --exclude-newer 2024-10-01 --no-annotate debug/xarray-accel.txt
bottleneck==1.4.0
flox==0.9.13
llvmlite==0.36.0
numba==0.53.1
numbagg==0.8.2
numpy==2.1.1
numpy-groupies==0.11.2
opt-einsum==3.4.0
packaging==24.1
pandas==2.2.3
python-dateutil==2.9.0.post0
pytz==2024.2
scipy==1.14.1
setuptools==75.1.0
six==1.16.0
toolz==0.12.1
tzdata==2024.2
xarray==2024.9.0

# AFTER
$ cargo run --profile fast-build --no-default-features pip compile -p 3.11 --no-progress --exclude-newer 2024-10-01 --no-annotate debug/xarray-accel.txt
bottleneck==1.4.0
flox==0.9.13
llvmlite==0.43.0
numba==0.60.0
numbagg==0.8.2
numpy==2.0.2
numpy-groupies==0.11.2
opt-einsum==3.4.0
packaging==24.1
pandas==2.2.3
python-dateutil==2.9.0.post0
pytz==2024.2
scipy==1.14.1
six==1.16.0
toolz==0.12.1
tzdata==2024.2
xarray==2024.9.0
```


Input sentry: The resolution is identical, but arrived at much faster:
main tries 69 versions (sentry-kafka-schemas: 63), PR tries 12 versions
(sentry-kafka-schemas: 6; 5 times conflicting, then once the right
version).

```text
python-rapidjson<=1.20,>=1.4
sentry-kafka-schemas<=0.1.113,>=0.1.50
```

```
# BEFORE
$ uv pip --no-progress compile -p 3.11 --exclude-newer 2024-10-01 --no-annotate debug/sentry.txt
fastjsonschema==2.20.0
msgpack==1.1.0
python-rapidjson==1.8
pyyaml==6.0.2
sentry-kafka-schemas==0.1.111
typing-extensions==4.12.2

# AFTER
$ cargo run --profile fast-build --no-default-features pip compile -p 3.11 --no-progress --exclude-newer 2024-10-01 --no-annotate debug/sentry.txt
fastjsonschema==2.20.0
msgpack==1.1.0
python-rapidjson==1.8
pyyaml==6.0.2
sentry-kafka-schemas==0.1.111
typing-extensions==4.12.2
```


Input apache-beam
```text
# Run on Python 3.10
dill<0.3.9,>=0.2.2
apache-beam<=2.49.0
```

```
# BEFORE
$ uv pip --no-progress compile -p 3.10 --exclude-newer 2024-10-01 --no-annotate debug/apache-beam.txt
  × Failed to download and build `apache-beam==2.0.0`
  ╰─▶ Build backend failed to determine requirements with `build_wheel()` (exit status: 1)

# AFTER
$ cargo run --profile fast-build --no-default-features pip compile -p 3.10 --no-progress --exclude-newer 2024-10-01 --no-annotate debug/apache-beam.txt
apache-beam==2.49.0
certifi==2024.8.30
charset-normalizer==3.3.2
cloudpickle==2.2.1
crcmod==1.7
dill==0.3.1.1
dnspython==2.6.1
docopt==0.6.2
fastavro==1.9.7
fasteners==0.19
grpcio==1.66.2
hdfs==2.7.3
httplib2==0.22.0
idna==3.10
numpy==1.24.4
objsize==0.6.1
orjson==3.10.7
proto-plus==1.24.0
protobuf==4.23.4
pyarrow==11.0.0
pydot==1.4.2
pymongo==4.10.0
pyparsing==3.1.4
python-dateutil==2.9.0.post0
pytz==2024.2
regex==2024.9.11
requests==2.32.3
six==1.16.0
typing-extensions==4.12.2
urllib3==2.2.3
zstandard==0.23.0
```
2024-12-16 11:39:50 +01:00
renovate[bot] 34281d96f1
Update Rust crate thiserror to v2.0.7 (#9926) 2024-12-15 20:12:08 -05:00
Charlie Marsh 9ab7dd6c93
Clear environment in settings tests (#9914)
## Summary

Part of: https://github.com/astral-sh/uv/issues/9873
2024-12-15 18:40:22 +00:00
samypr100 06015de90e
Patch additional `sysconfig` values such as AR at install time (#9905)
## Summary

Minor follow up to https://github.com/astral-sh/uv/pull/9857 to patch
AR.

Implements the AR replacement used in
[sysconfigpatcher](https://github.com/bluss/sysconfigpatcher/blob/main/src/sysconfigpatcher.py#L54),
namely

```python
DEFAULT_VARIABLE_UPDATES = {
    ...
    "AR": "ar",
}
```

## Test Plan

Added an additional test. Tested local python installs.

Related traces
```
TRACE Updated `AR` from `/tools/clang-linux64/bin/llvm-ar` to `ar`
```
2024-12-15 10:27:54 -05:00
Charlie Marsh 48c9196f9e
Show a concise error message for missing version field (#9912)
## Summary

This now looks like:

```
error: Failed to parse: `pyproject.toml`
  Caused by: TOML parse error at line 1, column 1
  |
1 | [project]
  | ^^^^^^^^^
`pyproject.toml` is using the `[project]` table, but the required `project.version` field is neither set nor present in the `project.dynamic` list
```

Closes https://github.com/astral-sh/uv/issues/9910.
2024-12-15 10:27:43 -05:00
Charlie Marsh d4c2c46f6e
Skip `--native-tls` in `pip compile` header (#9913)
## Summary

I also omitted `--no-progress` (we omit `--verbose` and `--quiet` --
this seems similar).

Part of: https://github.com/astral-sh/uv/issues/9873.
2024-12-15 09:44:59 -05:00
Zanie Blue c2e2c39449
Show terms in derivation tree debug output (#9862) 2024-12-13 22:53:33 -06:00
Charlie Marsh f0a2d6f076
Allow multiple disjoint URLs in overrides (#9893)
## Summary

Closes https://github.com/astral-sh/uv/issues/9803.
2024-12-14 02:12:44 +00:00
Charlie Marsh 0652800cb0
Bump version to v0.5.9 (#9889) 2024-12-13 17:28:19 -05:00
Imani Pelton 40a2a6a959
Avoid `panic!()` when current directory does not exist (#9876)
## Summary

If the shell is currently in a directory that no longer exists, uv will
panic from any command. Panicking is a confusing behavior to those
unfamiliar with Rust and can sometimes make it hard to determine the
true issue.

Closes #9875 

## Test Plan

The reproduction steps in the issue report were followed and uv no
longer panics. `uv version` can still successfully print the version if
the directory does exist.

---------

Co-authored-by: Charlie Marsh <charlie.r.marsh@gmail.com>
2024-12-13 21:39:46 +00:00
Charlie Marsh 7cdc1b2ec2
Document the `--fork-strategy` setting (#9887) 2024-12-13 21:35:20 +00:00
Zanie Blue 4bce1a32ec
Fix bug in terms when collapsing unavailable versions in resolver errors (#9877)
Closes https://github.com/astral-sh/uv/issues/9861
Closes https://github.com/pubgrub-rs/pubgrub/issues/297
2024-12-13 15:06:39 -06:00
Charlie Marsh b2459e6326
Introduce a `--fork-strategy` preference mode (#9868)
## Summary

This PR makes the behavior in https://github.com/astral-sh/uv/pull/9827
the default: we try to select the latest supported package version for
each supported Python version, but we still optimize for choosing fewer
versions when stratifying by platform.

However, you can opt out with `--fork-strategy fewest`.

Closes https://github.com/astral-sh/uv/issues/7190.
2024-12-13 16:05:07 -05:00
Charlie Marsh 0ee21146f4
Fork version selection based on `requires-python` requirements (#9827)
## Summary

This PR addresses a significant limitation in the resolver whereby we
avoid choosing the latest versions of packages when the user supports a
wider range.

For example, with NumPy, the latest versions only support Python 3.10
and later. If you lock a project with `requires-python = ">=3.8"`, we
pick the last NumPy version that supported Python 3.8, and use that for
_all_ Python versions. So you get `1.24.4` for all versions, rather than
`2.2.0`. And we'll never upgrade you unless you bump your
`requires-python`. (Even worse, those versions don't have wheels for
Python 3.12, etc., so you end up building from source.)

(As-is, this is intentional. We optimize for minimizing the number of
selected versions, and the current logic does that well!)

Instead, we know recognize when a version has an elevated
`requires-python` specifier and fork. This is a new fork point, since we
need to fork once we have the package metadata, as opposed to when we
see the dependencies.

In this iteration, I've made this behavior the default. I'm sort of
undecided on whether I want to push on that... Previously, I'd suggested
making it opt-in via a setting
(https://github.com/astral-sh/uv/pull/8686).

Closes https://github.com/astral-sh/uv/issues/8492.
2024-12-13 15:33:46 -05:00
Charlie Marsh dc0525ddd0
Remove use of `.previous()` in sysconfig parser (#9881)
## Summary

Apparently this is only available in debug.
2024-12-13 20:21:37 +00:00
Charlie Marsh 53dfe0de52
Avoid lookaheads in `sysconfig` parser (#9879)
## Summary

Based on some review feedback from
https://github.com/astral-sh/uv/pull/9857.
2024-12-13 20:02:52 +00:00
Charlie Marsh 08ea79cc33
Remove `-isysroot` when patching sysconfig (#9860)
## Summary

This is equivalent to
https://github.com/indygreg/python-build-standalone/pull/414, but at
install-time, so that it affects older Python builds too.
2024-12-13 19:49:27 +00:00
Charlie Marsh d2fb4c585d
Patch `sysconfig` data at install time (#9857)
## Summary

This PR reimplements
[`sysconfigpatcher`](https://github.com/bluss/sysconfigpatcher) in Rust
and applies it to our Python installations at install-time, ensuring
that the `sysconfig` data is more likely to be correct.

For now, we only rewrite prefixes (i.e., any path that starts with
`/install` gets rewritten to the correct absolute path for the current
machine).

Unlike `sysconfigpatcher`, this PR does not yet do any of the following:

- Patch `pkginfo` files.
- Change `clang` references to `cc`.

A few things that we should do as follow-ups, in my opinion:

1. Rewrite
[`AR`](c1ebf8ab92/src/sysconfigpatcher.py (L61)).
2. Remove `-isysroot`, which we already do for newer builds.
2024-12-13 14:36:22 -05:00
Charlie Marsh 5903ce5759
Avoid spurious 'Upgraded tool environment' in `uv tool upgrade` (#9870)
## Summary

Closes https://github.com/astral-sh/uv/issues/9869.
2024-12-13 14:36:02 +00:00
konsti 6051a26995
Remove test dependency on `pg_config` (#9853)
By mocking the metadata of `psycopg-c`, we avoid a test dependency on
`pg_config` for the warehouse ecosystem test.
2024-12-13 12:45:08 +01:00
Charlie Marsh f80ddf10b6
Avoid trailing slash when deserializing from lockfile (#9848)
## Summary

Very tricky problem whereby `workspace_root.join(path)` returns the
workspace root with a trailing slash if `path` is empty... This caused
us to accidentally _include_ excluded members during workspace
discovery, since (e.g.) `packages/seeds` doesn't match
`packages/seeds/`.

Closes
https://github.com/astral-sh/uv/issues/9832#issuecomment-2539121761.
2024-12-12 18:49:05 +00:00
Charlie Marsh a13e3f5f69
Avoid reusing interpreter metadata when running under Rosetta (#9846)
## Summary

Closes https://github.com/astral-sh/uv/issues/9836.
2024-12-12 13:21:35 -05:00
konsti c0f8e20a51
Allow underscores in entrypoints (#9825) 2024-12-11 22:24:18 +00:00
Charlie Marsh 8110dedde7
Simplify requires-python check in resolver (#9824)
## Summary

I believe this is identical.
2024-12-11 15:38:25 -05:00
Charlie Marsh 2ca39f1a2d
Skip root when assessing prefix viability (#9823)
## Summary

In CPython, it appears that `/` is not considered as a valid path in
`search_up`:

```c
static PyObject *
getpath_dirname(PyObject *Py_UNUSED(self), PyObject *args)
{
    PyObject *path;
    if (!PyArg_ParseTuple(args, "U", &path)) {
        return NULL;
    }
    Py_ssize_t end = PyUnicode_GET_LENGTH(path);
    Py_ssize_t pos = PyUnicode_FindChar(path, SEP, 0, end, -1);
    if (pos < 0) {
        return PyUnicode_FromStringAndSize(NULL, 0);
    }
    return PyUnicode_Substring(path, 0, pos);
}
```

```python
def search_up(prefix, *landmarks, test=isfile):
    while prefix:
        if any(test(joinpath(prefix, f)) for f in landmarks):
            return prefix
        prefix = dirname(prefix)
```

Closes https://github.com/astral-sh/uv/issues/9818.
2024-12-11 14:59:48 -05:00
Zanie Blue a41ef21db9
Fix suggestion to use `uv help python` on invalid install requests (#9820)
Closes https://github.com/astral-sh/uv/issues/9819
2024-12-11 12:48:35 -06:00
Zanie Blue ae25c2f4db
Upgrade minimum Rust version to 1.83 (#9815)
This reverts commit 6cc7a560f7 to reapply
#9511 since we've disabled ppc64le-musl per #9793
2024-12-11 10:06:19 -06:00
Zanie Blue f64da9b763
Add support for `UV_OFFLINE` (#9795)
Closes https://github.com/astral-sh/uv/issues/9794
2024-12-11 09:32:58 -06:00
konsti cb3fefff15
Fix local packse workflow (#9808)
Make the local packse workflow work again:

```
# In packse:
uv run --extra index --extra serve packse serve --no-hash scenarios &
# In uv:
UV_TEST_INDEX_URL="http://localhost:3141/simple/" ./scripts/scenarios/generate.py
```

Bugs fixed:
* The default scenario pattern didn't match anything.
* The snapshot update test command was wrong since the test
centralization
* Snapshot update failures would not be reported
2024-12-11 09:32:46 -06:00
Zanie Blue 80d41671bc
Bump version to 0.5.8 (#9791) 2024-12-11 15:18:51 +00:00
konsti 509dc83fd3
Resolver module improvements (#9773)
Further small refactorings for the resolver.
2024-12-11 14:46:36 +00:00
renovate[bot] 3b727b7323
Update Rust crate target-lexicon to 0.13.0 (#9729) 2024-12-10 20:34:07 -05:00
Zanie Blue 589416183f
Replace executables with broken symlinks during `uv python install` (#9706)
I somehow got in a state where we'd fail to install with

```
error: Failed to install cpython-3.13.0-macos-aarch64-none
  Caused by: Executable already exists at `/Users/zb/.local/bin/python3` but is not managed by uv; use `--force` to replace it
error: Failed to install cpython-3.13.0-macos-aarch64-none
  Caused by: Executable already exists at `/Users/zb/.local/bin/python` but is not managed by uv; use `--force` to replace it
```

but `python` / `python3` _were_ managed by uv, they just were linked to
an installation that was deleted.

This updates the logic to replace broken executables that are broken
symlinks. We apply this to broken links regardless of whether or not we
think the target is managed by uv.
2024-12-10 22:39:23 +00:00
Charlie Marsh 57a7f04f9a
Show a dedicated hint for missing `git+` prefixes (#9789)
## Summary

This has been bothering me a bit: `uv pip install "foo @
https://github.com/user/foo"` fails, telling you that it doesn't end in
a supported extension. But we should be able to tell you that it looks
like a Git repo.
2024-12-10 21:29:37 +00:00
konsti 321101d340
Publish: Support --index <name> (#9694)
When publishing, we currently ask the user to set `--publish-url` to the
upload URL and `--check-url` to the simple index URL, or the equivalent
configuration keys. But that's redundant with the `[[tool.uv.index]]`
declaration. Instead, we extend `[[tool.uv.index]]` with a `publish-url`
entry and allow passing `uv publish --index <name>`.

`uv publish --index <name>` requires the `pyproject.toml` to be present
when publishing, unlike using `--publish-url ... --check-url ...` which
can be used e.g. in CI without a checkout step. `--index` also always
uses the check URL feature to aid upload consistency.

The documentation tries to explain both approaches together, which
overlap for the check URL feature.

Fixes #8864

---------

Co-authored-by: Zanie Blue <contact@zanie.dev>
2024-12-10 22:17:47 +01:00
Zanie Blue a090cf1f12
Allow `--gui-script` on Unix (#9787)
To match `uv run foo.pyw` behavior from
https://github.com/astral-sh/uv/pull/9759
2024-12-10 21:13:17 +00:00
Charlie Marsh 6772cf8ac3
Preserve directory-level standalone build symlinks (#9723)
## Summary

This PR improves our "don't fully resolve symlinks" behavior for
`python-build-standalone` builds based on learnings from
https://github.com/indygreg/python-build-standalone/issues/380#issuecomment-2526575235.

Specifically, we can now robustly detect whether a target executable
will lead to a valid `prefix` or not, and iteratively resolve symlinks
until we find a valid target executable.

## Test Plan

### Direct symlink to `python`

Correctly resolves to the symlink target, rather than the symlink
itself.

```
❯ ln -s /Users/crmarsh/.local/share/uv/python/cpython-3.12.6-macos-aarch64-none/bin/python foo
❯ cargo run venv --python ./foo
❯ cat .venv/pyvenv.cfg
home = /Users/crmarsh/.local/share/uv/python/cpython-3.12.6-macos-aarch64-none/bin
implementation = CPython
uv = 0.5.7
version_info = 3.12.6
include-system-site-packages = false
prompt = uv
❯ .venv/bin/python -c "import sys"
```

### Symlink to the Python installation

Correctly does _not_ resolve the symlink.

```
❯ ln -s /Users/crmarsh/.local/share/uv/python/cpython-3.12.6-macos-aarch64-none bar
❯ cargo run venv --python ./bar
❯ cat .venv/pyvenv.cfg
home = /Users/crmarsh/workspace/uv/bar/bin
implementation = CPython
uv = 0.5.7
version_info = 3.12.6
include-system-site-packages = false
prompt = uv
❯ .venv/bin/python -c "import sys"
```

### Direct symlink to `python` in a symlinked Python installation

Correctly resolves the direct symlink, but not the symlink of the Python
installation.

```
❯ ln -s bar/bin/python baz
❯ cargo run venv --python ./baz
❯ cat .venv/pyvenv.cfg
home = /Users/crmarsh/workspace/uv/bar/bin
implementation = CPython
uv = 0.5.7
version_info = 3.12.6
include-system-site-packages = false
prompt = uv
❯ .venv/bin/python -c "import sys"
```
2024-12-10 15:41:28 -05:00
Rajko Radovanović f6f9179a5a
Add --gui-script flag for running Python scripts with pythonw.exe on … (#9152)
Addresses #6805

## Summary

This PR adds a `--gui-script` flag to `uv run` that allows running
Python scripts with `pythonw.exe` on Windows, regardless of file
extension. This solves the issue where users need to maintain duplicate
`.py` and `.pyw` files to run the same script with and without a console
window.

The implementation follows the pattern established by the existing
`--script` flag, but uses `pythonw.exe` instead of `python.exe` on
Windows. On non-Windows platforms, the flag is present but returns an
error indicating it's Windows-only functionality.

Changes:
- Added `--gui-script` flag (Windows-only)
- Added Windows test to verify GUI script behavior
- Added non-Windows test to verify proper error message
- Updated CLI documentation


## Test Plan

The changes are tested through:

1. New Windows-specific test that verifies:
- Script runs successfully with `pythonw.exe` when using `--gui-script`
- Console output is suppressed in GUI mode but visible in regular mode
   - Same script can be run both ways without modification

2. New non-Windows test that verifies:
- Appropriate error message when `--gui-script` is used on non-Windows
platforms

3. Documentation updates to clearly indicate Windows-only functionality

---------

Co-authored-by: Zanie Blue <contact@zanie.dev>
2024-12-10 14:35:17 -06:00
Zanie Blue 761dafd0d1
Allow download of Python distribution variants with newer CPU instruction sets (#9781)
Supersedes https://github.com/astral-sh/uv/pull/8517 with an alternative
approach of making all the variants available instead of replacing the
x86_64 (v1) variant with x86_64_v2.

Doesn't add automatic inference of the supported instructions, but that
should be doable per @charliermarsh's comment there. Going to do it as a
follow-up since this has been pretty time consuming.

e.g.,

```
❯ cargo run -q -- python install cpython-3.12.8-linux-x86_64_v3-gnu
Installed Python 3.12.8 in 2.72s
 + cpython-3.12.8-linux-x86_64_v3-gnu
```

Co-authored-by: j178 <10510431+j178@users.noreply.github.com>
2024-12-10 14:26:45 -06:00
Zanie Blue fd420db197
Ignore `.` prefixed directories during managed Python installation discovery (#9786)
Addresses
https://github.com/astral-sh/uv/pull/9756#discussion_r1878722112
2024-12-10 20:24:49 +00:00
Zanie Blue 7191865d52
Improve the error message when a Python install request is not valid (#9783)
```
❯ uv python install foo
error: Cannot download managed Python for request: directory `foo`
❯ cargo run -q -- python install foo
error: `foo` is not a valid Python download request; see `uv python help` for supported formats and `uv python list --only-downloads` for available versions
```
2024-12-10 20:20:47 +00:00
Charlie Marsh 535ab69508
Don't fail with `--no-build` when static metadata is available (#9785)
## Summary

This optimization isn't quite right, because we can successfully extract
metadata without having to build from source. (The builder itself will
error if we reach the point at which we need to build, but builds are
disabled.)

Closes https://github.com/astral-sh/uv/issues/9776.
2024-12-10 20:10:51 +00:00
Zanie Blue 6523d90da1
Add `uv python list --all-arches` (#9782)
With #9781 this becomes even more compelling. This is generally useful
as well.

e.g.,

```
❯ cargo run -- python list --all-arches
cpython-3.13.1+freethreaded-macos-x86_64-none     <download available>
cpython-3.13.1-macos-x86_64-none                  <download available>
cpython-3.13.1+freethreaded-macos-aarch64-none    <download available>
cpython-3.13.1-macos-aarch64-none                 <download available>
cpython-3.13.0-macos-aarch64-none                 /Users/zb/.local/bin/python3.13 -> /Users/zb/.local/share/uv/python/cpython-3.13.0-macos-aarch64-none/bin/python3.13
cpython-3.13.0-macos-aarch64-none                 /Users/zb/.local/bin/python3 -> /Users/zb/.local/share/uv/python/cpython-3.13.0-macos-aarch64-none/bin/python3.13
cpython-3.13.0-macos-aarch64-none                 /Users/zb/.local/bin/python -> /Users/zb/.local/share/uv/python/cpython-3.13.0-macos-aarch64-none/bin/python3.13
cpython-3.13.0-macos-aarch64-none                 /Users/zb/.local/share/uv/python/cpython-3.13.0-macos-aarch64-none/bin/python3.13
cpython-3.12.8-macos-x86_64-none                  <download available>
cpython-3.12.8-macos-aarch64-none                 <download available>
...
```
2024-12-10 14:02:41 -06:00
Charlie Marsh 4a21daff49
Don't drop comments between items in TOML tables (#9784)
## Summary

If you look at Ed's reply
[here](https://github.com/toml-rs/toml/issues/818#issuecomment-2532626305),
it sounds like we're being too heavy-handed in applying `.fmt()`. I
think I added this to handle an issue with inline tables whereby we were
inserting a space after a trailing comma? So now I'm just applying
`.fmt()` to inline tables, which don't allow comments between elements
anyway.

Closes https://github.com/astral-sh/uv/issues/9758.
2024-12-10 14:59:13 -05:00
Andrew Gallant c809462e4b
uv-resolver: deduplicate resolution markers (#9780)
Since we don't (currently) include conflict markers with our
`resolution-markers` in the lock file, it's possible that we end up
with duplicate markers. This happens when the resolver creates more
than one fork with the same PEP 508 markers but different conflict
markers, _and_ where those PEP 508 markers don't simplify to "always
true" after accounting for `requires-python`.

This change should be a strict improvement on the status quo. We aren't
removing any information. It is possible that we should be writing
conflict markers here (like we do for dependency edges), but I haven't
been able to come up with a case or think through a scenario where they
are necessary.

Fixes #9296
2024-12-10 14:58:39 -05:00