Skip to content

Commit c212d97

Browse files
committed
Merge remote-tracking branch 'origin/main' into release/6.1
2 parents d72912a + 0401a2a commit c212d97

File tree

4 files changed

+119
-7
lines changed

4 files changed

+119
-7
lines changed

Sources/Workspace/PackageContainer/RegistryPackageContainer.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,8 @@ public class RegistryPackageContainer: PackageContainer {
200200
return true
201201
} else if preferredToolsVersion.patch == 0, file == Manifest.basename + "@swift-\(preferredToolsVersion.major).\(preferredToolsVersion.minor).swift" {
202202
return true
203+
} else if preferredToolsVersion.patch == 0, preferredToolsVersion.minor == 0, file == Manifest.basename + "@swift-\(preferredToolsVersion.major).swift" {
204+
return true
203205
} else {
204206
return false
205207
}

Sources/Workspace/Workspace+Registry.swift

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -257,18 +257,35 @@ extension Workspace {
257257
var modifiedDependencies = [TargetDescription.Dependency]()
258258
for dependency in target.dependencies {
259259
var modifiedDependency = dependency
260-
if case .product(let name, let packageName, let moduleAliases, let condition) = dependency,
261-
let packageName
262-
{
263-
// makes sure we use the updated package name for target based dependencies
264-
if let modifiedPackageName = targetDependencyPackageNameTransformations[packageName] {
260+
switch dependency {
261+
case .product(
262+
name: let name,
263+
package: let packageName,
264+
moduleAliases: let moduleAliases,
265+
condition: let condition
266+
):
267+
if let packageName,
268+
// makes sure we use the updated package name for target based dependencies
269+
let modifiedPackageName = targetDependencyPackageNameTransformations[packageName]
270+
{
265271
modifiedDependency = .product(
266272
name: name,
267273
package: modifiedPackageName,
268274
moduleAliases: moduleAliases,
269275
condition: condition
270276
)
271277
}
278+
case .byName(name: let packageName, condition: let condition):
279+
if let modifiedPackageName = targetDependencyPackageNameTransformations[packageName] {
280+
modifiedDependency = .product(
281+
name: packageName,
282+
package: modifiedPackageName,
283+
moduleAliases: [:],
284+
condition: condition
285+
)
286+
}
287+
case .target:
288+
break
272289
}
273290
modifiedDependencies.append(modifiedDependency)
274291
}

Tests/WorkspaceTests/RegistryPackageContainerTests.swift

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ final class RegistryPackageContainerTests: XCTestCase {
226226
let v5_3_3 = ToolsVersion(string: "5.3.3")!
227227

228228
func createProvider(_ toolsVersion: ToolsVersion) throws -> PackageContainerProvider {
229-
let supportedVersions = Set<ToolsVersion>([ToolsVersion.v5_3, v5_3_3, .v5_4, .v5_5])
229+
let supportedVersions = Set<ToolsVersion>([ToolsVersion.v5, .v5_3, v5_3_3, .v5_4, .v5_5])
230230
let registryClient = try makeRegistryClient(
231231
packageIdentity: packageIdentity,
232232
packageVersion: packageVersion,
@@ -334,6 +334,14 @@ final class RegistryPackageContainerTests: XCTestCase {
334334
let manifest = try await container.loadManifest(version: packageVersion)
335335
XCTAssertEqual(manifest.toolsVersion, .v5_5)
336336
}
337+
338+
do {
339+
let provider = try createProvider(.v5) // the version of the alternate
340+
let ref = PackageReference.registry(identity: packageIdentity)
341+
let container = try await provider.getContainer(for: ref) as! RegistryPackageContainer
342+
let manifest = try await container.loadManifest(version: packageVersion)
343+
XCTAssertEqual(manifest.toolsVersion, .v5)
344+
}
337345
}
338346

339347
func makeRegistryClient(
@@ -492,7 +500,13 @@ final class RegistryPackageContainerTests: XCTestCase {
492500
guard let registryIdentity = identity.registry else {
493501
preconditionFailure("invalid registry identity: '\(identity)'")
494502
}
495-
let versionString = version.patch == 0 ? "\(version.major).\(version.minor)" : version.description
503+
let versionString = if version.patch == 0 && version.minor == 0 {
504+
"\(version.major)"
505+
} else if version.patch == 0 {
506+
"\(version.major).\(version.minor)"
507+
} else {
508+
version.description
509+
}
496510
return "<http://localhost/\(registryIdentity.scope)/\(registryIdentity.name)/\(version)/\(Manifest.filename)?swift-version=\(version)>; rel=\"alternate\"; filename=\"\(Manifest.basename)@swift-\(versionString).swift\"; swift-tools-version=\"\(version)\""
497511
}
498512
}

Tests/WorkspaceTests/WorkspaceTests.swift

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12869,6 +12869,85 @@ final class WorkspaceTests: XCTestCase {
1286912869
["did load manifest for registry package: org.baz (identity: org.baz)"]
1287012870
)
1287112871
}
12872+
12873+
func testTransitiveResolutionFromRegistryWithByNameDependencies() async throws {
12874+
let sandbox = AbsolutePath("/tmp/ws/")
12875+
let fs = InMemoryFileSystem()
12876+
12877+
let workspace = try await MockWorkspace(
12878+
sandbox: sandbox,
12879+
fileSystem: fs,
12880+
roots: [
12881+
MockPackage(
12882+
name: "Root",
12883+
path: "root",
12884+
targets: [
12885+
MockTarget(name: "RootTarget", dependencies: [
12886+
.product(name: "FooProduct", package: "foo"),
12887+
]),
12888+
],
12889+
products: [],
12890+
dependencies: [
12891+
.sourceControl(url: "https://git/org/foo", requirement: .upToNextMajor(from: "1.0.0")),
12892+
],
12893+
toolsVersion: .v5_6
12894+
),
12895+
],
12896+
packages: [
12897+
MockPackage(
12898+
name: "Bar",
12899+
identity: "org.bar",
12900+
alternativeURLs: ["https://git/org/Bar"],
12901+
targets: [
12902+
MockTarget(name: "BarTarget"),
12903+
],
12904+
products: [
12905+
MockProduct(name: "Bar", modules: ["BarTarget"]),
12906+
],
12907+
versions: ["1.0.0", "1.1.0"]
12908+
),
12909+
MockPackage(
12910+
name: "FooPackage",
12911+
identity: "org.foo",
12912+
alternativeURLs: ["https://git/org/foo"],
12913+
targets: [
12914+
MockTarget(name: "FooTarget", dependencies: [
12915+
"Bar",
12916+
]),
12917+
],
12918+
products: [
12919+
MockProduct(name: "FooProduct", modules: ["FooTarget"]),
12920+
],
12921+
dependencies: [
12922+
.sourceControl(url: "https://git/org/Bar", requirement: .upToNextMajor(from: "1.0.0")),
12923+
],
12924+
versions: ["1.0.0", "1.1.0", "1.2.0"]
12925+
),
12926+
]
12927+
)
12928+
12929+
workspace.sourceControlToRegistryDependencyTransformation = .swizzle
12930+
12931+
try await workspace.checkPackageGraph(roots: ["root"]) { graph, diagnostics in
12932+
XCTAssertNoDiagnostics(diagnostics)
12933+
PackageGraphTester(graph) { result in
12934+
result.check(roots: "Root")
12935+
result.check(packages: "org.bar", "org.foo", "Root")
12936+
result.check(modules: "FooTarget", "BarTarget", "RootTarget")
12937+
result.checkTarget("RootTarget") { result in
12938+
result.check(dependencies: "FooProduct")
12939+
}
12940+
result.checkTarget("FooTarget") { result in
12941+
result.check(dependencies: "Bar")
12942+
}
12943+
}
12944+
}
12945+
12946+
workspace.checkManagedDependencies { result in
12947+
result.check(dependency: "org.foo", at: .registryDownload("1.2.0"))
12948+
result.check(dependency: "org.bar", at: .registryDownload("1.1.0"))
12949+
}
12950+
}
1287212951

1287312952
// no dups
1287412953
func testResolutionMixedRegistryAndSourceControl1() async throws {

0 commit comments

Comments
 (0)