Skip to content

Commit e3432e9

Browse files
authored
fix a bug in resolving registry dependencies with alternative manifest versions (#4198)
motivation: fix an existing issue with registry dependencies that can lead to resolution failure changes: * improve the placeholder manifest lookup of registry based dependencies that have alternative manifests * add test
1 parent ddf9400 commit e3432e9

File tree

2 files changed

+26
-2
lines changed

2 files changed

+26
-2
lines changed

Sources/Workspace/RegistryPackageContainer.swift

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,8 +173,20 @@ public class RegistryPackageContainer: PackageContainer {
173173
return completion(.failure(error))
174174
case .success(let manifestContent):
175175
do {
176+
// find the fake manifest so we can replace it with the real manifest content
177+
guard let placeholderManifestFileName = try fileSystem.getDirectoryContents(.root).first(where: { file in
178+
if file == Manifest.basename + "@swift-\(preferredToolsVersion).swift" {
179+
return true
180+
} else if preferredToolsVersion.patch == 0, file == Manifest.basename + "@swift-\(preferredToolsVersion.major).\(preferredToolsVersion.minor).swift" {
181+
return true
182+
} else {
183+
return false
184+
}
185+
}) else {
186+
throw StringError("failed locating placeholder manifest for \(preferredToolsVersion)")
187+
}
176188
// replace the fake manifest with the real manifest content
177-
let manifestPath = AbsolutePath.root.appending(component: Manifest.basename + "@swift-\(preferredToolsVersion).swift")
189+
let manifestPath = AbsolutePath.root.appending(component: placeholderManifestFileName)
178190
try fileSystem.removeFileTree(manifestPath)
179191
try fileSystem.writeFileContents(manifestPath, string: manifestContent)
180192
// finally, load the manifest

Tests/WorkspaceTests/RegistryPackageContainerTests.swift

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,8 @@ class RegistryPackageContainerTests: XCTestCase {
208208
let packageVersion = Version("1.0.0")
209209
let packagePath = AbsolutePath.root
210210

211+
let v5_3_3 = ToolsVersion(string: "5.3.3")!
212+
211213
func createProvider(_ toolsVersion: ToolsVersion) throws -> PackageContainerProvider {
212214
let registryClient = try makeRegistryClient(
213215
packageIdentity: packageIdentity,
@@ -222,6 +224,7 @@ class RegistryPackageContainerTests: XCTestCase {
222224
"Content-Version": "1",
223225
"Content-Type": "text/x-swift",
224226
"Link": """
227+
\(self.manifestLink(packageIdentity, v5_3_3)),
225228
\(self.manifestLink(packageIdentity, .v5_4)),
226229
\(self.manifestLink(packageIdentity, .v5_5))
227230
"""
@@ -279,6 +282,14 @@ class RegistryPackageContainerTests: XCTestCase {
279282
XCTAssertEqual(manifest.toolsVersion, .v5_3)
280283
}
281284

285+
do {
286+
let provider = try createProvider(v5_3_3) // the version of the alternate
287+
let ref = PackageReference.registry(identity: packageIdentity)
288+
let container = try provider.getContainer(for: ref, skipUpdate: false) as! RegistryPackageContainer
289+
let manifest = try container.loadManifest(version: packageVersion)
290+
XCTAssertEqual(manifest.toolsVersion, v5_3_3)
291+
}
292+
282293
do {
283294
let provider = try createProvider(.v5_4) // the version of the alternate
284295
let ref = PackageReference.registry(identity: packageIdentity)
@@ -453,7 +464,8 @@ class RegistryPackageContainerTests: XCTestCase {
453464
guard let (scope, name) = identity.scopeAndName else {
454465
preconditionFailure("invalid identity")
455466
}
456-
return "<http://localhost/\(scope)/\(name)/\(version)/\(Manifest.filename)?swift-version=\(version)>; rel=\"alternate\"; filename=\"Package@swift-\(version).swift\"; swift-tools-version=\"\(version)\""
467+
let versionString = version.patch == 0 ? "\(version.major).\(version.minor)" : version.description
468+
return "<http://localhost/\(scope)/\(name)/\(version)/\(Manifest.filename)?swift-version=\(version)>; rel=\"alternate\"; filename=\"\(Manifest.basename)@swift-\(versionString).swift\"; swift-tools-version=\"\(version)\""
457469
}
458470
}
459471

0 commit comments

Comments
 (0)