Skip to content

Commit 5ca7853

Browse files
committed
refactor workspace initializer
motivation: workspace initializer is very robust, accomodating the needs of both libSwiftPM consumer and testing. we want to seperate these concerns a bit so that libSwiftPM exposes the minimum API surface area changes: * deprecate existing workspace inisitlazer * create new minimalistic public initializer oriented towards libSwiftPM consumers * create internal initializer with all custmization options oriented towards testing * better abstract resolver configuraiton and other behavior settings into a struct * update callsite and tests to the new API
1 parent e0b1bd2 commit 5ca7853

File tree

4 files changed

+347
-194
lines changed

4 files changed

+347
-194
lines changed

Sources/Commands/SwiftTool.swift

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -662,7 +662,7 @@ public class SwiftTool {
662662
}
663663

664664
let delegate = ToolWorkspaceDelegate(self.outputStream, logLevel: self.logLevel, observabilityScope: self.observabilityScope)
665-
let provider = GitRepositoryProvider(processSet: processSet)
665+
let provider = GitRepositoryProvider(processSet: self.processSet)
666666
let sharedSecurityDirectory = try self.getSharedSecurityDirectory()
667667
let sharedCacheDirectory = try self.getSharedCacheDirectory()
668668
let sharedConfigurationDirectory = try self.getSharedConfigurationDirectory()
@@ -677,16 +677,18 @@ public class SwiftTool {
677677
sharedCacheDirectory: sharedCacheDirectory,
678678
sharedConfigurationDirectory: sharedConfigurationDirectory
679679
),
680-
mirrors: self.getMirrorsConfig(sharedConfigurationDirectory: sharedConfigurationDirectory).mirrors,
681680
registries: try self.getRegistriesConfig(sharedConfigurationDirectory: sharedConfigurationDirectory).configuration,
682681
authorizationProvider: self.getAuthorizationProvider(),
683-
customManifestLoader: self.getManifestLoader(), // FIXME: doe we really need to customize it?
684-
customRepositoryProvider: provider, // FIXME: doe we really need to customize it?
685-
additionalFileRules: isXcodeBuildSystemEnabled ? FileRuleDescription.xcbuildFileTypes : FileRuleDescription.swiftpmFileTypes,
686-
resolverUpdateEnabled: !options.skipDependencyUpdate,
687-
resolverPrefetchingEnabled: options.shouldEnableResolverPrefetching,
688-
resolverFingerprintCheckingMode: self.options.resolverFingerprintCheckingMode,
689-
sharedRepositoriesCacheEnabled: self.options.useRepositoriesCache,
682+
mirrors: self.getMirrorsConfig(sharedConfigurationDirectory: sharedConfigurationDirectory).mirrors,
683+
resolutionConfiguration: ResolutionConfiguration(
684+
updateEnabled: !options.skipDependencyUpdate,
685+
prefetchingEnabled: options.shouldEnableResolverPrefetching,
686+
additionalFileRules: isXcodeBuildSystemEnabled ? FileRuleDescription.xcbuildFileTypes : FileRuleDescription.swiftpmFileTypes,
687+
sharedRepositoriesCacheEnabled: self.options.useRepositoriesCache,
688+
fingerprintCheckingMode: self.options.resolverFingerprintCheckingMode
689+
),
690+
customManifestLoader: self.getManifestLoader(), // FIXME: ideally we would not customize the manifest loader
691+
customRepositoryProvider: provider, // FIXME: ideally we would not customize the repository provider. its currently done for shutdown handling which can be better abstracted
690692
delegate: delegate
691693
)
692694
_workspace = workspace

