Skip to content

Commit aed0139

Browse files
committed
Implement package registry resolution in Workspace
1 parent 26a0942 commit aed0139

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,
@@ -1218,6 +1208,70 @@ fileprivate extension PinsStore {
12181208
}
12191209
}
12201210

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+
12211275
// MARK: - TSCUtility Functions
12221276

12231277
extension Workspace {
@@ -2004,7 +2058,7 @@ extension Workspace {
20042058
// We just request the packages here, repository manager will
20052059
// automatically manage the parallelism.
20062060
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 })
20082062
}
20092063

20102064
// Compute the pins that we need to actually clone.
@@ -2431,7 +2485,7 @@ extension Workspace {
24312485
// Get the latest revision from the container.
24322486
// TODO: replace with async/await when available
24332487
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)
24352489
}) as? RepositoryPackageContainer else {
24362490
throw InternalError("invalid container for \(packageRef) expected a RepositoryPackageContainer")
24372491
}
@@ -2502,7 +2556,7 @@ extension Workspace {
25022556
let delegate = !delegates.isEmpty ? MultiplexResolverDelegate(delegates) : nil
25032557

25042558
return PubgrubDependencyResolver(
2505-
provider: containerProvider,
2559+
provider: self,
25062560
pinsMap: pinsMap,
25072561
updateEnabled: self.resolverUpdateEnabled,
25082562
prefetchingEnabled: self.resolverPrefetchingEnabled,
@@ -2744,7 +2798,7 @@ extension Workspace {
27442798
// this?
27452799
// FIXME: this should not block
27462800
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)
27482802
}) as? RepositoryPackageContainer else {
27492803
throw InternalError("invalid container for \(package) expected a RepositoryPackageContainer")
27502804
}

0 commit comments

Comments
 (0)