Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Respect local versions for all user requirements #5232

Merged
merged 2 commits into from
Jul 19, 2024
Merged

Conversation

ibraheemdev
Copy link
Member

@ibraheemdev ibraheemdev commented Jul 19, 2024

Summary

This fixes a few bugs introduced by #5104. I previously thought we could track conflicting locals the same way we track conflicting URLs in forks, but it turns out that ends up being very tricky. URL forks work because we prioritize directly URL requirements. We can't prioritize locals in the same way without conflicting with the URL prioritization (this may be possible but it's not trivial), so we run into issues where a correct resolution depends on the order in which dependencies are traversed.

Instead, we track local versions across all forks in Locals. When applying a local version, we apply all locals with markers that intersect with the current fork. This way we end up applying some local versions without creating a fork. For example, given:

// pyproject.toml
dependencies = [
    "torch==2.0.0+cu118 ; platform_machine == 'x86_64'",
]

// requirements.in
torch==2.0.0
.

We choose 2.0.0+cu118 in all cases. However, if a disjoint fork is created based on local versions, the resolver will choose the most compatible local when it narrows to a specific fork. Thus we correctly respect local versions when forking:

// pyproject.toml
dependencies = [
    "torch==2.0.0+cu118 ; platform_machine == 'x86_64'",
    "torch==2.0.0+cpu ; platform_machine != 'x86_64'"
]

// requirements.in
torch==2.0.0
.

We should also be able to use a similar strategy for #5150.

Test Plan

This fixes #5220 locally for me, as well as a few other bugs that were not reported yet.

@ibraheemdev ibraheemdev added the lock Related to universal resolution and locking label Jul 19, 2024
})?;

// Add the local version.
*version = version.union(&local);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess this will just... fail? Since it has to be the union of multiple different == requirements, right?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should work fine, we want to allow any compatible local versions before narrowing to a fork.

Copy link
Member

@charliermarsh charliermarsh left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice. I find this easier to reason about too.

@zanieb zanieb merged commit bb73edb into main Jul 19, 2024
54 checks passed
@zanieb zanieb deleted the ibraheem/fork-locals branch July 19, 2024 21:56
@zanieb zanieb mentioned this pull request Jul 19, 2024
ibraheemdev added a commit that referenced this pull request Jul 23, 2024
## Summary

Similar to #5232, we should also
track prerelease strategies per-fork, instead of globally per package.
The common functionality for tracking locals and prerelease versions
across forks is extracted into the `ForkMap` type.

Resolves #4579. This doesn't quite
solve #4959, as that issue relies
on overlapping markers.
ibraheemdev added a commit that referenced this pull request Aug 6, 2024
## Summary

This fixes a bug introduced by
#5232. It turns out that the
`universal_disjoint_base_or_local_requirement` test does not actually do
what it was meant to because of the incorrect python requirement. With a
valid python requirement, it fails on `main`. The problem is that we try
to exclude the original base version from the range of allowed versions
to try and prefer local versions. However, in the test, there is a
branch that depends on the non-local version, with no applicable local
in its fork. We should remove this exclusion as prioritization is
handled by the candidate resolver.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
lock Related to universal resolution and locking
Projects
None yet
Development

Successfully merging this pull request may close these issues.

uv lock: regression in handling local version identifiers
3 participants