diff mbox series

[v2,1/7] progress: add function to set total

Message ID 20250219-toon-bundleuri-progress-v2-1-a84e7ffa921a@iotcl.com (mailing list archive)
State New
Headers show
Series Show progress when downloading from bundle URIs | expand

Commit Message

Toon Claes Feb. 19, 2025, 2:30 p.m. UTC
We're about to add the use of progress through curl. Although, curl
doesn't know the total at the start of the download, but might receive
this information in the Content-Length header when the download starts.

To allow users set the total size after calling start_progress(), add a
function progress_set_total().

Signed-off-by: Toon Claes <toon@iotcl.com>
---
 progress.c                  |  6 ++++++
 progress.h                  |  1 +
 t/helper/test-progress.c    |  5 +++++
 t/t0500-progress-display.sh | 24 ++++++++++++++++++++++++
 4 files changed, 36 insertions(+)

Comments

Jeff King Feb. 21, 2025, 7:43 a.m. UTC | #1
On Wed, Feb 19, 2025 at 03:30:19PM +0100, Toon Claes wrote:

> We're about to add the use of progress through curl. Although, curl
> doesn't know the total at the start of the download, but might receive
> this information in the Content-Length header when the download starts.
> 
> To allow users set the total size after calling start_progress(), add a
> function progress_set_total().

Makes sense.

> +void progress_set_total(struct progress *progress, uint64_t total)
> +{
> +	if (progress)
> +		progress->total = total;
> +}

I wondered if we'd need to do any other computation here (that would
have been done in start_progress() if we specified the total then). But
it looks like we don't look at progress->total until we're ready to
display something.

Would we want to call display_progress() or similar here, to update the
original view like:

  Working hard: 1<CR>

to:

  Working hard: 33% (1/3)<CR>

immediately, rather than waiting for more progress to be made? I guess
it probably doesn't matter that much in practice as we'd remain stale
for a brief period in most cases (particularly for transfers where we're
updating based on bytes received, which is a pretty small unit of work).

Plus I think it may be awkward, because we don't know whether to call
display_progress() or display_throughput().

-Peff
diff mbox series

Patch

diff --git a/progress.c b/progress.c
index 8d5ae70f3a..e254877d2c 100644
--- a/progress.c
+++ b/progress.c
@@ -276,6 +276,12 @@  static struct progress *start_progress_delay(struct repository *r,
 	return progress;
 }
 
+void progress_set_total(struct progress *progress, uint64_t total)
+{
+	if (progress)
+		progress->total = total;
+}
+
 static int get_default_delay(void)
 {
 	static int delay_in_secs = -1;
diff --git a/progress.h b/progress.h
index ed068c7bab..2e1bd738c2 100644
--- a/progress.h
+++ b/progress.h
@@ -15,6 +15,7 @@  void progress_test_force_update(void);
 
 void display_throughput(struct progress *progress, uint64_t total);
 void display_progress(struct progress *progress, uint64_t n);
+void progress_set_total(struct progress *progress, uint64_t total);
 struct progress *start_progress(struct repository *r,
 				const char *title, uint64_t total);
 struct progress *start_sparse_progress(struct repository *r,
diff --git a/t/helper/test-progress.c b/t/helper/test-progress.c
index 1f75b7bd19..3a73d6fe0a 100644
--- a/t/helper/test-progress.c
+++ b/t/helper/test-progress.c
@@ -74,6 +74,11 @@  int cmd__progress(int argc, const char **argv)
 			if (*end != '\0')
 				die("invalid input: '%s'", line.buf);
 			display_progress(progress, item_count);
+		} else if (skip_prefix(line.buf, "total ", (const char **) &end)) {
+			uint64_t total = strtoull(end, &end, 10);
+			if (*end != '\0')
+				die("invalid input: '%s'\n", line.buf);
+			progress_set_total(progress, total);
 		} else if (skip_prefix(line.buf, "throughput ",
 				       (const char **) &end)) {
 			uint64_t byte_count, test_ms;
diff --git a/t/t0500-progress-display.sh b/t/t0500-progress-display.sh
index d1a498a216..b7ed1db3a0 100755
--- a/t/t0500-progress-display.sh
+++ b/t/t0500-progress-display.sh
@@ -55,6 +55,30 @@  test_expect_success 'progress display with total' '
 	test_cmp expect out
 '
 
+test_expect_success 'progress display modify total' '
+	cat >expect <<-\EOF &&
+	Working hard: 1<CR>
+	Working hard:  66% (2/3)<CR>
+	Working hard: 100% (3/3)<CR>
+	Working hard: 100% (3/3), done.
+	EOF
+
+	cat >in <<-\EOF &&
+	start 0
+	update
+	progress 1
+	update
+	total 3
+	progress 2
+	progress 3
+	stop
+	EOF
+	test-tool progress <in 2>stderr &&
+
+	show_cr <stderr >out &&
+	test_cmp expect out
+'
+
 test_expect_success 'progress display breaks long lines #1' '
 	sed -e "s/Z$//" >expect <<\EOF &&
 Working hard.......2.........3.........4.........5.........6:   0% (100/100000)<CR>