@@ -402,7 +402,11 @@ private func createResolvedPackages(
402
402
}
403
403
}
404
404
405
- let dupProductsChecker = DuplicateProductsChecker ( packageBuilders: packageBuilders)
405
+ let dupProductsChecker = DuplicateProductsChecker (
406
+ packageBuilders: packageBuilders,
407
+ moduleAliasingUsed: moduleAliasingUsed,
408
+ observabilityScope: observabilityScope
409
+ )
406
410
try dupProductsChecker. run ( lookupByProductIDs: moduleAliasingUsed, observabilityScope: observabilityScope)
407
411
408
412
// The set of all target names.
@@ -430,7 +434,8 @@ private func createResolvedPackages(
430
434
return false
431
435
} )
432
436
433
- let lookupByProductIDs = packageBuilder. package . manifest. disambiguateByProductIDs || moduleAliasingUsed
437
+ let packageDoesNotSupportProductAliases = packageBuilder. package . doesNotSupportProductAliases
438
+ let lookupByProductIDs = !packageDoesNotSupportProductAliases && ( packageBuilder. package . manifest. disambiguateByProductIDs || moduleAliasingUsed)
434
439
435
440
// Get all the products from dependencies of this package.
436
441
let productDependencies = packageBuilder. dependencies
@@ -457,9 +462,11 @@ private func createResolvedPackages(
457
462
productDependencies. map { ( $0. product. name, $0) } ,
458
463
uniquingKeysWith: { lhs, _ in
459
464
let duplicates = productDependencies. filter { $0. product. name == lhs. product. name }
460
- throw PackageGraphError . duplicateProduct (
461
- product: lhs. product. name,
462
- packages: duplicates. map ( \. packageBuilder. package )
465
+ throw emitDuplicateProductDiagnostic (
466
+ productName: lhs. product. name,
467
+ packages: duplicates. map ( \. packageBuilder. package ) ,
468
+ moduleAliasingUsed: moduleAliasingUsed,
469
+ observabilityScope: observabilityScope
463
470
)
464
471
}
465
472
)
@@ -600,6 +607,31 @@ private func createResolvedPackages(
600
607
return try packageBuilders. map { try $0. construct ( ) }
601
608
}
602
609
610
+ private func emitDuplicateProductDiagnostic(
611
+ productName: String ,
612
+ packages: [ Package ] ,
613
+ moduleAliasingUsed: Bool ,
614
+ observabilityScope: ObservabilityScope
615
+ ) -> PackageGraphError {
616
+ if moduleAliasingUsed {
617
+ packages. filter { $0. doesNotSupportProductAliases } . forEach {
618
+ // Emit an additional warning about product aliasing in case of older tools-versions.
619
+ observabilityScope. emit ( warning: " product aliasing requires tools-version 5.2 or later, so it is not supported by ' \( $0. identity. description) ' " )
620
+ }
621
+ }
622
+ return PackageGraphError . duplicateProduct (
623
+ product: productName,
624
+ packages: packages
625
+ )
626
+ }
627
+
628
+ fileprivate extension Package {
629
+ var doesNotSupportProductAliases : Bool {
630
+ // We can never use the identity based lookup for older packages because they lack the necessary information.
631
+ return self . manifest. toolsVersion < . v5_2
632
+ }
633
+ }
634
+
603
635
fileprivate struct Pair : Hashable {
604
636
let package1 : Package
605
637
let package2 : Package
@@ -625,11 +657,16 @@ private class DuplicateProductsChecker {
625
657
var packageIDToBuilder = [ PackageIdentity: ResolvedPackageBuilder] ( )
626
658
var checkedPkgIDs = [ PackageIdentity] ( )
627
659
628
- init ( packageBuilders: [ ResolvedPackageBuilder ] ) {
660
+ let moduleAliasingUsed : Bool
661
+ let observabilityScope : ObservabilityScope
662
+
663
+ init ( packageBuilders: [ ResolvedPackageBuilder ] , moduleAliasingUsed: Bool , observabilityScope: ObservabilityScope ) {
629
664
for packageBuilder in packageBuilders {
630
665
let pkgID = packageBuilder. package . identity
631
666
self . packageIDToBuilder [ pkgID] = packageBuilder
632
667
}
668
+ self . moduleAliasingUsed = moduleAliasingUsed
669
+ self . observabilityScope = observabilityScope
633
670
}
634
671
635
672
func run( lookupByProductIDs: Bool = false , observabilityScope: ObservabilityScope ) throws {
@@ -657,9 +694,11 @@ private class DuplicateProductsChecker {
657
694
}
658
695
for (depIDOrName, depPkgs) in productToPkgMap. filter ( { Set ( $0. value) . count > 1 } ) {
659
696
let name = depIDOrName. components ( separatedBy: " _ " ) . dropFirst ( ) . joined ( separator: " _ " )
660
- throw PackageGraphError . duplicateProduct (
661
- product: name. isEmpty ? depIDOrName : name,
662
- packages: depPkgs. compactMap { packageIDToBuilder [ $0] ? . package }
697
+ throw emitDuplicateProductDiagnostic (
698
+ productName: name. isEmpty ? depIDOrName : name,
699
+ packages: depPkgs. compactMap { packageIDToBuilder [ $0] ? . package } ,
700
+ moduleAliasingUsed: self . moduleAliasingUsed,
701
+ observabilityScope: self . observabilityScope
663
702
)
664
703
}
665
704
}
@@ -683,9 +722,11 @@ private class DuplicateProductsChecker {
683
722
684
723
let duplicates = productToPkgMap. filter { $0. value. count > 1 }
685
724
for (productName, pkgs) in duplicates {
686
- throw PackageGraphError . duplicateProduct (
687
- product: productName,
688
- packages: pkgs. compactMap { packageIDToBuilder [ $0] ? . package }
725
+ throw emitDuplicateProductDiagnostic (
726
+ productName: productName,
727
+ packages: pkgs. compactMap { packageIDToBuilder [ $0] ? . package } ,
728
+ moduleAliasingUsed: self . moduleAliasingUsed,
729
+ observabilityScope: self . observabilityScope
689
730
)
690
731
}
691
732
}
0 commit comments