Skip to content

Commit ef4fb75

Browse files
committed
Implement package registry resolution in Workspace
1 parent 52d35c1 commit ef4fb75

File tree

1 file changed

+71
-17
lines changed

1 file changed

+71
-17
lines changed

Sources/Workspace/Workspace.swift

Lines changed: 71 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import Foundation
1515
import PackageLoading
1616
import PackageModel
1717
import PackageGraph
18+
import PackageRegistry
1819
import SourceControl
1920

2021
/// Enumeration of the different reasons for which the resolver needs to be run.
@@ -194,9 +195,6 @@ public class Workspace {
194195
// var for backwards compatibility with deprecated initializers, remove with them
195196
fileprivate var identityResolver: IdentityResolver
196197

197-
/// The package container provider.
198-
fileprivate let containerProvider: RepositoryPackageContainerProvider
199-
200198
/// The http client used for downloading binary artifacts.
201199
fileprivate let httpClient: HTTPClient
202200

@@ -226,6 +224,8 @@ public class Workspace {
226224

227225
fileprivate var resolvedFileWatcher: ResolvedFileWatcher?
228226

227+
fileprivate var registryManager: RegistryManager?
228+
229229
/// Create a new package workspace.
230230
///
231231
/// 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 {
306306
let resolverPrefetchingEnabled = resolverPrefetchingEnabled ?? false
307307
let resolverTracingEnabled = resolverTracingEnabled ?? false
308308

309-
310309
// initialize
311310
self.fileSystem = fileSystem
312311
self.location = location
@@ -322,15 +321,6 @@ public class Workspace {
322321
self.identityResolver = identityResolver
323322
self.checksumAlgorithm = checksumAlgorithm
324323

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-
334324
self.pinsStore = LoadableResult {
335325
try PinsStore(
336326
pinsFile: location.resolvedVersionsFile,
@@ -1229,6 +1219,70 @@ fileprivate extension PinsStore {
12291219
}
12301220
}
12311221

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+
12321286
// MARK: - TSCUtility Functions
12331287

12341288
extension Workspace {
@@ -2015,7 +2069,7 @@ extension Workspace {
20152069
// We just request the packages here, repository manager will
20162070
// automatically manage the parallelism.
20172071
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 })
20192073
}
20202074

20212075
// Compute the pins that we need to actually clone.
@@ -2443,7 +2497,7 @@ extension Workspace {
24432497
// Get the latest revision from the container.
24442498
// TODO: replace with async/await when available
24452499
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)
24472501
}) as? RepositoryPackageContainer else {
24482502
throw InternalError("invalid container for \(packageRef) expected a RepositoryPackageContainer")
24492503
}
@@ -2514,7 +2568,7 @@ extension Workspace {
25142568
let delegate = !delegates.isEmpty ? MultiplexResolverDelegate(delegates) : nil
25152569

25162570
return PubgrubDependencyResolver(
2517-
provider: containerProvider,
2571+
provider: self,
25182572
pinsMap: pinsMap,
25192573
updateEnabled: self.resolverUpdateEnabled,
25202574
prefetchingEnabled: self.resolverPrefetchingEnabled,
@@ -2756,7 +2810,7 @@ extension Workspace {
27562810
// this?
27572811
// FIXME: this should not block
27582812
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)
27602814
}) as? RepositoryPackageContainer else {
27612815
throw InternalError("invalid container for \(package) expected a RepositoryPackageContainer")
27622816
}

0 commit comments

Comments
 (0)