From b0effbcfd9c92246df01e2aed3f7e3c23f14aae4 Mon Sep 17 00:00:00 2001 From: David Evans Date: Fri, 18 Jun 2021 21:02:41 +0100 Subject: [PATCH] Make Swift 5.2 the minimum requirement (#1860) Make Swift 5.2 the minimum requirement, dropping support for Swift 5.0 and 5.1. Motivation: Whenever we have problems, Swift 5.0 and 5.1 seem to be the culprits. Dropping support for these very old versions will require less maintenance and free up our time to work on new features. Modifications: Set the tools version in Package.swift to 5.2 Remove CI configurations for 5.0 and 5.1 Update the various readmes to reflect that this change will be rolled out in NIO 2.30.0 Result: Swift 5.2 is the minimum version of Swift required to use NIO. --- CONTRIBUTING.md | 6 +- Package.swift | 2 +- README.md | 12 ++-- ...te-alloc-limits-to-last-completed-ci-build | 2 +- docker/Dockerfile | 2 +- docker/docker-compose.1804.50.yaml | 33 ---------- docker/docker-compose.1804.51.yaml | 65 ------------------- ...04.52.yaml => docker-compose.1804.52.yaml} | 20 +++--- docs/migration-guide-NIO1-to-NIO2.md | 2 + scripts/build_podspecs.sh | 2 +- scripts/check_no_api_breakages.sh | 7 +- 11 files changed, 31 insertions(+), 122 deletions(-) delete mode 100644 docker/docker-compose.1804.50.yaml delete mode 100644 docker/docker-compose.1804.51.yaml rename docker/{docker-compose.1604.52.yaml => docker-compose.1804.52.yaml} (86%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 20a4e9d6a3..c17b272790 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -63,16 +63,16 @@ We require that your commit messages match our template. The easiest way to do t git config commit.template dev/git.commit.template -The default policy for taking contributions is “Squash and Merge” - because of this the commit message format rule above applies to the PR rather than every commit contained within it. +The default policy for taking contributions is “Squash and Merge” - because of this the commit message format rule above applies to the PR rather than every commit contained within it. ### Make sure Tests work on Linux -SwiftNIO uses XCTest to run tests on both macOS and Linux. While the macOS version of XCTest is able to use the Objective-C runtime to discover tests at execution time, the Linux version is not (prior to swift 5.1). +SwiftNIO uses XCTest to run tests on both macOS and Linux. While the macOS version of XCTest is able to use the Objective-C runtime to discover tests at execution time, the Linux version is not (prior to swift 5.1). For this reason, whenever you add new tests **you have to run a script** that generates the hooks needed to run those tests on Linux, or our CI will complain that the tests are not all present on Linux. To do this, merely execute `ruby ./scripts/generate_linux_tests.rb` at the root of the package and check the changes it made. ### Make sure your patch works for all supported versions of swift -The CI will do this for you. You can use the docker-compose files included if you wish to check locally. Currently all versions of swift >= 5.0 are supported. For example usage of docker compose see the main [README](./README.md#an-alternative-using-docker-compose) +The CI will do this for you. You can use the docker-compose files included if you wish to check locally. Currently all versions of swift >= 5.2 are supported. For example usage of docker compose see the main [README](./README.md#an-alternative-using-docker-compose) ### Make sure your code is performant diff --git a/Package.swift b/Package.swift index 1ed800aa0e..2ad8389fa4 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.0 +// swift-tools-version:5.2 //===----------------------------------------------------------------------===// // // This source file is part of the SwiftNIO open source project diff --git a/README.md b/README.md index 5cc72688e0..52a0f93e94 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ It's like [Netty](https://netty.io), but written for Swift. The SwiftNIO project is split across multiple repositories: -Repository | NIO 2 (Swift 5+) | NIO 1 (Swift 4+) +Repository | NIO 2 (Swift 5.2+) | NIO 1 (Swift 4+) --- | --- | --- [https://github.com/apple/swift-nio][repo-nio]
SwiftNIO core | `from: "2.0.0"` | `from: "1.0.0"` [https://github.com/apple/swift-nio-ssl][repo-nio-ssl]
TLS (SSL) support | `from: "2.0.0"` | `from: "1.0.0"` @@ -20,6 +20,8 @@ Repository | NIO 2 (Swift 5+) | NIO 1 (Swift 4+) [https://github.com/apple/swift-nio-transport-services][repo-nio-transport-services]
first-class support for macOS, iOS, tvOS, and watchOS | `from: "1.0.0"` | `from: "0.1.0"` [https://github.com/apple/swift-nio-ssh][repo-nio-ssh]
SSH support | `.upToNextMinor(from: "0.2.0")` | _n/a_ +NIO 2.29.0 and older support Swift 5.0+. + ### Protocol Implementations Below you can find a list of a few protocol implementations that are done with SwiftNIO. This is a non-exhaustive list of protocols that are either part of the SwiftNIO project or are accepted into the [SSWG](https://swift.org/server)'s incubation process. All of the libraries listed below do all of their I/O in a non-blocking fashion using SwiftNIO. @@ -64,7 +66,7 @@ The latest released SwiftNIO 1 version supports Swift 4.0, 4.1, 4.2, and 5.0. #### SwiftNIO 2 -The latest released SwiftNIO 2 version supports Swift 5.0, 5.1, 5.2, 5.3, and 5.4. If you have a SwiftNIO 1 application or library that you would like to migrate to SwiftNIO 2, please check out the [migration guide](docs/migration-guide-NIO1-to-NIO2.md) we prepared for you. +The latest released SwiftNIO 2 version supports Swift 5.2, 5.3, and 5.4. If you have a SwiftNIO 1 application or library that you would like to migrate to SwiftNIO 2, please check out the [migration guide](docs/migration-guide-NIO1-to-NIO2.md) we prepared for you. ### Compatibility @@ -309,11 +311,11 @@ have a few prerequisites installed on your system. #### macOS -- Xcode 10.2 or newer, Xcode 11 recommended. +- Xcode 11.4 or newer, Xcode 12 recommended. ### Linux -- Swift 5.0, 5.1, 5.2, 5.3, or 5.4 from [swift.org/download](https://swift.org/download/#releases). We always recommend to use the latest released version. +- Swift 5.2, 5.3, or 5.4 from [swift.org/download](https://swift.org/download/#releases). We always recommend to use the latest released version. - netcat (for integration tests only) - lsof (for integration tests only) - shasum (for integration tests only) @@ -355,7 +357,7 @@ dnf install swift-lang /usr/bin/nc /usr/bin/lsof /usr/bin/shasum [repo-nio-ssh]: https://github.com/apple/swift-nio-ssh ### Speeding up testing -It's possible to run the test suite in parallel, it can save significant time if you have a larger multi-core machine, just add `--parallel` when running the tests. This can speed up the run time of the test suite with 30x or more. +It's possible to run the test suite in parallel, it can save significant time if you have a larger multi-core machine, just add `--parallel` when running the tests. This can speed up the run time of the test suite by 30x or more. ``` swift test --parallel diff --git a/dev/update-alloc-limits-to-last-completed-ci-build b/dev/update-alloc-limits-to-last-completed-ci-build index 8f4dec5150..619fe8b3a0 100755 --- a/dev/update-alloc-limits-to-last-completed-ci-build +++ b/dev/update-alloc-limits-to-last-completed-ci-build @@ -22,7 +22,7 @@ url_prefix=${1-"https://ci.swiftserver.group/job/swift-nio2-swift"} target_repo=${2-"$here/.."} tmpdir=$(mktemp -d /tmp/.last-build_XXXXXX) -for f in 51 52 53 54 55 -nightly; do +for f in 52 53 54 55 -nightly; do echo "swift$f" url="$url_prefix$f-prb/lastCompletedBuild/consoleFull" echo "$url" diff --git a/docker/Dockerfile b/docker/Dockerfile index 750c165d3c..3dccb6ff72 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,4 @@ -ARG swift_version=5.0 +ARG swift_version=5.2 ARG ubuntu_version=bionic ARG base_image=swift:$swift_version-$ubuntu_version FROM $base_image diff --git a/docker/docker-compose.1804.50.yaml b/docker/docker-compose.1804.50.yaml deleted file mode 100644 index da3acc00b7..0000000000 --- a/docker/docker-compose.1804.50.yaml +++ /dev/null @@ -1,33 +0,0 @@ -version: "3" - -services: - - runtime-setup: - image: swift-nio:18.04-5.0 - build: - args: - ubuntu_version: "bionic" - swift_version: "5.0" - - unit-tests: - image: swift-nio:18.04-5.0 - - integration-tests: - image: swift-nio:18.04-5.0 - - test: - image: swift-nio:18.04-5.0 - environment: - - INTEGRATION_TESTS_ARG=-f tests_0[012356789] - - performance-test: - image: swift-nio:18.04-5.0 - - shell: - image: swift-nio:18.04-5.0 - - echo: - image: swift-nio:18.04-5.0 - - http: - image: swift-nio:18.04-5.0 diff --git a/docker/docker-compose.1804.51.yaml b/docker/docker-compose.1804.51.yaml deleted file mode 100644 index 9cc6504252..0000000000 --- a/docker/docker-compose.1804.51.yaml +++ /dev/null @@ -1,65 +0,0 @@ -version: "3" - -services: - - runtime-setup: - image: swift-nio:18.04-5.1 - build: - args: - ubuntu_version: "bionic" - swift_version: "5.1" - - unit-tests: - image: swift-nio:18.04-5.1 - - integration-tests: - image: swift-nio:18.04-5.1 - - test: - image: swift-nio:18.04-5.1 - environment: - - MAX_ALLOCS_ALLOWED_1000_addHandlers=47050 - - MAX_ALLOCS_ALLOWED_1000_addHandlers_sync=40050 - - MAX_ALLOCS_ALLOWED_1000_addRemoveHandlers_handlercontext=9050 - - MAX_ALLOCS_ALLOWED_1000_addRemoveHandlers_handlername=9050 - - MAX_ALLOCS_ALLOWED_1000_addRemoveHandlers_handlertype=9050 - - MAX_ALLOCS_ALLOWED_1000_autoReadGetAndSet=32050 - - MAX_ALLOCS_ALLOWED_1000_autoReadGetAndSet_sync=0 - - MAX_ALLOCS_ALLOWED_1000_getHandlers=9050 - - MAX_ALLOCS_ALLOWED_1000_getHandlers_sync=37 - - MAX_ALLOCS_ALLOWED_1000_reqs_1_conn=30450 - - MAX_ALLOCS_ALLOWED_1000_tcpbootstraps=3050 - - MAX_ALLOCS_ALLOWED_1000_tcpconnections=171050 - - MAX_ALLOCS_ALLOWED_1000_udp_reqs=12050 - - MAX_ALLOCS_ALLOWED_1000_udpbootstraps=2050 - - MAX_ALLOCS_ALLOWED_1000_udpconnections=96050 - - MAX_ALLOCS_ALLOWED_1_reqs_1000_conn=452050 - - MAX_ALLOCS_ALLOWED_bytebuffer_lots_of_rw=2050 - - MAX_ALLOCS_ALLOWED_creating_10000_headers=10050 - - MAX_ALLOCS_ALLOWED_decode_1000_ws_frames=2050 - - MAX_ALLOCS_ALLOWED_encode_1000_ws_frames_holding_buffer=3 - - MAX_ALLOCS_ALLOWED_encode_1000_ws_frames_holding_buffer_with_space=3 - - MAX_ALLOCS_ALLOWED_encode_1000_ws_frames_new_buffer=3050 - - MAX_ALLOCS_ALLOWED_encode_1000_ws_frames_new_buffer_with_space=3050 - - MAX_ALLOCS_ALLOWED_future_erase_result=4050 - - MAX_ALLOCS_ALLOWED_future_lots_of_callbacks=60050 - - MAX_ALLOCS_ALLOWED_modifying_1000_circular_buffer_elements=0 - - MAX_ALLOCS_ALLOWED_modifying_byte_buffer_view=6050 - - MAX_ALLOCS_ALLOWED_ping_pong_1000_reqs_1_conn=4400 - - MAX_ALLOCS_ALLOWED_read_10000_chunks_from_file=200050 - - MAX_ALLOCS_ALLOWED_schedule_10000_tasks=90050 - - MAX_ALLOCS_ALLOWED_scheduling_10000_executions=20150 - - MAX_ALLOCS_ALLOWED_udp_1000_reqs_1_conn=12200 - - MAX_ALLOCS_ALLOWED_udp_1_reqs_1000_conn=188050 - - performance-test: - image: swift-nio:18.04-5.1 - - shell: - image: swift-nio:18.04-5.1 - - echo: - image: swift-nio:18.04-5.1 - - http: - image: swift-nio:18.04-5.1 diff --git a/docker/docker-compose.1604.52.yaml b/docker/docker-compose.1804.52.yaml similarity index 86% rename from docker/docker-compose.1604.52.yaml rename to docker/docker-compose.1804.52.yaml index 79e926112e..cf59d36eb1 100644 --- a/docker/docker-compose.1604.52.yaml +++ b/docker/docker-compose.1804.52.yaml @@ -3,20 +3,20 @@ version: "3" services: runtime-setup: - image: swift-nio:16.04-5.2 + image: swift-nio:18.04-5.2 build: args: - ubuntu_version: "xenial" + ubuntu_version: "bionic" swift_version: "5.2" unit-tests: - image: swift-nio:16.04-5.2 + image: swift-nio:18.04-5.2 integration-tests: - image: swift-nio:16.04-5.2 + image: swift-nio:18.04-5.2 test: - image: swift-nio:16.04-5.2 + image: swift-nio:18.04-5.2 environment: - MAX_ALLOCS_ALLOWED_1000_addHandlers=47050 - MAX_ALLOCS_ALLOWED_1000_addHandlers_sync=40050 @@ -51,17 +51,17 @@ services: - MAX_ALLOCS_ALLOWED_scheduling_10000_executions=20150 - MAX_ALLOCS_ALLOWED_udp_1000_reqs_1_conn=12200 - MAX_ALLOCS_ALLOWED_udp_1_reqs_1000_conn=188050 - - SANITIZER_ARG=--sanitize=thread + # - SANITIZER_ARG=--sanitize=thread broken on 18.04 - INTEGRATION_TESTS_ARG=-f tests_0[013-9] performance-test: - image: swift-nio:16.04-5.2 + image: swift-nio:18.04-5.2 shell: - image: swift-nio:16.04-5.2 + image: swift-nio:18.04-5.2 echo: - image: swift-nio:16.04-5.2 + image: swift-nio:18.04-5.2 http: - image: swift-nio:16.04-5.2 + image: swift-nio:18.04-5.2 diff --git a/docs/migration-guide-NIO1-to-NIO2.md b/docs/migration-guide-NIO1-to-NIO2.md index ecaa714d27..a233402fcd 100644 --- a/docs/migration-guide-NIO1-to-NIO2.md +++ b/docs/migration-guide-NIO1-to-NIO2.md @@ -4,6 +4,8 @@ This migration guide is our recommendation to migrate from NIO 1 to NIO 2. None This repository also contains a fairly complete list of public [API changes](https://github.com/apple/swift-nio/blob/main/docs/public-api-changes-NIO1-to-NIO2.md) from NIO 1 to NIO 2. +### Note: As of NIO 2.30.0 the minimum version of Swift required is 5.2. + ## Step 1: A warning-free compile on NIO 1 with Swift 5 To start with, we highly recommend to first get your project to compile warning-free with NIO 1 on Swift 5. The reason is that some of the warnings you might get are the result of deprecation in NIO 1 and deprecated NIO 1 API has been fully removed in NIO 2. diff --git a/scripts/build_podspecs.sh b/scripts/build_podspecs.sh index 760069ebb1..97814259d1 100755 --- a/scripts/build_podspecs.sh +++ b/scripts/build_podspecs.sh @@ -99,7 +99,7 @@ Pod::Spec.new do |s| s.documentation_url = 'https://apple.github.io/swift-nio/docs/current/NIO/index.html' s.module_name = '${target#Swift}' - s.swift_version = '5.0' + s.swift_version = '5.2' s.cocoapods_version = '>=1.6.0' s.ios.deployment_target = '10.0' s.osx.deployment_target = '10.10' diff --git a/scripts/check_no_api_breakages.sh b/scripts/check_no_api_breakages.sh index 29aa38b45b..a1e2bfe0e4 100755 --- a/scripts/check_no_api_breakages.sh +++ b/scripts/check_no_api_breakages.sh @@ -47,7 +47,7 @@ function build_and_do() { function usage() { echo >&2 "Usage: $0 REPO-GITHUB-URL NEW-VERSION OLD-VERSIONS..." echo >&2 - echo >&2 "This script requires a Swift 5.1+ toolchain." + echo >&2 "This script requires a Swift 5.2+ toolchain." echo >&2 echo >&2 "Examples:" echo >&2 @@ -101,7 +101,10 @@ for old_tag in "$@"; do --input-paths "$tmpdir/api-old/$f" -input-paths "$tmpdir/api-new/$f" 2>&1 \ > "$report" 2>&1 - if ! shasum "$report" | grep -q cefc4ee5bb7bcdb7cb5a7747efa178dab3c794d5; then + # the shasum here is for an empty report, i.e. no changes + # if the shasum of the new report is different, then there's + # obviously an API change + if ! shasum "$report" | grep -q afd2a1b542b33273920d65821deddc653063c700; then echo ERROR echo >&2 "==============================" echo >&2 "ERROR: public API change in $f"