summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Antoine Pelisse <apelisse@gmail.com>2013-04-10 21:03:23 +0200
committerLibravatar Junio C Hamano <gitster@pobox.com>2013-04-10 12:58:33 -0700
commit079b546a2940a84989893254a318c8414e13a13e (patch)
tree5f8cc69cbfa12a63cf23b6dfdd75f92eefb4b9ef
parentremote-bzr: improve tag handling (diff)
downloadtgif-079b546a2940a84989893254a318c8414e13a13e.tar.xz
strbuf: create strbuf_humanise_bytes() to show byte sizes
Humanization of downloaded size is done in the same function as text formatting in 'process.c'. The code cannot be reused easily elsewhere. Separate text formatting from size simplification and make the function public in strbuf so that it can easily be used by other callers. We now can use strbuf_humanise_bytes() for both downloaded size and download speed calculation. One of the drawbacks is that speed will now look like this when download is stalled: "0 bytes/s" instead of "0 KiB/s". Signed-off-by: Antoine Pelisse <apelisse@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--Documentation/technical/api-strbuf.txt5
-rw-r--r--progress.c43
-rw-r--r--strbuf.c19
-rw-r--r--strbuf.h1
4 files changed, 40 insertions, 28 deletions
diff --git a/Documentation/technical/api-strbuf.txt b/Documentation/technical/api-strbuf.txt
index 2c59cb2259..3350d97dda 100644
--- a/Documentation/technical/api-strbuf.txt
+++ b/Documentation/technical/api-strbuf.txt
@@ -230,6 +230,11 @@ which can be used by the programmer of the callback as she sees fit.
destination. This is useful for literal data to be fed to either
strbuf_expand or to the *printf family of functions.
+`strbuf_humanise_bytes`::
+
+ Append the given byte size as a human-readable string (i.e. 12.23 KiB,
+ 3.50 MiB).
+
`strbuf_addf`::
Add a formatted string to the buffer.
diff --git a/progress.c b/progress.c
index 3971f49f4d..10652b174d 100644
--- a/progress.c
+++ b/progress.c
@@ -10,6 +10,7 @@
#include "git-compat-util.h"
#include "progress.h"
+#include "strbuf.h"
#define TP_IDX_MAX 8
@@ -112,34 +113,14 @@ static int display(struct progress *progress, unsigned n, const char *done)
return 0;
}
-static void throughput_string(struct throughput *tp, off_t total,
+static void throughput_string(struct strbuf *buf, off_t total,
unsigned int rate)
{
- int l = sizeof(tp->display);
- if (total > 1 << 30) {
- l -= snprintf(tp->display, l, ", %u.%2.2u GiB",
- (int)(total >> 30),
- (int)(total & ((1 << 30) - 1)) / 10737419);
- } else if (total > 1 << 20) {
- int x = total + 5243; /* for rounding */
- l -= snprintf(tp->display, l, ", %u.%2.2u MiB",
- x >> 20, ((x & ((1 << 20) - 1)) * 100) >> 20);
- } else if (total > 1 << 10) {
- int x = total + 5; /* for rounding */
- l -= snprintf(tp->display, l, ", %u.%2.2u KiB",
- x >> 10, ((x & ((1 << 10) - 1)) * 100) >> 10);
- } else {
- l -= snprintf(tp->display, l, ", %u bytes", (int)total);
- }
-
- if (rate > 1 << 10) {
- int x = rate + 5; /* for rounding */
- snprintf(tp->display + sizeof(tp->display) - l, l,
- " | %u.%2.2u MiB/s",
- x >> 10, ((x & ((1 << 10) - 1)) * 100) >> 10);
- } else if (rate)
- snprintf(tp->display + sizeof(tp->display) - l, l,
- " | %u KiB/s", rate);
+ strbuf_addstr(buf, ", ");
+ strbuf_humanise_bytes(buf, total);
+ strbuf_addstr(buf, " | ");
+ strbuf_humanise_bytes(buf, rate * 1024);
+ strbuf_addstr(buf, "/s");
}
void display_throughput(struct progress *progress, off_t total)
@@ -183,6 +164,7 @@ void display_throughput(struct progress *progress, off_t total)
misecs += (int)(tv.tv_usec - tp->prev_tv.tv_usec) / 977;
if (misecs > 512) {
+ struct strbuf buf = STRBUF_INIT;
unsigned int count, rate;
count = total - tp->prev_total;
@@ -197,7 +179,9 @@ void display_throughput(struct progress *progress, off_t total)
tp->last_misecs[tp->idx] = misecs;
tp->idx = (tp->idx + 1) % TP_IDX_MAX;
- throughput_string(tp, total, rate);
+ throughput_string(&buf, total, rate);
+ strncpy(tp->display, buf.buf, sizeof(tp->display));
+ strbuf_release(&buf);
if (progress->last_value != -1 && progress_update)
display(progress, progress->last_value, NULL);
}
@@ -253,9 +237,12 @@ void stop_progress_msg(struct progress **p_progress, const char *msg)
bufp = (len < sizeof(buf)) ? buf : xmalloc(len + 1);
if (tp) {
+ struct strbuf strbuf = STRBUF_INIT;
unsigned int rate = !tp->avg_misecs ? 0 :
tp->avg_bytes / tp->avg_misecs;
- throughput_string(tp, tp->curr_total, rate);
+ throughput_string(&strbuf, tp->curr_total, rate);
+ strncpy(tp->display, strbuf.buf, sizeof(tp->display));
+ strbuf_release(&strbuf);
}
progress_update = 1;
sprintf(bufp, ", %s.\n", msg);
diff --git a/strbuf.c b/strbuf.c
index 48e9abb5c2..1170d01c43 100644
--- a/strbuf.c
+++ b/strbuf.c
@@ -528,6 +528,25 @@ void strbuf_addstr_urlencode(struct strbuf *sb, const char *s,
strbuf_add_urlencode(sb, s, strlen(s), reserved);
}
+void strbuf_humanise_bytes(struct strbuf *buf, off_t bytes)
+{
+ if (bytes > 1 << 30) {
+ strbuf_addf(buf, "%u.%2.2u GiB",
+ (int)(bytes >> 30),
+ (int)(bytes & ((1 << 30) - 1)) / 10737419);
+ } else if (bytes > 1 << 20) {
+ int x = bytes + 5243; /* for rounding */
+ strbuf_addf(buf, "%u.%2.2u MiB",
+ x >> 20, ((x & ((1 << 20) - 1)) * 100) >> 20);
+ } else if (bytes > 1 << 10) {
+ int x = bytes + 5; /* for rounding */
+ strbuf_addf(buf, "%u.%2.2u KiB",
+ x >> 10, ((x & ((1 << 10) - 1)) * 100) >> 10);
+ } else {
+ strbuf_addf(buf, "%u bytes", (int)bytes);
+ }
+}
+
int printf_ln(const char *fmt, ...)
{
int ret;
diff --git a/strbuf.h b/strbuf.h
index 958822c2dd..73e80cea69 100644
--- a/strbuf.h
+++ b/strbuf.h
@@ -170,6 +170,7 @@ extern int strbuf_check_branch_ref(struct strbuf *sb, const char *name);
extern void strbuf_addstr_urlencode(struct strbuf *, const char *,
int reserved);
+extern void strbuf_humanise_bytes(struct strbuf *buf, off_t bytes);
__attribute__((format (printf,1,2)))
extern int printf_ln(const char *fmt, ...);