diff options
-rw-r--r-- | src/apk_print.h | 5 | ||||
-rw-r--r-- | src/cache.c | 5 | ||||
-rw-r--r-- | src/commit.c | 19 | ||||
-rw-r--r-- | src/fetch.c | 7 | ||||
-rw-r--r-- | src/print.c | 61 |
5 files changed, 48 insertions, 49 deletions
diff --git a/src/apk_print.h b/src/apk_print.h index 61e27d4..590b8f3 100644 --- a/src/apk_print.h +++ b/src/apk_print.h @@ -31,10 +31,7 @@ struct apk_indent { int indent; }; -#define APK_PRINT_PROGRESS_MASK 0xff -#define APK_PRINT_PROGRESS_FORCE 0x100 - -void apk_print_progress(int percent); +void apk_print_progress(size_t done, size_t total); int apk_print_indented(struct apk_indent *i, apk_blob_t blob); void apk_print_indented_words(struct apk_indent *i, const char *text); void apk_print_indented_fmt(struct apk_indent *i, const char *fmt, ...); diff --git a/src/cache.c b/src/cache.c index 84b2786..3be5b6d 100644 --- a/src/cache.c +++ b/src/cache.c @@ -28,14 +28,12 @@ struct progress { size_t done, total; - int flags; }; static void progress_cb(void *ctx, size_t bytes_done) { struct progress *prog = (struct progress *) ctx; - apk_print_progress(muldiv(100, prog->done + bytes_done, prog->total) | prog->flags); - prog->flags = 0; + apk_print_progress(prog->done + bytes_done, prog->total); } static int cache_download(struct apk_database *db) @@ -68,7 +66,6 @@ static int cache_download(struct apk_database *db) if (repo == NULL) continue; - prog.flags = APK_PRINT_PROGRESS_FORCE; r = apk_cache_download(db, repo, pkg, APK_SIGN_VERIFY_IDENTITY, progress_cb, &prog); if (r) { diff --git a/src/commit.c b/src/commit.c index 6a2580d..af9e34c 100644 --- a/src/commit.c +++ b/src/commit.c @@ -91,7 +91,7 @@ static int print_change(struct apk_database *db, struct apk_change *change, struct apk_stats { unsigned int changes; - unsigned int bytes; + size_t bytes; unsigned int packages; }; @@ -115,22 +115,13 @@ struct progress { struct apk_stats done; struct apk_stats total; struct apk_package *pkg; - int flags; }; static void progress_cb(void *ctx, size_t installed_bytes) { struct progress *prog = (struct progress *) ctx; - size_t percent, total; - - total = prog->total.bytes + prog->total.packages; - if (total > 0) - percent = muldiv(100, prog->done.bytes + prog->done.packages + installed_bytes, - prog->total.bytes + prog->total.packages); - else - percent = 0; - apk_print_progress(percent | prog->flags); - prog->flags = 0; + apk_print_progress(prog->done.bytes + prog->done.packages + installed_bytes, + prog->total.bytes + prog->total.packages); } static int dump_packages(struct apk_changeset *changeset, @@ -283,7 +274,6 @@ int apk_solver_commit_changeset(struct apk_database *db, foreach_array_item(change, changeset->changes) { if (print_change(db, change, prog.done.changes, prog.total.changes)) { prog.pkg = change->new_pkg; - prog.flags = APK_PRINT_PROGRESS_FORCE; progress_cb(&prog, 0); if (!(apk_flags & APK_SIMULATE)) { @@ -301,7 +291,8 @@ int apk_solver_commit_changeset(struct apk_database *db, count_change(change, &prog.done); } - apk_print_progress(100 | APK_PRINT_PROGRESS_FORCE); + apk_print_progress(prog.total.bytes + prog.total.packages, + prog.total.bytes + prog.total.packages); run_triggers(db, changeset); diff --git a/src/fetch.c b/src/fetch.c index eaa6961..7891ac2 100644 --- a/src/fetch.c +++ b/src/fetch.c @@ -28,7 +28,7 @@ struct fetch_ctx { unsigned int flags; - int outdir_fd, errors, prog_flags; + int outdir_fd, errors; struct apk_database *db; size_t done, total; }; @@ -94,8 +94,7 @@ static int fetch_parse(void *ctx, struct apk_db_options *dbopts, static void progress_cb(void *pctx, size_t bytes_done) { struct fetch_ctx *ctx = (struct fetch_ctx *) pctx; - apk_print_progress(muldiv(100, ctx->done + bytes_done, ctx->total) | ctx->prog_flags); - ctx->prog_flags = 0; + apk_print_progress(ctx->done + bytes_done, ctx->total); } static int fetch_package(apk_hash_item item, void *pctx) @@ -133,8 +132,6 @@ static int fetch_package(apk_hash_item item, void *pctx) if (apk_flags & APK_SIMULATE) return 0; - ctx->prog_flags = APK_PRINT_PROGRESS_FORCE; - r = apk_repo_format_item(db, repo, pkg, &urlfd, url, sizeof(url)); if (r < 0) goto err; diff --git a/src/print.c b/src/print.c index d83bad2..6d00064 100644 --- a/src/print.c +++ b/src/print.c @@ -21,10 +21,12 @@ int apk_progress_fd; static int apk_screen_width = 0; +static int apk_progress_force = 1; void apk_reset_screen_width(void) { apk_screen_width = 0; + apk_progress_force = 1; } int apk_get_screen_width(void) @@ -41,35 +43,48 @@ int apk_get_screen_width(void) return apk_screen_width; } -void apk_print_progress(int percent_flags) +void apk_print_progress(size_t done, size_t total) { - static int last_written = 0; - const int bar_width = apk_get_screen_width() - 7; - char buf[8]; - int i, percent; + static size_t last_done = 0; + static int last_bar = 0, last_percent = 0; + int bar_width; + int bar = 0; + char buf[64]; /* enough for petabytes... */ + int i, percent = 0; + + if (last_done == done && !apk_progress_force) + return; - percent = percent_flags & APK_PRINT_PROGRESS_MASK; + if (apk_progress_fd != 0) { + i = snprintf(buf, sizeof(buf), "%zu/%zu\n", done, total); + write(apk_progress_fd, buf, i); + } + last_done = done; - if (last_written == percent && !(percent_flags & APK_PRINT_PROGRESS_FORCE)) + if (!(apk_flags & APK_PROGRESS)) return; - last_written = percent; - - if (apk_flags & APK_PROGRESS) { - fprintf(stderr, "\e7%3i%% [", percent); - for (i = 0; i < bar_width * percent / 100; i++) - fputc('#', stderr); - for (; i < bar_width; i++) - fputc(' ', stderr); - fputc(']', stderr); - fflush(stderr); - fputs("\e8\e[0K", stderr); + bar_width = apk_get_screen_width() - 7; + if (total > 0) { + bar = muldiv(bar_width, done, total); + percent = muldiv(100, done, total); } - if (apk_progress_fd != 0) { - i = snprintf(buf, sizeof(buf), "%i\n", percent); - write(apk_progress_fd, buf, i); - } + if (bar == last_bar && percent == last_percent && !apk_progress_force) + return; + + last_bar = bar; + last_percent = percent; + apk_progress_force = 0; + + fprintf(stderr, "\e7%3i%% [", percent); + for (i = 0; i < bar; i++) + fputc('#', stderr); + for (; i < bar_width; i++) + fputc(' ', stderr); + fputc(']', stderr); + fflush(stderr); + fputs("\e8\e[0K", stderr); } int apk_print_indented(struct apk_indent *i, apk_blob_t blob) @@ -80,6 +95,7 @@ int apk_print_indented(struct apk_indent *i, apk_blob_t blob) i->x += printf("%*s" BLOB_FMT, i->indent - i->x, "", BLOB_PRINTF(blob)); else i->x += printf(" " BLOB_FMT, BLOB_PRINTF(blob)); + apk_progress_force = 1; return 0; } @@ -133,5 +149,6 @@ void apk_log(const char *prefix, const char *format, ...) vfprintf(stderr, format, va); va_end(va); fprintf(stderr, "\n"); + apk_progress_force = 1; } |