diff options
Diffstat (limited to 'lib/libalpm/sync.c')
-rw-r--r-- | lib/libalpm/sync.c | 41 |
1 files changed, 31 insertions, 10 deletions
diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index 4cbaf0cb..b1eab55b 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -1,7 +1,7 @@ /* * sync.c * - * Copyright (c) 2006-2010 Pacman Development Team <pacman-dev@archlinux.org> + * Copyright (c) 2006-2011 Pacman Development Team <pacman-dev@archlinux.org> * Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org> * Copyright (c) 2005 by Aurelien Foret <orelien@chez.com> * Copyright (c) 2005 by Christian Hamar <krics@linuxforum.hu> @@ -31,7 +31,7 @@ #include <stdint.h> /* intmax_t */ #include <unistd.h> #include <time.h> -#include <dirent.h> +#include <limits.h> /* libalpm */ #include "sync.h" @@ -39,7 +39,6 @@ #include "log.h" #include "package.h" #include "db.h" -#include "cache.h" #include "deps.h" #include "conflict.h" #include "trans.h" @@ -50,6 +49,7 @@ #include "dload.h" #include "delta.h" #include "remove.h" +#include "diskspace.h" /** Check for new version of pkg in sync repos * (only the first occurrence is considered in sync) @@ -329,7 +329,7 @@ static int sync_target(alpm_list_t *dbs_sync, const char *target) * @param target the name of the sync target to add * @return 0 on success, -1 on error (pm_errno is set accordingly) */ -int SYMEXPORT alpm_sync_dbtarget(char *dbname, char *target) +int SYMEXPORT alpm_sync_dbtarget(const char *dbname, const char *target) { alpm_list_t *i; alpm_list_t *dbs_sync; @@ -362,7 +362,7 @@ int SYMEXPORT alpm_sync_dbtarget(char *dbname, char *target) * @param target the name of the sync target to add * @return 0 on success, -1 on error (pm_errno is set accordingly) */ -int SYMEXPORT alpm_sync_target(char *target) +int SYMEXPORT alpm_sync_target(const char *target) { alpm_list_t *dbs_sync; @@ -549,10 +549,10 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync /* if sync1 provides sync2, we remove sync2 from the targets, and vice versa */ pmdepend_t *dep1 = _alpm_splitdep(conflict->package1); pmdepend_t *dep2 = _alpm_splitdep(conflict->package2); - if(alpm_depcmp(sync1, dep2)) { + if(_alpm_depcmp(sync1, dep2)) { rsync = sync2; sync = sync1; - } else if(alpm_depcmp(sync2, dep1)) { + } else if(_alpm_depcmp(sync2, dep1)) { rsync = sync1; sync = sync2; } else { @@ -822,7 +822,7 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data) { alpm_list_t *i, *j, *files = NULL; alpm_list_t *deltas = NULL; - int replaces = 0; + size_t numtargs, current = 0, replaces = 0; int errors = 0; const char *cachedir = NULL; int ret = -1; @@ -854,7 +854,7 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data) for(j = trans->add; j; j = j->next) { pmpkg_t *spkg = j->data; - if(spkg->origin == PKG_FROM_CACHE && current == spkg->origin_data.db) { + if(spkg->origin != PKG_FROM_FILE && current == spkg->origin_data.db) { const char *fname = NULL; fname = alpm_pkg_get_filename(spkg); @@ -949,14 +949,18 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data) } /* Check integrity of packages */ + numtargs = alpm_list_count(trans->add); EVENT(trans, PM_TRANS_EVT_INTEGRITY_START, NULL, NULL); errors = 0; for(i = trans->add; i; i = i->next) { pmpkg_t *spkg = i->data; + int percent = (current * 100) / numtargs; if(spkg->origin == PKG_FROM_FILE) { continue; /* pkg_load() has been already called, this package is valid */ } + PROGRESS(trans, PM_TRANS_PROGRESS_INTEGRITY_START, "", percent, + numtargs, current); const char *filename = alpm_pkg_get_filename(spkg); const char *md5sum = alpm_pkg_get_md5sum(spkg); @@ -982,12 +986,16 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data) pkgfile->reason = spkg->reason; /* copy over install reason */ i->data = pkgfile; _alpm_pkg_free_trans(spkg); /* spkg has been removed from the target list */ + current++; } + PROGRESS(trans, PM_TRANS_PROGRESS_INTEGRITY_START, "", 100, + numtargs, current); + EVENT(trans, PM_TRANS_EVT_INTEGRITY_DONE, NULL, NULL); if(errors) { pm_errno = PM_ERR_PKG_INVALID; goto error; } - EVENT(trans, PM_TRANS_EVT_INTEGRITY_DONE, NULL, NULL); + if(trans->flags & PM_TRANS_FLAG_DOWNLOADONLY) { ret = 0; goto error; @@ -1018,6 +1026,19 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data) EVENT(trans, PM_TRANS_EVT_FILECONFLICTS_DONE, NULL, NULL); } + /* 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 */ if(replaces) { _alpm_log(PM_LOG_DEBUG, "removing conflicting and to-be-replaced packages\n"); |