Skip to content

[Wheel Variants] Wheel Variant Support for PIP #13366

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

Draft
wants to merge 25 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
8f75a76
Version Update
DEKHTIARJonathan Feb 25, 2025
6de1633
WheelVariant Demo
DEKHTIARJonathan Feb 26, 2025
7aaf1a7
PIP implementation of Wheel Variant
DEKHTIARJonathan Feb 27, 2025
b353f55
Include variant hashes in tags only when needed
mgorny Mar 2, 2025
e9a68b3
Initial `variants.json` support
mgorny Mar 3, 2025
0af06e0
Pass whole `variants.json` to `utils.variant` and add caching
mgorny Mar 3, 2025
71e9284
Wrap variants.json in a hashable class, and readd caching
mgorny Mar 3, 2025
45e389f
Enable `variants_json` API use in variantlib
mgorny Mar 3, 2025
b0ee541
Update wheel filename regex for wheelnext/pep_xxx_wheel_variants#5
mgorny Mar 18, 2025
7fbb325
Merge pull request #2 from mgorny/variants-json
DEKHTIARJonathan Mar 19, 2025
e4f70be
Merge pull request #6 from wheelnext/pep-xxx-wheel-variants-variants-…
DEKHTIARJonathan Mar 25, 2025
1e75e06
Remove support for combinatorial approach to variants (#7)
mgorny Mar 25, 2025
0aafb68
Update for variantlib API changes
mgorny Apr 7, 2025
9fb1fae
Import Fix
DEKHTIARJonathan Apr 28, 2025
26651c7
Display Fix
DEKHTIARJonathan Apr 28, 2025
91c6127
Switch to Variant Priority
DEKHTIARJonathan Apr 28, 2025
b145242
BugFix
DEKHTIARJonathan Apr 28, 2025
3292f9a
Install UI enhancement
DEKHTIARJonathan Apr 29, 2025
3b7c959
[WIP] Progressive work towards working pip again (#8)
mgorny May 8, 2025
16efc01
Use variant_wheel_supported() on remaining codepaths
mgorny May 12, 2025
1e26b59
Print selected variant details
mgorny May 12, 2025
27bbc0d
Bug Fix + Cosmetics
DEKHTIARJonathan May 13, 2025
e7f75ca
Add a `--no-variant` option to disable variant support entirely
mgorny May 15, 2025
29408a5
Support specifying variant hash as part of requirement
mgorny May 15, 2025
eba1524
Permit whitespace before variant hash
mgorny May 15, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/pip/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from typing import List, Optional

__version__ = "25.1.dev0"
__version__ = "25.1.dev0+pep-xxx-wheel-variants"


def main(args: Optional[List[str]] = None) -> int:
Expand Down
6 changes: 5 additions & 1 deletion src/pip/_internal/cache.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
from pip._internal.models.wheel import Wheel
from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds
from pip._internal.utils.urls import path_to_url
from pip._internal.utils.variant import variant_wheel_supported

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -150,7 +151,10 @@ def get(
package_name,
)
continue
if not wheel.supported(supported_tags):
if (
not wheel.supported(supported_tags)
or not variant_wheel_supported(wheel, link)
):
# Built for a different python/arch/etc
continue
candidates.append(
Expand Down
1 change: 1 addition & 0 deletions src/pip/_internal/cli/req_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -337,6 +337,7 @@ def _build_package_finder(
allow_all_prereleases=options.pre,
prefer_binary=options.prefer_binary,
ignore_requires_python=ignore_requires_python,
use_variants=options.use_variants,
)

return PackageFinder.create(
Expand Down
2 changes: 1 addition & 1 deletion src/pip/_internal/commands/index.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ def get_available_package_versions(self, options: Values, args: List[Any]) -> No
)

versions: Iterable[Version] = (
candidate.version for candidate in finder.find_all_candidates(query)
candidate.version for candidate, _ in finder.find_all_candidates(query)
)

if not options.pre:
Expand Down
45 changes: 36 additions & 9 deletions src/pip/_internal/commands/install.py
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,16 @@ def add_options(self) -> None:
),
)

self.cmd_opts.add_option(
"--no-variant",
dest="use_variants",
action="store_false",
default=True,
help=(
"Disable installing variant wheels."
),
)

@with_cleanup
def run(self, options: Values, args: List[str]) -> int:
if options.use_user_site and options.target_dir is not None:
Expand Down Expand Up @@ -314,8 +324,8 @@ def run(self, options: Values, args: List[str]) -> int:
options.target_dir = os.path.abspath(options.target_dir)
if (
# fmt: off
os.path.exists(options.target_dir) and
not os.path.isdir(options.target_dir)
os.path.exists(options.target_dir)
and not os.path.isdir(options.target_dir)
# fmt: on
):
raise CommandError(
Expand Down Expand Up @@ -397,13 +407,24 @@ def run(self, options: Values, args: List[str]) -> int:

if options.dry_run:
would_install_items = sorted(
(r.metadata["name"], r.metadata["version"])
(
r.metadata["name"],
r.metadata["version"],
r.metadata["variant-hash"],
)
if "variant-hash" in r.metadata
else (r.metadata["name"], r.metadata["version"])
for r in requirement_set.requirements_to_install
)

if would_install_items:
write_output(
"Would install %s",
" ".join("-".join(item) for item in would_install_items),
" ".join(
"-".join(item[:2])
+ (f"-{item[2]}" if len(item) > 2 else "")
for item in would_install_items
),
)
return SUCCESS

Expand Down Expand Up @@ -482,14 +503,20 @@ def run(self, options: Values, args: List[str]) -> int:
summary = []
installed_versions = {}
for distribution in env.iter_all_distributions():
installed_versions[distribution.canonical_name] = distribution.version
installed_versions[distribution.canonical_name] = (
distribution.version,
distribution.metadata["variant-hash"],
)
for package in installed:
display_name = package.name
version = installed_versions.get(canonicalize_name(display_name), None)
version, variant_hash = installed_versions.get(
canonicalize_name(display_name), (None, None)
)
text = f"{display_name}"
if version:
text = f"{display_name}-{version}"
else:
text = display_name
text = f"{text}-{version}"
if variant_hash:
text = f"{text}-{variant_hash}"
summary.append(text)

if conflicts is not None:
Expand Down
2 changes: 1 addition & 1 deletion src/pip/_internal/commands/list.py
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ def iter_packages_latest_infos(
def latest_info(
dist: "_DistWithLatestInfo",
) -> Optional["_DistWithLatestInfo"]:
all_candidates = finder.find_all_candidates(dist.canonical_name)
all_candidates, _ = finder.find_all_candidates(dist.canonical_name)
if not options.pre:
# Remove prereleases
all_candidates = [
Expand Down
Loading