@@ -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,
@@ -1218,6 +1208,70 @@ fileprivate extension PinsStore {
1218
1208
}
1219
1209
}
1220
1210
1211
+ // MARK: - PackageContainerProvider
1212
+
1213
+ extension Workspace : PackageContainerProvider {
1214
+ public func getContainer(
1215
+ for package : PackageReference ,
1216
+ skipUpdate: Bool ,
1217
+ on queue: DispatchQueue ,
1218
+ completion: @escaping ( Result < PackageContainer , Swift . Error > ) -> Void
1219
+ ) {
1220
+ // If the container is local, just create and return a local package container.
1221
+ if package . kind != . remote {
1222
+ return queue. async {
1223
+ let container = LocalPackageContainer (
1224
+ package : package ,
1225
+ identityResolver: self . identityResolver,
1226
+ manifestLoader: self . manifestLoader,
1227
+ toolsVersionLoader: self . toolsVersionLoader,
1228
+ currentToolsVersion: self . currentToolsVersion,
1229
+ fileSystem: self . fileSystem)
1230
+ completion ( . success( container) )
1231
+ }
1232
+ }
1233
+
1234
+ // If it's a dependency from a package registry
1235
+ if let registryManager = registryManager,
1236
+ let _ = package . identity. scopeAndName
1237
+ {
1238
+ let container = RegistryPackageContainer (
1239
+ package : package ,
1240
+ identityResolver: identityResolver,
1241
+ manager: registryManager,
1242
+ manifestLoader: manifestLoader,
1243
+ toolsVersionLoader: toolsVersionLoader,
1244
+ currentToolsVersion: currentToolsVersion
1245
+ )
1246
+ queue. async {
1247
+ completion ( . success( container) )
1248
+ }
1249
+ } else {
1250
+ // Resolve the container using the repository manager.
1251
+ repositoryManager. lookup ( repository: package . repository, skipUpdate: skipUpdate, on: queue) { result in
1252
+ queue. async {
1253
+ // Create the container wrapper.
1254
+ let result = result. tryMap { handle -> PackageContainer in
1255
+ // Open the repository.
1256
+ //
1257
+ // FIXME: Do we care about holding this open for the lifetime of the container.
1258
+ let repository = try handle. open ( )
1259
+ return RepositoryPackageContainer (
1260
+ package : package ,
1261
+ identityResolver: self . identityResolver,
1262
+ repository: repository,
1263
+ manifestLoader: self . manifestLoader,
1264
+ toolsVersionLoader: self . toolsVersionLoader,
1265
+ currentToolsVersion: self . currentToolsVersion
1266
+ )
1267
+ }
1268
+ completion ( result)
1269
+ }
1270
+ }
1271
+ }
1272
+ }
1273
+ }
1274
+
1221
1275
// MARK: - TSCUtility Functions
1222
1276
1223
1277
extension Workspace {
@@ -2004,7 +2058,7 @@ extension Workspace {
2004
2058
// We just request the packages here, repository manager will
2005
2059
// automatically manage the parallelism.
2006
2060
for pin in pinsStore. pins {
2007
- containerProvider . getContainer ( for: pin. packageRef, skipUpdate: true , on: . sharedConcurrent, completion: { _ in } )
2061
+ getContainer ( for: pin. packageRef, skipUpdate: true , on: . sharedConcurrent, completion: { _ in } )
2008
2062
}
2009
2063
2010
2064
// Compute the pins that we need to actually clone.
@@ -2431,7 +2485,7 @@ extension Workspace {
2431
2485
// Get the latest revision from the container.
2432
2486
// TODO: replace with async/await when available
2433
2487
guard let container = ( try temp_await {
2434
- containerProvider . getContainer ( for: packageRef, skipUpdate: true , on: . sharedConcurrent, completion: $0)
2488
+ getContainer ( for: packageRef, skipUpdate: true , on: . sharedConcurrent, completion: $0)
2435
2489
} ) as? RepositoryPackageContainer else {
2436
2490
throw InternalError ( " invalid container for \( packageRef) expected a RepositoryPackageContainer " )
2437
2491
}
@@ -2502,7 +2556,7 @@ extension Workspace {
2502
2556
let delegate = !delegates. isEmpty ? MultiplexResolverDelegate ( delegates) : nil
2503
2557
2504
2558
return PubgrubDependencyResolver (
2505
- provider: containerProvider ,
2559
+ provider: self ,
2506
2560
pinsMap: pinsMap,
2507
2561
updateEnabled: self . resolverUpdateEnabled,
2508
2562
prefetchingEnabled: self . resolverPrefetchingEnabled,
@@ -2744,7 +2798,7 @@ extension Workspace {
2744
2798
// this?
2745
2799
// FIXME: this should not block
2746
2800
guard let container = ( try temp_await {
2747
- containerProvider . getContainer ( for: package , skipUpdate: true , on: . sharedConcurrent, completion: $0)
2801
+ getContainer ( for: package , skipUpdate: true , on: . sharedConcurrent, completion: $0)
2748
2802
} ) as? RepositoryPackageContainer else {
2749
2803
throw InternalError ( " invalid container for \( package ) expected a RepositoryPackageContainer " )
2750
2804
}
0 commit comments