1
1
import functools
2
2
import logging
3
3
import os
4
- from typing import TYPE_CHECKING , Dict , List , Optional , Set , Tuple , cast
4
+ from typing import TYPE_CHECKING , Dict , Iterator , List , Optional , Set , Tuple , cast
5
5
6
6
from pip ._vendor .packaging .utils import canonicalize_name
7
7
from pip ._vendor .resolvelib import BaseReporter , ResolutionImpossible
19
19
PipDebuggingReporter ,
20
20
PipReporter ,
21
21
)
22
+ from pip ._internal .utils .parallel import LACK_SEM_OPEN , map_multithread
22
23
23
24
from .base import Candidate , Requirement
24
25
from .factory import Factory
@@ -66,6 +67,7 @@ def __init__(
66
67
self .ignore_dependencies = ignore_dependencies
67
68
self .upgrade_strategy = upgrade_strategy
68
69
self ._result : Optional [Result ] = None
70
+ self ._finder = finder
69
71
70
72
def resolve (
71
73
self , root_reqs : List [InstallRequirement ], check_supported_wheels : bool
@@ -87,6 +89,8 @@ def resolve(
87
89
reporter ,
88
90
)
89
91
92
+ self .prime_finder_cache (provider .identify (r ) for r in collected .requirements )
93
+
90
94
try :
91
95
try_to_avoid_resolution_too_deep = 2000000
92
96
result = self ._result = resolver .resolve (
@@ -161,6 +165,22 @@ def resolve(
161
165
self .factory .preparer .prepare_linked_requirements_more (reqs )
162
166
return req_set
163
167
168
+ def prime_finder_cache (self , project_names : Iterator [str ]) -> None :
169
+ if LACK_SEM_OPEN :
170
+ return
171
+
172
+ if not hasattr (self ._finder .find_all_candidates , "cache_info" ):
173
+ return
174
+
175
+ def _maybe_find_candidates (project_name : str ) -> None :
176
+ try :
177
+ self ._finder .find_all_candidates (project_name )
178
+ except AttributeError :
179
+ pass
180
+
181
+ for _ in map_multithread (_maybe_find_candidates , project_names ):
182
+ pass
183
+
164
184
def get_installation_order (
165
185
self , req_set : RequirementSet
166
186
) -> List [InstallRequirement ]:
0 commit comments