Skip to content

Commit 4af54b0

Browse files
committed
Initial implementation of RegistryPackageContainer
Add PackageRegistry module target Add PackageRegistryTests module target Add --enable-package-registry command-line option
1 parent c656ab9 commit 4af54b0

14 files changed

+1005
-11
lines changed

Package.swift

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ let package = Package(
4343
"PackageModel",
4444
"PackageLoading",
4545
"PackageGraph",
46+
"PackageRegistry",
4647
"Build",
4748
"Xcodeproj",
4849
"Workspace"
@@ -58,6 +59,7 @@ let package = Package(
5859
"PackageModel",
5960
"PackageLoading",
6061
"PackageGraph",
62+
"PackageRegistry",
6163
"Build",
6264
"Xcodeproj",
6365
"Workspace"
@@ -111,10 +113,16 @@ let package = Package(
111113
name: "LLBuildManifest",
112114
dependencies: ["SwiftToolsSupport-auto", "Basics"]),
113115

116+
.target(
117+
/** Package registry support */
118+
name: "PackageRegistry",
119+
dependencies: ["SwiftToolsSupport-auto", "Basics", "PackageLoading", "PackageModel"]),
120+
114121
.target(
115122
/** Source control operations */
116123
name: "SourceControl",
117124
dependencies: ["SwiftToolsSupport-auto", "Basics"]),
125+
118126
.target(
119127
/** Shim for llbuild library */
120128
name: "SPMLLBuild",
@@ -136,7 +144,7 @@ let package = Package(
136144
.target(
137145
/** Data structures and support for complete package graphs */
138146
name: "PackageGraph",
139-
dependencies: ["SwiftToolsSupport-auto", "Basics", "PackageLoading", "PackageModel", "SourceControl"]),
147+
dependencies: ["SwiftToolsSupport-auto", "Basics", "PackageLoading", "PackageModel", "PackageRegistry", "SourceControl"]),
140148

141149
// MARK: Package Collections
142150

@@ -248,6 +256,9 @@ let package = Package(
248256
.testTarget(
249257
name: "PackageCollectionsTests",
250258
dependencies: ["SPMTestSupport", "PackageCollections"]),
259+
.testTarget(
260+
name: "PackageRegistryTests",
261+
dependencies: ["SPMTestSupport", "PackageRegistry"]),
251262
.testTarget(
252263
name: "SourceControlTests",
253264
dependencies: ["SourceControl", "SPMTestSupport"]),

Sources/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ add_subdirectory(PackageDescription)
1515
add_subdirectory(PackageGraph)
1616
add_subdirectory(PackageLoading)
1717
add_subdirectory(PackageModel)
18+
add_subdirectory(PackageRegistry)
1819
add_subdirectory(SPMBuildCore)
1920
add_subdirectory(SPMLLBuild)
2021
add_subdirectory(SourceControl)

Sources/Commands/Options.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,10 @@ public struct SwiftToolOptions: ParsableArguments {
238238
@Flag(name: .customLong("trace-resolver"))
239239
var enableResolverTrace: Bool = false
240240

241+
@Flag(name: .customLong("enable-package-registry"),
242+
help: "Resolve dependencies using a package registry")
243+
var enablePackageRegistry: Bool = false
244+
241245
/// The number of jobs for llbuild to start (aka the number of schedulerLanes)
242246
@Option(name: .shortAndLong, help: "The number of jobs to spawn in parallel during the build process")
243247
var jobs: UInt32?

Sources/Commands/SwiftTool.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -468,7 +468,8 @@ public class SwiftTool {
468468
netrcFilePath: try resolvedNetrcFilePath(),
469469
isResolverPrefetchingEnabled: options.shouldEnableResolverPrefetching,
470470
skipUpdate: options.skipDependencyUpdate,
471-
enableResolverTrace: options.enableResolverTrace
471+
enableResolverTrace: options.enableResolverTrace,
472+
enablePackageRegistry: options.enablePackageRegistry
472473
)
473474
_workspace = workspace
474475
return workspace

Sources/PackageGraph/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
add_library(PackageGraph
1010
BoundVersion.swift
1111
CheckoutState.swift
12+
CompositePackageContainerProvider.swift
1213
DependencyMirrors.swift
1314
DependencyResolutionNode.swift
1415
DependencyResolver.swift
@@ -27,6 +28,7 @@ add_library(PackageGraph
2728
Pubgrub/PartialSolution.swift
2829
Pubgrub/PubgrubDependencyResolver.swift
2930
Pubgrub/Term.swift
31+
RegistryPackageContainer.swift
3032
RepositoryPackageContainer.swift
3133
ResolvedPackage.swift
3234
ResolvedProduct.swift
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
/*
2+
This source file is part of the Swift.org open source project
3+
4+
Copyright (c) 2014 - 2020 Apple Inc. and the Swift project authors
5+
Licensed under Apache License v2.0 with Runtime Library Exception
6+
7+
See http://swift.org/LICENSE.txt for license information
8+
See http://swift.org/CONTRIBUTORS.txt for Swift project authors
9+
*/
10+
11+
import Dispatch
12+
13+
import PackageLoading
14+
import PackageModel
15+
import PackageRegistry
16+
import SourceControl
17+
18+
import TSCBasic
19+
import TSCUtility
20+
21+
public class CompositePackageContainerProvider: PackageContainerProvider {
22+
let manifestLoader: ManifestLoaderProtocol
23+
let repositoryManager: RepositoryManager
24+
let mirrors: DependencyMirrors
25+
26+
/// The tools version currently in use. Only the container versions less than and equal to this will be provided by
27+
/// the container.
28+
let currentToolsVersion: ToolsVersion
29+
30+
/// The tools version loader.
31+
let toolsVersionLoader: ToolsVersionLoaderProtocol
32+
33+
let fileSystem: FileSystem
34+
35+
/// Queue for callbacks.
36+
private let callbacksQueue = DispatchQueue(label: "org.swift.swiftpm.container-provider")
37+
38+
/// Create a repository-based package provider.
39+
///
40+
/// - Parameters:
41+
/// - repositoryManager: The repository manager responsible for providing repositories.
42+
/// - manifestLoader: The manifest loader instance.
43+
/// - currentToolsVersion: The current tools version in use.
44+
/// - toolsVersionLoader: The tools version loader.
45+
public init(
46+
repositoryManager: RepositoryManager,
47+
mirrors: DependencyMirrors = DependencyMirrors(),
48+
manifestLoader: ManifestLoaderProtocol,
49+
currentToolsVersion: ToolsVersion = ToolsVersion.currentToolsVersion,
50+
toolsVersionLoader: ToolsVersionLoaderProtocol = ToolsVersionLoader(),
51+
fileSystem: FileSystem = localFileSystem
52+
) {
53+
self.repositoryManager = repositoryManager
54+
self.mirrors = mirrors
55+
self.manifestLoader = manifestLoader
56+
self.currentToolsVersion = currentToolsVersion
57+
self.toolsVersionLoader = toolsVersionLoader
58+
self.fileSystem = fileSystem
59+
}
60+
61+
public func getContainer(
62+
for reference: PackageReference,
63+
skipUpdate: Bool,
64+
completion: @escaping (Result<PackageContainer, Swift.Error>) -> Void
65+
) {
66+
// For remote package references, attempt to load from registry before falling back to respository access.
67+
if reference.kind == .remote {
68+
RegistryManager.discover(for: reference) { result in
69+
switch result {
70+
case .success(let registryManager):
71+
let provider = RegistryPackageContainerProvider(registryManager: registryManager, mirrors: self.mirrors, manifestLoader: self.manifestLoader, currentToolsVersion: self.currentToolsVersion, toolsVersionLoader: self.toolsVersionLoader)
72+
provider.getContainer(for: reference, skipUpdate: skipUpdate) { result in
73+
self.callbacksQueue.async {
74+
completion(result)
75+
}
76+
}
77+
default:
78+
let provider = RepositoryPackageContainerProvider(repositoryManager: self.repositoryManager, mirrors: self.mirrors, manifestLoader: self.manifestLoader, currentToolsVersion: self.currentToolsVersion, toolsVersionLoader: self.toolsVersionLoader)
79+
provider.getContainer(for: reference, skipUpdate: skipUpdate) { result in
80+
self.callbacksQueue.async {
81+
completion(result)
82+
}
83+
}
84+
}
85+
}
86+
} else {
87+
let provider = LocalPackageContainerProvider(mirrors: self.mirrors, manifestLoader: self.manifestLoader, currentToolsVersion: self.currentToolsVersion, toolsVersionLoader: self.toolsVersionLoader, fileSystem: self.fileSystem)
88+
provider.getContainer(for: reference, skipUpdate: skipUpdate) { result in
89+
self.callbacksQueue.async {
90+
completion(result)
91+
}
92+
}
93+
}
94+
}
95+
}

Sources/PackageGraph/LocalPackageContainer.swift

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,54 @@ extension LocalPackageContainer: CustomStringConvertible {
8585
return "LocalPackageContainer(\(identifier.path))"
8686
}
8787
}
88+
89+
public class LocalPackageContainerProvider: PackageContainerProvider {
90+
let manifestLoader: ManifestLoaderProtocol
91+
let mirrors: DependencyMirrors
92+
93+
/// The tools version currently in use. Only the container versions less than and equal to this will be provided by
94+
/// the container.
95+
let currentToolsVersion: ToolsVersion
96+
97+
/// The tools version loader.
98+
let toolsVersionLoader: ToolsVersionLoaderProtocol
99+
100+
let fileSystem: FileSystem
101+
102+
/// Queue for callbacks.
103+
private let callbacksQueue = DispatchQueue(label: "org.swift.swiftpm.container-provider")
104+
105+
public init(
106+
mirrors: DependencyMirrors = DependencyMirrors(),
107+
manifestLoader: ManifestLoaderProtocol,
108+
currentToolsVersion: ToolsVersion = ToolsVersion.currentToolsVersion,
109+
toolsVersionLoader: ToolsVersionLoaderProtocol = ToolsVersionLoader(),
110+
fileSystem: FileSystem = localFileSystem
111+
) {
112+
self.mirrors = mirrors
113+
self.manifestLoader = manifestLoader
114+
self.currentToolsVersion = currentToolsVersion
115+
self.toolsVersionLoader = toolsVersionLoader
116+
self.fileSystem = fileSystem
117+
}
118+
119+
public func getContainer(
120+
for identifier: PackageReference,
121+
skipUpdate: Bool,
122+
completion: @escaping (Result<PackageContainer, Swift.Error>) -> Void
123+
) {
124+
assert(identifier.kind == .local)
125+
callbacksQueue.async {
126+
let container = LocalPackageContainer(
127+
identifier,
128+
mirrors: self.mirrors,
129+
manifestLoader: self.manifestLoader,
130+
toolsVersionLoader: self.toolsVersionLoader,
131+
currentToolsVersion: self.currentToolsVersion,
132+
fs: self.fileSystem
133+
)
134+
135+
completion(.success(container))
136+
}
137+
}
138+
}

0 commit comments

Comments
 (0)