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

uv-resolver: add new UniversalMarker type #9334

Merged
merged 6 commits into from
Nov 22, 2024
Merged

Conversation

BurntSushi
Copy link
Member

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.

There are some other smaller commits in this PR will smaller changes,
so I'd recommend reviewing commit-by-commit.

Ref #9289

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.
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.
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).
This was completely unused. I noticed this while trying to read
and understand the code. It's unclear when or how this happened.
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.
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.
@BurntSushi BurntSushi force-pushed the ag/add-universal-marker branch from 1be6b78 to 4645037 Compare November 21, 2024 19:41
@BurntSushi
Copy link
Member Author

@charliermarsh Since this is just a refactoring PR, I'm going to bring this in. If you leave any feedback, I'm happy to follow-up!

@BurntSushi BurntSushi merged commit dae584d into main Nov 22, 2024
64 checks passed
@BurntSushi BurntSushi deleted the ag/add-universal-marker branch November 22, 2024 13:21
@BurntSushi BurntSushi added the internal A refactor or improvement that is not user-facing label Nov 23, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
internal A refactor or improvement that is not user-facing
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant