Skip to content
Closed
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
34 changes: 28 additions & 6 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
21 changes: 11 additions & 10 deletions Package.resolved

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

49 changes: 34 additions & 15 deletions Package.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// swift-tools-version: 5.6
// swift-tools-version: 6.0

import PackageDescription

Expand All @@ -17,40 +17,59 @@ 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",
"TestConfigurator",
"Git",
"PathKit",
"Rainbow",
"Yams",
.product(name: "ArgumentParser", package: "swift-argument-parser")]),
.product(name: "ArgumentParser", package: "swift-argument-parser")],
swiftSettings: flags
),
.target(name: "DependencyCalculator",
dependencies: ["Workspace", "PathKit", "SelectiveTestLogger", "Git"]),
dependencies: ["Workspace", "PathKit", "Git", .product(name: "Logging", package: "swift-log")],
swiftSettings: flags
),
.target(name: "TestConfigurator",
dependencies: ["Workspace", "PathKit", "SelectiveTestLogger"]),
dependencies: [
"Workspace",
"PathKit",
.product(name: "Logging", package: "swift-log"),
.product(name: "ArgumentParser", package: "swift-argument-parser")
],
swiftSettings: flags
),
.target(name: "Workspace",
dependencies: ["XcodeProj", "SelectiveTestLogger"]),
dependencies: ["XcodeProj", .product(name: "Logging", package: "swift-log")],
swiftSettings: flags
),
.target(name: "Git",
dependencies: ["SelectiveTestShell", "SelectiveTestLogger", "PathKit"]),
.target(name: "SelectiveTestLogger",
dependencies: ["Rainbow"]),
.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",
Expand All @@ -64,7 +83,7 @@ let targets: [PackageDescription.Target] = [
]
),
dependencies: ["xcode-selective-test"]
),
)
]

let package = Package(
Expand All @@ -77,8 +96,8 @@ let package = Package(
.package(url: "https://github.com/tuist/XcodeProj.git", .upToNextMajor(from: "9.0.2")),
.package(url: "https://github.com/apple/swift-argument-parser.git", .upToNextMajor(from: "1.2.0")),
.package(url: "https://github.com/kylef/PathKit.git", .upToNextMinor(from: "1.0.0")),
.package(url: "https://github.com/onevcat/Rainbow", .upToNextMajor(from: "4.0.0")),
.package(url: "https://github.com/jpsim/Yams.git", from: "5.0.5"),
.package(url: "https://github.com/apple/swift-log", from: "1.6.0")
],
targets: targets
)
25 changes: 14 additions & 11 deletions Plugins/SelectiveTestingPlugin/SelectiveTestingPlugin.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,10 @@ import PackagePlugin

@main
struct SelectiveTestingPlugin: CommandPlugin {
private func run(_ executable: String, arguments: [String] = []) throws {
let executableURL = URL(fileURLWithPath: executable)
private func run(_ executable: URL, arguments: [String] = []) throws {

let process = Process()
process.executableURL = executableURL
process.executableURL = executable
process.arguments = arguments

try process.run()
Expand All @@ -24,10 +23,10 @@ struct SelectiveTestingPlugin: CommandPlugin {
}

func performCommand(context: PluginContext, arguments: [String]) async throws {
FileManager().changeCurrentDirectoryPath(context.package.directory.string)
FileManager.default.changeCurrentDirectoryPath(context.package.directoryURL.path)
let tool = try context.tool(named: "xcode-selective-test")

try run(tool.path.string, arguments: arguments)
try run(tool.url, arguments: arguments)
}
}

Expand All @@ -36,7 +35,7 @@ struct SelectiveTestingPlugin: CommandPlugin {

extension SelectiveTestingPlugin: XcodeCommandPlugin {
func performCommand(context: XcodePluginContext, arguments: [String]) throws {
FileManager().changeCurrentDirectoryPath(context.xcodeProject.directory.string)
FileManager.default.changeCurrentDirectoryPath(context.xcodeProject.directoryURL.path)

let tool = try context.tool(named: "xcode-selective-test")

Expand All @@ -49,24 +48,28 @@ 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()])
}
}
}

try run(tool.path.string, arguments: toolArguments)
try run(tool.url, arguments: toolArguments)
}
}
#endif
Expand Down
6 changes: 3 additions & 3 deletions Sources/DependencyCalculator/ConcurrentMap.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

import Foundation

final class ThreadSafe<A> {
final class ThreadSafe<A: Sendable>: @unchecked Sendable {
private var _value: A
private let queue = DispatchQueue(label: "ThreadSafe")
init(_ value: A) {
Expand All @@ -22,8 +22,8 @@ final class ThreadSafe<A> {
}
}

extension Array {
func concurrentMap<B>(_ transform: @escaping (Element) -> B) -> [B] {
extension Array where Element: Sendable {
func concurrentMap<B: Sendable>(_ transform: @escaping @Sendable (Element) -> B) -> [B] {
let result = ThreadSafe([B?](repeating: nil, count: count))
DispatchQueue.concurrentPerform(iterations: count) { idx in
let element = self[idx]
Expand Down
4 changes: 2 additions & 2 deletions Sources/DependencyCalculator/DependencyCalculator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

import Foundation
import PathKit
import SelectiveTestLogger
import Logging
import Workspace

public extension WorkspaceInfo {
Expand All @@ -18,7 +18,7 @@ public extension WorkspaceInfo {
} else if let targetFromFolder = targetForFolder(path) {
result.insert(targetFromFolder)
} else {
Logger.message("Changed file at \(path) appears not to belong to any target")
logger.info("Changed file at \(path) appears not to belong to any target")
}
}
if incldueIndirectlyAffected {
Expand Down
Loading