From 21dd6a245bbbeb048164efac24b8a693ba9c750b Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Fri, 16 May 2025 12:06:41 +0100 Subject: [PATCH 1/3] Fix use of absolute paths to Swift SDK metatadata 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. --- .../Generator/SwiftSDKGenerator+Metadata.swift | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Sources/SwiftSDKGenerator/Generator/SwiftSDKGenerator+Metadata.swift b/Sources/SwiftSDKGenerator/Generator/SwiftSDKGenerator+Metadata.swift index 9fb9db2..fbb056b 100644 --- a/Sources/SwiftSDKGenerator/Generator/SwiftSDKGenerator+Metadata.swift +++ b/Sources/SwiftSDKGenerator/Generator/SwiftSDKGenerator+Metadata.swift @@ -113,12 +113,16 @@ extension SwiftSDKGenerator { ArtifactsArchiveMetadata( schemaVersion: "1.0", artifacts: artifacts.mapValues { - .init( + var relativePath = $0 + let prefixRemoved = relativePath.removePrefix(pathsConfiguration.artifactBundlePath) + assert(prefixRemoved) + + return .init( type: .swiftSDK, version: self.bundleVersion, variants: [ .init( - path: $0.string, + path: relativePath.string, supportedTriples: hostTriples.map { $0.map(\.triple) } ) ] From 024469748a06c5ef6fa6b2c72434effee87ac0a6 Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Fri, 16 May 2025 12:34:29 +0100 Subject: [PATCH 2/3] Add a test to prevent future regressions --- .../SwiftSDKGenerator+MetadataTests.swift | 45 ++++++++++++++++--- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/Tests/SwiftSDKGeneratorTests/Generator/SwiftSDKGenerator+MetadataTests.swift b/Tests/SwiftSDKGeneratorTests/Generator/SwiftSDKGenerator+MetadataTests.swift index b599075..18b5a80 100644 --- a/Tests/SwiftSDKGeneratorTests/Generator/SwiftSDKGenerator+MetadataTests.swift +++ b/Tests/SwiftSDKGeneratorTests/Generator/SwiftSDKGenerator+MetadataTests.swift @@ -10,6 +10,12 @@ // //===----------------------------------------------------------------------===// +#if canImport(FoundationEssentials) +import FoundationEssentials +#else +import Foundation +#endif + import Logging import SystemPackage import XCTest @@ -54,19 +60,44 @@ final class SwiftSDKGeneratorMetadataTests: XCTestCase { // Make sure the file exists let sdkSettingsFile = sdkDirPath.appending("SDKSettings.json") - let fileExists = await sdk.doesFileExist(at: sdkSettingsFile) + var fileExists = await sdk.doesFileExist(at: sdkSettingsFile) XCTAssertTrue(fileExists) // Read back file, make sure it contains the expected data - let data = String(data: try await sdk.readFile(at: sdkSettingsFile), encoding: .utf8) - XCTAssertNotNil(data) - XCTAssertTrue(data!.contains(testCase.bundleVersion)) - XCTAssertTrue(data!.contains("(\(testCase.targetTriple.archName))")) - XCTAssertTrue(data!.contains(linuxDistribution.description)) - XCTAssertTrue(data!.contains(testCase.expectedCanonicalName)) + let maybeString = String(data: try await sdk.readFile(at: sdkSettingsFile), encoding: .utf8) + let string = try XCTUnwrap(maybeString) + XCTAssertTrue(string.contains(testCase.bundleVersion)) + XCTAssertTrue(string.contains("(\(testCase.targetTriple.archName))")) + XCTAssertTrue(string.contains(linuxDistribution.description)) + XCTAssertTrue(string.contains(testCase.expectedCanonicalName)) // Cleanup try await sdk.removeFile(at: sdkSettingsFile) + + try await sdk.createDirectoryIfNeeded(at: sdk.pathsConfiguration.artifactBundlePath) + + // Generate bundle metadata + try await sdk.generateArtifactBundleManifest( + hostTriples: [sdk.targetTriple], + artifacts: ["foo": sdk.pathsConfiguration.artifactBundlePath.appending("bar.json")] + ) + + // Make sure the file exists + let archiveMetadataFile = await sdk.pathsConfiguration.artifactBundlePath.appending("info.json") + fileExists = await sdk.doesFileExist(at: archiveMetadataFile) + XCTAssertTrue(fileExists) + + // Read back file, make sure it contains the expected data + let data = try await sdk.readFile(at: archiveMetadataFile) + let decodedMetadata = try JSONDecoder().decode(ArtifactsArchiveMetadata.self, from: data) + XCTAssertEqual(decodedMetadata.artifacts.count, 1) + for (id, artifact) in decodedMetadata.artifacts { + XCTAssertEqual(id, "foo") + XCTAssertEqual(artifact.variants, [.init(path: "bar.json", supportedTriples: [testCase.targetTriple.triple])]) + } + + // Cleanup + try await sdk.removeFile(at: archiveMetadataFile) } } } From facc2ad2e0ae05bd6aada6198c5c137697566f5f Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Fri, 16 May 2025 12:36:03 +0100 Subject: [PATCH 3/3] Fix formatting --- .../Generator/SwiftSDKGenerator+MetadataTests.swift | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Tests/SwiftSDKGeneratorTests/Generator/SwiftSDKGenerator+MetadataTests.swift b/Tests/SwiftSDKGeneratorTests/Generator/SwiftSDKGenerator+MetadataTests.swift index 18b5a80..5074efd 100644 --- a/Tests/SwiftSDKGeneratorTests/Generator/SwiftSDKGenerator+MetadataTests.swift +++ b/Tests/SwiftSDKGeneratorTests/Generator/SwiftSDKGenerator+MetadataTests.swift @@ -10,18 +10,18 @@ // //===----------------------------------------------------------------------===// -#if canImport(FoundationEssentials) -import FoundationEssentials -#else -import Foundation -#endif - import Logging import SystemPackage import XCTest @testable import SwiftSDKGenerator +#if canImport(FoundationEssentials) + import FoundationEssentials +#else + import Foundation +#endif + final class SwiftSDKGeneratorMetadataTests: XCTestCase { let logger = Logger(label: "SwiftSDKGeneratorMetadataTests")