@@ -795,6 +795,17 @@ pub fn resolve_dependencies(
795795
796796 log:: debug!( "Phase 2: Build closure" ) ;
797797
798+ let selected_kicad_assets: BTreeMap < String , Version > = selected
799+ . iter ( )
800+ . filter ( |( line, version) | {
801+ matches ! (
802+ match_kicad_managed_repo( & kicad_entries, & line. path, version) ,
803+ KicadRepoMatch :: SelectorMatched
804+ )
805+ } )
806+ . map ( |( line, version) | ( line. path . clone ( ) , version. clone ( ) ) )
807+ . collect ( ) ;
808+
798809 // Phase 2: Build the final dependency set using only selected versions
799810 // Path-patched forks are now workspace members, so their deps are included automatically
800811 let closure = build_closure ( & workspace_info. packages , & selected, & manifest_cache) ;
@@ -803,7 +814,7 @@ pub fn resolve_dependencies(
803814
804815 // Phase 2.5: Materialize asset dependencies (KiCad symbol/footprint/model repos).
805816 log:: debug!( "Phase 2.5: Materialize asset dependencies" ) ;
806- materialize_asset_deps ( workspace_info, offline) ?;
817+ materialize_asset_deps ( workspace_info, & selected_kicad_assets , offline) ?;
807818 log:: debug!( "Materialized asset dependencies" ) ;
808819
809820 // Phase 3: (Removed - sparse checkout and hashing now done in Phase 1)
@@ -865,7 +876,8 @@ pub fn resolve_dependencies(
865876
866877 log:: debug!( "dependency resolution complete" ) ;
867878
868- let package_resolutions = build_native_resolution_map ( workspace_info, & closure, & patches) ;
879+ let package_resolutions =
880+ build_native_resolution_map ( workspace_info, & closure, & selected_kicad_assets, & patches) ;
869881
870882 Ok ( ResolutionResult {
871883 workspace_info : workspace_info. clone ( ) ,
@@ -1088,6 +1100,7 @@ fn prune_dir(
10881100fn build_native_resolution_map (
10891101 workspace_info : & WorkspaceInfo ,
10901102 closure : & HashMap < ModuleLine , Version > ,
1103+ selected_kicad_assets : & BTreeMap < String , Version > ,
10911104 patches : & BTreeMap < String , PatchSpec > ,
10921105) -> HashMap < PathBuf , BTreeMap < String , PathBuf > > {
10931106 // Use workspace cache path (symlink) for stable workspace-relative paths in generated files
@@ -1131,6 +1144,15 @@ fn build_native_resolution_map(
11311144 . insert ( line. family . clone ( ) , abs_path) ;
11321145 }
11331146 }
1147+ for ( repo, version) in selected_kicad_assets {
1148+ let version_str = version. to_string ( ) ;
1149+ if let Some ( abs_path) = base_resolver. resolve_package ( repo, & version_str) {
1150+ families
1151+ . entry ( repo. clone ( ) )
1152+ . or_default ( )
1153+ . insert ( semver_family ( version) , abs_path) ;
1154+ }
1155+ }
11341156
11351157 let resolver = MvsFamilyResolver {
11361158 families,
@@ -1296,14 +1318,17 @@ fn pseudo_matches_rev(version: &Version, rev: &str) -> bool {
12961318}
12971319
12981320/// Materialize asset dependencies selected by dependency resolution.
1299- fn materialize_asset_deps ( workspace_info : & WorkspaceInfo , offline : bool ) -> Result < ( ) > {
1300- let targets = workspace_info. asset_dep_versions ( ) ;
1301- if targets. is_empty ( ) {
1321+ fn materialize_asset_deps (
1322+ workspace_info : & WorkspaceInfo ,
1323+ selected_kicad_assets : & BTreeMap < String , Version > ,
1324+ offline : bool ,
1325+ ) -> Result < ( ) > {
1326+ if selected_kicad_assets. is_empty ( ) {
13021327 return Ok ( ( ) ) ;
13031328 }
13041329
13051330 let workspace_cache = workspace_info. root . join ( ".pcb/cache" ) ;
1306- let missing: Vec < ( String , Version ) > = targets
1331+ let missing: Vec < ( String , Version ) > = selected_kicad_assets
13071332 . iter ( )
13081333 . filter ( |( repo, version) | {
13091334 !workspace_cache
@@ -2207,9 +2232,48 @@ mod tests {
22072232
22082233 let mut workspace = workspace_with_root_config ( config) ;
22092234 workspace. root = temp. path ( ) . to_path_buf ( ) ;
2210- let err = materialize_asset_deps ( & workspace, true )
2235+ let selected_kicad_assets = BTreeMap :: from ( [ (
2236+ "gitlab.com/kicad/libraries/kicad-symbols" . to_string ( ) ,
2237+ Version :: new ( 9 , 0 , 0 ) ,
2238+ ) ] ) ;
2239+ let err = materialize_asset_deps ( & workspace, & selected_kicad_assets, true )
22112240 . expect_err ( "expected offline mode to require cached asset deps" ) ;
22122241
22132242 assert ! ( err. to_string( ) . contains( "not cached" ) ) ;
22142243 }
2244+
2245+ #[ test]
2246+ fn test_build_native_resolution_map_uses_selected_kicad_asset_version ( ) {
2247+ let temp = TempDir :: new ( ) . unwrap ( ) ;
2248+ let root = temp. path ( ) . to_path_buf ( ) ;
2249+ let cache_root = root. join ( ".pcb/cache/gitlab.com/kicad/libraries/kicad-symbols/9.0.8" ) ;
2250+ std:: fs:: create_dir_all ( & cache_root) . unwrap ( ) ;
2251+
2252+ let mut config = PcbToml :: default ( ) ;
2253+ config. dependencies . insert (
2254+ "gitlab.com/kicad/libraries/kicad-symbols" . to_string ( ) ,
2255+ DependencySpec :: Version ( "9.0.3" . to_string ( ) ) ,
2256+ ) ;
2257+
2258+ let mut workspace = workspace_with_root_config ( config. clone ( ) ) ;
2259+ workspace. root = root. clone ( ) ;
2260+
2261+ let selected_kicad_assets = BTreeMap :: from ( [ (
2262+ "gitlab.com/kicad/libraries/kicad-symbols" . to_string ( ) ,
2263+ Version :: new ( 9 , 0 , 8 ) ,
2264+ ) ] ) ;
2265+ let resolutions = build_native_resolution_map (
2266+ & workspace,
2267+ & HashMap :: new ( ) ,
2268+ & selected_kicad_assets,
2269+ & BTreeMap :: new ( ) ,
2270+ ) ;
2271+ let deps = resolutions
2272+ . get ( & root)
2273+ . expect ( "expected workspace root dependency map" ) ;
2274+ let resolved = deps
2275+ . get ( "gitlab.com/kicad/libraries/kicad-symbols" )
2276+ . expect ( "expected symbols dependency to resolve" ) ;
2277+ assert_eq ! ( resolved, & cache_root) ;
2278+ }
22152279}
0 commit comments