Merge pull request #19194 from Homebrew/concurrent-downloads-full-height

Use full terminal height for concurrent output.
This commit is contained in:
Mike McQuaid 2025-02-03 10:08:32 +00:00 committed by GitHub
commit f66edcd636
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 18 additions and 8 deletions

View File

@ -240,7 +240,7 @@ module Homebrew
$stdout.print Tty.hide_cursor $stdout.print Tty.hide_cursor
$stdout.flush $stdout.flush
output_message = lambda do |downloadable, future| output_message = lambda do |downloadable, future, last|
status = case future.state status = case future.state
when :fulfilled when :fulfilled
"#{Tty.green}✔︎#{Tty.reset}" "#{Tty.green}✔︎#{Tty.reset}"
@ -253,7 +253,7 @@ module Homebrew
end end
message = "#{downloadable.download_type.capitalize} #{downloadable.name}" message = "#{downloadable.download_type.capitalize} #{downloadable.name}"
$stdout.puts "#{status} #{message}" $stdout.print "#{status} #{message}#{"\n" unless last}"
$stdout.flush $stdout.flush
if future.rejected? && (e = future.reason).is_a?(ChecksumMismatchError) if future.rejected? && (e = future.reason).is_a?(ChecksumMismatchError)
@ -277,21 +277,26 @@ module Homebrew
previous_pending_line_count -= 1 previous_pending_line_count -= 1
$stdout.print Tty.clear_to_end $stdout.print Tty.clear_to_end
$stdout.flush $stdout.flush
output_message.call(downloadable, future) output_message.call(downloadable, future, false)
end end
previous_pending_line_count = 0 previous_pending_line_count = 0
remaining_downloads.each do |downloadable, future| max_lines = [concurrency, Tty.height].min
# FIXME: Allow printing full terminal height. remaining_downloads.each_with_index do |(downloadable, future), i|
break if previous_pending_line_count >= [concurrency, (Tty.height - 1)].min break if previous_pending_line_count >= max_lines
$stdout.print Tty.clear_to_end $stdout.print Tty.clear_to_end
$stdout.flush $stdout.flush
previous_pending_line_count += output_message.call(downloadable, future) last = i == max_lines - 1 || i == remaining_downloads.count - 1
previous_pending_line_count += output_message.call(downloadable, future, last)
end end
if previous_pending_line_count.positive? if previous_pending_line_count.positive?
$stdout.print Tty.move_cursor_up_beginning(previous_pending_line_count) if (previous_pending_line_count - 1).zero?
$stdout.print Tty.move_cursor_beginning
else
$stdout.print Tty.move_cursor_up_beginning(previous_pending_line_count - 1)
end
$stdout.flush $stdout.flush
end end

View File

@ -70,6 +70,11 @@ module Tty
"\033[#{line_count}F" "\033[#{line_count}F"
end end
sig { returns(String) }
def move_cursor_beginning
"\033[0G"
end
sig { params(line_count: Integer).returns(String) } sig { params(line_count: Integer).returns(String) }
def move_cursor_down(line_count) def move_cursor_down(line_count)
"\033[#{line_count}B" "\033[#{line_count}B"