From 24684a616ed46c635a2236873c8168b9153b5bc1 Mon Sep 17 00:00:00 2001 From: Allan McRae Date: Tue, 16 Nov 2010 17:07:43 +1000 Subject: [PATCH] Display progress bar for disk space checking Checking disk space needed for a transaction can take a while so add an informative progress bar. Signed-off-by: Allan McRae Signed-off-by: Dan McGee --- lib/libalpm/alpm.h | 7 ++++++- lib/libalpm/diskspace.c | 19 +++++++++++++++++-- lib/libalpm/sync.c | 4 ++++ src/pacman/callback.c | 9 +++++++++ 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index 2879f560..08d02698 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -371,6 +371,10 @@ typedef enum _pmtransevt_t { * The repository's tree name is passed to the callback. */ PM_TRANS_EVT_RETRIEVE_START, + /** Disk space usage will be computed for a package */ + PM_TRANS_EVT_DISKSPACE_START, + /** Disk space usage was computed for a package */ + PM_TRANS_EVT_DISKSPACE_DONE, } pmtransevt_t; /*@}*/ @@ -389,7 +393,8 @@ typedef enum _pmtransprog_t { PM_TRANS_PROGRESS_ADD_START, PM_TRANS_PROGRESS_UPGRADE_START, PM_TRANS_PROGRESS_REMOVE_START, - PM_TRANS_PROGRESS_CONFLICTS_START + PM_TRANS_PROGRESS_CONFLICTS_START, + PM_TRANS_PROGRESS_DISKSPACE_START, } pmtransprog_t; /* Transaction Event callback */ diff --git a/lib/libalpm/diskspace.c b/lib/libalpm/diskspace.c index e57b4246..1f1a6201 100644 --- a/lib/libalpm/diskspace.c +++ b/lib/libalpm/diskspace.c @@ -44,6 +44,7 @@ #include "alpm_list.h" #include "util.h" #include "log.h" +#include "trans.h" #include "handle.h" static int mount_point_cmp(const alpm_mountpoint_t *mp1, const alpm_mountpoint_t *mp2) @@ -258,6 +259,8 @@ int _alpm_check_diskspace(pmtrans_t *trans, pmdb_t *db) int replaces = 0, abort = 0; alpm_list_t *targ; pmpkg_t *pkg; + int numtargs = alpm_list_count(trans->add); + int current = 0; mount_points = mount_point_list(); if(mount_points == NULL) { @@ -267,13 +270,22 @@ int _alpm_check_diskspace(pmtrans_t *trans, pmdb_t *db) replaces = alpm_list_count(trans->remove); if(replaces) { - for(targ = trans->remove; targ; targ = targ->next) { + numtargs += replaces; + for(targ = trans->remove; targ; targ = targ->next, current++) { + double percent = (double)current / numtargs; + PROGRESS(trans, PM_TRANS_PROGRESS_DISKSPACE_START, "", (percent * 100), + numtargs, current); + pkg = (pmpkg_t*)targ->data; calculate_removed_size(pkg, mount_points); } } - for(targ = trans->add; targ; targ = targ->next) { + for(targ = trans->add; targ; targ = targ->next, current++) { + double percent = (double)current / numtargs; + PROGRESS(trans, PM_TRANS_PROGRESS_DISKSPACE_START, "", (percent * 100), + numtargs, current); + pkg = (pmpkg_t*)targ->data; if(_alpm_db_get_pkgfromcache(db, pkg->name)) { calculate_removed_size(pkg, mount_points); @@ -288,6 +300,9 @@ int _alpm_check_diskspace(pmtrans_t *trans, pmdb_t *db) } } + PROGRESS(trans, PM_TRANS_PROGRESS_DISKSPACE_START, "", 100, + numtargs, current); + for(i = mount_points; i; i = alpm_list_next(i)) { alpm_mountpoint_t *data = i->data; if(data->used == 1) { diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index 14f14621..8af32e45 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -999,11 +999,15 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data) /* check available disk space */ if(handle->checkspace) { + EVENT(trans, PM_TRANS_EVT_DISKSPACE_START, NULL, NULL); + _alpm_log(PM_LOG_DEBUG, "checking available disk space\n"); if(_alpm_check_diskspace(trans, handle->db_local) == -1) { _alpm_log(PM_LOG_ERROR, _("not enough free disk space\n")); goto error; } + + EVENT(trans, PM_TRANS_EVT_DISKSPACE_DONE, NULL, NULL); } /* remove conflicting and to-be-replaced packages */ diff --git a/src/pacman/callback.c b/src/pacman/callback.c index 925f1fcf..f585b284 100644 --- a/src/pacman/callback.c +++ b/src/pacman/callback.c @@ -228,6 +228,11 @@ void cb_trans_evt(pmtransevt_t event, void *data1, void *data2) case PM_TRANS_EVT_RETRIEVE_START: printf(_(":: Retrieving packages from %s...\n"), (char*)data1); break; + case PM_TRANS_EVT_DISKSPACE_START: + if(config->noprogressbar) { + printf(_("checking available disk space...\n")); + } + break; /* all the simple done events, with fallthrough for each */ case PM_TRANS_EVT_FILECONFLICTS_DONE: case PM_TRANS_EVT_CHECKDEPS_DONE: @@ -236,6 +241,7 @@ void cb_trans_evt(pmtransevt_t event, void *data1, void *data2) case PM_TRANS_EVT_INTEGRITY_DONE: case PM_TRANS_EVT_DELTA_INTEGRITY_DONE: case PM_TRANS_EVT_DELTA_PATCHES_DONE: + case PM_TRANS_EVT_DISKSPACE_DONE: /* nothing */ break; } @@ -375,6 +381,9 @@ void cb_trans_progress(pmtransprog_t event, const char *pkgname, int percent, case PM_TRANS_PROGRESS_CONFLICTS_START: opr = _("checking for file conflicts"); break; + case PM_TRANS_PROGRESS_DISKSPACE_START: + opr = _("checking available disk space"); + break; default: return; }