diff options
| author | ruki <[email protected]> | 2025-10-29 22:37:39 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2025-10-29 10:37:58 +0800 |
| commit | 88e30eca65d91dcdb569a866a35f5cc1d15c1f61 (patch) | |
| tree | 68d767ee63592edfd4e4c87937b1a9e7864377c6 /xmake/modules/utils/progress.lua | |
| parent | b0d93f0996b95ee5e74b0ddbca3237d7734a789f (diff) | |
check idle progress
Diffstat (limited to 'xmake/modules/utils/progress.lua')
| -rw-r--r-- | xmake/modules/utils/progress.lua | 49 |
1 files changed, 33 insertions, 16 deletions
diff --git a/xmake/modules/utils/progress.lua b/xmake/modules/utils/progress.lua index 6a8d9e156..c291854ea 100644 --- a/xmake/modules/utils/progress.lua +++ b/xmake/modules/utils/progress.lua @@ -156,13 +156,21 @@ function _show_progress_with_multirow_refresh(progress, format, ...) is_first = true end - -- update the progress info + -- show the total progress line local linecount = _g.linecount or 0 - local lineinfo = progress_lineinfos[running] + local maxwidth = os.getwinsize().width + if not is_first and linecount > 0 then + tty.cursor_move_to_col(maxwidth) + tty.cursor_move_up(linecount + 1) + end + tty.erase_line_to_start().cr() + cprint(progress_line) + + -- update the subprogress infos local current_time = os.mclock() + local lineinfo = progress_lineinfos[running] if lineinfo == nil then - _g.linecount = linecount + 1 - lineinfo = {start_time = current_time, spent_time = 0} + lineinfo = {start_time = current_time, spent_time = 0, running = running} progress_lineinfos[running] = lineinfo else lineinfo.spent_time = current_time - lineinfo.start_time @@ -175,36 +183,45 @@ function _show_progress_with_multirow_refresh(progress, format, ...) elseif spent_time > 500 then timecolor = "${color.build.progress_slow}" end - local subprogress_line = _strip_progress_line(vformat(" > %s%0.02fs${clear} ", timecolor, spent_time / 1000) .. progress_msg) - lineinfo.progress_line = subprogress_line - - local maxwidth = os.getwinsize().width - if not is_first and linecount > 0 then - tty.cursor_move_to_col(maxwidth) - tty.cursor_move_up(linecount + 1) + if is_finished then + lineinfo.progress_line = nil + else + local subprogress_line = _strip_progress_line(vformat(" > %s%0.02fs${clear} ", timecolor, spent_time / 1000) .. progress_msg) + lineinfo.progress_line = subprogress_line end - tty.erase_line_to_start().cr() - cprint(progress_line) - + -- sort the progress lines by the spent time local lineinfos = {} for _, progress_lineinfo in pairs(progress_lineinfos) do table.insert(lineinfos, progress_lineinfo) end table.sort(lineinfos, function (a, b) return a.spent_time > b.spent_time end) + + -- show the subprocess lines + local linecount = 0 for _, lineinfo in ipairs(lineinfos) do + -- we need not show it if the progress job is idle in runjobs now + local progress_running = lineinfo.running + if progress_running and progress_running:data("runjobs.running") == false then + lineinfo.progress_line = nil + end tty.cursor_move_to_col(maxwidth) tty.erase_line_to_start().cr() - cprint(lineinfo.progress_line) + if lineinfo.progress_line then + cprint(lineinfo.progress_line) + else + print("") + end + linecount = linecount + 1 end if is_finished then - print("") _g.showing_without_scroll = false _g.progress_lineinfos = nil _g.linecount = 0 else _g.showing_without_scroll = true + _g.linecount = linecount end io.flush() end |
