Commit Graph

5195 Commits

Author SHA1 Message Date
Charlie Marsh 619ec8dcce
Allow system Python discovery with `--target` and `--prefix` (#9371)
## Summary

If we're installing with `--target` or `--prefix`, then it's not a
mutable operation, so we should be allowed to discover system Pythons. I
suspect this was hard to special-case in the past but is now trivial
after @zanieb's various refactors.

Closes https://github.com/astral-sh/uv/issues/9356.
2024-11-22 17:06:43 -05:00
Charlie Marsh 0ae9a8b742
Annotate default groups in conflict error messages (#9368)
## Summary

We now tell the user if a group was enabled by default.

Closes https://github.com/astral-sh/uv/issues/9366.
2024-11-22 21:13:15 +00:00
Charlie Marsh 1744a9b0a1
Surface extras and group conflicts in `uv export` (#9365)
## Summary

Closes https://github.com/astral-sh/uv/issues/9364.
2024-11-22 15:58:27 -05:00
Matthijs Kok 536d038f9b
docs: reference `--no-progress` option in related environment variable (#9357)
## Summary

Aligns the description of `UV_NO_PROGRESS` with other env vars that also
have a related flag.

`--no-progress` is a "global option" and exists in every command.

---------

Co-authored-by: Zanie Blue <contact@zanie.dev>
2024-11-22 14:51:53 +00:00
Andrew Gallant dae584d49b uv-resolver: introduce new UniversalMarker type
This effectively combines a PEP 508 marker and an as-yet-specified
marker for expressing conflicts among extras and groups.

This just defines the type and threads it through most of the various
points in the code that previously used `MarkerTree` only. Some parts
do still continue to use `MarkerTree` specifically, e.g., when dealing
with non-universal resolution or exporting to `requirements.txt`.

This doesn't change any behavior.
2024-11-22 08:21:23 -05:00
Andrew Gallant d7e5fcbf62 uv/pip/compile: slightly simplify conflicts
This doesn't change any behavior. But this makes it a bit
clearer in the code that `uv pip compile` does not support
specifying conflicts. Indeed, we always pass an empty set of
conflicts to the resolver.

This is because there is no way to encode the conditional
logic of conflicts into the `requirements.txt` format. This
is unlike markers.
2024-11-22 08:21:23 -05:00
Andrew Gallant a66b0eb931 uv-resolver: remove 'package_markers'
This was completely unused. I noticed this while trying to read
and understand the code. It's unclear when or how this happened.
2024-11-22 08:21:23 -05:00
Andrew Gallant 085fde8955 uv-resolver: simplify `fork_markers` construction
This doesn't change any behavior. My guess is that this code was
a casualty of refactoring. But basically, it was doing redundant
case analysis and iterating over all resolutions (even though it's
in the branch that can only occur when there is only one
resolution).
2024-11-22 08:21:23 -05:00
Andrew Gallant 2b6d9b2289 uv-resolver: remove 'fork.is_false()' filtering
This filtering is now redundant, since forking now avoids these
degenerate cases by construction.

The main change to forking that enables skipping over "always
false" forks is that forking now starts with the parent's markers
instead of starting with MarkerTree::TRUE and trying to combine
them with the parent's markers later. This in turn leads to
skipping over anything that "can't" happen when combined with the
parents markers. So we never hit the case of generating a fork
that, when combined with the parent's markers, results in a
marker that is always false. We just avoid it in the first place.
2024-11-22 08:21:23 -05:00
Andrew Gallant 42da99ff92 uv-pep508: add a clarifying test
This test demonstrates the difference between `extra != "foo"` and
`sys_platform != "foo"`.

I wrote this test down to test the extra simplification logic was
correct. And I also wanted to test whether we could somehow hackily
encode `group` (as opposed to just `extra`) logic into marker
expressions by reusing another field. But I don't think we can.
2024-11-22 08:21:23 -05:00
Jon Åslund a513301b7a
Fix get_operating_system_and_architecture (#9319)
_get_glibc_version() can after #9005 return either (0, 0) if glibc
string is missing or (-1, -1) if the string can't be parsed. There was
no need to change missing string to (0, 0).

Also, move back indentation to make it easier to understand.
2024-11-21 15:05:48 -05:00
konsti 55148c214e
Avoid empty user display paths (#9312)
Currently, user display returns an empty path if the current dir is the
directory we are printing. This leads to odd messages such as

 > Including project.license-files at `` with `LICENSE*`

or

> Not a license files match: ``

Instead, we display the current path as a dot.
2024-11-21 14:56:50 -05:00
Zanie Blue 82f96903ba
Fix header level of "Conflicting dependencies" page (#9330) 2024-11-21 11:44:22 -06:00
Zanie Blue 8149e636c3
Add aliases for build backend requests (#9294)
I found it surprising we did not accept names like `hatchling` or
`scikit-build`
2024-11-21 14:51:18 +00:00
Zanie Blue 83c5eae1f3
Avoid referencing `scikit-build` (#9320)
It is different than `scikit-buid-core`
2024-11-21 08:42:47 -06:00
Charlie Marsh b9e9b60232
Remove `Option` from preference marker (#9304)
## Summary

This... _should_ be equivalent?
2024-11-21 09:36:24 -05:00
Charlie Marsh 40844048af
Remove `--upgrade`, `--no-upgrade`, and `--upgrade-package` from `uv tool upgrade` (#9318)
## Summary

`--upgrade` isn't useful, since it's the default. So it's now hidden,
but continues to warn if you enable it.

`--no-upgrade` isn't useful, since it panics. So it's now removed
entirely. This isn't breaking, since it already didn't work.

`--upgrade-package` actually _is_ useful, because it turns out it allows
things like: `uv tool upgrade babel --upgrade-package "babel<0.2.14"` to
constrain the upgrade.

I left this in place but hid it... I think we should provide a better
workflow for this, like `uv tool upgrade "babel<0.2.14"`? It's strange
to specify the package twice, and that `uv tool upgrade` has an
`--upgrade-package` flag.

Closes https://github.com/astral-sh/uv/issues/9317.
2024-11-21 09:35:57 -05:00
Zanie Blue d391961fa5
Touchup the extension module guide (#9293)
Co-authored-by: pantheraleo-7 <159872817+pantheraleo-7@users.noreply.github.com>
2024-11-21 14:24:21 +00:00
konsti de2e9cd0ff
Increase UV_STACK_SIZE to 3MB (#9311)
We're seeing CI failures on windows
2024-11-21 11:46:33 +00:00
Skyler Hawthorne 91c3ebc6f7
Fix Python interpreter discovery on non-glibc hosts (#9005)
## Summary

On Termux, uv currently fails to find any interpreter because it can't
find a glibc version, because there isn't one. But the Python
interpreter is still functional nonetheless.

So, when glibc cannot be found, simply return 0 for the version numbers
and mark the interpreter as being incompatible with manylinux

I really don't know if this is the right way to address this, but I can
attest that manual testing shows uv appears to be fully functional, at
least for pip and virtualenvs.

Fixes #7373

## Test Plan

I tried running the test suite, and after some tweaks, a good portion of
the test suite passes as well. A significant number of tests fail, but
this appears to be due to minor differences in output, like warnings
about hard links not working (hard links are completely disallowed on
Android), differences in the number of files removed, etc. The test
suite seems to be very sensitive to minor variations in output.
2024-11-21 12:35:02 +01:00
konsti e49ecd868d
Improve build backend excludes (#9281)
This PR contains three smaller improvements:
* Improve the include/exclude logging. We're still showing the current
directory as empty backticks, not sure what to do about that
* Add early stopping to license file globbing, so we don't traverse the
whole directory recursively when license files can only be in few places
* Support explicit wheel excludes. These are still not entirely right,
but at least we're correctly excluding compiled python files now. The
next step is to make sure that the wheel excludes contain all pattern
from source dist excludes, to make sure source tree -> wheel can't have
more files than source tree -> source dist -> wheel.
2024-11-21 12:20:29 +01:00
Charlie Marsh 3143494ddb
Make marker enums `Copy` (#9305) 2024-11-21 04:45:25 +00:00
Charlie Marsh 5e48819dbb
Only respect preferences across the same indexes (#9302)
## Summary

The issue here is fairly complex. Consider the following:

```toml
[project]
name = "project"
version = "0.1.0"
requires-python = ">=3.12.0"
dependencies = []

[project.optional-dependencies]
cpu = [
  "torch>=2.5.1",
  "torchvision>=0.20.1",
]
cu124 = [
  "torch>=2.5.1",
  "torchvision>=0.20.1",
]

[tool.uv]
conflicts = [
  [
    { extra = "cpu" },
    { extra = "cu124" },
  ],
]

[tool.uv.sources]
torch = [
  { index = "pytorch-cpu", extra = "cpu", marker = "platform_system != 'Darwin'" },
]
torchvision = [
  { index = "pytorch-cpu", extra = "cpu", marker = "platform_system != 'Darwin'" },
]

[[tool.uv.index]]
name = "pytorch-cpu"
url = "https://download.pytorch.org/whl/cpu"
explicit = true
```

When solving this project, we first pick a PyTorch version from PyPI, to
solve the `cu124` extra, selecting `2.5.1`.

Later, we try to solve the `cpu` extra. In solving that extra, we look
at the PyTorch CPU index. Ideally, we'd select `2.5.1+cpu`... But
`2.5.1` is already a preference. So we choose that.

Now, we only respect preferences for explicit indexes if they came from
the same index.

Closes https://github.com/astral-sh/uv/issues/9295.
2024-11-20 22:26:43 -05:00
Charlie Marsh c6482dd038
Remove dev dependencies in `--all-groups --no-dev` (#9300)
## Summary

Closes https://github.com/astral-sh/uv/issues/9297.
2024-11-20 20:06:05 -05:00
Jon Åslund 98c96b718f
Fix example pyproject.toml in project concept documentation (#9298)
The snippet out of context looks like a valid minimal pyproject.toml
which it is not without name and version. The line worked in layout.md
before when it was just under the minimal config.

---------

Co-authored-by: Zanie Blue <contact@zanie.dev>
2024-11-21 00:39:39 +00:00
Charlie Marsh c62c83c37a
Bump version to v0.5.4 (#9290) 2024-11-20 16:01:24 -05:00
Charlie Marsh 829eed8e35
Strip `--index` and `--default-index` from command header (#9288)
## Summary

The new `--index` and `--default-index` flags are being omitted in the
`uv pip compile` header, unintentionally.

Closes https://github.com/astral-sh/uv/issues/9287.
2024-11-20 19:10:32 +00:00
Charlie Marsh b19ccb6b97
Add a progress bar to `uv tree --outdated` and `uv pip list --outdated` (#9284)
## Summary

Closes https://github.com/astral-sh/uv/issues/9282.
2024-11-20 17:29:57 +00:00
Charlie Marsh a0de83001c
Parallelize network requests in `uv tree --outdated` (#9280)
## Summary

Closes https://github.com/astral-sh/uv/issues/9266.
2024-11-20 16:45:14 +00:00
Jo 23cc9b0322
Add `--all-groups` to `uv sync|run|export|tree` (#8892)
## Summary

Closes #8594

---------

Co-authored-by: Charlie Marsh <charlie.r.marsh@gmail.com>
2024-11-20 16:07:36 +00:00
Charlie Marsh 2ed180ea6b
Accept either singular or plural for CLI constraints (#9196)
## Summary

I find myself messing this up with `--build-constraint` vs.
`--build-constraints`, and it turns out our own CLI isn't fully
consistent here either.
2024-11-20 15:31:23 +00:00
konsti 2f5a64a8b3
Unify cargo features (#9267)
When building only a single crate in the workspace to run its tests, we
often recompile a lot of other, unrelated crates. Whenever cargo has a
different set of crate features, it needs to recompile. By moving some
features (non-exhaustive for now) to the workspace level, we always
activate them an avoid recompiling.

The cargo docs mismatch the behavior of cargo around default-deps, so I
filed that upstream and left most `default-features` mismatches:
https://github.com/rust-lang/cargo/issues/14841.

Reference script:

```python
import tomllib
from collections import defaultdict
from pathlib import Path

uv = Path("/home/konsti/projects/uv")
skip_list = ["uv-trampoline", "uv-dev", "uv-performance-flate2-backend", "uv-performance-memory-allocator"]

root_feature_map = defaultdict(set)
root_default_features = defaultdict(bool)
cargo_toml = tomllib.loads(uv.joinpath("Cargo.toml").read_text())
for dep, declaration in cargo_toml["workspace"]["dependencies"].items():
    root_default_features[dep] = root_default_features[dep] or declaration.get("default-features", True)
    root_feature_map[dep].update(declaration.get("features", []))

feature_map = defaultdict(set)
default_features = defaultdict(bool)
for crate in uv.joinpath("crates").iterdir():
    if crate.name in skip_list:
        continue
    if not crate.joinpath("Cargo.toml").is_file():
        continue
    cargo_toml = tomllib.loads(crate.joinpath("Cargo.toml").read_text())
    for dep, declaration in cargo_toml.get("dependencies", {}).items():
        # If any item uses default features, they are used everywhere
        default_features[dep] = default_features[dep] or declaration.get("default-features", True)
        feature_map[dep].update(declaration.get("features", []))

for dep, features in sorted(feature_map.items()):
    features = features - root_feature_map.get(dep, set())
    if not features and default_features[dep] == root_default_features[dep]:
        continue
    print(dep, default_features[dep], sorted(features))
```
2024-11-20 16:11:24 +01:00
Charlie Marsh 8ca8de8eaa
Use exponential backoff for publish retries (#9276)
## Summary

Just trying to unify the retry handling, as in
https://github.com/astral-sh/uv/pull/9274 and elsewhere. Right now, the
publish handler doesn't use any backoff and always retries three times
regardless of settings.
2024-11-20 15:02:33 +00:00
Zanie Blue 110c38e549
Improve the project creation documentation (#9236) 2024-11-20 08:50:14 -06:00
Zanie Blue 4f65a69ebf
Move the integration guides into the "Guides" section as a collapsed group (#9245)
Let's have all the guides together!
2024-11-20 08:50:02 -06:00
Zanie Blue 20eccc157c
Improve content on project configuration (#9235) 2024-11-20 08:49:51 -06:00
Charlie Marsh 1b13036674
Add retries for Python downloads (#9274)
## Summary

This uses the same approach as in the rest of uv, but with another
dedicated method for retries.

Closes https://github.com/astral-sh/uv/issues/8525.
2024-11-20 09:42:42 -05:00
Charlie Marsh 289771e311
Avoid validating extra and group sources in `build-system.requires` (#9273)
## Summary

This was an oversight in the initial implementation. We shouldn't
validate sources for the `build-system.requires` field, since extras and
groups can _never_ be active.

Closes https://github.com/astral-sh/uv/issues/9259.
2024-11-20 09:05:50 -05:00
Charlie Marsh ccc0962cbd
Use `zlib-rs` on all platforms (#9264) 2024-11-20 00:01:58 -05:00
Zanie Blue dab55dddde
Watch for changes to the template file during documentation serve (#9244)
Fixes this really annoying behavior where the served documentation would
not reflect changes to the mkdocs template file (where we store all of
our actual configuration)

ref https://github.com/mkdocs/mkdocs/pull/2642
2024-11-19 22:39:38 -06:00
Zanie Blue 78df14e7a8
Add support for anchor redirects with client-side js (#9212)
The redirect plugin doesn't support this, and it's not feasible to do
server-side so we need to do the redirect client-side with some
javascript.
2024-11-19 22:32:43 -06:00
Zanie Blue 2ff705fba0
Add breadcrumbs to the documentation (#9242)
<img width="815" alt="Screenshot 2024-11-19 at 2 10 10 PM"
src="https://github.com/user-attachments/assets/49e645d2-1648-40b4-8bb4-ba5d6545a353">
<img width="815" alt="Screenshot 2024-11-19 at 2 10 25 PM"
src="https://github.com/user-attachments/assets/854d7bee-dc16-4429-ae11-789f50d1c6a4">
2024-11-19 22:31:43 -06:00
Ben Beasley 80ab562f9f
In uv-globfilter, use the workspace fs-err in dev-dependencies (#9262)
<!--
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

In uv-globfilter, use the workspace `fs-err` in `dev-dependencies`.

This fixes an unnecessary dev-dependency on `fs-err` 2.x even after the
workspace fs-err was updated to 3.x in
https://github.com/astral-sh/uv/pull/8625.

The `Cargo.lock` file still has `fs-err v2.11.0` after this PR, but it
is via `tracing-durations-export v0.3.0` rather than directly required
by any `uv` crate.

## Test Plan

<!-- How was it tested? -->

```
$ cd crates/uv-globfilter/
$ cargo test
```
2024-11-20 03:59:37 +00:00
Zanie Blue 7c4c15b879
Add trace logs to `is_extended_transient_error` (#9248)
Co-authored-by: Charlie Marsh <charlie.r.marsh@gmail.com>
2024-11-19 22:24:05 -05:00
Charlie Marsh f4799d2346
Add dedicated warning for empty stdin (#9256)
## Summary

I ran into this in practice:

![Screenshot 2024-11-19 at 4 20
37 PM](https://github.com/user-attachments/assets/d89aa9f1-828a-492e-af5a-3434e277580e)
2024-11-19 17:52:41 -05:00
Charlie Marsh 9fb7f81738
Catch retries with wrapped `reqwest` errors (#9253)
## Summary

It turns out that `WrappedReqwestError` skips the `reqwest::Error`
itself in order to hack the display. This PR adds it to the list of
variants we check when retrying transient errors.

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


## Test Plan

Patched `reqwest` locally to return an error in `bytes()`. Verified that
it was _not_ caught prior to this PR, but was caught afterwards.
2024-11-19 17:08:48 -05:00
konsti 8e0389e2fd
Build backend: Build editable (#9230)
Support for editable installs. This is a simple PEP 660 implementation.
2024-11-19 21:52:11 +00:00
konsti 0913382aa5
Better WrappedReqwestError docs (#9251)
Document the hack with which we insert a hint message for offline cases.
2024-11-19 16:51:58 -05:00
Charlie Marsh c188b11b0a
Fix typo in PyTorch docs (#9249)
## Summary

Raised at https://x.com/stefanofusai/status/1858981714942718163/photo/1.
2024-11-19 15:41:30 -06:00
Charlie Marsh b09d5fcdd9
Add minimum version to PyTorch guide (#9247)
## Summary

Closes https://github.com/astral-sh/uv/issues/9224.
2024-11-19 15:21:43 -06:00