Skip to content

Commit 006b562

Browse files
committed
Initial implementation of RegistryPackageContainer
Add PackageRegistry module target Add PackageRegistryTests module target Add --enable-package-registry command-line option Adjust assertion for LocalPackageContainerProvider to accommodate root identifiers Fix package registry manager implementation to match specification
1 parent c145fb0 commit 006b562

16 files changed

+1058
-38
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
@@ -244,6 +244,10 @@ public struct SwiftToolOptions: ParsableArguments {
244244
@Flag(name: .customLong("trace-resolver"))
245245
var enableResolverTrace: Bool = false
246246

247+
@Flag(name: .customLong("enable-package-registry"),
248+
help: "Enable dependency resolution using package registries when available")
249+
var enablePackageRegistry: Bool = false
250+
247251
/// The number of jobs for llbuild to start (aka the number of schedulerLanes)
248252
@Option(name: .shortAndLong, help: "The number of jobs to spawn in parallel during the build process")
249253
var jobs: UInt32?

Sources/Commands/SwiftTool.swift

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ private final class DiagnosticsEngineHandler {
228228

229229
protocol SwiftCommand: ParsableCommand {
230230
var swiftOptions: SwiftToolOptions { get }
231-
231+
232232
func run(_ swiftTool: SwiftTool) throws
233233
}
234234

@@ -312,7 +312,7 @@ public class SwiftTool {
312312
do {
313313
try Self.postprocessArgParserResult(options: options, diagnostics: diagnostics)
314314
self.options = options
315-
315+
316316
// Honor package-path option is provided.
317317
if let packagePath = options.packagePath ?? options.chdir {
318318
try ProcessEnv.chdir(packagePath)
@@ -370,29 +370,29 @@ public class SwiftTool {
370370
self.buildPath = getEnvBuildPath(workingDir: cwd) ??
371371
customBuildPath ??
372372
(packageRoot ?? cwd).appending(component: ".build")
373-
373+
374374
// Setup the globals.
375375
verbosity = Verbosity(rawValue: options.verbosity)
376376
Process.verbose = verbosity != .concise
377377
}
378-
378+
379379
static func postprocessArgParserResult(options: SwiftToolOptions, diagnostics: DiagnosticsEngine) throws {
380380
if options.chdir != nil {
381381
diagnostics.emit(warning: "'--chdir/-C' option is deprecated; use '--package-path' instead")
382382
}
383-
383+
384384
if options.multirootPackageDataFile != nil {
385385
diagnostics.emit(.unsupportedFlag("--multiroot-data-file"))
386386
}
387-
387+
388388
if options.useExplicitModuleBuild && !options.useIntegratedSwiftDriver {
389389
diagnostics.emit(error: "'--experimental-explicit-module-build' option requires '--use-integrated-swift-driver'")
390390
}
391-
391+
392392
if !options.archs.isEmpty && options.customCompileTriple != nil {
393393
diagnostics.emit(.mutuallyExclusiveArgumentsError(arguments: ["--arch", "--triple"]))
394394
}
395-
395+
396396
if options.netrcFilePath != nil {
397397
// --netrc-file option only supported on macOS >=10.13
398398
#if os(macOS)
@@ -405,7 +405,7 @@ public class SwiftTool {
405405
diagnostics.emit(error: "'--netrc-file' option is only supported on macOS >=10.13")
406406
#endif
407407
}
408-
408+
409409
if options.enableTestDiscovery {
410410
diagnostics.emit(warning: "'--enable-test-discovery' option is deprecated; tests are automatically discovered on all platforms")
411411
}
@@ -444,12 +444,12 @@ public class SwiftTool {
444444
private lazy var _swiftpmConfig: Result<Workspace.Configuration, Swift.Error> = {
445445
return Result(catching: { try Workspace.Configuration(path: try configFilePath()) })
446446
}()
447-
447+
448448
func resolvedNetrcFilePath() throws -> AbsolutePath? {
449449
guard options.netrc ||
450450
options.netrcFilePath != nil ||
451451
options.netrcOptional else { return nil }
452-
452+
453453
let resolvedPath: AbsolutePath = options.netrcFilePath ?? AbsolutePath("\(NSHomeDirectory())/.netrc")
454454
guard localFileSystem.exists(resolvedPath) else {
455455
if !options.netrcOptional {
@@ -493,7 +493,8 @@ public class SwiftTool {
493493
isResolverPrefetchingEnabled: options.shouldEnableResolverPrefetching,
494494
skipUpdate: options.skipDependencyUpdate,
495495
enableResolverTrace: options.enableResolverTrace,
496-
cachePath: cachePath
496+
cachePath: cachePath,
497+
enablePackageRegistry: options.enablePackageRegistry
497498
)
498499
_workspace = workspace
499500
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: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
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+
/// Create a repository-based package provider.
36+
///
37+
/// - Parameters:
38+
/// - repositoryManager: The repository manager responsible for providing repositories.
39+
/// - manifestLoader: The manifest loader instance.
40+
/// - currentToolsVersion: The current tools version in use.
41+
/// - toolsVersionLoader: The tools version loader.
42+
public init(
43+
repositoryManager: RepositoryManager,
44+
mirrors: DependencyMirrors = DependencyMirrors(),
45+
manifestLoader: ManifestLoaderProtocol,
46+
currentToolsVersion: ToolsVersion = ToolsVersion.currentToolsVersion,
47+
toolsVersionLoader: ToolsVersionLoaderProtocol = ToolsVersionLoader(),
48+
fileSystem: FileSystem = localFileSystem
49+
) {
50+
self.repositoryManager = repositoryManager
51+
self.mirrors = mirrors
52+
self.manifestLoader = manifestLoader
53+
self.currentToolsVersion = currentToolsVersion
54+
self.toolsVersionLoader = toolsVersionLoader
55+
self.fileSystem = fileSystem
56+
}
57+
58+
public func getContainer(
59+
for reference: PackageReference,
60+
skipUpdate: Bool,
61+
on queue: DispatchQueue,
62+
completion: @escaping (Result<PackageContainer, Swift.Error>) -> Void
63+
) {
64+
let result: Result<PackageContainer, Swift.Error>
65+
66+
// For remote package references, attempt to load from registry before falling back to respository access.
67+
if reference.kind == .remote {
68+
do {
69+
let provider = RegistryPackageContainerProvider(mirrors: mirrors, manifestLoader: manifestLoader, currentToolsVersion: currentToolsVersion, toolsVersionLoader: toolsVersionLoader)
70+
let container = try tsc_await { provider.getContainer(for: reference, skipUpdate: skipUpdate, on: queue, completion: $0) }
71+
result = .success(container)
72+
} catch {
73+
let provider = RepositoryPackageContainerProvider(repositoryManager: self.repositoryManager, mirrors: self.mirrors, manifestLoader: self.manifestLoader, currentToolsVersion: self.currentToolsVersion, toolsVersionLoader: self.toolsVersionLoader)
74+
result = tsc_await { provider.getContainer(for: reference, skipUpdate: skipUpdate, on: queue, completion: $0) }
75+
}
76+
} else {
77+
let provider = LocalPackageContainerProvider(mirrors: self.mirrors, manifestLoader: self.manifestLoader, currentToolsVersion: self.currentToolsVersion, toolsVersionLoader: self.toolsVersionLoader, fileSystem: self.fileSystem)
78+
result = tsc_await { provider.getContainer(for: reference, skipUpdate: skipUpdate, on: queue, completion: $0) }
79+
}
80+
81+
queue.async {
82+
completion(result)
83+
}
84+
}
85+
}

Sources/PackageGraph/LocalPackageContainer.swift

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66

77
See http://swift.org/LICENSE.txt for license information
88
See http://swift.org/CONTRIBUTORS.txt for Swift project authors
9-
*/
9+
*/
1010

1111
import Dispatch
1212

13-
import TSCBasic
1413
import PackageLoading
1514
import PackageModel
1615
import SourceControl
16+
import TSCBasic
1717
import TSCUtility
1818

1919
/// Local package container.
@@ -111,3 +111,53 @@ extension LocalPackageContainer: CustomStringConvertible {
111111
return "LocalPackageContainer(\(identifier.path))"
112112
}
113113
}
114+
115+
public class LocalPackageContainerProvider: PackageContainerProvider {
116+
let manifestLoader: ManifestLoaderProtocol
117+
let mirrors: DependencyMirrors
118+
119+
/// The tools version currently in use. Only the container versions less than and equal to this will be provided by
120+
/// the container.
121+
let currentToolsVersion: ToolsVersion
122+
123+
/// The tools version loader.
124+
let toolsVersionLoader: ToolsVersionLoaderProtocol
125+
126+
let fileSystem: FileSystem
127+
128+
public init(
129+
mirrors: DependencyMirrors = DependencyMirrors(),
130+
manifestLoader: ManifestLoaderProtocol,
131+
currentToolsVersion: ToolsVersion = ToolsVersion.currentToolsVersion,
132+
toolsVersionLoader: ToolsVersionLoaderProtocol = ToolsVersionLoader(),
133+
fileSystem: FileSystem = localFileSystem
134+
) {
135+
self.mirrors = mirrors
136+
self.manifestLoader = manifestLoader
137+
self.currentToolsVersion = currentToolsVersion
138+
self.toolsVersionLoader = toolsVersionLoader
139+
self.fileSystem = fileSystem
140+
}
141+
142+
public func getContainer(
143+
for identifier: PackageReference,
144+
skipUpdate: Bool,
145+
on queue: DispatchQueue,
146+
completion: @escaping (Result<PackageContainer, Swift.Error>) -> Void)
147+
{
148+
assert(identifier.kind != .remote)
149+
150+
let container = LocalPackageContainer(
151+
identifier,
152+
mirrors: self.mirrors,
153+
manifestLoader: self.manifestLoader,
154+
toolsVersionLoader: self.toolsVersionLoader,
155+
currentToolsVersion: self.currentToolsVersion,
156+
fs: self.fileSystem
157+
)
158+
159+
queue.async {
160+
completion(.success(container))
161+
}
162+
}
163+
}

Sources/PackageGraph/PackageContainer.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import Dispatch
1212
import PackageLoading
1313
import PackageModel
1414
import SourceControl
15+
import Dispatch
1516
import struct TSCUtility.Version
1617

1718
/// A container of packages.

0 commit comments

Comments
 (0)