Skip to content

Commit fbde755

Browse files
[6.1] Fix registry package swizzling when package name casing differs (#8234)
Description: Fixes a case sensitivity issue when swizzling package names during a package resolution from a package registry. Scope: Packages Risk: Low Testing: New test for this specific case Issue: #8194 Author: @fortmarek Reviewer: @plemarquand Co-authored-by: Marek Fořt <[email protected]>
1 parent d494ec2 commit fbde755

File tree

3 files changed

+68
-4
lines changed

3 files changed

+68
-4
lines changed

Sources/PackageModel/Manifest/PackageDependencyDescription.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ public enum PackageDependency: Equatable, Hashable, Sendable {
152152
return settings.nameForTargetDependencyResolutionOnly ?? PackageIdentityParser.computeDefaultName(fromURL: url)
153153
}
154154
case .registry:
155-
return self.identity.description
155+
return self.identity.description.lowercased()
156156
}
157157
}
158158

Sources/Workspace/Workspace+Registry.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ extension Workspace {
220220
info: "swizzling '\(dependency.locationString)' with registry dependency '\(registryIdentity)'."
221221
)
222222
targetDependencyPackageNameTransformations[dependency
223-
.nameForModuleDependencyResolutionOnly] = registryIdentity.description
223+
.nameForModuleDependencyResolutionOnly.lowercased()] = registryIdentity.description
224224
modifiedDependency = .registry(
225225
identity: registryIdentity,
226226
requirement: requirement,
@@ -266,7 +266,7 @@ extension Workspace {
266266
):
267267
if let packageName,
268268
// makes sure we use the updated package name for target based dependencies
269-
let modifiedPackageName = targetDependencyPackageNameTransformations[packageName]
269+
let modifiedPackageName = targetDependencyPackageNameTransformations[packageName.lowercased()]
270270
{
271271
modifiedDependency = .product(
272272
name: name,
@@ -276,7 +276,7 @@ extension Workspace {
276276
)
277277
}
278278
case .byName(name: let packageName, condition: let condition):
279-
if let modifiedPackageName = targetDependencyPackageNameTransformations[packageName] {
279+
if let modifiedPackageName = targetDependencyPackageNameTransformations[packageName.lowercased()] {
280280
modifiedDependency = .product(
281281
name: packageName,
282282
package: modifiedPackageName,

Tests/WorkspaceTests/WorkspaceTests.swift

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13079,6 +13079,70 @@ final class WorkspaceTests: XCTestCase {
1307913079
}
1308013080
}
1308113081
}
13082+
13083+
func testTransitiveResolutionFromRegistryWithDifferentPackageNameCasing() async throws {
13084+
let sandbox = AbsolutePath("/tmp/ws/")
13085+
let fs = InMemoryFileSystem()
13086+
13087+
let workspace = try await MockWorkspace(
13088+
sandbox: sandbox,
13089+
fileSystem: fs,
13090+
roots: [
13091+
MockPackage(
13092+
name: "Root",
13093+
path: "root",
13094+
targets: [
13095+
MockTarget(name: "RootTarget", dependencies: [
13096+
.product(name: "FooProduct", package: "Foo"),
13097+
]),
13098+
],
13099+
products: [],
13100+
dependencies: [
13101+
.sourceControl(url: "https://git/org/foo", requirement: .upToNextMajor(from: "1.0.0")),
13102+
],
13103+
toolsVersion: .v5_6
13104+
),
13105+
],
13106+
packages: [
13107+
MockPackage(
13108+
name: "FooPackage",
13109+
identity: "org.foo",
13110+
alternativeURLs: ["https://git/org/foo"],
13111+
targets: [
13112+
MockTarget(name: "FooTarget"),
13113+
],
13114+
products: [
13115+
MockProduct(name: "FooProduct", modules: ["FooTarget"]),
13116+
],
13117+
dependencies: [
13118+
.sourceControl(url: "https://git/org/bar", requirement: .upToNextMajor(from: "1.0.0")),
13119+
],
13120+
versions: ["1.0.0", "1.1.0", "1.2.0"]
13121+
),
13122+
]
13123+
)
13124+
13125+
workspace.sourceControlToRegistryDependencyTransformation = .swizzle
13126+
13127+
try await workspace.checkPackageGraph(roots: ["root"]) { graph, diagnostics in
13128+
XCTAssertNoDiagnostics(diagnostics)
13129+
PackageGraphTester(graph) { result in
13130+
result.check(roots: "Root")
13131+
result.check(packages: "org.foo", "Root")
13132+
result.check(modules: "FooTarget", "RootTarget")
13133+
result.checkTarget("RootTarget") { result in
13134+
result.check(dependencies: "FooProduct")
13135+
}
13136+
result.checkTarget("FooTarget") { result in
13137+
result.check(dependencies: [])
13138+
}
13139+
}
13140+
}
13141+
13142+
workspace.checkManagedDependencies { result in
13143+
result.check(dependency: "org.foo", at: .registryDownload("1.2.0"))
13144+
}
13145+
}
1308213146

1308313147
// duplicate package at root level
1308413148
func testResolutionMixedRegistryAndSourceControl2() async throws {

0 commit comments

Comments
 (0)