in Sources/SPMTestSupport/MockWorkspace.swift [110:211]
func create(package: MockPackage, basePath: AbsolutePath, isRoot: Bool) throws {
let packagePath: AbsolutePath
switch package.location {
case .fileSystem(let path):
packagePath = basePath.appending(path)
case .sourceControl(let url):
if let containerProvider = customPackageContainerProvider {
let observability = ObservabilitySystem.makeForTesting()
let packageRef = PackageReference(identity: PackageIdentity(url: url), kind: .remoteSourceControl(url))
let container = try temp_await { containerProvider.getContainer(for: packageRef, skipUpdate: true, observabilityScope: observability.topScope, on: .sharedConcurrent, completion: $0) }
guard let customContainer = container as? CustomPackageContainer else {
throw StringError("invalid custom container: \(container)")
}
packagePath = try customContainer.retrieve(at: try Version(versionString: package.versions.first!!), observabilityScope: observability.topScope)
} else {
packagePath = basePath.appending(components: "sourceControl", url.absoluteString.spm_mangledToC99ExtendedIdentifier())
}
case .registry(let identity):
packagePath = basePath.appending(components: "registry", identity.description.spm_mangledToC99ExtendedIdentifier())
}
let packageLocation: String
let packageKind: PackageReference.Kind
let packageVersions: [String?] = isRoot ? [nil] : package.versions
var sourceControlSpecifier: RepositorySpecifier? = nil
var registryIdentity: PackageIdentity? = nil
switch (isRoot, package.location) {
case (true, _):
packageLocation = packagePath.pathString
packageKind = .root(packagePath)
sourceControlSpecifier = RepositorySpecifier(path: packagePath)
case (_, .fileSystem(let path)):
packageLocation = self.packagesDir.appending(path).pathString
packageKind = .fileSystem(packagePath)
sourceControlSpecifier = RepositorySpecifier(path: self.packagesDir.appending(path))
case (_, .sourceControl(let url)):
packageLocation = url.absoluteString
packageKind = .remoteSourceControl(url)
sourceControlSpecifier = RepositorySpecifier(url: url)
case (_, .registry(let identity)):
packageLocation = identity.description
packageKind = .registry(identity)
registryIdentity = identity
}
let toolsVersion = package.toolsVersion ?? .currentToolsVersion
// Create targets on disk.
if let specifier = sourceControlSpecifier {
let repository = self.repositoryProvider.specifierMap[specifier] ?? .init(path: packagePath, fs: self.fileSystem)
try writePackageContent(fileSystem: repository, root: .root, toolsVersion: toolsVersion)
let versions = packageVersions.compactMap({ $0 })
if versions.isEmpty {
try repository.commit()
} else {
for version in versions {
try repository.commit(hash: package.revisionProvider.map { $0(version) })
try repository.tag(name: version)
}
}
self.repositoryProvider.add(specifier: specifier, repository: repository)
} else if let identity = registryIdentity {
let source = InMemoryRegistryPackageSource(fileSystem: self.fileSystem, path: packagePath, writeContent: false)
try writePackageContent(fileSystem: source.fileSystem, root: source.path, toolsVersion: toolsVersion)
self.registry.addPackage(identity: identity, versions: packageVersions.compactMap({ $0 }), source: source)
} else {
throw InternalError("unknown package type")
}
let manifestPath = packagePath.appending(component: Manifest.filename)
for version in packageVersions {
let v = version.flatMap(Version.init(_:))
manifests[.init(url: packageLocation, version: v)] = try Manifest(
displayName: package.name,
path: manifestPath,
packageKind: packageKind,
packageLocation: packageLocation,
platforms: package.platforms,
version: v,
toolsVersion: toolsVersion,
dependencies: package.dependencies.map { try $0.convert(baseURL: packagesDir, identityResolver: self.identityResolver) },
products: package.products.map { ProductDescription(name: $0.name, type: .library(.automatic), targets: $0.targets) },
targets: try package.targets.map { try $0.convert() }
)
}
func writePackageContent(fileSystem: FileSystem, root: AbsolutePath, toolsVersion: ToolsVersion) throws {
let sourcesDir = root.appending(component: "Sources")
for target in package.targets {
let targetDir = sourcesDir.appending(component: target.name)
try fileSystem.createDirectory(targetDir, recursive: true)
try fileSystem.writeFileContents(targetDir.appending(component: "file.swift"), bytes: "")
}
let manifestPath = root.appending(component: Manifest.filename)
try fileSystem.writeFileContents(manifestPath, bytes: "")
try rewriteToolsVersionSpecification(toDefaultManifestIn: root, specifying: toolsVersion, fileSystem: fileSystem)
}
}