Skip to content

Commit 4e0e12c

Browse files
committed
Only log build settings once unless they change
This makes the logs a lot less spammy.
1 parent 139b69a commit 4e0e12c

File tree

1 file changed

+53
-36
lines changed

1 file changed

+53
-36
lines changed

Sources/SKCore/BuildSystemManager.swift

Lines changed: 53 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -72,25 +72,6 @@ public actor BuildSystemManager {
7272
}
7373
}
7474

75-
/// Splits `message` on newline characters such that each chunk is at most `maxChunkSize` bytes long.
76-
///
77-
/// The intended use case for this is to split compiler arguments into multiple chunks so that each chunk doesn't exceed
78-
/// the maximum message length of `os_log` and thus won't get truncated.
79-
///
80-
/// - Note: This will only split along newline boundary. If a single line is longer than `maxChunkSize`, it won't be
81-
/// split. This is fine for compiler argument splitting since a single argument is rarely longer than 800 characters.
82-
private func splitLongMultilineMessage(message: String, maxChunkSize: Int) -> [String] {
83-
var chunks: [String] = []
84-
for line in message.split(separator: "\n", omittingEmptySubsequences: false) {
85-
if let lastChunk = chunks.last, lastChunk.utf8.count + line.utf8.count < maxChunkSize {
86-
chunks[chunks.count - 1] += "\n" + line
87-
} else {
88-
chunks.append(String(line))
89-
}
90-
}
91-
return chunks
92-
}
93-
9475
extension BuildSystemManager {
9576
public var delegate: BuildSystemDelegate? {
9677
get { _delegate }
@@ -160,23 +141,7 @@ extension BuildSystemManager {
160141
// to reference `document` instead of `mainFile`.
161142
settings = settings.patching(newFile: document.pseudoPath, originalFile: mainFile.pseudoPath)
162143
}
163-
let log = """
164-
Compiler Arguments:
165-
\(settings.compilerArguments.joined(separator: "\n"))
166-
167-
Working directory:
168-
\(settings.workingDirectory ?? "<nil>")
169-
"""
170-
171-
let chunks = splitLongMultilineMessage(message: log, maxChunkSize: 800)
172-
for (index, chunk) in chunks.enumerated() {
173-
logger.log(
174-
"""
175-
Build settings for \(document.forLogging) (\(index + 1)/\(chunks.count))
176-
\(chunk)
177-
"""
178-
)
179-
}
144+
await BuildSettingsLogger.shared.log(settings: settings, for: document)
180145
return settings
181146
}
182147

@@ -334,3 +299,55 @@ extension BuildSystemManager {
334299
return self.watchedFiles[uri]?.mainFile
335300
}
336301
}
302+
303+
// MARK: - Build settings logger
304+
305+
/// Shared logger that only logs build settings for a file once unless they change
306+
fileprivate actor BuildSettingsLogger {
307+
static let shared = BuildSettingsLogger()
308+
309+
private var loggedSettings: [DocumentURI: FileBuildSettings] = [:]
310+
311+
func log(settings: FileBuildSettings, for uri: DocumentURI) {
312+
guard loggedSettings[uri] != settings else {
313+
return
314+
}
315+
loggedSettings[uri] = settings
316+
let log = """
317+
Compiler Arguments:
318+
\(settings.compilerArguments.joined(separator: "\n"))
319+
320+
Working directory:
321+
\(settings.workingDirectory ?? "<nil>")
322+
"""
323+
324+
let chunks = splitLongMultilineMessage(message: log, maxChunkSize: 800)
325+
for (index, chunk) in chunks.enumerated() {
326+
logger.log(
327+
"""
328+
Build settings for \(uri.forLogging) (\(index + 1)/\(chunks.count))
329+
\(chunk)
330+
"""
331+
)
332+
}
333+
}
334+
335+
/// Splits `message` on newline characters such that each chunk is at most `maxChunkSize` bytes long.
336+
///
337+
/// The intended use case for this is to split compiler arguments into multiple chunks so that each chunk doesn't exceed
338+
/// the maximum message length of `os_log` and thus won't get truncated.
339+
///
340+
/// - Note: This will only split along newline boundary. If a single line is longer than `maxChunkSize`, it won't be
341+
/// split. This is fine for compiler argument splitting since a single argument is rarely longer than 800 characters.
342+
private func splitLongMultilineMessage(message: String, maxChunkSize: Int) -> [String] {
343+
var chunks: [String] = []
344+
for line in message.split(separator: "\n", omittingEmptySubsequences: false) {
345+
if let lastChunk = chunks.last, lastChunk.utf8.count + line.utf8.count < maxChunkSize {
346+
chunks[chunks.count - 1] += "\n" + line
347+
} else {
348+
chunks.append(String(line))
349+
}
350+
}
351+
return chunks
352+
}
353+
}

0 commit comments

Comments
 (0)