@@ -49,8 +49,8 @@ final class ContainerProvider {
4949 }
5050
5151 func removeCachedContainers( for packages: [ PackageReference ] ) {
52- for package in packages {
53- self . containersCache [ package ] = nil
52+ packages. forEach {
53+ self . containersCache [ $0 ] = nil
5454 }
5555 }
5656
@@ -65,13 +65,25 @@ final class ContainerProvider {
6565 /// Get the container for the given identifier, loading it if necessary.
6666 func getContainer(
6767 for package : PackageReference ,
68+ availableLibraries: [ LibraryMetadata ] ,
6869 completion: @escaping ( Result < PubGrubPackageContainer , Error > ) -> Void
6970 ) {
7071 // Return the cached container, if available.
7172 if let container = self . containersCache [ comparingLocation: package ] {
7273 return completion ( . success( container) )
7374 }
7475
76+ if let metadata = package . matchingPrebuiltLibrary ( in: availableLibraries) {
77+ do {
78+ let prebuiltPackageContainer = try PrebuiltPackageContainer ( metadata: metadata)
79+ let pubGrubContainer = PubGrubPackageContainer ( underlying: prebuiltPackageContainer, pins: self . pins)
80+ self . containersCache [ package ] = pubGrubContainer
81+ return completion ( . success( pubGrubContainer) )
82+ } catch {
83+ return completion ( . failure( error) )
84+ }
85+ }
86+
7587 if let prefetchSync = self . prefetches [ package ] {
7688 // If this container is already being prefetched, wait for that to complete
7789 prefetchSync. notify ( queue: . sharedConcurrent) {
@@ -81,18 +93,15 @@ final class ContainerProvider {
8193 } else {
8294 // if prefetch failed, remove from list of prefetches and try again
8395 self . prefetches [ package ] = nil
84- return self . getContainer ( for: package , completion: completion)
96+ return self . getContainer ( for: package , availableLibraries : availableLibraries , completion: completion)
8597 }
8698 }
8799 } else {
88100 // Otherwise, fetch the container from the provider
89101 self . underlying. getContainer (
90102 for: package ,
91103 updateStrategy: self . skipUpdate ? . never : . always, // TODO: make this more elaborate
92- observabilityScope: self . observabilityScope. makeChildScope (
93- description: " getting package container " ,
94- metadata: package . diagnosticsMetadata
95- ) ,
104+ observabilityScope: self . observabilityScope. makeChildScope ( description: " getting package container " , metadata: package . diagnosticsMetadata) ,
96105 on: . sharedConcurrent
97106 ) { result in
98107 let result = result. tryMap { container -> PubGrubPackageContainer in
@@ -109,7 +118,7 @@ final class ContainerProvider {
109118 /// Starts prefetching the given containers.
110119 func prefetch( containers identifiers: [ PackageReference ] , availableLibraries: [ LibraryMetadata ] ) {
111120 let filteredIdentifiers = identifiers. filter {
112- $0. matchingPrebuiltLibrary ( in: availableLibraries) == nil
121+ return $0. matchingPrebuiltLibrary ( in: availableLibraries) == nil
113122 }
114123 // Process each container.
115124 for identifier in filteredIdentifiers {
@@ -124,19 +133,13 @@ final class ContainerProvider {
124133 self . underlying. getContainer (
125134 for: identifier,
126135 updateStrategy: self . skipUpdate ? . never : . always, // TODO: make this more elaborate
127- observabilityScope: self . observabilityScope. makeChildScope (
128- description: " prefetching package container " ,
129- metadata: identifier. diagnosticsMetadata
130- ) ,
136+ observabilityScope: self . observabilityScope. makeChildScope ( description: " prefetching package container " , metadata: identifier. diagnosticsMetadata) ,
131137 on: . sharedConcurrent
132138 ) { result in
133139 defer { self . prefetches [ identifier] ? . leave ( ) }
134140 // only cache positive results
135141 if case . success( let container) = result {
136- self . containersCache [ identifier] = PubGrubPackageContainer (
137- underlying: container,
138- pins: self . pins
139- )
142+ self . containersCache [ identifier] = PubGrubPackageContainer ( underlying: container, pins: self . pins)
140143 }
141144 }
142145 }
0 commit comments