Commit Graph

7045 Commits

Author SHA1 Message Date
Zanie Blue f0151f3a18
Bump version to 0.8.1 (#14818) 2025-07-22 11:36:20 -05:00
Zanie Blue 7d41bdb308
Allow removal of virtual environments with missing interpreters (#14812)
Co-authored-by: konsti <konstin@mailbox.org>
2025-07-22 15:16:59 +00:00
Copilot 96b889bce3
Add hint to use `uv self version` when `uv version` cannot find a project (#14738)
When users run `uv version` in a directory without a `pyproject.toml`
file, they often intend to check uv's own version rather than a
project's version. This change adds a helpful hint to guide users to the
correct command.

**Before:**
```
❯ uv version
error: No `pyproject.toml` found in current directory or any parent directory
```

**After:**
```
❯ uv version
error: No `pyproject.toml` found in current directory or any parent directory

hint: If you meant to view uv's version, use `uv self version` instead
```

## Changes

- Modified `find_target()` function in
`crates/uv/src/commands/project/version.rs` to catch
`WorkspaceError::MissingPyprojectToml` specifically and enhance the
error message with a helpful hint
- Added import for `WorkspaceError` to access the specific error type
- Updated existing tests to expect the new hint message in error output
- Added new test case `version_get_missing_with_hint()` to verify
behavior

The hint appears consistently across all scenarios where `uv version`
fails to find a project:
- `uv version` (normal mode)
- `uv version --project .` (explicit project mode)
- `uv version --preview` (preview mode)

The change maintains all existing functionality - when a
`pyproject.toml` is found, `uv version` continues to work normally
without showing the hint.

Fixes #14730.

<!-- START COPILOT CODING AGENT TIPS -->
---

💡 You can make Copilot smarter by setting up custom instructions,
customizing its development environment and configuring Model Context
Protocol (MCP) servers. Learn more [Copilot coding agent
tips](https://gh.io/copilot-coding-agent-tips) in the docs.

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: zanieb <2586601+zanieb@users.noreply.github.com>
2025-07-22 08:32:45 -05:00
Zanie Blue e49d61db1f
Emit JSON output with `--quiet` (#14810) 2025-07-22 08:21:54 -05:00
Charlie Marsh 2677e85df9
Disallow writing symlinks outside the source distribution target directory (#12259)
## Summary

Closes #12163.

## Test Plan

Created an offending source distribution with this script:

```python
import io
import tarfile
import textwrap
import time

PKG_NAME  = "badpkg"
VERSION   = "0.1"
DIST_NAME = f"{PKG_NAME}-{VERSION}"
ARCHIVE   = f"{DIST_NAME}.tar.gz"


def _bytes(data: str) -> io.BytesIO:
    """Helper: wrap a text blob as a BytesIO for tarfile.addfile()."""
    return io.BytesIO(data.encode())


def main(out_path: str = ARCHIVE) -> None:
    now = int(time.time())

    with tarfile.open(out_path, mode="w:gz") as tar:

        def add_file(path: str, data: str, mode: int = 0o644) -> None:
            """Add a regular file whose *content* is supplied as a string."""
            buf  = _bytes(data)
            info = tarfile.TarInfo(path)
            info.size   = len(buf.getbuffer())
            info.mtime  = now
            info.mode   = mode
            tar.addfile(info, buf)

        # ── top‑level setup.py ───────────────────────────────────────────────
        setup_py = textwrap.dedent(f"""\
            from setuptools import setup, find_packages
            setup(
                name="{PKG_NAME}",
                version="{VERSION}",
                packages=find_packages(),
            )
        """)
        add_file(f"{DIST_NAME}/setup.py", setup_py)

        # ── minimal package code ─────────────────────────────────────────────
        add_file(f"{DIST_NAME}/{PKG_NAME}/__init__.py", "# placeholder\\n")

        # ── the malicious symlink ────────────────────────────────────────────
        link = tarfile.TarInfo(f"{DIST_NAME}/{PKG_NAME}/evil_link")
        link.type     = tarfile.SYMTYPE
        link.mtime    = now
        link.mode     = 0o777
        link.linkname = "../../../outside.txt"
        tar.addfile(link)

    print(f"Created {out_path}")


if __name__ == "__main__":
    main()
```

Verified that both `pip install` and `uv pip install` rejected it.

I also changed `link.linkname = "../../../outside.txt"` to
`link.linkname = "/etc/outside"`, and verified that the absolute path
was rejected too.
2025-07-22 09:20:09 -04:00
Zanie Blue c8486da495
Update virtual environment removal to delete `pyvenv.cfg` last (#14808)
An alternative to https://github.com/astral-sh/uv/pull/14569

This isn't a complete solution to
https://github.com/astral-sh/uv/issues/13986, in the sense that it's
still "fatal" to `uv sync` if we fail to delete an environment, but I
think that's okay — deferring deletion is much more complicated. This at
least doesn't break users once the deletion fails. The downside is we'll
generally treat this virtual environment is valid, even if we nuked a
bunch of it.

Closes https://github.com/astral-sh/uv/issues/13986
2025-07-22 08:13:38 -05:00
Zanie Blue 8bffa693b4
Copy entry points and Jupyter data directories into ephemeral environments (#14790)
This is an alternative to https://github.com/astral-sh/uv/pull/14788
which has the benefit that it addresses
https://github.com/astral-sh/uv/issues/13327 which would be an issue
even if we reverted #14447.

There are two changes here

1. We copy entry points into the ephemeral environment, and rewrite
their shebangs (or trampoline target) to ensure the ephemeral
environment is not bypassed.
2. We link `etc/jupyter` and `share/jupyter` data directories into the
ephemeral environment, this is in order to ensure the above doesn't
break Jupyter which unfortunately cannot find the `share` directory
otherwise. I'd love not to do this, as it seems brittle and we don't
have a motivating use-case beyond Jupyter. I've opened
https://github.com/jupyterlab/jupyterlab/issues/17716 upstream for
discussion, as there is a viable patch that could be made upstream to
resolve the problem. I've limited the fix to Jupyter directories so we
can remove it without breakage.

Closes https://github.com/astral-sh/uv/issues/14729
Closes https://github.com/astral-sh/uv/issues/13327
Closes https://github.com/astral-sh/uv/issues/14749

---------

Co-authored-by: Charlie Marsh <charlie.r.marsh@gmail.com>
2025-07-22 12:11:05 +00:00
Ping Shuijie c1bf934721
chore: fix some minor issues in comments (#14807)
<!--
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

 fix some minor issues in comments

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

## Test Plan

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

Signed-off-by: pingshuijie <pingshuijie@outlook.com>
2025-07-22 10:13:05 +00:00
Charlie Marsh ecfa386088
Error on unknown fields in `dependency-metadata` (#14801)
## Summary

Closes https://github.com/astral-sh/uv/issues/14800.
2025-07-21 22:15:03 +00:00
Charlie Marsh 036c9bef3f
Add a borrowed `Realm` type (#14798)
## Summary

Allows zero-cost comparisons against URL references.
2025-07-21 21:07:35 +00:00
Charlie Marsh a3ea1b69f2
Add support for `HF_TOKEN` (#14797)
## Summary

If `HF_TOKEN` is set, we'll automatically wire it up to authenticate
requests when hitting private `huggingface.co` URLs in `uv run`.

## Test Plan

An unauthenticated request:

```
> cargo run -- run https://huggingface.co/datasets/cmarsh/test/resolve/main/main.py

  File "/var/folders/nt/6gf2v7_s3k13zq_t3944rwz40000gn/T/mainYadr5M.py", line 1
    Invalid username or password.
            ^^^^^^^^
SyntaxError: invalid syntax
```

An authenticated request:

```
> HF_TOKEN=hf_... cargo run run https://huggingface.co/datasets/cmarsh/test/resolve/main/main.py

Hello from main.py!
```
2025-07-21 20:55:33 +00:00
Ali Chaudry 7a56950bab
Update `setup-uv` docs for Github Actions integration guide (re-order python and uv setup) (#14741)
I updated the Github Actions integration guide to run Github's
`setup-python` before Astral's `setup-uv`, as `setup-uv`'s
`activate-environment: true` doesn't work with the original ordering.
There is a discussion about this behavior in the `setup-uv` repo
[here](https://github.com/astral-sh/setup-uv/issues/479).

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

Update the documentation for the Github Actions integration. Caveat: I'm
unsure if there are any other reasons where the original ordering (that
is,`setup-uv` before `setup-python`) might be preferred.

## Test Plan

Tested in a private Github Actions push, as documented in the
aforementioned discussion on `setup-uv`'s repo. Confirmed that removing
`source .venv/bin/activate` and replacing it with `activate-environment:
true` now works in this ordering (but didn't work with the original
ordering where `uv` installs before Github's `python`).
2025-07-21 14:48:47 -05:00
Charlie Marsh 2c8e394f03
Create (e.g.) `python3.13t` executables in `uv venv` (#14764)
## Summary

CPython's `venv` module creates these, so we should too.

On non-Windows, we add `python3.13t`.

On Windows, we add `python3.13t.exe` and `pythonw3.13t.exe` (see:
65d2c51c10/Lib/venv/__init__.py (L362)).

Closes https://github.com/astral-sh/uv/issues/14760.
2025-07-21 16:25:50 +00:00
konsti f3dc457d2a
Introduce a generic type for list operations (#14792)
We currently have two marker keys that a list, `extras` and
`dependency_groups`, both from PEP 751. With the variants PEP, we will
add three more. This change is broken out of the wheel variants PR to
introduce generic marker list support, plus a change to use
`ContainerOperator` in more places.
2025-07-21 18:21:46 +02:00
Charlie Marsh d052427c37
Accept `&Path` when creating executable links (#14791)
## Summary

I don't see a great reason for this to take an owned value. It only
needs an owned value for error cases.
2025-07-21 11:53:28 -04:00
Charlie Marsh 80708dea6e
Use a match for Windows executables in `venv` (#14766)
## Summary

I found it confusing that the `else` case for `== "graalpy"` is still
necessary for the `== "pypy"` branch (i.e., that `pythonw.exe` is copied
for PyPy despite not being in the `== "pypy"` branch).

Instead, we now use a match for PyP, GraalPy, and then everything else.
2025-07-21 14:48:52 +00:00
Charlie Marsh aafeda2253
Enforce `requires-python` in `pylock.toml` (#14787)
## Summary

Turns out we weren't validating this at install-time.
2025-07-21 14:37:14 +00:00
Copilot d768dedff6
Remove `version_get_fallback_unmanaged_json` test (#14786)
The `version_get_fallback_unmanaged_json` test was failing when running
tests outside of a git checkout (e.g., from a release tarball) due to
inconsistent behavior based on git availability.

The test had conditional logic that expected different outcomes
depending on whether `git_version_info_expected()` returned true or
false:
- In git checkouts: Expected failure with "The project is marked as
unmanaged" error
- Outside git checkouts: Expected success with fallback behavior showing
version info

However, the fallback behavior was removed in version 0.8.0, making this
test obsolete. All other similar tests
(`version_get_fallback_unmanaged`,
`version_get_fallback_unmanaged_short`,
`version_get_fallback_unmanaged_strict`) consistently expect failure
when a project is marked as unmanaged, regardless of git availability.

This change removes the problematic test entirely, as suggested by
@zanieb. All remaining version tests (51 total) continue to pass.

Fixes #14785.

<!-- START COPILOT CODING AGENT TIPS -->
---

💡 You can make Copilot smarter by setting up custom instructions,
customizing its development environment and configuring Model Context
Protocol (MCP) servers. Learn more [Copilot coding agent
tips](https://gh.io/copilot-coding-agent-tips) in the docs.

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: zanieb <2586601+zanieb@users.noreply.github.com>
2025-07-21 14:17:06 +00:00
Ibraheem Ahmed ba1319450a
Update `toml` to v0.9 (#14571)
## Summary

This should give us some performance and error message improvements.

---------

Co-authored-by: Charlie Marsh <charlie.r.marsh@gmail.com>
Co-authored-by: Zanie Blue <contact@zanie.dev>
2025-07-21 08:18:16 -05:00
Charlie Marsh b81cce9152
Support `extras` and `dependency_groups` markers on `uv pip install` and `uv pip sync` (#14755)
## Summary

We don't yet support writing these, but we can at least read them
(which, e.g., allows you to install PDM-exported `pylock.toml` files
with uv, since PDM _always_ writes a default group).

Closes #14740.
2025-07-21 12:48:47 +00:00
konsti ab48dfd0cb
Collect contains markers in enum (#14782)
We'll add more contains markers for the wheel variants, so I want to
unify them before rebasing the variants branch on them.
2025-07-21 08:38:33 -04:00
Jo 9983273289
Use sha256 checksum from GitHub API for GraalPy releases (#14779)
## Summary

Follow #14078, use GitHub generated sha256 for GraalPy releases too.

## Test Plan

```console
uv run ./crates/uv-python/fetch-download-metadata.py
```
2025-07-21 08:35:45 -04:00
konsti 8ed86a6dcd
Remove Python 3.9.18 from `.python-versions` (#14784)
Python 3.9.18 is not used in the tests anymore.
2025-07-21 07:27:59 -05:00
Jo 98d6ab6632
Improve `CPythonFinder._parse_download_url` a bit (#14780)
## Summary

Rename `_parse_download_url` to `_parse_download_asset` and move the
`asset['digest']` logic into it.

## Test Plan

```console
uv run ./crates/uv-python/fetch-download-metadata.py
```
2025-07-21 12:22:45 +02:00
Zanie Blue 7c2819d1f6
Match `--bounds` formatting for `uv_build` bounds in `uv init` (#14731)
Closes #14724 

https://chatgpt.com/codex/tasks/task_e_687a53ba646c8331baa4140c5b2bec70

---------

Co-authored-by: konstin <konstin@mailbox.org>
2025-07-21 09:48:38 +00:00
renovate[bot] a049ba78fc
Update uraimo/run-on-arch-action action to v3 (#14778) 2025-07-20 21:54:44 -04:00
renovate[bot] e0feed8f9e
Update taiki-e/install-action action to v2.56.19 (#14777) 2025-07-20 21:54:38 -04:00
renovate[bot] abcd03bc0e
Update astral-sh/setup-uv action to v6.4.1 (#14774) 2025-07-20 21:25:01 -04:00
renovate[bot] b6d12c1b84
Update Rust crate serde_json to v1.0.141 (#14773) 2025-07-20 21:24:56 -04:00
renovate[bot] 3a949e0e53
Update Rust crate rustix to v1.0.8 (#14772) 2025-07-20 21:24:46 -04:00
renovate[bot] 51336acd2a
Update pre-commit hook astral-sh/ruff-pre-commit to v0.12.4 (#14771) 2025-07-20 21:24:34 -04:00
renovate[bot] 2c54a4acfb
Update google-github-actions/setup-gcloud digest to 6a7c903 (#14770) 2025-07-20 21:24:28 -04:00
renovate[bot] 0951ebc55c
Update google-github-actions/auth digest to 140bb51 (#14769) 2025-07-20 21:24:22 -04:00
renovate[bot] a4c7bcf3ca
Update aws-actions/configure-aws-credentials digest to a159d7b (#14768) 2025-07-20 21:24:09 -04:00
Charlie Marsh 0487034e91
Fix bad merge in `warn_uv_toml_masked_fields` (#14767)
## Summary

The branch got stale and merged without flagging that this no longer
compiles.
2025-07-20 20:28:31 -04:00
Aria Desires a42a2846e6
Make warnings about masked `[tool.uv]` fields more precise (#14325)
This is the second half of #14308
2025-07-20 18:54:50 -04:00
konsti dbe6a21486
Retry request on invalid data error (#14703)
I also improved the trace logging.

Fixes #14699
2025-07-20 22:28:34 +00:00
Charlie Marsh 5e2047b253
Implement `PartialEq` for `OptionSet` (#14765)
Closes https://github.com/astral-sh/uv/issues/14737.
2025-07-20 18:17:07 -04:00
Charlie Marsh 9923f42c2e
Fix kebab casing of README variants in build backend (#14762)
## Summary

In this context, `rename_all` only applies to the variants, not their
fields.

Closes #14761.
2025-07-20 21:38:50 +00:00
Charlie Marsh fcf0bdd3a6
Add missing `the` in concept link (#14763) 2025-07-20 17:38:24 -04:00
Matt Norton d85a300b5f
Fix typo in `concepts/projects/config.md` (#14759) 2025-07-20 17:27:33 -04:00
Charlie Marsh bd4c7ff860
Move dependency group normalization into specification (#14757)
## Summary

A refactor that I'm extracting from #14755. There should be no
functional changes, but the core idea is to postpone filling in the
default `path` for a dependency group until we make the specification.
This allows us to use the groups for the `pylock.toml` in the future, if
such a `pylock.toml` is provided.
2025-07-20 14:13:27 -04:00
Charlie Marsh a3371867ac
Support `extras` and `dependency_groups` markers in PEP 508 grammar (#14753)
## Summary

We always evaluate these to `false` right now, but we can at least parse
them.

See: https://peps.python.org/pep-0751/#dependency-groups.
2025-07-20 14:02:22 -04:00
Charlie Marsh 2d8dda34b4
Fix comment on `extra_names` (#14756) 2025-07-20 17:53:36 +00:00
Zanie Blue d0a14c72a3
Fix tests requiring patch-level Python (#14733)
Closes #14723

https://chatgpt.com/codex/tasks/task_e_687a532188d08331b4352ba0a78f8fdb
2025-07-20 11:12:01 -05:00
Charlie Marsh 9c9db9b547
Clarify which portions of requires-python behavior are consistent with pip (#14752)
See: #14711
2025-07-20 09:44:25 -04:00
Charlie Marsh d0efe1ed9c
Apply Cache-Control overrides to response, not request headers (#14736)
## Summary

This was just an oversight on my part in the initial implementation.

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

## Test Plan

With:

```toml
[project]
name = "foo"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.13.2"
dependencies = [
]

[[tool.uv.index]]
url = "https://download.pytorch.org/whl/cpu"
cache-control = { api = "max-age=600" }
```

Ran `cargo run lock -vvv` and verified that the PyTorch index response
was cached (whereas it typically returns `cache-control:
no-cache,no-store,must-revalidate`).
2025-07-18 16:32:29 -04:00
konsti 574aa1ef11
Better error reporting for removing Python versions from the Windows registry (#14722)
See
https://github.com/astral-sh/uv/actions/runs/16370666070/job/46258004849

We didn't actual use a format string, showing the template instead. We
don't show the causes in the error report, so we format it into one
error.
2025-07-18 13:26:47 +00:00
Zanie Blue a186fda2d2
Elide traceback when `python -m uv` in interrupted with Ctrl-C on Windows (#14715)
Closes https://github.com/astral-sh/uv/issues/14704
2025-07-18 08:07:36 -05:00
Zanie Blue 70875128be
Disable the Windows Registry updates during `python install` tests (#14718) 2025-07-18 07:49:25 -05:00