Skip to content

Commit ddf9400

Browse files
authored
refactor binary depedencies handling outside workspace class (#4197)
motivation: code handling binary dependencies has become complex and large, factor it out to its own class changes: * factor out the code that deals with downloading and extracting binary dependencies out of Workspace and into a dedicated struct * adjust workspace initializers to allow customizing the BinaryArtifactsManager instead of the HTTPClient and Archiver that are in service of handling binary dependencies (used for testing only) * adjjust call sites and test
1 parent 5a94f3c commit ddf9400

File tree

9 files changed

+682
-499
lines changed

9 files changed

+682
-499
lines changed

Sources/Commands/SwiftPackageTool.swift

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -860,8 +860,16 @@ extension SwiftPackageTool {
860860
var path: AbsolutePath
861861

862862
func run(_ swiftTool: SwiftTool) throws {
863-
let workspace = try swiftTool.getActiveWorkspace()
864-
let checksum = try workspace.checksum(forBinaryArtifactAt: path)
863+
let binaryArtifactsManager = try Workspace.BinaryArtifactsManager(
864+
fileSystem: swiftTool.fileSystem,
865+
authorizationProvider: swiftTool.getAuthorizationProvider(),
866+
hostToolchain: swiftTool.getHostToolchain(),
867+
checksumAlgorithm: SHA256(),
868+
customHTTPClient: .none,
869+
customArchiver: .none,
870+
delegate: .none
871+
)
872+
let checksum = try binaryArtifactsManager.checksum(forBinaryArtifactAt: path)
865873
print(checksum)
866874
}
867875
}

Sources/PackageLoading/ManifestLoader.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public protocol ManifestLoaderProtocol {
7878
}
7979

8080
public extension ManifestLoaderProtocol {
81-
var supportedArchiveExtensions: [String] { ["zip"] }
81+
static var supportedArchiveExtensions: [String] { ["zip"] }
8282
}
8383

8484
public protocol ManifestLoaderDelegate {
@@ -437,7 +437,7 @@ public final class ManifestLoader: ManifestLoaderProtocol {
437437
continue
438438
}
439439

440-
let validExtensions = self.supportedArchiveExtensions + BinaryTarget.Kind.allCases.filter{ $0 != .unknown }.map { $0.fileExtension }
440+
let validExtensions = Self.supportedArchiveExtensions + BinaryTarget.Kind.allCases.filter{ $0 != .unknown }.map { $0.fileExtension }
441441
guard let fileExtension = relativePath.extension, validExtensions.contains(fileExtension) else {
442442
observabilityScope.emit(.unsupportedBinaryLocationExtension(
443443
targetName: target.name,
@@ -470,10 +470,10 @@ public final class ManifestLoader: ManifestLoaderProtocol {
470470
continue
471471
}
472472

473-
guard self.supportedArchiveExtensions.contains(url.pathExtension) else {
473+
guard Self.supportedArchiveExtensions.contains(url.pathExtension) else {
474474
observabilityScope.emit(.unsupportedBinaryLocationExtension(
475475
targetName: target.name,
476-
validExtensions: self.supportedArchiveExtensions
476+
validExtensions: Self.supportedArchiveExtensions
477477
))
478478
continue
479479
}

Sources/SPMTestSupport/MockWorkspace.swift

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,9 @@ public final class MockWorkspace {
2828
let toolsVersion: ToolsVersion
2929
let fingerprints: MockPackageFingerprintStorage
3030
let mirrors: DependencyMirrors
31-
public var httpClient: HTTPClient
3231
public var registryClient: RegistryClient
3332
let registry: MockRegistry
34-
public var archiver: MockArchiver
33+
let customBinaryArtifactsManager: Workspace.CustomBinaryArtifactsManager
3534
public var checksumAlgorithm: MockHashAlgorithm
3635
public private(set) var manifestLoader: MockManifestLoader
3736
public let repositoryProvider: InMemoryGitRepositoryProvider
@@ -49,9 +48,8 @@ public final class MockWorkspace {
4948
toolsVersion: ToolsVersion = ToolsVersion.currentToolsVersion,
5049
fingerprints customFingerprints: MockPackageFingerprintStorage? = .none,
5150
mirrors customMirrors: DependencyMirrors? = nil,
52-
httpClient customHttpClient: HTTPClient? = .none,
5351
registryClient customRegistryClient: RegistryClient? = .none,
54-
binaryArchiver customBinaryArchiver: MockArchiver? = .none,
52+
binaryArtifactsManager customBinaryArtifactsManager: Workspace.CustomBinaryArtifactsManager? = .none,
5553
checksumAlgorithm customChecksumAlgorithm: MockHashAlgorithm? = .none,
5654
customPackageContainerProvider: MockPackageContainerProvider? = .none,
5755
skipDependenciesUpdates: Bool = false,
@@ -66,8 +64,8 @@ public final class MockWorkspace {
6664
self.identityResolver = DefaultIdentityResolver(locationMapper: self.mirrors.effectiveURL(for:))
6765
self.manifestLoader = MockManifestLoader(manifests: [:])
6866
self.customPackageContainerProvider = customPackageContainerProvider
69-
self.checksumAlgorithm = customChecksumAlgorithm ?? MockHashAlgorithm()
7067
self.repositoryProvider = InMemoryGitRepositoryProvider()
68+
self.checksumAlgorithm = customChecksumAlgorithm ?? MockHashAlgorithm()
7169
self.registry = MockRegistry(
7270
filesystem: self.fileSystem,
7371
identityResolver: self.identityResolver,
@@ -78,8 +76,10 @@ public final class MockWorkspace {
7876
self.toolsVersion = toolsVersion
7977
self.skipDependenciesUpdates = skipDependenciesUpdates
8078
self.sourceControlToRegistryDependencyTransformation = sourceControlToRegistryDependencyTransformation
81-
self.httpClient = customHttpClient ?? HTTPClient.mock(fileSystem: fileSystem)
82-
self.archiver = customBinaryArchiver ?? MockArchiver()
79+
self.customBinaryArtifactsManager = customBinaryArtifactsManager ?? .init(
80+
httpClient: HTTPClient.mock(fileSystem: fileSystem),
81+
archiver: MockArchiver()
82+
)
8383
try self.create()
8484
}
8585

@@ -268,9 +268,8 @@ public final class MockWorkspace {
268268
customPackageContainerProvider: self.customPackageContainerProvider,
269269
customRepositoryProvider: self.repositoryProvider,
270270
customRegistryClient: self.registryClient,
271+
customBinaryArtifactsManager: self.customBinaryArtifactsManager,
271272
customIdentityResolver: self.identityResolver,
272-
customHTTPClient: self.httpClient,
273-
customArchiver: self.archiver,
274273
customChecksumAlgorithm: self.checksumAlgorithm,
275274
delegate: self.delegate
276275
)

Sources/Workspace/CMakeLists.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@ add_library(Workspace
2222
ToolsVersionSpecificationRewriter.swift
2323
UserToolchain.swift
2424
Workspace.swift
25-
WorkspaceConfiguration.swift
26-
WorkspaceState.swift
25+
Workspace+BinaryArtifacts.swift
26+
Workspace+Configuration.swift
27+
Workspace+State.swift
2728
WindowsToolchainInfo.swift)
2829
target_link_libraries(Workspace PUBLIC
2930
TSCBasic

0 commit comments

Comments
 (0)