Skip to content

Commit 2821ae5

Browse files
authored
refactor stream handling (#3729)
motivation: consolidate and clarify which output stream is used throught the code changes: * reanme all local variables called "stdoutStream" to "outputStream" to differenciate with the global stdoutStream from TSC * audit code for use of stdoutStream and replace with a configurable outputStream so that we can centraliy control the output * clean up diagnostics print code
1 parent 9180312 commit 2821ae5

File tree

19 files changed

+257
-286
lines changed

19 files changed

+257
-286
lines changed

Sources/Build/BuildOperation.swift

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ public final class BuildOperation: PackageStructureDelegate, SPMBuildCore.BuildS
5252
/// The loaded package graph.
5353
private var packageGraph: PackageGraph?
5454

55-
/// The stdout stream for the build delegate.
56-
let stdoutStream: OutputByteStream
55+
/// The output stream for the build delegate.
56+
let outputStream: OutputByteStream
5757

5858
public var builtTestProducts: [BuiltTestProduct] {
5959
(try? getBuildDescription())?.builtTestProducts ?? []
@@ -65,14 +65,14 @@ public final class BuildOperation: PackageStructureDelegate, SPMBuildCore.BuildS
6565
packageGraphLoader: @escaping () throws -> PackageGraph,
6666
pluginInvoker: @escaping (PackageGraph) throws -> [ResolvedTarget: [PluginInvocationResult]],
6767
diagnostics: DiagnosticsEngine,
68-
stdoutStream: OutputByteStream
68+
outputStream: OutputByteStream
6969
) {
7070
self.buildParameters = buildParameters
7171
self.cacheBuildManifest = cacheBuildManifest
7272
self.packageGraphLoader = packageGraphLoader
7373
self.pluginInvoker = pluginInvoker
7474
self.diagnostics = diagnostics
75-
self.stdoutStream = stdoutStream
75+
self.outputStream = outputStream
7676
}
7777

7878
public func getPackageGraph() throws -> PackageGraph {
@@ -121,7 +121,8 @@ public final class BuildOperation: PackageStructureDelegate, SPMBuildCore.BuildS
121121
/// Perform a build using the given build description and subset.
122122
public func build(subset: BuildSubset) throws {
123123
// Create the build system.
124-
let buildSystem = try createBuildSystem(with: getBuildDescription())
124+
let buildDescription = try self.getBuildDescription()
125+
let buildSystem = try createBuildSystem(with: buildDescription)
125126
self.buildSystem = buildSystem
126127

127128
// Perform the build.
@@ -194,9 +195,21 @@ public final class BuildOperation: PackageStructureDelegate, SPMBuildCore.BuildS
194195
diagnostics: diagnostics
195196
)
196197
self.buildPlan = plan
198+
199+
let (buildDescription, buildManifest) = try BuildDescription.create(with: plan)
200+
201+
// FIXME: ideally this would be done outside of the planning phase,
202+
// but it would require deeper changes in how we serialize BuildDescription
203+
// Output a dot graph
204+
if buildParameters.printManifestGraphviz {
205+
// FIXME: this seems like the wrong place to print
206+
var serializer = DOTManifestSerializer(manifest: buildManifest)
207+
serializer.writeDOT(to: self.outputStream)
208+
self.outputStream.flush()
209+
}
197210

198211
// Finally create the llbuild manifest from the plan.
199-
return try BuildDescription.create(with: plan)
212+
return buildDescription
200213
}
201214

202215
/// Build the package structure target.
@@ -220,8 +233,8 @@ public final class BuildOperation: PackageStructureDelegate, SPMBuildCore.BuildS
220233
// Figure out which progress bar we have to use during the build.
221234
let isVerbose = verbosity != .concise
222235
let progressAnimation: ProgressAnimationProtocol = isVerbose
223-
? MultiLineNinjaProgressAnimation(stream: self.stdoutStream)
224-
: NinjaProgressAnimation(stream: self.stdoutStream)
236+
? MultiLineNinjaProgressAnimation(stream: self.outputStream)
237+
: NinjaProgressAnimation(stream: self.outputStream)
225238

226239
let bctx = BuildExecutionContext(
227240
buildParameters,
@@ -235,7 +248,7 @@ public final class BuildOperation: PackageStructureDelegate, SPMBuildCore.BuildS
235248
buildSystem: self,
236249
bctx: bctx,
237250
diagnostics: diagnostics,
238-
outputStream: self.stdoutStream,
251+
outputStream: self.outputStream,
239252
progressAnimation: progressAnimation,
240253
delegate: self.delegate
241254
)
@@ -294,10 +307,10 @@ public final class BuildOperation: PackageStructureDelegate, SPMBuildCore.BuildS
294307
}
295308

