From c69ea02bff38d7d6c5cda41a344b2d6a71ad2c74 Mon Sep 17 00:00:00 2001
From: Paul Moore
Date: Wed, 3 Aug 2022 10:12:29 +0100
Subject: [PATCH] Add a version check to __pip-runner__.py
---
setup.py | 2 ++
src/pip/__pip-runner__.py | 36 +++++++++++++++++++++++++-----------
2 files changed, 27 insertions(+), 11 deletions(-)
diff --git a/setup.py b/setup.py
index 9b7fdeb1134..2179d34d2bf 100644
--- a/setup.py
+++ b/setup.py
@@ -81,5 +81,7 @@ def get_version(rel_path: str) -> str:
],
},
zip_safe=False,
+ # NOTE: python_requires is duplicated in __pip-runner__.py.
+ # When changing this value, please change the other copy as well.
python_requires=">=3.7",
)
diff --git a/src/pip/__pip-runner__.py b/src/pip/__pip-runner__.py
index 14026c0d131..49a148a097e 100644
--- a/src/pip/__pip-runner__.py
+++ b/src/pip/__pip-runner__.py
@@ -4,24 +4,38 @@
an import statement.
"""
-import runpy
+# /!\ This version compatibility check section must be Python 2 compatible. /!\
+
import sys
-import types
-from importlib.machinery import ModuleSpec, PathFinder
-from os.path import dirname
-from typing import Optional, Sequence, Union
+
+# Copied from setup.py
+PYTHON_REQUIRES = (3, 7)
+
+
+def version_str(version): # type: ignore
+ return ".".join(str(v) for v in version)
+
+
+if sys.version_info[:2] < PYTHON_REQUIRES:
+ raise SystemExit(
+ "This version of pip does not support python {} (requires >={}).".format(
+ version_str(sys.version_info[:2]), version_str(PYTHON_REQUIRES)
+ )
+ )
+
+# From here on, we can use Python 3 features, but the syntax must remain
+# Python 2 compatible.
+
+import runpy # noqa: E402
+from importlib.machinery import PathFinder # noqa: E402
+from os.path import dirname # noqa: E402
PIP_SOURCES_ROOT = dirname(dirname(__file__))
class PipImportRedirectingFinder:
@classmethod
- def find_spec(
- self,
- fullname: str,
- path: Optional[Sequence[Union[bytes, str]]] = None,
- target: Optional[types.ModuleType] = None,
- ) -> Optional[ModuleSpec]:
+ def find_spec(self, fullname, path=None, target=None): # type: ignore
if fullname != "pip":
return None