Skip to content

Commit a29d2c6

Browse files
authored
Enable strict concurrency (#76)
* Enable strict concurrency * Broaden CI matrix (#77) * Branch out test setups * Use macOS 26 image * Run CI on push * Xcode 26
1 parent b16aac0 commit a29d2c6

File tree

4 files changed

+71
-23
lines changed

4 files changed

+71
-23
lines changed

.github/workflows/test.yml

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ on:
44
push:
55
branches: [ "main" ]
66
pull_request:
7-
types: [opened, reopened]
7+
types: [opened, reopened, synchronize]
88

99
jobs:
10-
test:
10+
test-16-2:
1111
runs-on: macos-latest
1212
steps:
1313
- name: Set Xcode version
@@ -16,12 +16,20 @@ jobs:
1616
- name: Run tests
1717
run: swift test -v
1818

19-
test-linux:
20-
if: false
21-
runs-on: ubuntu-22.04
19+
test-26:
20+
runs-on: macos-26
21+
steps:
22+
- name: Set Xcode version
23+
run: sudo xcode-select -s /Applications/Xcode_26.0.app
24+
- uses: actions/checkout@v3
25+
- name: Run tests
26+
run: swift test -v
27+
28+
test-linux-6-1:
29+
runs-on: ubuntu-latest
2230
steps:
2331
- uses: actions/checkout@v3
24-
- uses: swift-actions/setup-swift@v2
32+
- uses: SwiftyLab/setup-swift@latest
2533
with:
2634
swift-version: "6.1.0"
2735
- name: Get swift version
@@ -30,3 +38,17 @@ jobs:
3038
run: git config --global user.email "test@example.com" && git config --global user.name "Test User"
3139
- name: Run tests
3240
run: swift test -v
41+
42+
test-linux-6-2:
43+
runs-on: ubuntu-latest
44+
steps:
45+
- uses: actions/checkout@v3
46+
- uses: SwiftyLab/setup-swift@latest
47+
with:
48+
swift-version: "6.2.0"
49+
- name: Get swift version
50+
run: swift --version
51+
- name: Prepare Git
52+
run: git config --global user.email "test@example.com" && git config --global user.name "Test User"
53+
- name: Run tests
54+
run: swift test -v

Package.swift

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,37 +17,59 @@ let products: [PackageDescription.Product] = [
1717
)
1818
]
1919

20+
let flags: [PackageDescription.SwiftSetting] = [.enableExperimentalFeature("StrictConcurrency")]
21+
2022
let targets: [PackageDescription.Target] = [
2123
.executableTarget(
2224
name: "xcode-selective-test",
2325
dependencies: ["SelectiveTestingCore",
24-
.product(name: "ArgumentParser", package: "swift-argument-parser")]
26+
.product(name: "ArgumentParser", package: "swift-argument-parser")],
27+
swiftSettings: flags
2528
),
2629
.target(name: "SelectiveTestingCore",
2730
dependencies: ["DependencyCalculator",
2831
"TestConfigurator",
2932
"Git",
3033
"PathKit",
3134
"Yams",
32-
.product(name: "ArgumentParser", package: "swift-argument-parser")]),
35+
.product(name: "ArgumentParser", package: "swift-argument-parser")],
36+
swiftSettings: flags
37+
),
3338
.target(name: "DependencyCalculator",
34-
dependencies: ["Workspace", "PathKit", "Git", .product(name: "Logging", package: "swift-log")]),
39+
dependencies: ["Workspace", "PathKit", "Git", .product(name: "Logging", package: "swift-log")],
40+
swiftSettings: flags
41+
),
3542
.target(name: "TestConfigurator",
36-
dependencies: ["Workspace", "PathKit", .product(name: "Logging", package: "swift-log")]),
43+
dependencies: [
44+
"Workspace",
45+
"PathKit",
46+
.product(name: "Logging", package: "swift-log"),
47+
.product(name: "ArgumentParser", package: "swift-argument-parser")
48+
],
49+
swiftSettings: flags
50+
),
3751
.target(name: "Workspace",
38-
dependencies: ["XcodeProj", .product(name: "Logging", package: "swift-log")]),
52+
dependencies: ["XcodeProj", .product(name: "Logging", package: "swift-log")],
53+
swiftSettings: flags
54+
),
3955
.target(name: "Git",
40-
dependencies: ["SelectiveTestShell", "PathKit", .product(name: "Logging", package: "swift-log")]),
41-
.target(name: "SelectiveTestShell"),
56+
dependencies: ["SelectiveTestShell", "PathKit", .product(name: "Logging", package: "swift-log")],
57+
swiftSettings: flags
58+
),
59+
.target(name: "SelectiveTestShell",
60+
swiftSettings: flags
61+
),
4262
.testTarget(
4363
name: "SelectiveTestingTests",
4464
dependencies: ["xcode-selective-test", "PathKit"],
45-
resources: [.copy("ExampleProject")]
65+
resources: [.copy("ExampleProject")],
66+
swiftSettings: flags
4667
),
4768
.testTarget(
4869
name: "DependencyCalculatorTests",
4970
dependencies: ["DependencyCalculator", "Workspace", "PathKit", "SelectiveTestingCore"],
50-
resources: [.copy("ExamplePackages")]
71+
resources: [.copy("ExamplePackages")],
72+
swiftSettings: flags
5173
),
5274
.plugin(
5375
name: "SelectiveTestingPlugin",
@@ -61,7 +83,7 @@ let targets: [PackageDescription.Target] = [
6183
]
6284
),
6385
dependencies: ["xcode-selective-test"]
64-
),
86+
)
6587
]
6688

6789
let package = Package(

Plugins/SelectiveTestingPlugin/SelectiveTestingPlugin.swift

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,19 +48,23 @@ struct SelectiveTestingPlugin: CommandPlugin {
4848
}
4949

5050
if !toolArguments.contains(where: { $0 == "--test-plan" }) {
51-
let testPlans = context.xcodeProject.filePaths.filter {
52-
$0.extension == "xctestplan"
51+
let allFiles = context.xcodeProject.targets.reduce([]) { partialResult, target in
52+
partialResult + target.inputFiles
53+
}
54+
55+
let testPlans = allFiles.filter {
56+
$0.url.pathExtension == "xctestplan"
5357
}
5458

5559
if !testPlans.isEmpty {
5660
if testPlans.count == 1 {
57-
print("Using \(testPlans[0].string) test plan")
61+
print("Using \(testPlans[0].url.path()) test plan")
5862
} else {
5963
print("Using \(testPlans.count) test plans")
6064
}
6165

6266
for testPlan in testPlans {
63-
toolArguments.append(contentsOf: ["--test-plan", testPlan.string])
67+
toolArguments.append(contentsOf: ["--test-plan", testPlan.url.path()])
6468
}
6569
}
6670
}

Sources/Workspace/Target.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
//
44

55
import Foundation
6-
import PathKit
6+
@preconcurrency import PathKit
77
import XcodeProj
88

99
extension PBXNativeTarget {
@@ -17,8 +17,8 @@ extension PBXNativeTarget {
1717
}
1818
}
1919

20-
public struct TargetIdentity: Hashable {
21-
public enum TargetType {
20+
public struct TargetIdentity: Hashable, Sendable {
21+
public enum TargetType: Sendable {
2222
case project
2323
case package
2424
}

0 commit comments

Comments
 (0)