Skip to content

Require Swift 6 #341

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Aug 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions .github/workflows/pull_request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@ 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_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_5_8_enabled: false
linux_5_9_enabled: false
linux_5_10_enabled: false
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
Expand Down
42 changes: 27 additions & 15 deletions Package.swift
Original file line number Diff line number Diff line change
@@ -1,29 +1,31 @@
// swift-tools-version:5.9
// swift-tools-version:6.0

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(.v12),
.iOS(.v15),
.tvOS(.v15),
.watchOS(.v8),
],
platforms: platforms,
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
// requires Linux or at least macOS v15
.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.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.git", from: "1.0.0"),
],
targets: [
.target(
Expand All @@ -32,7 +34,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",
Expand All @@ -42,7 +45,8 @@ 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",
Expand All @@ -60,31 +64,39 @@ 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(
name: "AWSLambdaTesting",
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)]
),
]
)
92 changes: 0 additions & 92 deletions Package@swift-5.8.swift

This file was deleted.

40 changes: 24 additions & 16 deletions Plugins/AWSLambdaPackager/Plugin.swift
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,9 @@
import Dispatch
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 {
func performCommand(context: PackagePlugin.PluginContext, arguments: [String]) async throws {
Expand Down Expand Up @@ -282,10 +272,23 @@ struct AWSLambdaPackager: CommandPlugin {
print("\(executable.string) \(arguments.joined(separator: " "))")
}

var output = ""
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<Value>: @unchecked Sendable {
let value: Value
}

let outputMutex = Mutex("")
let outputSync = DispatchGroup()
let outputQueue = DispatchQueue(label: "AWSLambdaPackager.output")
let outputHandler = { (data: Data?) in
let unsafeTransfer = UnsafeTransfer(value: stdout)
let outputHandler = { @Sendable (data: Data?) in
dispatchPrecondition(condition: .onQueue(outputQueue))

outputSync.enter()
Expand All @@ -299,15 +302,17 @@ struct AWSLambdaPackager: CommandPlugin {
return
}

output += _output + "\n"
outputMutex.withLock { output in
output += _output + "\n"
}

switch logLevel {
case .silent:
break
case .debug(let outputIndent), .output(let outputIndent):
print(String(repeating: " ", count: outputIndent), terminator: "")
print(_output)
fflush(stdout)
fflush(unsafeTransfer.value)
}
}

Expand Down Expand Up @@ -336,6 +341,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 {
Expand All @@ -359,6 +366,7 @@ struct AWSLambdaPackager: CommandPlugin {
}
}

@available(macOS 15.0, *)
private struct Configuration: CustomStringConvertible {
public let outputDirectory: Path
public let products: [Product]
Expand Down
Loading