summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAllan McRae <allan@archlinux.org>2010-11-16 17:07:43 +1000
committerDan McGee <dan@archlinux.org>2010-12-12 20:30:11 -0600
commit24684a616ed46c635a2236873c8168b9153b5bc1 (patch)
tree8b8111aeec5b01e144187ae1c0a76297734c2a6d
parente22aa23c8f5adb0fd4b7ccbee480a4906ede0346 (diff)
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 <allan@archlinux.org> Signed-off-by: Dan McGee <dan@archlinux.org>
-rw-r--r--lib/libalpm/alpm.h7
-rw-r--r--lib/libalpm/diskspace.c19
-rw-r--r--lib/libalpm/sync.c4
-rw-r--r--src/pacman/callback.c9
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;
}