@@ -110,8 +110,8 @@ def _hash_flags_dict(self, flags):
110
110
h ^= hash (pair )
111
111
return h
112
112
113
- def solve (self , top_core , flags ):
114
- return self ._solve (top_core , flags )
113
+ def solve (self , top_core , flags , added_cores ):
114
+ return self ._solve (top_core , flags , added_cores )
115
115
116
116
def _get_conflict_map (self ):
117
117
"""Return a map of cores to their conflicts
@@ -142,7 +142,7 @@ def _get_conflict_map(self):
142
142
conflict_set .remove (real_pkg )
143
143
return conflict_map
144
144
145
- def _solve (self , top_core , flags = {}, only_matching_vlnv = False ):
145
+ def _solve (self , top_core , flags = {}, added_cores = (), only_matching_vlnv = False ):
146
146
def eq_vln (this , that ):
147
147
return (
148
148
this .vendor == that .vendor
@@ -151,7 +151,12 @@ def eq_vln(this, that):
151
151
)
152
152
153
153
# Try to return a cached result
154
- solver_cache_key = (top_core , self ._hash_flags_dict (flags ), only_matching_vlnv )
154
+ requested_cores = frozenset (added_cores + (top_core ,))
155
+ solver_cache_key = (
156
+ requested_cores ,
157
+ self ._hash_flags_dict (flags ),
158
+ only_matching_vlnv ,
159
+ )
155
160
cached_solution = self ._solver_cache_lookup (solver_cache_key )
156
161
if cached_solution :
157
162
return cached_solution
@@ -206,12 +211,13 @@ def eq_vln(this, that):
206
211
repo .add_package (package )
207
212
208
213
request = Request ()
209
- _top_dep = "{} {} {}" .format (
210
- self ._package_name (top_core ),
211
- top_core .relation ,
212
- self ._package_version (top_core ),
213
- )
214
- request .install (Requirement ._from_string (_top_dep ))
214
+ for requested_core in requested_cores :
215
+ dep = "{} {} {}" .format (
216
+ self ._package_name (requested_core ),
217
+ requested_core .relation ,
218
+ self ._package_version (requested_core ),
219
+ )
220
+ request .install (Requirement ._from_string (dep ))
215
221
216
222
installed_repository = Repository ()
217
223
pool = Pool ([repo ])
@@ -249,11 +255,12 @@ def eq_vln(this, that):
249
255
]
250
256
# Print a warning for all virtual selections that has no concrete requirement selection
251
257
for virtual in virtual_selection .values ():
252
- logger .warning (
253
- "Non-deterministic selection of virtual core {} selected {}" .format (
254
- virtual [1 ], virtual [0 ]
258
+ if virtual [0 ] not in requested_cores :
259
+ logger .warning (
260
+ "Non-deterministic selection of virtual core {} selected {}" .format (
261
+ virtual [1 ], virtual [0 ]
262
+ )
255
263
)
256
- )
257
264
258
265
result = [op .package .core for op in transaction .operations ]
259
266
@@ -402,13 +409,16 @@ def get_libraries(self):
402
409
"""Get all registered libraries"""
403
410
return self ._lm .get_libraries ()
404
411
405
- def get_depends (self , core , flags ):
412
+ def get_depends (self , core , flags , added_cores ):
406
413
"""Get an ordered list of all dependencies of a core
407
414
408
415
All direct and indirect dependencies are resolved into a dependency
409
416
tree, the tree is flattened, and an ordered list of dependencies is
410
417
created.
411
418
419
+ The list is augmented by any added_cores required by the call, which can
420
+ deterministically satisfy virtual VLNV dependencies.
421
+
412
422
The first element in the list is a leaf dependency, the last element
413
423
is the core at the root of the dependency tree.
414
424
"""
@@ -417,8 +427,9 @@ def get_depends(self, core, flags):
417
427
core .relation , str (core ), str (flags )
418
428
)
419
429
)
430
+ logger .debug (" User added cores to request: " + ", " .join ([str (c ) for c in added_cores ]))
420
431
resolved_core = self .db .find (core )
421
- deps = self .db .solve (resolved_core .name , flags )
432
+ deps = self .db .solve (resolved_core .name , flags , added_cores )
422
433
logger .debug (" Resolved core to {}" .format (str (resolved_core .name )))
423
434
logger .debug (" with dependencies " + ", " .join ([str (c .name ) for c in deps ]))
424
435
return deps
0 commit comments