From 4a08bb0daa52c3015029d46575ce684b54ffbf53 Mon Sep 17 00:00:00 2001 From: Dmitry Kovba Date: Mon, 30 Mar 2026 12:22:58 -0700 Subject: [PATCH] Ensure that the bar length never exceeds the remaining width (#1348) - Fixes a reported problem, caused by a race in progress events from the Containerization package reaching container. --- Sources/TerminalProgress/ProgressBar.swift | 2 +- Tests/TerminalProgressTests/ProgressBarTests.swift | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Sources/TerminalProgress/ProgressBar.swift b/Sources/TerminalProgress/ProgressBar.swift index 8928f078..b5d7acfd 100644 --- a/Sources/TerminalProgress/ProgressBar.swift +++ b/Sources/TerminalProgress/ProgressBar.swift @@ -235,7 +235,7 @@ extension ProgressBar { if config.showProgressBar, total > 0, allowProgress { let usedWidth = components.joined(separator: " ").count + 45 let remainingWidth = max(config.width - usedWidth, 1) - let barLength = state.finished ? remainingWidth : Int(Int64(remainingWidth) * value / total) + let barLength = min(remainingWidth, state.finished ? remainingWidth : Int(Int64(remainingWidth) * value / total)) let barPaddingLength = remainingWidth - barLength let bar = "\(String(repeating: config.theme.bar, count: barLength))\(String(repeating: " ", count: barPaddingLength))" components.append("|\(bar)|") diff --git a/Tests/TerminalProgressTests/ProgressBarTests.swift b/Tests/TerminalProgressTests/ProgressBarTests.swift index 7232abf8..ea470d1f 100644 --- a/Tests/TerminalProgressTests/ProgressBarTests.swift +++ b/Tests/TerminalProgressTests/ProgressBarTests.swift @@ -738,6 +738,17 @@ final class ProgressBarTests: XCTestCase { XCTAssertEqual(output, "⠋ Task [0s]") } + func testProgressBarSizeExceedsTotal() async throws { + let config = try ProgressConfig( + description: "Task", + showProgressBar: true, + totalSize: 50 + ) + let progress = ProgressBar(config: config) + progress.set(size: 100) + let _ = progress.draw() + } + func testItemsName() async throws { let config = try ProgressConfig( description: "Task",