From bb139e802002b26a43917dde7cbd10a0a7cf33f7 Mon Sep 17 00:00:00 2001 From: Mike Gerasimenko Date: Mon, 3 Nov 2025 21:02:15 +0100 Subject: [PATCH 1/2] Enable strict concurrency --- Package.swift | 40 ++++++++++++++----- .../SelectiveTestingPlugin.swift | 12 ++++-- Sources/Workspace/Target.swift | 6 +-- 3 files changed, 42 insertions(+), 16 deletions(-) diff --git a/Package.swift b/Package.swift index 754c662..2f3f80b 100644 --- a/Package.swift +++ b/Package.swift @@ -17,11 +17,14 @@ let products: [PackageDescription.Product] = [ ) ] +let flags: [PackageDescription.SwiftSetting] = [.enableExperimentalFeature("StrictConcurrency")] + let targets: [PackageDescription.Target] = [ .executableTarget( name: "xcode-selective-test", dependencies: ["SelectiveTestingCore", - .product(name: "ArgumentParser", package: "swift-argument-parser")] + .product(name: "ArgumentParser", package: "swift-argument-parser")], + swiftSettings: flags ), .target(name: "SelectiveTestingCore", dependencies: ["DependencyCalculator", @@ -29,25 +32,44 @@ let targets: [PackageDescription.Target] = [ "Git", "PathKit", "Yams", - .product(name: "ArgumentParser", package: "swift-argument-parser")]), + .product(name: "ArgumentParser", package: "swift-argument-parser")], + swiftSettings: flags, + ), .target(name: "DependencyCalculator", - dependencies: ["Workspace", "PathKit", "Git", .product(name: "Logging", package: "swift-log")]), + dependencies: ["Workspace", "PathKit", "Git", .product(name: "Logging", package: "swift-log")], + swiftSettings: flags, + ), .target(name: "TestConfigurator", - dependencies: ["Workspace", "PathKit", .product(name: "Logging", package: "swift-log")]), + dependencies: [ + "Workspace", + "PathKit", + .product(name: "Logging", package: "swift-log"), + .product(name: "ArgumentParser", package: "swift-argument-parser") + ], + swiftSettings: flags, + ), .target(name: "Workspace", - dependencies: ["XcodeProj", .product(name: "Logging", package: "swift-log")]), + dependencies: ["XcodeProj", .product(name: "Logging", package: "swift-log")], + swiftSettings: flags, + ), .target(name: "Git", - dependencies: ["SelectiveTestShell", "PathKit", .product(name: "Logging", package: "swift-log")]), - .target(name: "SelectiveTestShell"), + dependencies: ["SelectiveTestShell", "PathKit", .product(name: "Logging", package: "swift-log")], + swiftSettings: flags, + ), + .target(name: "SelectiveTestShell", + swiftSettings: flags, + ), .testTarget( name: "SelectiveTestingTests", dependencies: ["xcode-selective-test", "PathKit"], - resources: [.copy("ExampleProject")] + resources: [.copy("ExampleProject")], + swiftSettings: flags ), .testTarget( name: "DependencyCalculatorTests", dependencies: ["DependencyCalculator", "Workspace", "PathKit", "SelectiveTestingCore"], - resources: [.copy("ExamplePackages")] + resources: [.copy("ExamplePackages")], + swiftSettings: flags ), .plugin( name: "SelectiveTestingPlugin", diff --git a/Plugins/SelectiveTestingPlugin/SelectiveTestingPlugin.swift b/Plugins/SelectiveTestingPlugin/SelectiveTestingPlugin.swift index 7f0dc29..2a73c2d 100644 --- a/Plugins/SelectiveTestingPlugin/SelectiveTestingPlugin.swift +++ b/Plugins/SelectiveTestingPlugin/SelectiveTestingPlugin.swift @@ -48,19 +48,23 @@ struct SelectiveTestingPlugin: CommandPlugin { } if !toolArguments.contains(where: { $0 == "--test-plan" }) { - let testPlans = context.xcodeProject.filePaths.filter { - $0.extension == "xctestplan" + let allFiles = context.xcodeProject.targets.reduce([]) { partialResult, target in + partialResult + target.inputFiles + } + + let testPlans = allFiles.filter { + $0.url.pathExtension == "xctestplan" } if !testPlans.isEmpty { if testPlans.count == 1 { - print("Using \(testPlans[0].string) test plan") + print("Using \(testPlans[0].url.path()) test plan") } else { print("Using \(testPlans.count) test plans") } for testPlan in testPlans { - toolArguments.append(contentsOf: ["--test-plan", testPlan.string]) + toolArguments.append(contentsOf: ["--test-plan", testPlan.url.path()]) } } } diff --git a/Sources/Workspace/Target.swift b/Sources/Workspace/Target.swift index 0c59a4f..e3cca85 100644 --- a/Sources/Workspace/Target.swift +++ b/Sources/Workspace/Target.swift @@ -3,7 +3,7 @@ // import Foundation -import PathKit +@preconcurrency import PathKit import XcodeProj extension PBXNativeTarget { @@ -17,8 +17,8 @@ extension PBXNativeTarget { } } -public struct TargetIdentity: Hashable { - public enum TargetType { +public struct TargetIdentity: Hashable, Sendable { + public enum TargetType: Sendable { case project case package } From 85ccc6a66e5d51e3f5bb8657b46f7c622c13c7ef Mon Sep 17 00:00:00 2001 From: Mike Gerasymenko Date: Mon, 3 Nov 2025 22:47:53 +0100 Subject: [PATCH 2/2] Broaden CI matrix (#77) * Branch out test setups * Use macOS 26 image * Run CI on push * Xcode 26 --- .github/workflows/test.yml | 34 ++++++++++++++++++++++++++++------ Package.swift | 14 +++++++------- 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 82956c0..f831bcd 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -4,10 +4,10 @@ on: push: branches: [ "main" ] pull_request: - types: [opened, reopened] + types: [opened, reopened, synchronize] jobs: - test: + test-16-2: runs-on: macos-latest steps: - name: Set Xcode version @@ -16,12 +16,20 @@ jobs: - name: Run tests run: swift test -v - test-linux: - if: false - runs-on: ubuntu-22.04 + test-26: + runs-on: macos-26 + steps: + - name: Set Xcode version + run: sudo xcode-select -s /Applications/Xcode_26.0.app + - uses: actions/checkout@v3 + - name: Run tests + run: swift test -v + + test-linux-6-1: + runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: swift-actions/setup-swift@v2 + - uses: SwiftyLab/setup-swift@latest with: swift-version: "6.1.0" - name: Get swift version @@ -30,3 +38,17 @@ jobs: run: git config --global user.email "test@example.com" && git config --global user.name "Test User" - name: Run tests run: swift test -v + + test-linux-6-2: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: SwiftyLab/setup-swift@latest + with: + swift-version: "6.2.0" + - name: Get swift version + run: swift --version + - name: Prepare Git + run: git config --global user.email "test@example.com" && git config --global user.name "Test User" + - name: Run tests + run: swift test -v diff --git a/Package.swift b/Package.swift index 2f3f80b..397262d 100644 --- a/Package.swift +++ b/Package.swift @@ -33,11 +33,11 @@ let targets: [PackageDescription.Target] = [ "PathKit", "Yams", .product(name: "ArgumentParser", package: "swift-argument-parser")], - swiftSettings: flags, + swiftSettings: flags ), .target(name: "DependencyCalculator", dependencies: ["Workspace", "PathKit", "Git", .product(name: "Logging", package: "swift-log")], - swiftSettings: flags, + swiftSettings: flags ), .target(name: "TestConfigurator", dependencies: [ @@ -46,18 +46,18 @@ let targets: [PackageDescription.Target] = [ .product(name: "Logging", package: "swift-log"), .product(name: "ArgumentParser", package: "swift-argument-parser") ], - swiftSettings: flags, + swiftSettings: flags ), .target(name: "Workspace", dependencies: ["XcodeProj", .product(name: "Logging", package: "swift-log")], - swiftSettings: flags, + swiftSettings: flags ), .target(name: "Git", dependencies: ["SelectiveTestShell", "PathKit", .product(name: "Logging", package: "swift-log")], - swiftSettings: flags, + swiftSettings: flags ), .target(name: "SelectiveTestShell", - swiftSettings: flags, + swiftSettings: flags ), .testTarget( name: "SelectiveTestingTests", @@ -83,7 +83,7 @@ let targets: [PackageDescription.Target] = [ ] ), dependencies: ["xcode-selective-test"] - ), + ) ] let package = Package(