Sources/SPMTestSupport/MockWorkspace.swift

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ public final class MockWorkspace {
2727
public var registryClient: RegistryClient
2828
public let archiver: MockArchiver
2929
public let checksumAlgorithm: MockHashAlgorithm
30-
public let fingerprintStorage: MockPackageFingerprintStorage
3130
let roots: [MockPackage]
3231
let packages: [MockPackage]
3332
public let mirrors: DependencyMirrors
33+
public let fingerprints: MockPackageFingerprintStorage
3434
let identityResolver: IdentityResolver
3535
public var manifestLoader: MockManifestLoader
3636
public var repositoryProvider: InMemoryGitRepositoryProvider
@@ -42,15 +42,15 @@ public final class MockWorkspace {
4242
public init(
4343
sandbox: AbsolutePath,
4444
fileSystem: InMemoryFileSystem,
45-
mirrors: DependencyMirrors? = nil,
4645
roots: [MockPackage],
4746
packages: [MockPackage],
4847
toolsVersion: ToolsVersion = ToolsVersion.currentToolsVersion,
49-
customHttpClient: HTTPClient? = .none,
50-
customRegistryClient: RegistryClient? = .none,
51-
customBinaryArchiver: MockArchiver? = .none,
52-
customChecksumAlgorithm: MockHashAlgorithm? = .none,
53-
customFingerprintStorage: MockPackageFingerprintStorage? = .none,
48+
mirrors customMirrors: DependencyMirrors? = nil,
49+
fingerprints customFingerprints: MockPackageFingerprintStorage? = .none,
50+
httpClient customHttpClient: HTTPClient? = .none,
51+
registryClient customRegistryClient: RegistryClient? = .none,
52+
binaryArchiver customBinaryArchiver: MockArchiver? = .none,
53+
checksumAlgorithm customChecksumAlgorithm: MockHashAlgorithm? = .none,
5454
resolverUpdateEnabled: Bool = true
5555
) throws {
5656
let archiver = customBinaryArchiver ?? MockArchiver()
@@ -61,8 +61,8 @@ public final class MockWorkspace {
6161
self.httpClient = httpClient
6262
self.archiver = archiver
6363
self.checksumAlgorithm = customChecksumAlgorithm ?? MockHashAlgorithm()
64-
self.fingerprintStorage = customFingerprintStorage ?? MockPackageFingerprintStorage()
65-
self.mirrors = mirrors ?? DependencyMirrors()
64+
self.fingerprints = customFingerprints ?? MockPackageFingerprintStorage()
65+
self.mirrors = customMirrors ?? DependencyMirrors()
6666
self.identityResolver = DefaultIdentityResolver(locationMapper: self.mirrors.effectiveURL(for:))
6767
self.roots = roots
6868
self.packages = packages
@@ -73,7 +73,7 @@ public final class MockWorkspace {
7373
identityResolver: self.identityResolver,
7474
checksumAlgorithm: self.checksumAlgorithm,
7575
filesystem: self.fileSystem,
76-
fingerprintStorage: self.fingerprintStorage
76+
fingerprintStorage: self.fingerprints
7777
)
7878
self.registryClient = customRegistryClient ?? self.registry.registryClient
7979
self.toolsVersion = toolsVersion
@@ -220,7 +220,7 @@ public final class MockWorkspace {
220220
return workspace
221221
}
222222

223-
let workspace = try Workspace(
223+
let workspace = try Workspace._init(
224224
fileSystem: self.fileSystem,
225225
location: .init(
226226
workingDirectory: self.sandbox.appending(component: ".build"),
@@ -230,7 +230,15 @@ public final class MockWorkspace {
230230
sharedCacheDirectory: self.fileSystem.swiftPMCacheDirectory,
231231
sharedConfigurationDirectory: self.fileSystem.swiftPMConfigDirectory
232232
),
233+
fingerprints: self.fingerprints,
233234
mirrors: self.mirrors,
235+
resolutionConfiguration: ResolutionConfiguration(
236+
updateEnabled: self.resolverUpdateEnabled,
237+
prefetchingEnabled: true,
238+
additionalFileRules: ResolutionConfiguration.default.additionalFileRules,
239+
sharedRepositoriesCacheEnabled: ResolutionConfiguration.default.sharedRepositoriesCacheEnabled,
240+
fingerprintCheckingMode: .strict
241+
),
234242
customToolsVersion: self.toolsVersion,
235243
customManifestLoader: self.manifestLoader,
236244
customRepositoryProvider: self.repositoryProvider,
@@ -239,10 +247,6 @@ public final class MockWorkspace {
239247
customHTTPClient: self.httpClient,
240248
customArchiver: self.archiver,
241249
customChecksumAlgorithm: self.checksumAlgorithm,
242-
customFingerprintStorage: self.fingerprintStorage,
243-
resolverUpdateEnabled: self.resolverUpdateEnabled,
244-
resolverPrefetchingEnabled: true,
245-
resolverFingerprintCheckingMode: .strict,
246250
delegate: self.delegate
247251
)
248252

0 commit comments

Comments
 (0)