@@ -15,6 +15,7 @@ import Foundation
15
15
import PackageLoading
16
16
import PackageModel
17
17
import PackageGraph
18
+ import PackageRegistry
18
19
import SourceControl
19
20
20
21
/// Enumeration of the different reasons for which the resolver needs to be run.
@@ -194,9 +195,6 @@ public class Workspace {
194
195
// var for backwards compatibility with deprecated initializers, remove with them
195
196
fileprivate var identityResolver : IdentityResolver
196
197
197
- /// The package container provider.
198
- fileprivate let containerProvider : RepositoryPackageContainerProvider
199
-
200
198
/// The http client used for downloading binary artifacts.
201
199
fileprivate let httpClient : HTTPClient
202
200
@@ -226,6 +224,8 @@ public class Workspace {
226
224
227
225
fileprivate var resolvedFileWatcher : ResolvedFileWatcher ?
228
226
227
+ fileprivate var registryManager : RegistryManager ?
228
+
229
229
/// Create a new package workspace.
230
230
///
231
231
/// This initializer is designed for use cases when the workspace needs to be highly customized such as testing.
@@ -306,7 +306,6 @@ public class Workspace {
306
306
let resolverPrefetchingEnabled = resolverPrefetchingEnabled ?? false
307
307
let resolverTracingEnabled = resolverTracingEnabled ?? false
308
308
309
-
310
309
// initialize
311
310
self . fileSystem = fileSystem
312
311
self . location = location
@@ -322,15 +321,6 @@ public class Workspace {
322
321
self . identityResolver = identityResolver
323
322
self . checksumAlgorithm = checksumAlgorithm
324
323
325
- self . containerProvider = RepositoryPackageContainerProvider (
326
- fileSystem: fileSystem,
327
- repositoryManager: repositoryManager,
328
- identityResolver: self . identityResolver,
329
- manifestLoader: manifestLoader,
330
- currentToolsVersion: currentToolsVersion,
331
- toolsVersionLoader: toolsVersionLoader
332
- )
333
-
334
324
self . pinsStore = LoadableResult {
335
325
try PinsStore (
336
326
pinsFile: location. resolvedVersionsFile,
@@ -1229,6 +1219,70 @@ fileprivate extension PinsStore {
1229
1219
}
1230
1220
}
1231
1221
1222
+ // MARK: - PackageContainerProvider
1223
+
1224
+ extension Workspace : PackageContainerProvider {
1225
+ public func getContainer(
1226
+ for package : PackageReference ,
1227
+ skipUpdate: Bool ,
1228
+ on queue: DispatchQueue ,
1229
+ completion: @escaping ( Result < PackageContainer , Swift . Error > ) -> Void
1230
+ ) {
1231
+ // If the container is local, just create and return a local package container.
1232
+ if package . kind != . remote {
1233
+ return queue. async {
1234
+ let container = LocalPackageContainer (
1235
+ package : package ,
1236
+ identityResolver: self . identityResolver,
1237
+ manifestLoader: self . manifestLoader,
1238
+ toolsVersionLoader: self . toolsVersionLoader,
1239
+ currentToolsVersion: self . currentToolsVersion,
1240
+ fileSystem: self . fileSystem)
1241
+ completion ( . success( container) )
1242
+ }
1243
+ }
1244
+
1245
+ // If it's a dependency from a package registry
1246
+ if let registryManager = registryManager,
1247
+ let _ = package . identity. scopeAndName
1248
+ {
1249
+ let container = RegistryPackageContainer (
1250
+ package : package ,
1251
+ identityResolver: identityResolver,
1252
+ manager: registryManager,
1253
+ manifestLoader: manifestLoader,
1254
+ toolsVersionLoader: toolsVersionLoader,
1255
+ currentToolsVersion: currentToolsVersion
1256
+ )
1257
+ queue. async {
1258
+ completion ( . success( container) )
1259
+ }
1260
+ } else {
1261
+ // Resolve the container using the repository manager.
1262
+ repositoryManager. lookup ( repository: package . repository, skipUpdate: skipUpdate, on: queue) { result in
1263
+ queue. async {
1264
+ // Create the container wrapper.
1265
+ let result = result. tryMap { handle -> PackageContainer in
1266
+ // Open the repository.
1267
+ //
1268
+ // FIXME: Do we care about holding this open for the lifetime of the container.
1269
+ let repository = try handle. open ( )
1270
+ return RepositoryPackageContainer (
1271
+ package : package ,
1272
+ identityResolver: self . identityResolver,
1273
+ repository: repository,
1274
+ manifestLoader: self . manifestLoader,
1275
+ toolsVersionLoader: self . toolsVersionLoader,
1276
+ currentToolsVersion: self . currentToolsVersion
1277
+ )
1278
+ }
1279
+ completion ( result)
1280
+ }
1281
+ }
1282
+ }
1283
+ }
1284
+ }
1285
+
1232
1286
// MARK: - TSCUtility Functions
1233
1287
1234
1288
extension Workspace {
@@ -2015,7 +2069,7 @@ extension Workspace {
2015
2069
// We just request the packages here, repository manager will
2016
2070
// automatically manage the parallelism.
2017
2071
for pin in pinsStore. pins {
2018
- containerProvider . getContainer ( for: pin. packageRef, skipUpdate: true , on: . sharedConcurrent, completion: { _ in } )
2072
+ getContainer ( for: pin. packageRef, skipUpdate: true , on: . sharedConcurrent, completion: { _ in } )
2019
2073
}
2020
2074
2021
2075
// Compute the pins that we need to actually clone.
@@ -2443,7 +2497,7 @@ extension Workspace {
2443
2497
// Get the latest revision from the container.
2444
2498
// TODO: replace with async/await when available
2445
2499
guard let container = ( try temp_await {
2446
- containerProvider . getContainer ( for: packageRef, skipUpdate: true , on: . sharedConcurrent, completion: $0)
2500
+ getContainer ( for: packageRef, skipUpdate: true , on: . sharedConcurrent, completion: $0)
2447
2501
} ) as? RepositoryPackageContainer else {
2448
2502
throw InternalError ( " invalid container for \( packageRef) expected a RepositoryPackageContainer " )
2449
2503
}
@@ -2514,7 +2568,7 @@ extension Workspace {
2514
2568
let delegate = !delegates. isEmpty ? MultiplexResolverDelegate ( delegates) : nil
2515
2569
2516
2570
return PubgrubDependencyResolver (
2517
- provider: containerProvider ,
2571
+ provider: self ,
2518
2572
pinsMap: pinsMap,
2519
2573
updateEnabled: self . resolverUpdateEnabled,
2520
2574
prefetchingEnabled: self . resolverPrefetchingEnabled,
@@ -2756,7 +2810,7 @@ extension Workspace {
2756
2810
// this?
2757
2811
// FIXME: this should not block
2758
2812
guard let container = ( try temp_await {
2759
- containerProvider . getContainer ( for: package , skipUpdate: true , on: . sharedConcurrent, completion: $0)
2813
+ getContainer ( for: package , skipUpdate: true , on: . sharedConcurrent, completion: $0)
2760
2814
} ) as? RepositoryPackageContainer else {
2761
2815
throw InternalError ( " invalid container for \( package ) expected a RepositoryPackageContainer " )
2762
2816
}
0 commit comments