summaryrefslogtreecommitdiff
path: root/src/commit.c
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2013-06-19 08:47:09 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2013-06-19 10:00:31 +0000
commitadc5b0b16127049307283b9b59d7f0705ba8adc2 (patch)
tree55dd37153d8d5b8f1e9c88219f966e959cbfcdc0 /src/commit.c
parent0c1a26f25c73710896d8666b2de11e5215eda366 (diff)
downloadapk-tools-adc5b0b16127049307283b9b59d7f0705ba8adc2.tar.gz
apk-tools-adc5b0b16127049307283b9b59d7f0705ba8adc2.tar.bz2
apk-tools-adc5b0b16127049307283b9b59d7f0705ba8adc2.tar.xz
apk-tools-adc5b0b16127049307283b9b59d7f0705ba8adc2.zip
print: move progress bar update logic to apk_print_progress
- let the apk_print functions deal with the forced print itself. We avoid that the callbacks need to deal with the force flag. We can also get rid of the APK_PRINT_PROGRESS_* defines. - let the reader of --progress-fd decide how often things are updated rather than having a fixed granularity off 1/100 (percent) - avoid detect screen size and percent/bar calculations in case the --no-progress was given - track satistics for both the ascii bar and percent info and update bar only if either percent or bar changes. This makes the bar go smoother when width is wider than 100 chars and it makes the percent counter go smooth when screen width is less thann 100 chars. It also simplifies the callbacks as they no longer need to deal with update granularity.
Diffstat (limited to 'src/commit.c')
-rw-r--r--src/commit.c19
1 files changed, 5 insertions, 14 deletions
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);