Skip to content

Commit 2381cd5

Browse files
authored
Merge pull request #21006 from Homebrew/progress-fixed-size-format
Use decimal prefixes for bytes, fix concurrent download progress output edge cases
2 parents 1874094 + 5675ea7 commit 2381cd5

File tree

3 files changed

+28
-26
lines changed

3 files changed

+28
-26
lines changed

Library/Homebrew/download_queue.rb

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -259,19 +259,21 @@ def message_with_progress(downloadable, future, message)
259259
tty_width = Tty.width
260260
return message unless tty_width.positive?
261261

262+
available_width = tty_width - 2
262263
fetched_size = downloadable.fetched_size
263-
return message if fetched_size.blank?
264+
return message[0, available_width].to_s if fetched_size.blank?
264265

266+
precision = 1
265267
size_length = 5
266268
unit_length = 2
267-
size_formatting_string = "%<size>#{size_length}.1f%<unit>#{unit_length}s"
268-
size, unit = disk_usage_readable_size_unit(fetched_size)
269+
size_formatting_string = "%<size>#{size_length}.#{precision}f%<unit>#{unit_length}s"
270+
size, unit = disk_usage_readable_size_unit(fetched_size, precision:)
269271
formatted_fetched_size = format(size_formatting_string, size:, unit:)
270272

271273
formatted_total_size = if future.fulfilled?
272274
formatted_fetched_size
273275
elsif (total_size = downloadable.total_size)
274-
size, unit = disk_usage_readable_size_unit(total_size)
276+
size, unit = disk_usage_readable_size_unit(total_size, precision:)
275277
format(size_formatting_string, size:, unit:)
276278
else
277279
# fill in the missing spaces for the size if we don't have it yet.
@@ -280,11 +282,11 @@ def message_with_progress(downloadable, future, message)
280282

281283
max_phase_length = 11
282284
phase = format("%-<phase>#{max_phase_length}s", phase: downloadable.phase.to_s.capitalize)
283-
progress = "#{formatted_fetched_size}/#{formatted_total_size}"
284-
additional_padding_length = max_phase_length + size_length + unit_length - 1
285-
message_length = tty_width - progress.length - additional_padding_length
285+
progress = " [#{phase} #{formatted_fetched_size}/#{formatted_total_size}]"
286+
message_length = available_width - progress.length
287+
return message[0, available_width].to_s unless message_length.positive?
286288

287-
"#{message[0, message_length].to_s.ljust(message_length)} [#{phase} #{progress}]"
289+
"#{message[0, message_length].to_s.ljust(message_length)}#{progress}"
288290
end
289291

290292
class Spinner

Library/Homebrew/extend/kernel.rb

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -204,20 +204,20 @@ def ensure_executable!(name, formula_name = nil, reason: "", latest: false)
204204
Formulary.factory_stub(formula_name).ensure_installed!(reason:, latest:).opt_bin/name
205205
end
206206

207-
sig { params(size_in_bytes: T.any(Integer, Float)).returns([T.any(Integer, Float), String]) }
208-
def disk_usage_readable_size_unit(size_in_bytes)
209-
if size_in_bytes.abs >= 1_073_741_824
210-
size = size_in_bytes.to_f / 1_073_741_824
211-
unit = "GB"
212-
elsif size_in_bytes.abs >= 1_048_576
213-
size = size_in_bytes.to_f / 1_048_576
214-
unit = "MB"
215-
elsif size_in_bytes.abs >= 1_024
216-
size = size_in_bytes.to_f / 1_024
217-
unit = "KB"
218-
else
219-
size = size_in_bytes
220-
unit = "B"
207+
sig {
208+
params(
209+
size_in_bytes: T.any(Integer, Float),
210+
precision: T.nilable(Integer),
211+
).returns([T.any(Integer, Float), String])
212+
}
213+
def disk_usage_readable_size_unit(size_in_bytes, precision: nil)
214+
size = size_in_bytes
215+
unit = "B"
216+
%w[KB MB GB].each do |next_unit|
217+
break if (precision ? size.abs.round(precision) : size.abs) < 1000
218+
219+
size /= 1000.0
220+
unit = next_unit
221221
end
222222
[size, unit]
223223
end

Library/Homebrew/test/extend/kernel_spec.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,11 @@
7171

7272
specify "#disk_usage_readable" do
7373
expect(disk_usage_readable(1)).to eq("1B")
74-
expect(disk_usage_readable(1000)).to eq("1000B")
75-
expect(disk_usage_readable(1024)).to eq("1KB")
74+
expect(disk_usage_readable(999)).to eq("999B")
75+
expect(disk_usage_readable(1000)).to eq("1KB")
7676
expect(disk_usage_readable(1025)).to eq("1KB")
77-
expect(disk_usage_readable(4_404_020)).to eq("4.2MB")
78-
expect(disk_usage_readable(4_509_715_660)).to eq("4.2GB")
77+
expect(disk_usage_readable(4_404_020)).to eq("4.4MB")
78+
expect(disk_usage_readable(4_509_715_660)).to eq("4.5GB")
7979
end
8080

8181
describe "#number_readable" do

0 commit comments

Comments
 (0)