-
Notifications
You must be signed in to change notification settings - Fork 2.9k
Add support for using Python 3.6 interpreters #18454
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
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Drive-by comment without a full review: IMO it's not useful to check this file in, because it carries a risk of diverging from the actual patches to the Alternatively, leave this file in, but don't commit the changes to the
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Hm I'm quite partial to checking it in so it's easy to apply in the future and very clear what changed. I'm pretty hesitant to deal with applying it at build time. These files rarely change and we're a small team. I think optimizing for strictly preventing drift here is a bit silly.
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'll write a script to perform the vendoring. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,139 @@ | ||
| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||
| Subject: [PATCH] python36-support | ||
|
|
||
| Remove `from __future__ import annotations` and quote PEP 604 (`X | Y`) union | ||
| annotations and PEP 585 (`dict[K, V]`) lowercase generics so these vendored | ||
| modules remain compatible with Python 3.6. | ||
|
|
||
| --- | ||
| diff --git a/crates/uv-python/python/packaging/_elffile.py b/crates/uv-python/python/packaging/_elffile.py | ||
| index 8dc7fb32a..f1907a595 100644 | ||
| --- a/crates/uv-python/python/packaging/_elffile.py | ||
| +++ b/crates/uv-python/python/packaging/_elffile.py | ||
| @@ -8,8 +8,6 @@ Based on: https://gist.github.com/lyssdod/f51579ae8d93c8657a5564aefc2ffbca | ||
| ELF header: https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.eheader.html | ||
| """ | ||
|
|
||
| -from __future__ import annotations | ||
| - | ||
| import enum | ||
| import os | ||
| import struct | ||
| @@ -88,11 +86,11 @@ class ELFFile: | ||
| except struct.error as e: | ||
| raise ELFInvalid("unable to parse machine and section information") from e | ||
|
|
||
| - def _read(self, fmt: str) -> tuple[int, ...]: | ||
| + def _read(self, fmt: str) -> "tuple[int, ...]": | ||
| return struct.unpack(fmt, self._f.read(struct.calcsize(fmt))) | ||
|
|
||
| @property | ||
| - def interpreter(self) -> str | None: | ||
| + def interpreter(self) -> "str | None": | ||
| """ | ||
| The path recorded in the ``PT_INTERP`` section header. | ||
| """ | ||
| diff --git a/crates/uv-python/python/packaging/_manylinux.py b/crates/uv-python/python/packaging/_manylinux.py | ||
| index 7b52a5581..d3c871aab 100644 | ||
| --- a/crates/uv-python/python/packaging/_manylinux.py | ||
| +++ b/crates/uv-python/python/packaging/_manylinux.py | ||
| @@ -1,5 +1,3 @@ | ||
| -from __future__ import annotations | ||
| - | ||
| import collections | ||
| import contextlib | ||
| import functools | ||
| @@ -19,7 +17,7 @@ EF_ARM_ABI_FLOAT_HARD = 0x00000400 | ||
| # `os.PathLike` not a generic type until Python 3.9, so sticking with `str` | ||
| # as the type for `path` until then. | ||
| @contextlib.contextmanager | ||
| -def _parse_elf(path: str) -> Generator[ELFFile | None, None, None]: | ||
| +def _parse_elf(path: str) -> "Generator[ELFFile | None, None, None]": | ||
| try: | ||
| with open(path, "rb") as f: | ||
| yield ELFFile(f) | ||
| @@ -74,7 +72,7 @@ def _have_compatible_abi(executable: str, archs: Sequence[str]) -> bool: | ||
| # For now, guess what the highest minor version might be, assume it will | ||
| # be 50 for testing. Once this actually happens, update the dictionary | ||
| # with the actual value. | ||
| -_LAST_GLIBC_MINOR: dict[int, int] = collections.defaultdict(lambda: 50) | ||
| +_LAST_GLIBC_MINOR: "dict[int, int]" = collections.defaultdict(lambda: 50) | ||
|
|
||
|
|
||
| class _GLibCVersion(NamedTuple): | ||
| @@ -82,7 +80,7 @@ class _GLibCVersion(NamedTuple): | ||
| minor: int | ||
|
|
||
|
|
||
| -def _glibc_version_string_confstr() -> str | None: | ||
| +def _glibc_version_string_confstr() -> "str | None": | ||
| """ | ||
| Primary implementation of glibc_version_string using os.confstr. | ||
| """ | ||
| @@ -92,7 +90,7 @@ def _glibc_version_string_confstr() -> str | None: | ||
| # https://github.com/python/cpython/blob/fcf1d003bf4f0100c/Lib/platform.py#L175-L183 | ||
| try: | ||
| # Should be a string like "glibc 2.17". | ||
| - version_string: str | None = os.confstr("CS_GNU_LIBC_VERSION") | ||
| + version_string: "str | None" = os.confstr("CS_GNU_LIBC_VERSION") | ||
| assert version_string is not None | ||
| _, version = version_string.rsplit() | ||
| except (AssertionError, AttributeError, OSError, ValueError): | ||
| @@ -101,7 +99,7 @@ def _glibc_version_string_confstr() -> str | None: | ||
| return version | ||
|
|
||
|
|
||
| -def _glibc_version_string_ctypes() -> str | None: | ||
| +def _glibc_version_string_ctypes() -> "str | None": | ||
| """ | ||
| Fallback implementation of glibc_version_string using ctypes. | ||
| """ | ||
| @@ -145,7 +143,7 @@ def _glibc_version_string_ctypes() -> str | None: | ||
| return version_str | ||
|
|
||
|
|
||
| -def _glibc_version_string() -> str | None: | ||
| +def _glibc_version_string() -> "str | None": | ||
| """Returns glibc version string, or None if not using glibc.""" | ||
| return _glibc_version_string_confstr() or _glibc_version_string_ctypes() | ||
|
|
||
| @@ -203,7 +201,7 @@ def _is_compatible(arch: str, version: _GLibCVersion) -> bool: | ||
| return True | ||
|
|
||
|
|
||
| -_LEGACY_MANYLINUX_MAP: dict[_GLibCVersion, str] = { | ||
| +_LEGACY_MANYLINUX_MAP: "dict[_GLibCVersion, str]" = { | ||
| # CentOS 7 w/ glibc 2.17 (PEP 599) | ||
| _GLibCVersion(2, 17): "manylinux2014", | ||
| # CentOS 6 w/ glibc 2.12 (PEP 571) | ||
| diff --git a/crates/uv-python/python/packaging/_musllinux.py b/crates/uv-python/python/packaging/_musllinux.py | ||
| index b4ca23804..40a72f05b 100644 | ||
| --- a/crates/uv-python/python/packaging/_musllinux.py | ||
| +++ b/crates/uv-python/python/packaging/_musllinux.py | ||
| @@ -4,8 +4,6 @@ This module implements logic to detect if the currently running Python is | ||
| linked against musl, and what musl version is used. | ||
| """ | ||
|
|
||
| -from __future__ import annotations | ||
| - | ||
| import functools | ||
| import re | ||
| import subprocess | ||
| @@ -20,7 +18,7 @@ class _MuslVersion(NamedTuple): | ||
| minor: int | ||
|
|
||
|
|
||
| -def _parse_musl_version(output: str) -> _MuslVersion | None: | ||
| +def _parse_musl_version(output: str) -> "_MuslVersion | None": | ||
| lines = [n for n in (n.strip() for n in output.splitlines()) if n] | ||
| if len(lines) < 2 or lines[0][:4] != "musl": | ||
| return None | ||
| @@ -31,7 +29,7 @@ def _parse_musl_version(output: str) -> _MuslVersion | None: | ||
|
|
||
|
|
||
| @functools.lru_cache() | ||
| -def _get_musl_version(executable: str) -> _MuslVersion | None: | ||
| +def _get_musl_version(executable: str) -> "_MuslVersion | None": | ||
| """Detect currently-running musl runtime version. | ||
|
|
||
| This is done by checking the specified executable's dynamic linking |
Uh oh!
There was an error while loading. Please reload this page.