From 7e31773b0eb839698b2a086e2936d90904513a26 Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Fri, 12 Jul 2019 21:38:32 +0300 Subject: [PATCH] Add remaining time estimate to Ninja status. --- doc/manual.asciidoc | 1 + src/build.cc | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/doc/manual.asciidoc b/doc/manual.asciidoc index e49d26d174..d2f54acbbd 100644 --- a/doc/manual.asciidoc +++ b/doc/manual.asciidoc @@ -205,6 +205,7 @@ Several placeholders are available: `%c`:: Current rate of finished edges per second (average over builds specified by `-j` or its default) `%e`:: Elapsed time in seconds. _(Available since Ninja 1.2.)_ +`%h`:: Estimated time remaining. _(Available since Ninja 1.10.)_ `%%`:: A plain `%` character. The default progress status is `"[%f/%t] "` (note the trailing space diff --git a/src/build.cc b/src/build.cc index a0557382e0..9f428b19c2 100644 --- a/src/build.cc +++ b/src/build.cc @@ -274,6 +274,28 @@ string BuildStatus::FormatProgressStatus( break; } + case 'h': { + double ratio_finished = double(finished_edges_) / total_edges_; + if (overall_rate_.Elapsed() < 1.0 || ratio_finished < 0.01) { + snprintf(buf, sizeof(buf), "--m --s"); + } else { + double time_remaining = + (1.0 / ratio_finished - 1) * overall_rate_.Elapsed(); + int hours = int(time_remaining) / 3600; + int minutes = (int(time_remaining) % 3600) / 60; + int seconds = int(time_remaining) % 60; + if (hours > 0) { + snprintf(buf, sizeof(buf), "%dh %dm", hours, minutes); + } else if (minutes > 0) { + snprintf(buf, sizeof(buf), "%dm %ds", minutes, seconds); + } else { + snprintf(buf, sizeof(buf), "%ds", seconds); + } + } + out += buf; + break; + } + default: Fatal("unknown placeholder '%%%c' in $NINJA_STATUS", *s); return "";