Commit Graph

7187 Commits

Author SHA1 Message Date
Charlie Marsh 1c3706c4ef
Infer output type in `uv export` (#12958)
## Summary

If the user provides a `.toml` file, we assume PEP 751; otherwise, we
assume `requirements.txt`.
2025-04-21 21:35:04 +00:00
Charlie Marsh d8cea2fd49
Add `uv export` support for PEP 751 (#12955)
## Summary

This PR adds `uv export` support for [PEP
751](https://peps.python.org/pep-0751). We don't yet expose a way to
consume the generated lockfile, but it's a first step.

The logic to go from `uv.lock` to "flat set of packages to include, with
markers telling us when to include them" is all shared with the
`requirements.txt` export (and extracted in
https://github.com/astral-sh/uv/pull/12956). So most of the code is just
converting from our internal types to the PEP 751 schema.
2025-04-21 21:21:17 +00:00
Zanie Blue 9484e3663c
Prefer stable releases over pre-releases in `uv python install` (#12194)
e.g., `uv python install 3` should not install the 3.14 alpha

Closes #12184
2025-04-21 21:16:07 +00:00
Zanie Blue c55dd0f295
Add a brief sleep before sending SIGINT to children (#13018)
In an attempt to avoid interrupting the child if it is in the process of
exiting.

This resolves the issue with marimo reported in
https://github.com/astral-sh/uv/issues/12108#issuecomment-2745933178 and
https://github.com/marimo-team/marimo/issues/4224
2025-04-21 14:47:39 -05:00
Zanie Blue 8717fbe469
Forward additional signals to the child process in `uv run` (#13017)
As I suspected quite some time ago
(https://github.com/astral-sh/uv/pull/6738#issuecomment-2315466033),
it's problematic that we don't handle _every_ signal here. This PR adds
handling for all of the Unix signals except `SIGCHLD`, `SIGIO`, and
`SIGPOLL` which seem incorrect to forward. Also notable, we _cannot_
handle `SIGKILL` so if someone sends that to the PID instead of the
PGID, they will leave dangling subprocesses.

Instead, we could use `exec` and avoid this handling. However, we'd lose
the ability to add nice error message on failure (e.g., as someone is
trying to add in https://github.com/astral-sh/uv/pull/12201) and, more
critically, we'd need to figure out how to clean up resources properly
(i.e., temporary directories) which currently happens on `Drop`. In the
long-term, we'll probably want an option to use `exec` — but we'll need
to figure out when to clean up resources or accept that they will
dangle. This was last discussed in
https://github.com/astral-sh/uv/issues/3095 — discussion on that
approach should continue there.

A note on the implementation: I spent time time trying to write the
handler using a tokio stream, so we could dynamically iterate over a
list of signals instead of copy/pasting the implementation — I couldn't
get it to work though and it didn't seem critical.

Closes https://github.com/astral-sh/uv/issues/12830
2025-04-21 14:47:30 -05:00
renovate[bot] 2803e6fc5f
Update Rust crate http to v1.3.1 (#13015) 2025-04-21 08:30:23 -04:00
renovate[bot] 24041e5fbf
Update Rust crate data-encoding to v2.9.0 (#13014) 2025-04-21 08:30:03 -04:00
Jo 2cb998847c
Fix `SourceNotAllowed` error message (#13012)
## Summary

Before:

```console
$ uv python list py --managed-python
error: Interpreter discovery for `executable name `py`` requires `search path` but only only managed is allowed
```

After:

```console
$ uv python list py --managed-python
error: Interpreter discovery for `executable name `py`` requires `search path` but only `only managed` is allowed
```
2025-04-21 08:29:45 -04:00
renovate[bot] 06134f34ea
Update docker/login-action action to v3.4.0 (#13008) 2025-04-21 08:29:32 -04:00
renovate[bot] e992e5fa17
Update docker/setup-buildx-action action to v3.10.0 (#13010) 2025-04-21 08:29:19 -04:00
renovate[bot] a74f995441
Update docker/metadata-action action to v5.7.0 (#13009) 2025-04-21 08:29:12 -04:00
renovate[bot] 98e3546afd
Update docker/build-push-action action to v6.15.0 (#13007) 2025-04-21 08:29:02 -04:00
renovate[bot] f56ca37271
Update conda-incubator/setup-miniconda action to v3.1.1 (#13005) 2025-04-21 08:28:52 -04:00
konsti da09ece8a9
Build backend: Add reference docs and schema (#12803)
Add reference documentation and schema integration for the uv build
backend. The reference documentation comes with a preview note upfront.
2025-04-21 12:27:49 +02:00
konsti 2b96dbdd49
Refactor adding bounds to dependencies in `pyproject.toml` (#12945)
Preparation work for making the kind of bound added configurable.

No functional changes, just moving some methods around.
2025-04-21 12:25:27 +02:00
renovate[bot] 77e0fbee4f
Update pre-commit dependencies (#13011) 2025-04-21 09:46:12 +01:00
renovate[bot] bdfb014d68
Update astral-sh/setup-uv action to v5.4.2 (#13004) 2025-04-21 03:54:04 +00:00
renovate[bot] c929f71085
Update actions/setup-python action to v5.5.0 (#13003) 2025-04-21 03:32:53 +00:00
renovate[bot] 78f2b697ce
Update actions/checkout action to v4.2.2 (#13002) 2025-04-21 03:08:09 +00:00
Max Mynter 2608f742b2
Allow updating Git sources by name (#12897)
Closes: #4567

## Summary

When adding a package with Git reference options (`--rev`, `--tag`,
`--branch`) that already has a Git source defined, use the existing Git
URL with the new reference instead of reporting an error.

This allows commands like `uv add requests --branch main` to work when
requests is already defined with a Git source in the project
configuration.

Previously, you would need to provide the whole Git url again for this
to work:
```bash
uv add git+https://github.com/psf/requests --branch main
```
<!-- What's the purpose of the change? What does it do, and why? -->

## Test Plan
- [x] Add unit tests for project
- [x] Add unit tests for script
- [x] Tested locally for project and script environments like below

### Testing Project
In a directory using the `uv` executable from this PR (via replacing
every `uv` with `cargo run --`) initialize a project and virtual
environment
```bash
uv init
uv venv
```
move into the environment 
```bash
# on mac
source .venv/bin/activate
```
and add a dependency with a git url
```bash
uv add git+https://github.com/Textualize/rich --branch master
```
Then change the branch of the project to see that the branch can be
changed without need of the whole git url:
```bash
uv add rich --branch py310
```

### Testing Script
Create the following file, e.g. `script.py`:
```python
import time
from rich.progress import track

print("Starting")
for i in track(range(20), description="For example:"):
    time.sleep(0.05)
print("Done")
```
Now using `uv` (referencing the executable of this PR) add the
dependency
```bash
uv add --script script.py 'git+https://github.com/Textualize/rich' --branch master
```
and check we can execute the script:
```bash
uv run script.py
```
To test the change update the branch

```bash
uv add --script script.py rich --branch py310
```
and check that the dependency is updated and the script is executed:
```bash
uv run script.py
```

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

----
This is my first time contributing to `uv` (yay, 🤗) so let me know if
there is something obvious i am missing.
Unit tests will follow soon.

---------

Co-authored-by: Charlie Marsh <charlie.r.marsh@gmail.com>
2025-04-21 02:58:38 +00:00
renovate[bot] c810bc3a83
Update Rust crate proc-macro2 to v1.0.95 (#13000) 2025-04-21 02:49:52 +00:00
renovate[bot] 9b65e49096
Update actions/attest-build-provenance action to v2.2.3 (#13001) 2025-04-21 02:49:22 +00:00
renovate[bot] 4f3cf4e746
Update Rust crate jiff to v0.2.9 (#12999) 2025-04-21 02:44:03 +00:00
renovate[bot] 64f4f7ea94
Update Rust crate assert_cmd to v2.0.17 (#12997) 2025-04-21 02:20:13 +00:00
renovate[bot] 26fb1ac320
Update taiki-e/install-action digest to 09dc018 (#12996) 2025-04-21 02:15:02 +00:00
renovate[bot] f967ca7afe
Update astral-sh/setup-uv digest to d4b2f3b (#12995) 2025-04-21 02:12:27 +00:00
Charlie Marsh 132307b67c
Add upload time to `uv.lock` (#12968)
## Summary

This is included in PEP 751, so we lose it when converting from
`uv.lock`. I think it's a good piece of information to include in the
`uv.lock` anyway.
2025-04-20 21:58:12 -04:00
John Mumm e9e4ad4d7d
Obfuscate username in tracing URL (#12969)
A URL username can be a secret token, so we should avoid logging it.
2025-04-19 11:11:41 +02:00
John Mumm ea16fe28b6
Obfuscate password in credentials debug messages (#12944)
I noticed in the trace output that we weren't obfuscating the
`Credentials` password in a trace message. This PR creates a `Password`
newtype with a custom `Debug` implementation.
2025-04-19 00:01:11 +02:00
Zanie Blue 41ac6649d7
Add debug logs for version file search (#12951)
Co-authored-by: John Mumm <jtfmumm@gmail.com>
2025-04-18 16:31:52 +00:00
Zanie Blue 91410acf82
Fix `PythonDownloadRequest` parsing for partial keys (#12925)
In #12909, I noticed we failed to parse partial download keys with `any`
placeholders. Here, parsing for that is fixed.
2025-04-18 11:25:52 -05:00
Charlie Marsh 6eb6475afd
Add `subdirectory` to Direct URL for local directories (#12971)
## Summary

This is allowed by the spec, even though we don't have a use for it.
2025-04-18 11:57:58 -04:00
johnthagen 3d340e83b7
Improve formatting for `"all"` `default-groups` setting documentation (#12963)
## Summary

Make the documentation for `"all"` `defauilt-groups` a little easier to
read by monospacing the literal.
2025-04-18 11:34:39 -04:00
John Mumm 17ed789edb
Properly handle authentication for 302 redirect URLs (#12920)
uv was failing to authenticate on 302 redirects when credentials were
available. This was because it was relying on `reqwest_middleware`'s
default redirect behavior which bypasses the middleware pipeline when
trying the redirect request (and hence bypasses our authentication
middleware). This PR updates uv to retrigger the middleware pipeline
when handling a 302 redirect, correctly using credentials from the URL,
the keyring, or `.netrc`.

Closes #5595
Closes #11097
2025-04-18 14:56:17 +02:00
Charlie Marsh 256b100a9e
Accept `requirements.txt` (verbatim) as a format on the CLI (#12957)
## Summary

Right now, you have to do `--format requirements-txt`, which seems
confusing? We now accept both `requirements.txt` and `requirements-txt`.
2025-04-18 03:18:53 +00:00
Charlie Marsh 784510becc
Separate `requirements.txt` export logic from graph construction (#12956)
## Summary

A standalone, preparatory refactor for
https://github.com/astral-sh/uv/pull/12955.
2025-04-17 23:10:03 -04:00
Aria Desires eef3fc2215
update cargo-dist and enable ci checks (#12949)
Fixes #12881 
Potentially Fixes #12780
Prevents #12879
2025-04-17 19:32:56 -04:00
Alex Prengère 451c834ebb
Show PyPy downloads during `uv python list` (#12915)
Fixes #12914.
When `PythonDownloadRequest` does not have the `implementation` set, do
not set it to CPython when calling `fill`, otherwise only CPython
interpreters are shown when listing interpreters available for download,
with `uv python list`.
2025-04-17 11:59:13 -05:00
Dheepak Krishnamurthy 89b221d72b
fix(ui): update version formatting to use cyan color (#12943)
## Summary

This PR simplifies the version formatting by replacing `.white()` with
`.cyan()` styling for consistency.

Resolves #12940 

## Test Plan

I manually recreated the code and tested it with this patch:

```diff
diff --git i/crates/uv/src/lib.rs w/crates/uv/src/lib.rs
index b9c01b002..cf051351f 100644
--- i/crates/uv/src/lib.rs
+++ w/crates/uv/src/lib.rs
@@ -1019,6 +1019,20 @@ async fn run(mut cli: Cli) -> Result<ExitStatus> {
         }) => commands::self_update(target_version, token, printer).await,
         #[cfg(not(feature = "self-update"))]
         Commands::Self_(_) => {
+            eprintln!("{}: {}", "error".cyan().bold(), "fake error message");
+
+            let version_information = format!(
+                "from {} to {}",
+                "v0.1.1".bold().cyan(),
+                "v0.1.2".bold().cyan(),
+            );
+            eprintln!(
+                "{}{} Upgraded uv {}! {}",
+                "success".green().bold(),
+                ":".bold(),
+                version_information,
+                format!("https://github.com/astral-sh/uv/releases/tag/{}", "v0.1.2").cyan()
+            );
             anyhow::bail!(
                 "uv was installed through an external package manager, and self-update \
                 is not available. Please use your package manager to update uv."
```

In a light terminal, this is what it looks like:

<img width="750" alt="image"
src="https://github.com/user-attachments/assets/dc0d283c-e845-41fb-9821-80b0a3f1c4fe"
/>
2025-04-17 12:58:36 -04:00
Max Mynter ebb45bdba1
Align supported Config-settings with example in docs (#12947)
Closes #12929
## Summary
Untag the `config-settings` value to support JSON schema according to
the
[docs](https://docs.astral.sh/uv/reference/settings/#config-settings).
```toml
[tool.uv]
config-settings = { editable_mode = "compat" }
```
<!-- What's the purpose of the change? What does it do, and why? -->

## Test Plan
Verified using the "Even Better TOML" extension with paths to old and
new `uv.schema.json`.


## Notes
I could not reproduce the issue with either the `taplo` (on which Even
Better Toml is built, afaik) and `check-jsonschema` CLI tools; with both
old and new versions of the `uv.schema.json` validated the
`pyproject.toml`.

Maybe for these there is some additional regularization going on and
that's also how a breaking case ended up in the docs?
I'm unsure on how to test for this.

After about an hour, the Even better TOML VSCode extension was the only
way to reproduce failing validation.

Let me know if I can do something else.

<!-- How was it tested? -->
2025-04-17 12:57:53 -04:00
konsti 37a71fd26a
Make `uv init` resilient against broken git (#12895)
Currently, `uv init` works without a `git` executable, and with a
working `git` executable, but not with a broken `git`, be it from GitHub
Action's Windows CI or from the shim we insert.

`uv init` calls git twice: Once `git rev-parse` to check whether a git
repo already exists, and then `git init` (if there is no git repository
yet and no `--vcs none`).

By separately handling the cases where git failed during `git rev-parse`
doesn't work vs. where the is no repository when checking for an
existing repo work tree, we can avoid calling `git init` for broken git
and erroring. We have to hardcode the expected git command outputs to be
able to check.
2025-04-17 17:45:25 +02:00
John Mumm 211e712b83
Add test for install from remote requirements.txt (#12941)
Closes #2593.
2025-04-17 16:25:37 +02:00
Aria Desires 041c7a5e63
Use suffix on uvx binary when searching for uv binary (#12923)
This is a rebased and updated version of #11925 based on my review (I
didn't have permission to push to their branch).

For posterity I've preserved their commits but my final commit
essentially rewrites the whole thing anyway.

Fixes #11637

---------

Co-authored-by: Chris Lieb <clieb@bitsighttech.com>
2025-04-16 14:52:09 -04:00
Jo fc3dacf9a0
Improve docs for `uv python list --only-downloads` and `--only-installed` (#12916)
"Only show Python downloads, exclude installed distributions." might be
misunderstood as excluding installed distributions from `uv python list
--only-downloads`, implying that versions already installed won’t be
shown.
2025-04-16 10:51:47 -05:00
Samay Kapadia d9243cee7e
[docs] Add shebang section for scripts (#11553)
<!--
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

Documentation only. Adds a section in scripts.md about running uv
scripts with a shebang line

## Test Plan

n/a

---------

Co-authored-by: Zanie Blue <contact@zanie.dev>
2025-04-16 15:20:27 +00:00
Zanie Blue e58cc39238
Patch `CC` and `CCX` entries in sysconfig for cross-compiled `aarch64` Python distributions (#12239)
Closes https://github.com/astral-sh/uv/issues/12207
2025-04-16 08:34:05 -05:00
konsti 4d34b28657
Set 4MB stack size for all threads, introduce `UV_STACK_SIZE` (#12839)
See #12769 for the motivation. We set the 4MB not only for the main
thread, but also for all tokio and rayon threads to fix a stack overflow
while unpacking wheels in production on Windows.

There are two variables for setting the stack size: A new
`UV_STACK_SIZE` that takes precedent, and the existing `RUST_MIN_STACK`.
When setting the stack size, `UV_STACK_SIZE` should be preferred, since
`RUST_MIN_STACK` affects all Rust applications, including build backends
we call (e.g., maturin). The minimum stack size is set to 1MB, the
lowest stack size we observed on a platform (Windows main thread).

Fixes #12769

## Test Plan

Tested manually with the example from #12769
2025-04-16 09:27:46 +02:00
Deividas / Dunixas df35919d5a
teeny gramatical error in docs (#12908)
<!--
Thank you for contributing to uv! To help us out with reviewing, please
consider the following:

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

## Summary

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

Incorrect use of the indefinite article- 'an project' instead of 'a
project'

## Test Plan

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

Was not tested due to it being a small change to docs wording without
change in formatting.
2025-04-15 16:13:51 -05:00
Ori Shamir e178cc1b7a
docs: Fix highlight line in explicit index documentation (#12887)
## Summary

Fix the highlighted line in [Index
Documentation](https://docs.astral.sh/uv/concepts/projects/dependencies/#index)
(towards the end of the section) - the `explicit = true` line should be
highlighted.

## Test Plan
Docs.
2025-04-15 15:39:56 -05:00
Jo 8665c06225
Write requested python variant to pin file in `uv init` (#12870)
## Summary

Closes #12855

This PR also fixed an issue, where `python_request` was matched against
`PythonVersion::Default`. Previously, if `python_request` was `3.13t`,
it would match the last branch, triggering a download of the Python
version if it wasn't already installed.


6b7f60c1ea/crates/uv/src/commands/project/init.rs (L421-L448)

```console
❯ uv init -v --managed-python --python 3.13t foo
DEBUG uv 0.6.14 (a4cec56dc 2025-04-09)
DEBUG Searching for Python 3.13t in managed installations
DEBUG Searching for managed installations at `/Users/Jo/.local/share/uv/python`
DEBUG Found managed installation `cpython-3.13.1-macos-aarch64-none`
DEBUG Found `cpython-3.13.1-macos-aarch64-none` at `/Users/Jo/.local/share/uv/python/cpython-3.13.1-macos-aarch64-none/bin/python3.13` (managed installations)
DEBUG Skipping interpreter at `/Users/Jo/.local/share/uv/python/cpython-3.13.1-macos-aarch64-none/bin/python3.13` from managed installations: does not satisfy request `3.13t`
DEBUG Skipping incompatible managed installation `cpython-3.12.8-macos-aarch64-none`
DEBUG Skipping incompatible managed installation `pypy-3.11.11-macos-aarch64-none`
DEBUG Requested Python not found, checking for available download...
DEBUG Acquired lock for `/Users/Jo/.local/share/uv/python`
DEBUG Using request timeout of 30s
INFO Fetching requested Python...
Downloading cpython-3.13.3+freethreaded-macos-aarch64-none (49.9MiB)
DEBUG Downloading https://github.com/astral-sh/python-build-standalone/releases/download/20250409/cpython-3.13.3%2B20250409-aarch64-apple-darwin-freethreaded%2Bpgo%2Blto-full.tar.zst to temporary location: /Users/Jo/.local/share/uv/python/.temp/.tmpfoOLkE
DEBUG Extracting cpython-3.13.3%2B20250409-aarch64-apple-darwin-freethreaded%2Bpgo%2Blto-full.tar.zst
 Downloaded cpython-3.13.3+freethreaded-macos-aarch64-none
DEBUG Moving /Users/Jo/.local/share/uv/python/.temp/.tmpfoOLkE/python/install to /Users/Jo/.local/share/uv/python/cpython-3.13.3+freethreaded-macos-aarch64-none
DEBUG Released lock at `/Users/Jo/.local/share/uv/python/.lock`
DEBUG Writing Python versions to `/private/tmp/foo/.python-version`
Initialized project `foo` at `/private/tmp/foo`

❯ cat foo/.python-version
3.13
```

After this PR, uv will not try to download it:

```console
❯ uv python uninstall 3.13t
❯ cargo run -- init -v --managed-python --python 3.13t bar
DEBUG uv 0.6.14+15 (6b7f60c1e 2025-04-12)
DEBUG Writing Python versions to `/private/tmp/bar/.python-version`
Initialized project `bar` at `/private/tmp/bar`

❯ cat bar/.python_version
3.13t
```
2025-04-15 15:28:21 -05:00