@@ -1454,6 +1454,12 @@ pub async fn resolve_dev_dependencies(
14541454 variants : & std:: collections:: BTreeMap < String , Vec < VariantValue > > ,
14551455 variant_files : & [ PathBuf ] ,
14561456) -> Result < Vec < Dependency > , Box < PlatformUnsat > > {
1457+ // Collect all dev source package names to filter out interdependencies
1458+ let dev_source_names: HashSet < PackageName > = dev_dependencies
1459+ . iter ( )
1460+ . map ( |( name, _) | name. clone ( ) )
1461+ . collect ( ) ;
1462+
14571463 let futures = dev_dependencies
14581464 . into_iter ( )
14591465 . map ( |( package_name, source_spec) | {
@@ -1463,6 +1469,7 @@ pub async fn resolve_dev_dependencies(
14631469 let build_environment = build_environment. clone ( ) ;
14641470 let variants = variants. clone ( ) ;
14651471 let variant_files = variant_files. to_vec ( ) ;
1472+ let dev_source_names = dev_source_names. clone ( ) ;
14661473
14671474 resolve_single_dev_dependency (
14681475 package_name,
@@ -1473,6 +1480,7 @@ pub async fn resolve_dev_dependencies(
14731480 build_environment,
14741481 variants,
14751482 variant_files,
1483+ dev_source_names,
14761484 )
14771485 } )
14781486 . collect :: < futures:: stream:: FuturesUnordered < _ > > ( ) ;
@@ -1498,6 +1506,7 @@ async fn resolve_single_dev_dependency(
14981506 build_environment : BuildEnvironment ,
14991507 variants : std:: collections:: BTreeMap < String , Vec < VariantValue > > ,
15001508 variant_files : Vec < PathBuf > ,
1509+ dev_source_names : HashSet < PackageName > ,
15011510) -> Result < Vec < Dependency > , PlatformUnsat > {
15021511 let pinned_source = command_dispatcher
15031512 . pin_and_checkout ( source_spec. location )
@@ -1527,20 +1536,25 @@ async fn resolve_single_dev_dependency(
15271536
15281537 let mut dependencies = Vec :: new ( ) ;
15291538
1530- // Process source dependencies
1531- for ( dev_name, dep) in dev_source. into_specs ( ) {
1532- let string = dep. to_string ( ) ;
1539+ // Process source dependencies, filtering out dependencies that are also dev sources
1540+ for ( dep_name, dep) in dev_source
1541+ . into_specs ( )
1542+ . filter ( |( name, _) | !dev_source_names. contains ( name) )
1543+ {
15331544 let anchored_source = dep. resolve ( & SourceAnchor :: Workspace ) ;
15341545
15351546 dependencies. push ( Dependency :: CondaSource (
1536- dev_name . clone ( ) ,
1547+ dep_name . clone ( ) ,
15371548 anchored_source,
1538- Cow :: Owned ( format ! ( "{} @ {}" , dev_name . as_source( ) , string ) ) ,
1549+ Cow :: Owned ( package_name . as_source ( ) . to_string ( ) ) ,
15391550 ) ) ;
15401551 }
15411552
1542- // Process binary dependencies
1543- for ( dev_name, binary_spec) in dev_bin. into_specs ( ) {
1553+ // Process binary dependencies, filtering out dependencies that are also dev sources
1554+ for ( dep_name, binary_spec) in dev_bin
1555+ . into_specs ( )
1556+ . filter ( |( name, _) | !dev_source_names. contains ( name) )
1557+ {
15441558 // Convert BinarySpec to NamelessMatchSpec
15451559 let nameless_spec = binary_spec
15461560 . try_into_nameless_match_spec ( & channel_config)
@@ -1557,16 +1571,16 @@ async fn resolve_single_dev_dependency(
15571571 SpecConversionError :: MissingName => ParseMatchSpecError :: MissingPackageName ,
15581572 } ;
15591573 PlatformUnsat :: FailedToParseMatchSpec (
1560- dev_name . as_source ( ) . to_string ( ) ,
1574+ dep_name . as_source ( ) . to_string ( ) ,
15611575 parse_channel_err,
15621576 )
15631577 } ) ?;
15641578
1565- let spec = MatchSpec :: from_nameless ( nameless_spec, Some ( dev_name . clone ( ) . into ( ) ) ) ;
1579+ let spec = MatchSpec :: from_nameless ( nameless_spec, Some ( dep_name . clone ( ) . into ( ) ) ) ;
15661580
15671581 dependencies. push ( Dependency :: Conda (
15681582 spec,
1569- Cow :: Owned ( dev_name . as_source ( ) . to_string ( ) ) ,
1583+ Cow :: Owned ( package_name . as_source ( ) . to_string ( ) ) ,
15701584 ) ) ;
15711585 }
15721586
0 commit comments