Skip to content

Commit 6bffad0

Browse files
authored
Add createBuildDescription command to the service console (#866)
This is equivalent to the existing `build` command except that it creates the underlying build operation using `createBuildOperationForBuildDescriptionOnly`.
1 parent 8eced69 commit 6bffad0

File tree

2 files changed

+40
-3
lines changed

2 files changed

+40
-3
lines changed

Sources/SwiftBuild/ConsoleCommands/SWBServiceConsoleBuildCommand.swift

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,24 @@ import Foundation
1515
import SWBProtocol
1616
import SWBUtil
1717

18+
typealias ExecuteOperation = (_ startInfo: SwiftBuildMessage.BuildStartedInfo, _ session: SWBBuildServiceSession, _ sessionCreationDiagnostics: [SwiftBuildMessage.DiagnosticInfo], _ request: SWBBuildRequest) async -> SWBCommandResult
19+
20+
class SWBServiceConsoleCreateBuildDescriptionCommand: SWBServiceConsoleCommand {
21+
static let name = "createBuildDescription"
22+
23+
static func usage() -> String {
24+
return name + " [options] <container-path>"
25+
}
26+
27+
static func validate(invocation: SWBServiceConsoleCommandInvocation) -> SWBServiceConsoleError? {
28+
return nil
29+
}
30+
31+
static func perform(invocation: SWBServiceConsoleCommandInvocation) async -> SWBCommandResult {
32+
return await SWBServiceConsoleBuildCommand.perform(invocation: invocation, operationFunc: generateBuildDescription)
33+
}
34+
}
35+
1836
class SWBServiceConsoleBuildCommand: SWBServiceConsoleCommand {
1937
static let name = "build"
2038

@@ -27,6 +45,10 @@ class SWBServiceConsoleBuildCommand: SWBServiceConsoleCommand {
2745
}
2846

2947
static func perform(invocation: SWBServiceConsoleCommandInvocation) async -> SWBCommandResult {
48+
return await Self.perform(invocation: invocation, operationFunc: doBuildOperation)
49+
}
50+
51+
static func perform(invocation: SWBServiceConsoleCommandInvocation, operationFunc: ExecuteOperation) async -> SWBCommandResult {
3052
// Parse the arguments.
3153
var positionalArgs = [String]()
3254
var configuredTargetNames = [String]()
@@ -187,7 +209,7 @@ class SWBServiceConsoleBuildCommand: SWBServiceConsoleCommand {
187209
return .failure(.failedCommandError(description: error.localizedDescription))
188210
}
189211

190-
return await doBuildOperation(startInfo: .init(baseDirectory: baseDirectory, derivedDataPath: absoluteDerivedDataPath), session: session, sessionCreationDiagnostics: diagnostics, request: request)
212+
return await operationFunc(.init(baseDirectory: baseDirectory, derivedDataPath: absoluteDerivedDataPath), session, diagnostics, request)
191213
}
192214
}
193215
}
@@ -370,7 +392,19 @@ extension SWBBuildService {
370392
}
371393
}
372394

395+
fileprivate func generateBuildDescription(startInfo: SwiftBuildMessage.BuildStartedInfo, session: SWBBuildServiceSession, sessionCreationDiagnostics: [SwiftBuildMessage.DiagnosticInfo], request: SWBBuildRequest) async -> SWBCommandResult {
396+
await runBuildOperation(startInfo: startInfo, session: session, sessionCreationDiagnostics: sessionCreationDiagnostics, request: request) {
397+
return try await session.createBuildOperationForBuildDescriptionOnly(request: request, delegate: PlanningOperationDelegate())
398+
}
399+
}
400+
373401
fileprivate func doBuildOperation(startInfo: SwiftBuildMessage.BuildStartedInfo, session: SWBBuildServiceSession, sessionCreationDiagnostics: [SwiftBuildMessage.DiagnosticInfo], request: SWBBuildRequest) async -> SWBCommandResult {
402+
await runBuildOperation(startInfo: startInfo, session: session, sessionCreationDiagnostics: sessionCreationDiagnostics, request: request) {
403+
return try await session.createBuildOperation(request: request, delegate: PlanningOperationDelegate())
404+
}
405+
}
406+
407+
fileprivate func runBuildOperation(startInfo: SwiftBuildMessage.BuildStartedInfo, session: SWBBuildServiceSession, sessionCreationDiagnostics: [SwiftBuildMessage.DiagnosticInfo], request: SWBBuildRequest, createOperation: () async throws -> SWBBuildOperation) async -> SWBCommandResult {
374408
let systemInfo: SWBSystemInfo
375409
do {
376410
systemInfo = try .default()
@@ -409,7 +443,7 @@ fileprivate func doBuildOperation(startInfo: SwiftBuildMessage.BuildStartedInfo,
409443

410444
// Start a build operation. We set ourself as the delegate, so we will hear about output and completion.
411445
do {
412-
let operation = try await session.createBuildOperation(request: request, delegate: PlanningOperationDelegate())
446+
let operation = try await createOperation()
413447
for try await event in try await operation.start() {
414448
switch event {
415449
case .buildStarted:
@@ -463,7 +497,8 @@ private final class PlanningOperationDelegate: SWBPlanningOperationDelegate, Sen
463497
func registerBuildCommands() {
464498
for commandClass in ([
465499
SWBServiceConsoleBuildCommand.self,
466-
SWBServiceConsolePrepareForIndexCommand.self
500+
SWBServiceConsolePrepareForIndexCommand.self,
501+
SWBServiceConsoleCreateBuildDescriptionCommand.self,
467502
] as [any SWBServiceConsoleCommand.Type]) { SWBServiceConsoleCommandRegistry.registerCommandClass(commandClass) }
468503
}
469504

Tests/SwiftBuildTests/ConsoleCommands/GeneralCommandsTests.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ fileprivate struct GeneralCommandsTests {
6969
build\r
7070
clang-scan\r
7171
clearAllCaches\r
72+
createBuildDescription\r
7273
createSession\r
7374
createXCFramework\r
7475
deleteSession\r
@@ -131,6 +132,7 @@ fileprivate struct GeneralCommandsTests {
131132
"build",
132133
"clang-scan",
133134
"clearAllCaches",
135+
"createBuildDescription",
134136
"createSession",
135137
"createXCFramework",
136138
"deleteSession",

0 commit comments

Comments
 (0)