Skip to content

Commit d45075e

Browse files
authored
Fix use of absolute paths to Swift SDK metatadata (#212)
The generator incorrectly recorded absolute paths to Swift SDK metadata in bundle archive metadata, which is fragile and also can't be handled by SwiftPM.
1 parent fc7da52 commit d45075e

File tree

2 files changed

+44
-9
lines changed

2 files changed

+44
-9
lines changed

Sources/SwiftSDKGenerator/Generator/SwiftSDKGenerator+Metadata.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,12 +113,16 @@ extension SwiftSDKGenerator {
113113
ArtifactsArchiveMetadata(
114114
schemaVersion: "1.0",
115115
artifacts: artifacts.mapValues {
116-
.init(
116+
var relativePath = $0
117+
let prefixRemoved = relativePath.removePrefix(pathsConfiguration.artifactBundlePath)
118+
assert(prefixRemoved)
119+
120+
return .init(
117121
type: .swiftSDK,
118122
version: self.bundleVersion,
119123
variants: [
120124
.init(
121-
path: $0.string,
125+
path: relativePath.string,
122126
supportedTriples: hostTriples.map { $0.map(\.triple) }
123127
)
124128
]

Tests/SwiftSDKGeneratorTests/Generator/SwiftSDKGenerator+MetadataTests.swift

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@ import XCTest
1616

1717
@testable import SwiftSDKGenerator
1818

19+
#if canImport(FoundationEssentials)
20+
import FoundationEssentials
21+
#else
22+
import Foundation
23+
#endif
24+
1925
final class SwiftSDKGeneratorMetadataTests: XCTestCase {
2026
let logger = Logger(label: "SwiftSDKGeneratorMetadataTests")
2127

@@ -54,19 +60,44 @@ final class SwiftSDKGeneratorMetadataTests: XCTestCase {
5460

5561
// Make sure the file exists
5662
let sdkSettingsFile = sdkDirPath.appending("SDKSettings.json")
57-
let fileExists = await sdk.doesFileExist(at: sdkSettingsFile)
63+
var fileExists = await sdk.doesFileExist(at: sdkSettingsFile)
5864
XCTAssertTrue(fileExists)
5965

6066
// Read back file, make sure it contains the expected data
61-
let data = String(data: try await sdk.readFile(at: sdkSettingsFile), encoding: .utf8)
62-
XCTAssertNotNil(data)
63-
XCTAssertTrue(data!.contains(testCase.bundleVersion))
64-
XCTAssertTrue(data!.contains("(\(testCase.targetTriple.archName))"))
65-
XCTAssertTrue(data!.contains(linuxDistribution.description))
66-
XCTAssertTrue(data!.contains(testCase.expectedCanonicalName))
67+
let maybeString = String(data: try await sdk.readFile(at: sdkSettingsFile), encoding: .utf8)
68+
let string = try XCTUnwrap(maybeString)
69+
XCTAssertTrue(string.contains(testCase.bundleVersion))
70+
XCTAssertTrue(string.contains("(\(testCase.targetTriple.archName))"))
71+
XCTAssertTrue(string.contains(linuxDistribution.description))
72+
XCTAssertTrue(string.contains(testCase.expectedCanonicalName))
6773

6874
// Cleanup
6975
try await sdk.removeFile(at: sdkSettingsFile)
76+
77+
try await sdk.createDirectoryIfNeeded(at: sdk.pathsConfiguration.artifactBundlePath)
78+
79+
// Generate bundle metadata
80+
try await sdk.generateArtifactBundleManifest(
81+
hostTriples: [sdk.targetTriple],
82+
artifacts: ["foo": sdk.pathsConfiguration.artifactBundlePath.appending("bar.json")]
83+
)
84+
85+
// Make sure the file exists
86+
let archiveMetadataFile = await sdk.pathsConfiguration.artifactBundlePath.appending("info.json")
87+
fileExists = await sdk.doesFileExist(at: archiveMetadataFile)
88+
XCTAssertTrue(fileExists)
89+
90+
// Read back file, make sure it contains the expected data
91+
let data = try await sdk.readFile(at: archiveMetadataFile)
92+
let decodedMetadata = try JSONDecoder().decode(ArtifactsArchiveMetadata.self, from: data)
93+
XCTAssertEqual(decodedMetadata.artifacts.count, 1)
94+
for (id, artifact) in decodedMetadata.artifacts {
95+
XCTAssertEqual(id, "foo")
96+
XCTAssertEqual(artifact.variants, [.init(path: "bar.json", supportedTriples: [testCase.targetTriple.triple])])
97+
}
98+
99+
// Cleanup
100+
try await sdk.removeFile(at: archiveMetadataFile)
70101
}
71102
}
72103
}

0 commit comments

Comments
 (0)