summaryrefslogtreecommitdiff
path: root/progress.c
diff options
context:
space:
mode:
Diffstat (limited to 'progress.c')
-rw-r--r--progress.c53
1 files changed, 46 insertions, 7 deletions
diff --git a/progress.c b/progress.c
index 0318bdd41b..19805ac646 100644
--- a/progress.c
+++ b/progress.c
@@ -14,6 +14,7 @@
#include "strbuf.h"
#include "trace.h"
#include "utf8.h"
+#include "config.h"
#define TP_IDX_MAX 8
@@ -45,6 +46,19 @@ struct progress {
static volatile sig_atomic_t progress_update;
+/*
+ * These are only intended for testing the progress output, i.e. exclusively
+ * for 'test-tool progress'.
+ */
+int progress_testing;
+uint64_t progress_test_ns = 0;
+void progress_test_force_update(void); /* To silence -Wmissing-prototypes */
+void progress_test_force_update(void)
+{
+ progress_update = 1;
+}
+
+
static void progress_interval(int signum)
{
progress_update = 1;
@@ -55,6 +69,9 @@ static void set_progress_signal(void)
struct sigaction sa;
struct itimerval v;
+ if (progress_testing)
+ return;
+
progress_update = 0;
memset(&sa, 0, sizeof(sa));
@@ -72,6 +89,10 @@ static void set_progress_signal(void)
static void clear_progress_signal(void)
{
struct itimerval v = {{0,},};
+
+ if (progress_testing)
+ return;
+
setitimer(ITIMER_REAL, &v, NULL);
signal(SIGALRM, SIG_IGN);
progress_update = 0;
@@ -119,6 +140,7 @@ static void display(struct progress *progress, uint64_t n, const char *done)
size_t clear_len = counters_sb->len < last_count_len ?
last_count_len - counters_sb->len + 1 :
0;
+ /* The "+ 2" accounts for the ": ". */
size_t progress_line_len = progress->title_len +
counters_sb->len + 2;
int cols = term_columns();
@@ -128,7 +150,7 @@ static void display(struct progress *progress, uint64_t n, const char *done)
(int) clear_len, eol);
} else if (!done && cols < progress_line_len) {
clear_len = progress->title_len + 1 < cols ?
- cols - progress->title_len : 0;
+ cols - progress->title_len - 1 : 0;
fprintf(stderr, "%s:%*s\n %s%s",
progress->title, (int) clear_len, "",
counters_sb->buf, eol);
@@ -150,8 +172,15 @@ static void throughput_string(struct strbuf *buf, uint64_t total,
strbuf_addstr(buf, ", ");
strbuf_humanise_bytes(buf, total);
strbuf_addstr(buf, " | ");
- strbuf_humanise_bytes(buf, rate * 1024);
- strbuf_addstr(buf, "/s");
+ strbuf_humanise_rate(buf, rate * 1024);
+}
+
+static uint64_t progress_getnanotime(struct progress *progress)
+{
+ if (progress_testing)
+ return progress->start_ns + progress_test_ns;
+ else
+ return getnanotime();
}
void display_throughput(struct progress *progress, uint64_t total)
@@ -164,7 +193,7 @@ void display_throughput(struct progress *progress, uint64_t total)
return;
tp = progress->throughput;
- now_ns = getnanotime();
+ now_ns = progress_getnanotime(progress);
if (!tp) {
progress->throughput = tp = xcalloc(1, sizeof(*tp));
@@ -239,9 +268,19 @@ static struct progress *start_progress_delay(const char *title, uint64_t total,
return progress;
}
+static int get_default_delay(void)
+{
+ static int delay_in_secs = -1;
+
+ if (delay_in_secs < 0)
+ delay_in_secs = git_env_ulong("GIT_PROGRESS_DELAY", 2);
+
+ return delay_in_secs;
+}
+
struct progress *start_delayed_progress(const char *title, uint64_t total)
{
- return start_progress_delay(title, total, 2, 0);
+ return start_progress_delay(title, total, get_default_delay(), 0);
}
struct progress *start_progress(const char *title, uint64_t total)
@@ -266,7 +305,7 @@ struct progress *start_sparse_progress(const char *title, uint64_t total)
struct progress *start_delayed_sparse_progress(const char *title,
uint64_t total)
{
- return start_progress_delay(title, total, 2, 1);
+ return start_progress_delay(title, total, get_default_delay(), 1);
}
static void finish_if_sparse(struct progress *progress)
@@ -296,7 +335,7 @@ void stop_progress_msg(struct progress **p_progress, const char *msg)
struct throughput *tp = progress->throughput;
if (tp) {
- uint64_t now_ns = getnanotime();
+ uint64_t now_ns = progress_getnanotime(progress);
unsigned int misecs, rate;
misecs = ((now_ns - progress->start_ns) * 4398) >> 32;
rate = tp->curr_total / (misecs ? misecs : 1);