From 9babfea76c370c54e3195b5cedec0e1a562a7268 Mon Sep 17 00:00:00 2001 From: Aryan Shah Date: Thu, 22 Aug 2024 14:03:15 +0100 Subject: [PATCH 1/5] Require Swift 6 --- Package.swift | 37 ++++++----- Package@swift-5.8.swift | 92 -------------------------- Plugins/AWSLambdaPackager/Plugin.swift | 13 +++- 3 files changed, 32 insertions(+), 110 deletions(-) delete mode 100644 Package@swift-5.8.swift diff --git a/Package.swift b/Package.swift index cb9c5321..0fa425f4 100644 --- a/Package.swift +++ b/Package.swift @@ -1,14 +1,11 @@ -// swift-tools-version:5.9 +// swift-tools-version:6.0 import PackageDescription let package = Package( name: "swift-aws-lambda-runtime", platforms: [ - .macOS(.v12), - .iOS(.v15), - .tvOS(.v15), - .watchOS(.v8), + .macOS(.v15) ], products: [ // this library exports `AWSLambdaRuntimeCore` and adds Foundation convenience methods @@ -16,6 +13,7 @@ let package = Package( // this has all the main functionality for lambda and it does not link Foundation .library(name: "AWSLambdaRuntimeCore", targets: ["AWSLambdaRuntimeCore"]), // plugin to package the lambda, creating an archive that can be uploaded to AWS + // requires Linux or at least macOS v15 .plugin(name: "AWSLambdaPackager", targets: ["AWSLambdaPackager"]), // for testing only .library(name: "AWSLambdaTesting", targets: ["AWSLambdaTesting"]), @@ -23,7 +21,7 @@ let package = Package( dependencies: [ .package(url: "https://github.com/apple/swift-nio.git", .upToNextMajor(from: "2.67.0")), .package(url: "https://github.com/apple/swift-log.git", .upToNextMajor(from: "1.5.4")), - .package(url: "https://github.com/apple/swift-docc-plugin", exact: "1.3.0"), + .package(url: "https://github.com/apple/swift-docc-plugin", from: "1.0.0"), ], targets: [ .target( @@ -32,7 +30,8 @@ let package = Package( .byName(name: "AWSLambdaRuntimeCore"), .product(name: "NIOCore", package: "swift-nio"), .product(name: "NIOFoundationCompat", package: "swift-nio"), - ] + ], + swiftSettings: [.swiftLanguageMode(.v5)] ), .target( name: "AWSLambdaRuntimeCore", @@ -42,15 +41,15 @@ let package = Package( .product(name: "NIOCore", package: "swift-nio"), .product(name: "NIOConcurrencyHelpers", package: "swift-nio"), .product(name: "NIOPosix", package: "swift-nio"), - ] + ], + swiftSettings: [.swiftLanguageMode(.v5)] ), .plugin( name: "AWSLambdaPackager", capability: .command( intent: .custom( verb: "archive", - description: - "Archive the Lambda binary and prepare it for uploading to AWS. Requires docker on macOS or non Amazonlinux 2 distributions." + description: "Archive the Lambda binary and prepare it for uploading to AWS. Requires docker on macOS or non Amazonlinux 2 distributions." ) ) ), @@ -60,14 +59,16 @@ let package = Package( .byName(name: "AWSLambdaRuntimeCore"), .product(name: "NIOTestUtils", package: "swift-nio"), .product(name: "NIOFoundationCompat", package: "swift-nio"), - ] + ], + swiftSettings: [.swiftLanguageMode(.v5)] ), .testTarget( name: "AWSLambdaRuntimeTests", dependencies: [ .byName(name: "AWSLambdaRuntimeCore"), .byName(name: "AWSLambdaRuntime"), - ] + ], + swiftSettings: [.swiftLanguageMode(.v5)] ), // testing helper .target( @@ -75,16 +76,22 @@ let package = Package( dependencies: [ .byName(name: "AWSLambdaRuntime"), .product(name: "NIO", package: "swift-nio"), - ] + ], + swiftSettings: [.swiftLanguageMode(.v5)] + ), + .testTarget( + name: "AWSLambdaTestingTests", + dependencies: ["AWSLambdaTesting"], + swiftSettings: [.swiftLanguageMode(.v5)] ), - .testTarget(name: "AWSLambdaTestingTests", dependencies: ["AWSLambdaTesting"]), // for perf testing .executableTarget( name: "MockServer", dependencies: [ .product(name: "NIOHTTP1", package: "swift-nio"), .product(name: "NIO", package: "swift-nio"), - ] + ], + swiftSettings: [.swiftLanguageMode(.v5)] ), ] ) diff --git a/Package@swift-5.8.swift b/Package@swift-5.8.swift deleted file mode 100644 index 7add120b..00000000 --- a/Package@swift-5.8.swift +++ /dev/null @@ -1,92 +0,0 @@ -// swift-tools-version:5.7 - -import PackageDescription - -let package = Package( - name: "swift-aws-lambda-runtime", - platforms: [ - .macOS(.v12), - .iOS(.v15), - .tvOS(.v15), - .watchOS(.v8), - ], - products: [ - // this library exports `AWSLambdaRuntimeCore` and adds Foundation convenience methods - .library(name: "AWSLambdaRuntime", targets: ["AWSLambdaRuntime"]), - // this has all the main functionality for lambda and it does not link Foundation - .library(name: "AWSLambdaRuntimeCore", targets: ["AWSLambdaRuntimeCore"]), - // plugin to package the lambda, creating an archive that can be uploaded to AWS - .plugin(name: "AWSLambdaPackager", targets: ["AWSLambdaPackager"]), - // for testing only - .library(name: "AWSLambdaTesting", targets: ["AWSLambdaTesting"]), - ], - dependencies: [ - .package(url: "https://github.com/apple/swift-nio.git", .upToNextMajor(from: "2.43.1")), - .package(url: "https://github.com/apple/swift-log.git", .upToNextMajor(from: "1.4.2")), - .package(url: "https://github.com/swift-server/swift-backtrace.git", .upToNextMajor(from: "1.2.3")), - .package(url: "https://github.com/apple/swift-docc-plugin", exact: "1.3.0"), - ], - targets: [ - .target( - name: "AWSLambdaRuntime", - dependencies: [ - .byName(name: "AWSLambdaRuntimeCore"), - .product(name: "NIOCore", package: "swift-nio"), - .product(name: "NIOFoundationCompat", package: "swift-nio"), - ] - ), - .target( - name: "AWSLambdaRuntimeCore", - dependencies: [ - .product(name: "Logging", package: "swift-log"), - .product(name: "Backtrace", package: "swift-backtrace"), - .product(name: "NIOHTTP1", package: "swift-nio"), - .product(name: "NIOCore", package: "swift-nio"), - .product(name: "NIOConcurrencyHelpers", package: "swift-nio"), - .product(name: "NIOPosix", package: "swift-nio"), - ] - ), - .plugin( - name: "AWSLambdaPackager", - capability: .command( - intent: .custom( - verb: "archive", - description: - "Archive the Lambda binary and prepare it for uploading to AWS. Requires docker on macOS or non Amazonlinux 2 distributions." - ) - ) - ), - .testTarget( - name: "AWSLambdaRuntimeCoreTests", - dependencies: [ - .byName(name: "AWSLambdaRuntimeCore"), - .product(name: "NIOTestUtils", package: "swift-nio"), - .product(name: "NIOFoundationCompat", package: "swift-nio"), - ] - ), - .testTarget( - name: "AWSLambdaRuntimeTests", - dependencies: [ - .byName(name: "AWSLambdaRuntimeCore"), - .byName(name: "AWSLambdaRuntime"), - ] - ), - // testing helper - .target( - name: "AWSLambdaTesting", - dependencies: [ - .byName(name: "AWSLambdaRuntime"), - .product(name: "NIO", package: "swift-nio"), - ] - ), - .testTarget(name: "AWSLambdaTestingTests", dependencies: ["AWSLambdaTesting"]), - // for perf testing - .executableTarget( - name: "MockServer", - dependencies: [ - .product(name: "NIOHTTP1", package: "swift-nio"), - .product(name: "NIO", package: "swift-nio"), - ] - ), - ] -) diff --git a/Plugins/AWSLambdaPackager/Plugin.swift b/Plugins/AWSLambdaPackager/Plugin.swift index 9ae2ad04..9825f070 100644 --- a/Plugins/AWSLambdaPackager/Plugin.swift +++ b/Plugins/AWSLambdaPackager/Plugin.swift @@ -15,6 +15,7 @@ import Dispatch import Foundation import PackagePlugin +import Synchronization #if os(macOS) import Darwin @@ -28,6 +29,7 @@ import ucrt #error("Unsupported platform") #endif +@available(macOS 15.0, *) @main struct AWSLambdaPackager: CommandPlugin { func performCommand(context: PackagePlugin.PluginContext, arguments: [String]) async throws { @@ -282,10 +284,10 @@ struct AWSLambdaPackager: CommandPlugin { print("\(executable.string) \(arguments.joined(separator: " "))") } - var output = "" + let outputMutex = Mutex("") let outputSync = DispatchGroup() let outputQueue = DispatchQueue(label: "AWSLambdaPackager.output") - let outputHandler = { (data: Data?) in + let outputHandler = { @Sendable (data: Data?) in dispatchPrecondition(condition: .onQueue(outputQueue)) outputSync.enter() @@ -299,7 +301,9 @@ struct AWSLambdaPackager: CommandPlugin { return } - output += _output + "\n" + outputMutex.withLock { output in + output += _output + "\n" + } switch logLevel { case .silent: @@ -336,6 +340,8 @@ struct AWSLambdaPackager: CommandPlugin { // wait for output to be full processed outputSync.wait() + let output = outputMutex.withLock { $0 } + if process.terminationStatus != 0 { // print output on failure and if not already printed if logLevel < .output { @@ -359,6 +365,7 @@ struct AWSLambdaPackager: CommandPlugin { } } +@available(macOS 15.0, *) private struct Configuration: CustomStringConvertible { public let outputDirectory: Path public let products: [Product] From bbb2fa04d7eaeff6de0511f9d4e533fde955aa43 Mon Sep 17 00:00:00 2001 From: Aryan Shah Date: Tue, 27 Aug 2024 12:07:25 +0100 Subject: [PATCH 2/5] Apply formatter --- Package.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index 0fa425f4..65a9214e 100644 --- a/Package.swift +++ b/Package.swift @@ -49,7 +49,8 @@ let package = Package( capability: .command( intent: .custom( verb: "archive", - description: "Archive the Lambda binary and prepare it for uploading to AWS. Requires docker on macOS or non Amazonlinux 2 distributions." + description: + "Archive the Lambda binary and prepare it for uploading to AWS. Requires docker on macOS or non Amazonlinux 2 distributions." ) ) ), From fa0dfa0aaff00d8a7bf8518c890d6d7f806f830d Mon Sep 17 00:00:00 2001 From: Aryan Shah Date: Tue, 27 Aug 2024 14:21:31 +0100 Subject: [PATCH 3/5] Disable 5.8, 5.9, and 5.10 checks --- .github/workflows/pull_request.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index f0657f0d..8cd0b274 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -16,9 +16,9 @@ jobs: name: Unit tests uses: apple/swift-nio/.github/workflows/unit_tests.yml@main with: - linux_5_8_arguments_override: "-Xswiftc -warnings-as-errors --explicit-target-dependency-import-check error" - linux_5_9_arguments_override: "-Xswiftc -warnings-as-errors --explicit-target-dependency-import-check error" - linux_5_10_arguments_override: "-Xswiftc -warnings-as-errors --explicit-target-dependency-import-check error" + linux_5_8_enabled: false + linux_5_9_enabled: false + linux_5_10_enabled: false linux_nightly_6_0_arguments_override: "-Xswiftc -warnings-as-errors --explicit-target-dependency-import-check error" linux_nightly_main_arguments_override: "-Xswiftc -warnings-as-errors --explicit-target-dependency-import-check error" From be37729827bdf7aea2bf2ebdb46b72992f8d6bd8 Mon Sep 17 00:00:00 2001 From: Aryan Shah Date: Wed, 28 Aug 2024 09:34:18 +0100 Subject: [PATCH 4/5] Fix errors --- Package.swift | 12 ++++++++---- Plugins/AWSLambdaPackager/Plugin.swift | 27 +++++++++++++------------- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/Package.swift b/Package.swift index 65a9214e..38a18f83 100644 --- a/Package.swift +++ b/Package.swift @@ -2,11 +2,15 @@ import PackageDescription +#if os(macOS) +let platforms: [PackageDescription.SupportedPlatform]? = [.macOS(.v15)] +#else +let platforms: [PackageDescription.SupportedPlatform]? = nil +#endif + let package = Package( name: "swift-aws-lambda-runtime", - platforms: [ - .macOS(.v15) - ], + platforms: platforms, products: [ // this library exports `AWSLambdaRuntimeCore` and adds Foundation convenience methods .library(name: "AWSLambdaRuntime", targets: ["AWSLambdaRuntime"]), @@ -21,7 +25,7 @@ let package = Package( dependencies: [ .package(url: "https://github.com/apple/swift-nio.git", .upToNextMajor(from: "2.67.0")), .package(url: "https://github.com/apple/swift-log.git", .upToNextMajor(from: "1.5.4")), - .package(url: "https://github.com/apple/swift-docc-plugin", from: "1.0.0"), + .package(url: "https://github.com/apple/swift-docc-plugin.git", from: "1.0.0"), ], targets: [ .target( diff --git a/Plugins/AWSLambdaPackager/Plugin.swift b/Plugins/AWSLambdaPackager/Plugin.swift index 9825f070..a0ea999b 100644 --- a/Plugins/AWSLambdaPackager/Plugin.swift +++ b/Plugins/AWSLambdaPackager/Plugin.swift @@ -17,18 +17,6 @@ import Foundation import PackagePlugin import Synchronization -#if os(macOS) -import Darwin -#elseif canImport(Glibc) -import Glibc -#elseif canImport(Musl) -import Musl -#elseif os(Windows) -import ucrt -#else -#error("Unsupported platform") -#endif - @available(macOS 15.0, *) @main struct AWSLambdaPackager: CommandPlugin { @@ -284,9 +272,22 @@ struct AWSLambdaPackager: CommandPlugin { print("\(executable.string) \(arguments.joined(separator: " "))") } + let fd = dup(1) + let stdout = fdopen(fd, "rw")! + defer { fclose(stdout) } + + // We need to use an unsafe transfer here to get the fd into our Sendable closure. + // This transfer is fine, because we guarantee that the code in the outputHandler + // is run before we continue the functions execution, where the fd is used again. + // See `process.waitUntilExit()` and the following `outputSync.wait()` + struct UnsafeTransfer: @unchecked Sendable { + let value: Value + } + let outputMutex = Mutex("") let outputSync = DispatchGroup() let outputQueue = DispatchQueue(label: "AWSLambdaPackager.output") + let unsafeTransfer = UnsafeTransfer(value: stdout) let outputHandler = { @Sendable (data: Data?) in dispatchPrecondition(condition: .onQueue(outputQueue)) @@ -311,7 +312,7 @@ struct AWSLambdaPackager: CommandPlugin { case .debug(let outputIndent), .output(let outputIndent): print(String(repeating: " ", count: outputIndent), terminator: "") print(_output) - fflush(stdout) + fflush(unsafeTransfer.value) } } From 7ad3115dd802fcb9fecdeaf4cb123f218e5b1c97 Mon Sep 17 00:00:00 2001 From: Aryan Shah Date: Wed, 28 Aug 2024 10:04:17 +0100 Subject: [PATCH 5/5] Remove -warnings-as-errors for now --- .github/workflows/pull_request.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 8cd0b274..814e6ed5 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -19,8 +19,8 @@ jobs: linux_5_8_enabled: false linux_5_9_enabled: false linux_5_10_enabled: false - linux_nightly_6_0_arguments_override: "-Xswiftc -warnings-as-errors --explicit-target-dependency-import-check error" - linux_nightly_main_arguments_override: "-Xswiftc -warnings-as-errors --explicit-target-dependency-import-check error" + linux_nightly_6_0_arguments_override: "--explicit-target-dependency-import-check error" + linux_nightly_main_arguments_override: "--explicit-target-dependency-import-check error" swift-6-language-mode: name: Swift 6 Language Mode