Commit Graph

1051 Commits

Author SHA1 Message Date
Charlie Marsh 9dea237fca Revalidate editables and other dependencies in scripts (#18328)
## Summary

Lockfile re-validation was iterating from the workspace roots; but for
scripts, we have no roots! This is similar to the approach we use in `uv
tree`, `uv export`, etc.

Closes https://github.com/astral-sh/uv/issues/18312.
2026-03-06 11:46:07 -05:00
konsti 401661ee22 Log the duration we took before erroring (#18231)
We previously errored due to not having long enough backoff, and there
were questions about how long the retries are, so let's log this on
failure.
2026-03-06 08:51:10 -06:00
konsti f18d279686 Add spans for toml reading (#18305)
In a warm cache situation, e.g. with `uv run`, toml parsing is by far
our slowest operation. These kinda hacky spans help debugging that. It
would be better if `toml::from_str` would be instrumented itself, but
this way we can add paths in the relevant places.
2026-03-05 14:43:52 +01:00
konsti 55cbe85d74 Unify poetry check types (#18260)
Found this duplication when looking at the toml parsing code.
2026-03-03 12:13:01 -06:00
Denizhan Dakılır 810072dd62 fix: uv tree orphaned roots and premature deduplication (#17212)
<!--
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

will close https://github.com/astral-sh/uv/issues/17160

Basically, old code using nodes with no incoming edges included
transitive deps which resulted in orphaned roots. We didnt actually need
that code as well, infinite cycle handling was done in `fn visit`
correctly so just using root node directly solves the issue. I also
found another bug during the process where packages were marked as
"visited" prematurely resulting in not even expanding them and not
showing them at the tree.

## Test Plan

I added two tests with snapshots.

---------

Co-authored-by: Charlie Marsh <charlie.r.marsh@gmail.com>
2026-03-03 17:37:54 +00:00
Chiranjeevi U 905d97dc82 Skip installed Python check for URL dependencies (#18211)
## Summary

Skip the installed Python version check when resolving URL dependencies.
Such checks are already skipped for registry dependencies.

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

---------

Signed-off-by: Chiranjeevi U <244287281+chiranjeevi-max@users.noreply.github.com>
Co-authored-by: Charlie Marsh <charlie.r.marsh@gmail.com>
2026-03-01 20:38:17 +00:00
Charlie Marsh 548b29ffc3 Retain default-branch Git SHAs in pylock.toml files (#18227)
## Summary

If no revision is specified, we should assume the input used the default
branch (rather than returning early and ignoring the existing SHA).

Closes https://github.com/astral-sh/uv/issues/18224.
2026-02-28 20:50:11 -05:00
liam 99cb2a2c50 Add resolver hint when --exclude-newer filters out all versions of a package (#18217)
Resolves #18014 (also related to
https://github.com/astral-sh/uv/issues/18010)

When `--exclude-newer` is active and all versions of a required package
were uploaded after the cutoff, resolution fails with no indication that
the setting is the cause. This diff adds a resolver hint that surfaces
the relationship.

The diff also includes debug-level logging of the exclude-newer
configuration at resolver start (happy to get this in separately, if
needed), and trace-level logging each time an individual file is
excluded by the timestamp cutoff. These help diagnose resolution
behavior without requiring the hint to fire.
2026-02-27 13:59:02 -06:00
konsti 55cfaf9d94 Apply lockfile marker normalization for fork markers (#18116)
While dependency markers get a roundtrip through simplify/complexify
([crates/uv-resolver/src/lock/mod.rs#L4846-L4848](https://github.com/astral-sh/uv/blob/3223b1c39f8011a4460f2b5d56ace19e5d26e16d/crates/uv-resolver/src/lock/mod.rs#L4846-L4848),
https://github.com/astral-sh/uv/pull/15994), this treatment was missing
for fork markers, causing errors with `--locked --refresh` on a fresh
lockfile.

Fixes #16839
Closes #18024
2026-02-24 17:43:11 +01:00
Zanie Blue f7e9a33d48 Improve performance of repeated conflicts with an extra (#18094)
In https://github.com/astral-sh/uv/issues/18026, we received a report
that resolution took >90m and the root cause appears to be that repeated
conflicts with a single extra causes an exponential explosion.

I used Codex to find an optimization to avoid this. 

> When processing N pairwise conflict sets that share a common extra
(e.g., {pinned, a}, {pinned, b}, {pinned, c}, ...), the resolver creates
forks by iterating over each conflict set and splitting every existing
fork into N+1 sub-forks. Without the optimization, this is
multiplicative — each conflict set multiplies the fork count, producing
O(2^N) forks even though most are redundant.
> 
> The key observation is: if a prior conflict set already excluded an
extra from a fork, then a later conflict set involving that same extra
is already satisfied in that fork — there's nothing left to separate.
For example, after processing {pinned, a}, one fork has pinned excluded.
When we then process {pinned, b}, that fork already can't have pinned
active, so the constraint "at most one of pinned or b" is trivially
true. We call this fork dominated by the earlier split — no further
forking is needed.
> 
> The one subtlety: even if a conflict set is satisfied in a fork, we
might still need to fork if the remaining non-excluded item appears in
another conflict set that's still live (i.e., has two or more
non-excluded items). That's the refined check — we only skip forking
when the item is truly dominated across all conflict sets, not just the
current one.

I then did some rough benchmarking
```
 ┌────┬────────┬───────┬─────────┐                                                                       
 │ N  │ Before │ After │ Speedup │                                                                       
 ├────┼────────┼───────┼─────────┤                                                                       
 │ 5  │ 29ms   │ 27ms  │ ~1×     │                                                                       
 ├────┼────────┼───────┼─────────┤                                                                       
 │ 8  │ 58ms   │ 27ms  │ 2×      │                                                                       
 ├────┼────────┼───────┼─────────┤                                                                       
 │ 10 │ 185ms  │ 26ms  │ 7×      │                                                                       
 ├────┼────────┼───────┼─────────┤                                                                       
 │ 15 │ 20.0s  │ 46ms  │ 435×    │                                                                       
 ├────┼────────┼───────┼─────────┤                                                                       
 │ 20 │ >60s   │ 28ms  │ >2,000× │                                                                       
 └────┴────────┴───────┴─────────┘                                                                       
```
2026-02-20 16:08:30 +00:00
konsti 3223b1c39f Update stale comments and downgrade a warn! (#18101)
This came out of an experience on whether claude code can find missing
updates in from changes in PRs:

#18096 — Propagate project-level conflicts to package extras (zanieb)
**Stale docstring on `filter_by_group`**: In
`crates/uv-resolver/src/resolver/environment.rs`, the docstring still
says "Include rules have no effect in `included_by_group`". After this
PR, include rules DO affect `included_by_group` when a project-level
exclusion exists for a package — an explicit inclusion for a specific
extra overrides the exclusion.

#18081 — Filter `pylock.toml` wheels by tags and `requires-python`
(konstin)
**Inverted docstring on `is_wheel_unreachable`**: At
`crates/uv-resolver/src/lock/mod.rs:6088`, the docstring says "Returns
`false` if the wheel is definitely unreachable" but the function
actually returns `true` when unreachable. The `true`/`false` are
swapped.

#18075 — make missing files warning debug (dead10ck)
**Analogous `warn!` not changed in flat_index.rs**:
`crates/uv-client/src/flat_index.rs:215` has a similar `warn!("Skipping
file in {}: {err}", &url)` that exhibits the same noisy pattern.
Arguable whether flat indexes warrant the same change since they're
user-configured and less likely to trigger mass warnings.
2026-02-20 08:40:58 +01:00
Zanie Blue 31a277e006 Propagate project-level conflicts to package extras (#18096)
Closes #18015

Project-level conflict items (e.g., `{ package = "pkg-a" }`) were not
properly excluding the package's extras and groups from the conflicting
fork. When a project-level conflict excludes a package, all of that
package's extras should also be excluded (since they transitively depend
on the base package). The alternative seems to be that the user needs to
enumerate all of the extra conflicts explicitly in addition to the
package conflict, which seems excessive.

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-02-19 08:21:43 -06:00
konsti 8c697a426f Filter pylock.toml wheels by tags and requires-python (#18081)
We are already doing this for `uv.lock`, but it was missing for
`pylock.toml`.
2026-02-18 17:31:39 +01:00
Zanie Blue 7ef8d66c94 Clean up legacy workspace root concept (#17864)
Prompted by https://github.com/astral-sh/uv/issues/17855 — I think this
branch is just dead code?
2026-02-17 10:24:15 -05:00
Tim Pickles 50f96967d3 feat: add properties to synthentic & project root (#17820) 2026-02-02 21:46:52 +01:00
Tomasz Kramkowski 6e3ba2f03d Introduce PreviewFeature to clarify intent throughout the codebase (#17670)
## Summary

This PR replaces `bitflags` in favour of `enumflags2` (which we already
transitively depended on) so that `PreviewFeatures` can be replaced with
`PreviewFeature` which is an enum. This clarifies intent in cases where
we only care about one specific `PreviewFeature`.

To avoid a bunch of boilerplate changes, the `Preview` wrapper has been
kept and creation now involves a `&[PreviewFeature]` in all cases. The
alternative was to have everything which initialises a `Preview` use
`BitFlags` directly and possibly to remove `Preview` entirely but this
keeps things simpler and limits the changes throughout the rest of the
codebase solely to changes which deal with the name changes (ALL_CAPS to
PascalCase) and the impact on `--show-settings` which I don't believe we
care about stability of output for?

The changes to `--show-settings` could be avoided with some custom
`Debug` implementation but that seems excessive.

This PR will impact #16452. But the changes were inspired by trying to
remove the need for that particular PR to add more runtime type
checking.

## Test Plan

Existing tests were adjusted (I also fixed some missing cases). The test
for panicking in cases which are now prevented through the use of type
changes has been dropped. All the rest of the tests were ran, snapshot
changes reviewed and applied.
2026-01-23 17:19:23 +00:00
William Woodruff ffb45112ab PEP 792: plumb statuses into internal representation (#17631) 2026-01-23 10:29:39 -05:00
William Woodruff 7728392641 Fix schema for PackageExcludeNewer (#17665) 2026-01-22 17:45:50 -05:00
konsti 2458d4835d Remove unused error enum variants (#17657) 2026-01-22 12:31:55 +01:00
Zanie Blue 3e22637c93 Use #[expect(clippy::...)] throughout and drop unused supressions (#17537)
Co-authored-by: Claude <noreply@anthropic.com>
2026-01-20 21:52:06 +00:00
Zanie Blue ed3cd39789 Consolidate the disjoint target hints (#17540)
These should be generated alongside all the other resolver hints, I
think.

The order changes here, but that seems fine.

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-01-19 17:08:51 -06:00
Zanie Blue 73ad74c4d5 Improve error message for abi3 wheels on free-threaded Python (#17442)
Closes #17406 

Unlike https://github.com/astral-sh/uv/pull/17415, this returns a
dedicated error variant instead of adding a downstream special case to
handling of `Python` tag incompatibilities.

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-01-15 10:58:10 -06:00
liam 827edd0740 Allow disabling exclude-newer per package (#16854)
Resolves https://github.com/astral-sh/uv/issues/16846,
https://github.com/astral-sh/uv/issues/16813

This diff adds support for disabling `exclude-newer` for specific
packages using `<name>=false`. This allows packages
without upload dates (e.g., CPU-only PyTorch wheels from custom indices)
to be resolved when a global `exclude-newer` is set, without disabling
it globally.

---------

Co-authored-by: Zanie Blue <contact@zanie.dev>
2026-01-12 19:00:07 -06:00
Tom Schafer 29285db48e Fix missing dependencies on synthetic root in SBOM export (#17363) 2026-01-08 13:19:34 -05:00
William Woodruff a27e0c850d Use Cow<str> for deserialization everywhere (#17330) 2026-01-05 17:57:35 -05:00
Charlie Marsh 691719f906 Filter PPC wheels et al in lockfile (#17317)
## Summary

Closes https://github.com/astral-sh/uv/issues/17313.
2026-01-05 10:25:02 -05:00
konsti 24cc4a789b Fix some Rust 1.92 clippy lints (#17324)
Saw this as a build failure in a CI job.

Excluding https://github.com/zkat/miette/pull/459
2026-01-05 11:11:43 +00:00
Zanie Blue c26a57670d Fix regression where zstd distribution hashes were not considered valid (#17265)
Fixes a regression from https://github.com/astral-sh/uv/pull/17157 as
reported in https://github.com/astral-sh/uv/issues/17260

Closes https://github.com/astral-sh/uv/issues/17260
Closes https://github.com/astral-sh/uv/pull/17263

You can see the regression test fail
[here](https://github.com/astral-sh/uv/actions/runs/20599629637/job/59162043790?pr=17269)
in #17269 which cherry-picks the commit adding tests without the fix.
2025-12-30 15:24:03 +00:00
Charlie Marsh 6fa8204efe Avoid enforcing incorrect hash in mixed-hash settings (#17157)
## Summary

Right now, when we return a `Dist` from a lockfile, we concatenate all
hashes for all distributions for a given package. In the case of
https://github.com/astral-sh/uv/issues/17143, I think that means we'll
return the SHA256 from the sdist, plus the SHA512 from the wheel. If the
wheel was previously installed (i.e., it's in the cache), and we
computed the SHA256 at that point in time, then `Hashed::has_digests`
would return `true` because we have _at least_ one SHA256. We now limit
the hashes to the distribution that we expect to install.

Closes https://github.com/astral-sh/uv/issues/17143.
2025-12-17 16:01:59 +00:00
jkipper af348c2a88 Ignore pyproject index username in lockfile comparison (#16995)
<!--
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

Pyproject.toml index url may contain a username while lockfile doesn't.
Treat it as the same index to prevent unintended package updates

Fixes #16436

---------

Co-authored-by: konstin <konstin@mailbox.org>
2025-12-16 10:47:50 +00:00
haruna c43315f4eb Change exclude-newer type into optional string (#17121)
<!--
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: #17103 

## Test Plan

The following settings will be enabled for the schema.

```toml
[tool.uv]
exclude-newer = "P7D"
```
2025-12-13 13:42:01 -06:00
Zanie Blue a550743bed Drop some non-integration exclude-newer tests (#17071)
Closes https://github.com/astral-sh/uv/issues/17070

Claude added these and they're unstable and just not useful imo.
2025-12-10 14:04:05 +00:00
Zanie Blue d0a6f5d13f Add support for relative durations in exclude-newer (#16814)
Adds support for "friendly" durations like, 1 week, 7 days, 24 hours
using Jiff's parser. During resolution, we calculate this relative to
the current time and resolve it into a concrete timestamp for the
lockfile. If the span has not changed, e.g., to another relative value,
then locking again will not change the lockfile. The locked timestamp
will only be updated when the lockfile is invalidated, e.g., with
`--upgrade`. This prevents the lockfile from repeatedly churning when a
relative value is used.
2025-12-09 19:52:14 +00:00
Charlie Marsh 28a8194a67 Respect dropped (but explicit) indexes in dependency groups (#17012)
## Summary

There are a class of outcomes whereby an index might not be included in
"allowed indexes", but could still correctly appear in a lockfile. In
the linked case, we have two `default = true` indexes, and one of them
is also named. We omit the second `default = true` index from the list
of "allowed indexes", but since it's named, a dependency can reference
it explicitly. We handle this correctly for `project.dependencies`, but
the handling was incorrectly omitting dependency groups.

Closes https://github.com/astral-sh/uv/issues/16843.
2025-12-06 14:06:46 +00:00
konsti 05fa19c440 Use explicit credentials cache instead of global static (#16768)
Fixes https://github.com/astral-sh/uv/issues/16447

Passing this around explicitly uncovers some behaviors where we pass
e.g. the credentials store to reading the lockfile. The changes in this
PR should preserve the existing behavior for now, they only make the
locations we read from more explicit.

Labeling this PR as "Enhancement" instead of "Internal" in case this
changes behavior when it shouldn't have.
2025-12-03 14:51:25 +01:00
Charlie Marsh 932d7b8fce Filter wheels from PEP 751 files based on --no-binary et al in uv pip compile (#16956)
## Summary

Like in `uv.lock`, we should omit artifacts that are filtered out by
`--no-binary` or by the target platform tags.

Closes https://github.com/astral-sh/uv/issues/13413.
2025-12-03 06:51:35 -06:00
samypr100 fee7f9d093 Support Git LFS with opt-in (#16143)
## Summary

Follow up to https://github.com/astral-sh/uv/pull/15563
Closes https://github.com/astral-sh/uv/issues/13485

This is a first-pass at adding support for conditional support for Git
LFS between git sources, initial feedback welcome.

e.g.
```
[tool.uv.sources]
test-lfs-repo = { git = "https://github.com/zanieb/test-lfs-repo.git", lfs = true }
```

For context previously a user had to set `UV_GIT_LFS` to have uv fetch
lfs objects on git sources. This env var was all or nothing, meaning you
must always have it set to get consistent behavior and it applied to all
git sources. If you fetched lfs objects at a revision and then turned
off lfs (or vice versa), the git db, corresponding checkout lfs
artifacts would not be updated properly. Similarly, when git source
distributions were built, there would be no distinction between sources
with lfs and without lfs. Hence, it could corrupt the git, sdist, and
archive caches.

In order to support some sources being LFS enabled and other not, this
PR adds a stateful layer roughly similar to how `subdirectory` works but
for `lfs` since the git database, the checkouts and the corresponding
caching layers needed to be LFS aware (requested vs installed). The
caches also had to isolated and treated entirely separate when handling
LFS sources.

Summary
* Adds `lfs = true` or `lfs = false` to git sources in pyproject.toml
* Added `lfs=true` query param / fragments to most relevant url structs
(not parsed as user input)
  * In the case of uv add / uv tool, `--lfs` is supported instead
* `UV_GIT_LFS` environment variable support is still functional for
non-project entrypoints (e.g. uv pip)
* `direct-url.json` now has an custom `git_lfs` entry under VcsInfo
(note, this is not in the spec currently -- see caveats).
* git database and checkouts have an different cache key as the sources
should be treated effectively different for the same rev.
* sdists cache also differ in the cache key of a built distribution if
it was built using LFS enabled revisions to distinguish between non-LFS
same revisions. This ensures the strong assumption for archive-v0 that
an unpacked revision "doesn't change sources" stays valid.

Caveats
* `pylock.toml` import support has not been added via git_lfs=true,
going through the spec it wasn't clear to me it's something we'd support
outside of the env var (for now).
* direct-url struct was modified by adding a non-standard `git_lfs`
field under VcsInfo which may be undersirable although the PEP 610 does
say `Additional fields that would be necessary to support such VCS
SHOULD be prefixed with the VCS command name` which could be interpret
this change as ok.
* There will be a slight lockfile and cache churn for users that use
`UV_GIT_LFS` as all git lockfile entries will get a `lfs=true` fragment.
The cache version does not need an update, but LFS sources will get
their own namespace under git-v0 and sdist-v9/git hence a cache-miss
will occur once but this can be sufficient to label this as breaking for
workflows always setting `UV_GIT_LFS`.

## Test Plan

Some initial tests were added. More tests likely to follow as we reach
consensus on a final approach.

For IT test, we may want to move to use a repo under astral namespace in
order to test lfs functionality.

Manual testing was done for common pathological cases like killing LFS
fetch mid-way, uninstalling LFS after installing an sdist with it and
reinstalling, fetching LFS artifacts in different commits, etc.

PSA: Please ignore the docker build failures as its related to depot
OIDC issues.

---------

Co-authored-by: Zanie Blue <contact@zanie.dev>
Co-authored-by: konstin <konstin@mailbox.org>
2025-12-02 12:23:51 +00:00
Charlie Marsh bfdee80f6c Validate URL wheel tags against Requires-Python and required environments (#16824)
## Summary

Closes #16818.
2025-11-25 20:05:58 -05:00
Tom Schafer fd7e6d0a05 Add SBOM export support (#16523)
Co-authored-by: Will Rollason <william.rollason@snyk.io>
2025-11-20 12:52:31 -05:00
William Woodruff ae1edef9c0 Reject ambiguously parsed URLs (#16622)
Co-authored-by: Zanie Blue <contact@zanie.dev>
2025-11-12 16:27:57 +00:00
Charlie Marsh c1c1950dce Add support for the Simple index API top-level route (#16656)
## Summary

At present, we only have support for the detail routes (e.g.,
`https://pypi.org/simple/requests`), but not the top-level index route
(e.g., `https://pypi.org/simple/`). I need this for some downstream work
so pulling it into its own PR.
2025-11-10 14:50:19 -05:00
Zanie Blue 5983a8876b Refactor to remove some cruft from ExcludeNewer propagation (#16641)
I think using a wire here is less convoluted.
2025-11-08 09:44:17 -06:00
Zanie Blue bfecc9902e Fix inclusive constraints on available package versions in resolver errors (#16629)
Closes https://github.com/astral-sh/uv/issues/16626
2025-11-07 09:23:37 -06:00
liam 857827da14 Add prerelease guidance for build-system resolution failures (#16550)
Resolves https://github.com/astral-sh/uv/issues/16496

This PR updates the resolver so `build-system` dependency failures
surface prerelease hints even when prerelease selection is fixed. When a
build dependency only has prerelease candidates, or the requested
version explicitly includes a prerelease marker, we now emit a tailored
hint explaining that build environments can’t auto-enable prereleases
and describing how to opt in.

---------

Co-authored-by: Charlie Marsh <charlie.r.marsh@gmail.com>
2025-11-02 18:38:09 +00:00
Charlie Marsh 5c71b5c124 Enable first-class dependency exclusions (#16528)
## Summary

This PR adds an `exclude-dependencies` setting that allows users to omit
a dependency during resolution. It's effectively a formalized version of
the `flask ; python_version < '0'` hack that we've suggested to users in
various issues.

Closes #12616.
2025-10-31 10:14:12 -04:00
samypr100 7978122837 Update Rust toolchain to 1.91 and MSRV to 1.89 (#16531)
## Summary

Updates Rust Toolchain to
[1.91](https://blog.rust-lang.org/2025/10/30/Rust-1.91.0/) and bumps
MSRV to [1.89](https://blog.rust-lang.org/2025/08/07/Rust-1.89.0/) per
versioning policy. New clippy rule [implicit
clone](https://rust-lang.github.io/rust-clippy/master/index.html#implicit_clone)
resulted in some minor changes (some with improvements).

Updates trampoline to `nightly-2025-06-23` which is roughly 1.89~. The
trampoline binaries do not need to be regenerated as there should be no
changes.
2025-10-30 22:34:59 -05:00
Zanie Blue e2eea6d7db Fix root of uv tree when --package is used with circular dependencies (#15908)
Closes #15907

Best viewed with
https://github.com/astral-sh/uv/pull/15908/files?diff=unified&w=1

When `--package` is used, just use those as the roots rather than
calculating them. I'm not sure if there will be undesirable
side-effects, but it's the naive solution.
2025-10-26 22:01:00 -04:00
konsti 491293362f Don't panic in uv export --frozen when the lockfile is outdated (#16407)
Provide a good error message when the discovered workspace members
mismatch with the locked workspace members in `uv export --frozen`,
instead of panicking.

Fixes #16406
2025-10-23 15:07:14 -05:00
eun2ce e0fe38eabb Improve 403 Forbidden error message to indicate package may not exist (#16353)
Fixes #16340

## Summary

Some package registries (PyTorch, corporate PyPI mirrors) return `403
Forbidden` when a package is not found, instead of `404 Not Found`. The
previous error message incorrectly suggested this was always an
authentication issue, causing confusion for users.

This PR updates the error hint to clarify that a 403 error could
indicate either missing authentication credentials OR that the package
doesn't exist on the index.

## Test Plan

- Updated existing snapshot test in `crates/uv/tests/it/edit.rs` to
reflect the new error message
- The change is purely a message improvement with no behavioral changes

## Changes

### Before

hint: An index URL (https://example.com/simple) could not be queried due
to a lack of valid authentication credentials (403 Forbidden).

### After

hint: An index URL (https://example.com/simple) returned a 403 Forbidden
error. This could indicate missing authentication credentials, or the
package may not exist on this index.


## Files Changed

- `crates/uv-resolver/src/pubgrub/report.rs` - Updated error message
- `crates/uv/tests/it/edit.rs` - Updated snapshot test expectation

---------

Co-authored-by: eun2ce <eun2ce@eun2ceui-MacBookPro.local>
Co-authored-by: konstin <konstin@mailbox.org>
2025-10-20 11:43:18 +00:00
Parham MohammadAlizadeh ed3f99a119 Add required environment marker example to hint (#16244)
## Summary
fixes issue #15938 
- show platform wheel hint with a concrete
`tool.uv.required-environments` example so users know how to configure
compatibility
- add `WheelTagHint::suggest_environment_marker` to pick a sensible
environment marker based on the available wheel tags
- update the `sync_required_environment_hint` integration snapshot to
expect the new multi-line hint

## Test Plan

cargo test --package uv --test it --
sync::sync_required_environment_hint
2025-10-20 13:08:10 +02:00