summaryrefslogtreecommitdiff
path: root/dev-python/certifi/files/certifi-3021.3.16-use-importlib.patch
blob: 3028bfcb99cf6a27e8186e5a6cd044c9999e55d7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
1. https://github.com/tiran/certifi-system-store/commit/6945f34b7be433dbf22946825cdb225d5d2136d5
2. https://github.com/tiran/certifi-system-store/pull/21

Avoid repeated instances of https://bugs.gentoo.org/878045 when a package
has too-strict requirements and then affects other, unrelated Python
packages on the system.

From 6945f34b7be433dbf22946825cdb225d5d2136d5 Mon Sep 17 00:00:00 2001
From: Christian Heimes <christian@python.org>
Date: Tue, 16 Mar 2021 16:00:08 +0100
Subject: [PATCH] Relax patch checks (#13)

- only check that version matches, not files are identical
- compare base directories with samefile. This fixes a problem with
  lib64 symlink in virtual envs.

Signed-off-by: Christian Heimes <christian@python.org>
--- a/src/certifi/_patch.py
+++ b/src/certifi/_patch.py
@@ -28,7 +28,7 @@ def _patch_dist_info():
     except pkg_resources.DistributionNotFound:
         pass
     else:
-        if os.path.samefile(css_dist.egg_info, certifi_dist.egg_info):
+        if certifi_dist.version == css_dist.version:
             return False, css_dist.egg_info, certifi_dist.egg_info
         else:
             # blow away certifi's dist-info
@@ -55,7 +55,9 @@ def _patch_dist_info():
     certifi_dir = os.path.dirname(os.path.abspath(__file__))
     dist_dir = os.path.abspath(certifi_dist.egg_info)
 
-    if os.path.dirname(certifi_dir) != os.path.dirname(dist_dir):
+    # compare with samefile instead of string comparison to avoid false
+    # negatives caused by venv lib64 / lib symlinks
+    if not os.path.samefile(os.path.dirname(certifi_dir), os.path.dirname(dist_dir)):
         raise RuntimeError(
             f"'{certifi_dir} and {dist_dir} have different parent directories."
         )

From cdec6d20b5d716d9853e72a1519a304070395498 Mon Sep 17 00:00:00 2001
From: Christian Heimes <christian@python.org>
Date: Wed, 22 Jun 2022 10:08:18 +0200
Subject: [PATCH] Use importlib on Python 3.8+

--- a/setup.cfg
+++ b/setup.cfg
@@ -38,8 +40,9 @@ packages = certifi
 include_package_data = True
 zip_safe = True
 setup_requires = setuptools
-# hack to prevent installation on unsupported platforms Windows and macOS
 install_requires =
+    setuptools; python_version < "3.8"
+    # hack to prevent installation on unsupported platforms Windows and macOS
     certifi-system-store > 4000; sys_platform == "win32" or sys_platform == "darwin"
 python_requires = >=3.6
 
--- a/src/certifi/_patch.py
+++ b/src/certifi/_patch.py
@@ -1,7 +1,31 @@
 import os
 import shutil
 import sys
-import pkg_resources
+
+if sys.version_info >= (3, 8):
+    from importlib import metadata
+
+    PackageNotFoundError = metadata.PackageNotFoundError
+
+    def _get_distinfo(name):
+        dist = metadata.distribution(name)
+        egg_info = dist._path
+        return dist.version, egg_info
+
+    def _invalidate_caches():
+        pass
+
+else:
+    import pkg_resources
+
+    PackageNotFoundError = pkg_resources.DistributionNotFound
+
+    def _get_distinfo(name):
+        dist = pkg_resources.get_distribution(name)
+        return dist.version, dist.egg_info
+
+    def _invalidate_caches():
+        pkg_resources.working_set.__init__()
 
 
 def _relsymlink(target, linkname):
@@ -22,22 +46,22 @@ def _relsymlink(target, linkname):
 
 def _patch_dist_info():
     # distribution object for the canonical project name
-    css_dist = pkg_resources.get_distribution("certifi_system_store")
+    css_version, css_egg_info = _get_distinfo("certifi_system_store")
     try:
-        certifi_dist = pkg_resources.get_distribution("certifi")
-    except pkg_resources.DistributionNotFound:
+        certifi_version, certifi_egg_info = _get_distinfo("certifi")
+    except PackageNotFoundError:
         pass
     else:
-        if certifi_dist.version == css_dist.version:
-            return False, css_dist.egg_info, certifi_dist.egg_info
+        if certifi_version == css_version:
+            return False, css_egg_info, certifi_egg_info
         else:
             # blow away certifi's dist-info
-            shutil.rmtree(certifi_dist.egg_info)
+            shutil.rmtree(certifi_egg_info)
             # reset current working set, so pkg_resources can pick up our hack
-            pkg_resources.working_set.__init__()
+            _invalidate_caches()
 
     # certifi-system-store's dist-info
-    abs_css_distinfodir = os.path.abspath(css_dist.egg_info)
+    abs_css_distinfodir = os.path.abspath(css_egg_info)
     css_basedir, css_distinfodir = os.path.split(abs_css_distinfodir)
 
     # certifi's dist-info in same base directory
@@ -48,12 +72,12 @@ def _patch_dist_info():
     _relsymlink(target=abs_css_distinfodir, linkname=abs_certifi_distinfodir)
 
     # get dist info from refreshed working set
-    css_dist = pkg_resources.get_distribution("certifi_system_store")
-    certifi_dist = pkg_resources.get_distribution("certifi")
+    css_version, css_egg_info = _get_distinfo("certifi_system_store")
+    certifi_version, certifi_egg_info = _get_distinfo("certifi")
 
     # check that certifi dist-info is in same site-packages as certifi package
     certifi_dir = os.path.dirname(os.path.abspath(__file__))
-    dist_dir = os.path.abspath(certifi_dist.egg_info)
+    dist_dir = os.path.abspath(certifi_egg_info)
 
     # compare with samefile instead of string comparison to avoid false
     # negatives caused by venv lib64 / lib symlinks
@@ -65,17 +89,17 @@ def _patch_dist_info():
     # double check versions
     _verify_dist_info()
 
-    return True, css_dist.egg_info, certifi_dist.egg_info
+    return True, css_egg_info, certifi_egg_info
 
 
 def _verify_dist_info():
-    css_dist = pkg_resources.get_distribution("certifi_system_store")
+    css_version, css_egg_info = _get_distinfo("certifi_system_store")
     try:
-        certifi_dist = pkg_resources.get_distribution("certifi")
-    except pkg_resources.DistributionNotFound as e:
+        certifi_version, certifi_egg_info = _get_distinfo("certifi")
+    except PackageNotFoundError as e:
         raise RuntimeError(e)
     else:
-        if certifi_dist.version != css_dist.version:
+        if certifi_version != css_version:
             raise RuntimeError(
                 f"'certifi.dist-info' is not an alias to "
                 f"'certifi_system_store.dist-info'. "