296309
extension BuildDescription {
297-
static func create(with plan: BuildPlan) throws -> BuildDescription {
310+
static func create(with plan: BuildPlan) throws -> (BuildDescription, BuildManifest) {
298311
// Generate the llbuild manifest.
299312
let llbuild = LLBuildManifestBuilder(plan)
300-
try llbuild.generateManifest(at: plan.buildParameters.llbuildManifest)
313+
let buildManifest = try llbuild.generateManifest(at: plan.buildParameters.llbuildManifest)
301314

302315
let swiftCommands = llbuild.manifest.getCmdToolMap(kind: SwiftCompilerTool.self)
303316
let swiftFrontendCommands = llbuild.manifest.getCmdToolMap(kind: SwiftFrontendTool.self)
@@ -317,7 +330,7 @@ extension BuildDescription {
317330
recursive: true
318331
)
319332
try buildDescription.write(to: plan.buildParameters.buildDescriptionPath)
320-
return buildDescription
333+
return (buildDescription, buildManifest)
321334
}
322335
}
323336

Sources/Build/BuildPlan.swift

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,6 @@ extension BuildParameters {
3535
return buildPath.appending(component: "ModuleCache")
3636
}
3737

38-
/// Checks if stdout stream is tty.
39-
fileprivate static var isTTY: Bool = {
40-
guard let stream = stdoutStream.stream as? LocalFileOutputByteStream else {
41-
return false
42-
}
43-
return TerminalController.isTTY(stream)
44-
}()
45-
4638
/// Extra flags to pass to Swift compiler.
4739
public var swiftCompilerFlags: [String] {
4840
var flags = self.flags.cCompilerFlags.flatMap({ ["-Xcc", $0] })
@@ -779,7 +771,7 @@ public final class SwiftTargetBuildDescription {
779771
}
780772

781773
// Add arguments to colorize output if stdout is tty
782-
if BuildParameters.isTTY {
774+
if buildParameters.isTTY {
783775
args += ["-color-diagnostics"]
784776
}
785777

Sources/Build/ManifestBuilder.swift

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public class LLBuildManifestBuilder {
4949

5050
// MARK:- Generate Manifest
5151
/// Generate manifest at the given path.
52-
public func generateManifest(at path: AbsolutePath) throws {
52+
public func generateManifest(at path: AbsolutePath) throws -> BuildManifest {
5353
manifest.createTarget(TargetKind.main.targetName)
5454
manifest.createTarget(TargetKind.test.targetName)
5555
manifest.defaultTarget = TargetKind.main.targetName
@@ -82,14 +82,8 @@ public class LLBuildManifestBuilder {
8282
try self.createProductCommand(description)
8383
}
8484

85-
// Output a dot graph
86-
if buildParameters.printManifestGraphviz {
87-
var serializer = DOTManifestSerializer(manifest: manifest)
88-
serializer.writeDOT(to: &stdoutStream)
89-
stdoutStream.flush()
90-
}
91-
9285
try ManifestWriter().write(manifest, at: path)
86+
return manifest
9387
}
9488

9589
func addNode(_ node: Node, toTarget targetKind: TargetKind) {

Sources/Commands/APIDigester.swift

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,12 @@ struct APIDigesterBaselineDumper {
5454
}
5555

5656
/// Emit the API baseline files and return the path to their directory.
57-
func emitAPIBaseline(for modulesToDiff: Set<String>,
58-
at baselineDir: AbsolutePath?,
59-
force: Bool) throws -> AbsolutePath {
57+
func emitAPIBaseline(
58+
for modulesToDiff: Set<String>,
59+
at baselineDir: AbsolutePath?,
60+
force: Bool,
61+
outputStream: OutputByteStream
62+
) throws -> AbsolutePath {
6063
var modulesToDiff = modulesToDiff
6164
let apiDiffDir = inputBuildParameters.apiDiff
6265
let baselineDir = (baselineDir ?? apiDiffDir).appending(component: baselineRevision.identifier)
@@ -121,7 +124,7 @@ struct APIDigesterBaselineDumper {
121124
packageGraphLoader: { graph },
122125
pluginInvoker: { _ in [:] },
123126
diagnostics: diags,
124-
stdoutStream: stdoutStream
127+
outputStream: outputStream
125128
)
126129

127130
try buildOp.build()

Sources/Commands/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
add_library(Commands
1010
APIDigester.swift
1111
Describe.swift
12-
Error.swift
1312
GenerateLinuxMain.swift
1413
MultiRootSupport.swift
1514
Options.swift

Sources/Commands/Error.swift

Lines changed: 0 additions & 115 deletions
This file was deleted.

Sources/Commands/Snippets/CardStack.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ struct CardStack {
3535
private var needsToClearScreen = true
3636

3737
init(package: ResolvedPackage, snippetGroups: [SnippetGroup], swiftTool: SwiftTool) {
38-
self.terminal = TerminalController(stream: stdoutStream)!
38+
self.terminal = TerminalController(stream: swiftTool.outputStream)!
3939
self.cards = [TopCard(package: package, snippetGroups: snippetGroups, swiftTool: swiftTool)]
4040
self.swiftTool = swiftTool
4141
}

0 commit comments

Comments
 (0)