@@ -168,6 +168,86 @@ impl SpkProvider {
168168 self . cancel_solving . get ( )
169169 }
170170
171+ fn request_to_known_dependencies ( & self , requirement : & Request ) -> KnownDependencies {
172+ let mut known_deps = KnownDependencies :: default ( ) ;
173+ match requirement {
174+ Request :: Pkg ( pkg_request) => {
175+ let kd = self . pkg_request_to_known_dependencies ( pkg_request) ;
176+ known_deps. requirements . extend ( kd. requirements ) ;
177+ known_deps. constrains . extend ( kd. constrains ) ;
178+ }
179+ Request :: Var ( var_request) => {
180+ match & var_request. value {
181+ spk_schema:: ident:: PinnableValue :: FromBuildEnv => todo ! ( ) ,
182+ spk_schema:: ident:: PinnableValue :: FromBuildEnvIfPresent => todo ! ( ) ,
183+ spk_schema:: ident:: PinnableValue :: Pinned ( value) => {
184+ let dep_name = match var_request. var . namespace ( ) {
185+ Some ( pkg_name) => {
186+ self . pool . intern_package_name ( PkgNameBufWithComponent {
187+ name : pkg_name. to_owned ( ) ,
188+ component : SyntheticComponent :: Base ,
189+ } )
190+ }
191+ None => {
192+ // Since we will be adding constraints for
193+ // global vars we need to add the pseudo-package
194+ // to the dependency list so it will influence
195+ // decisions.
196+ let pseudo_pkg_name = format ! (
197+ "{PSEUDO_PKG_NAME_PREFIX}{}" ,
198+ var_request. var. base_name( )
199+ ) ;
200+ if self
201+ . known_global_var_values
202+ . borrow_mut ( )
203+ . entry ( var_request. var . base_name ( ) . to_owned ( ) )
204+ . or_insert_with ( HashSet :: new)
205+ . insert ( VarValue :: ArcStr ( Arc :: clone ( value) ) )
206+ && self
207+ . queried_global_var_values
208+ . borrow ( )
209+ . contains ( var_request. var . base_name ( ) )
210+ {
211+ // Seeing a new value for a var that has
212+ // already locked in the list of candidates.
213+ self . cancel_solving . set ( true ) ;
214+ }
215+ let dep_name =
216+ self . pool . intern_package_name ( PkgNameBufWithComponent {
217+ name : pkg_name ! ( & pseudo_pkg_name) . to_owned ( ) ,
218+ component : SyntheticComponent :: Base ,
219+ } ) ;
220+ known_deps. requirements . push (
221+ self . pool
222+ . intern_version_set (
223+ dep_name,
224+ RequestVS :: GlobalVar {
225+ key : var_request. var . base_name ( ) . to_owned ( ) ,
226+ value : VarValue :: ArcStr ( Arc :: clone ( value) ) ,
227+ } ,
228+ )
229+ . into ( ) ,
230+ ) ;
231+ dep_name
232+ }
233+ } ;
234+ // If we end up adding pkg_name to the solve, it needs
235+ // to satisfy this var request.
236+ known_deps. constrains . push (
237+ self . pool
238+ . intern_version_set (
239+ dep_name,
240+ RequestVS :: SpkRequest ( requirement. clone ( ) ) ,
241+ )
242+ . into ( ) ,
243+ ) ;
244+ }
245+ }
246+ }
247+ }
248+ known_deps
249+ }
250+
171251 /// Return a new provider to restart the solve, preserving what was learned
172252 /// about global variables.
173253 pub fn reset ( & self ) -> Self {
@@ -779,12 +859,12 @@ impl DependencyProvider for SpkProvider {
779859 for embedded_component_requirement in embedded
780860 . components ( )
781861 . iter ( )
782- . filter ( |embedded_component| {
783- embedded_component. name == located_build_ident_with_component. component
784- } )
862+ . filter ( |embedded_component| embedded_component. name == * actual_component)
785863 . flat_map ( |embedded_component| embedded_component. requirements . iter ( ) )
786864 {
787- todo ! ( "{embedded_component_requirement:?}" ) ;
865+ let kd = self . request_to_known_dependencies ( embedded_component_requirement) ;
866+ known_deps. requirements . extend ( kd. requirements ) ;
867+ known_deps. constrains . extend ( kd. constrains ) ;
788868 }
789869 }
790870 // If this solvable is an embedded stub and it is
@@ -930,89 +1010,9 @@ impl DependencyProvider for SpkProvider {
9301010 ) ;
9311011 }
9321012 for requirement in package. runtime_requirements ( ) . iter ( ) {
933- match requirement {
934- Request :: Pkg ( pkg_request) => {
935- let kd = self . pkg_request_to_known_dependencies ( pkg_request) ;
936- known_deps. requirements . extend ( kd. requirements ) ;
937- known_deps. constrains . extend ( kd. constrains ) ;
938- }
939- Request :: Var ( var_request) => {
940- match & var_request. value {
941- spk_schema:: ident:: PinnableValue :: FromBuildEnv => todo ! ( ) ,
942- spk_schema:: ident:: PinnableValue :: FromBuildEnvIfPresent => todo ! ( ) ,
943- spk_schema:: ident:: PinnableValue :: Pinned ( value) => {
944- let dep_name = match var_request. var . namespace ( ) {
945- Some ( pkg_name) => {
946- self . pool . intern_package_name ( PkgNameBufWithComponent {
947- name : pkg_name. to_owned ( ) ,
948- component : SyntheticComponent :: Base ,
949- } )
950- }
951- None => {
952- // Since we will be adding
953- // constraints for global vars we
954- // need to add the pseudo-package
955- // to the dependency list so it
956- // will influence decisions.
957- let pseudo_pkg_name = format ! (
958- "{PSEUDO_PKG_NAME_PREFIX}{}" ,
959- var_request. var. base_name( )
960- ) ;
961- if self
962- . known_global_var_values
963- . borrow_mut ( )
964- . entry ( var_request. var . base_name ( ) . to_owned ( ) )
965- . or_insert_with ( HashSet :: new)
966- . insert ( VarValue :: ArcStr ( Arc :: clone ( value) ) )
967- && self
968- . queried_global_var_values
969- . borrow ( )
970- . contains ( var_request. var . base_name ( ) )
971- {
972- // Seeing a new value for a var
973- // that has already locked in
974- // the list of candidates.
975- self . cancel_solving . set ( true ) ;
976- }
977- let dep_name = self . pool . intern_package_name (
978- PkgNameBufWithComponent {
979- name : pkg_name ! ( & pseudo_pkg_name) . to_owned ( ) ,
980- component : SyntheticComponent :: Base ,
981- } ,
982- ) ;
983- known_deps. requirements . push (
984- self . pool
985- . intern_version_set (
986- dep_name,
987- RequestVS :: GlobalVar {
988- key : var_request
989- . var
990- . base_name ( )
991- . to_owned ( ) ,
992- value : VarValue :: ArcStr ( Arc :: clone (
993- value,
994- ) ) ,
995- } ,
996- )
997- . into ( ) ,
998- ) ;
999- dep_name
1000- }
1001- } ;
1002- // If we end up adding pkg_name to the solve,
1003- // it needs to satisfy this var request.
1004- known_deps. constrains . push (
1005- self . pool
1006- . intern_version_set (
1007- dep_name,
1008- RequestVS :: SpkRequest ( requirement. clone ( ) ) ,
1009- )
1010- . into ( ) ,
1011- ) ;
1012- }
1013- }
1014- }
1015- }
1013+ let kd = self . request_to_known_dependencies ( requirement) ;
1014+ known_deps. requirements . extend ( kd. requirements ) ;
1015+ known_deps. constrains . extend ( kd. constrains ) ;
10161016 }
10171017 Dependencies :: Known ( known_deps)
10181018 }
0 commit comments