diff --git a/doc/pacman.conf.5.txt b/doc/pacman.conf.5.txt index ecc5c748..ae4d7484 100644 --- a/doc/pacman.conf.5.txt +++ b/doc/pacman.conf.5.txt @@ -162,6 +162,10 @@ Options than the percent of each individual download target. The progress bar is still based solely on the current file download. +*CheckSpace*:: + Performs an approximate check for adequate available disk space before + installing packages. + Repository Sections ------------------- Each repository section defines a section name and at least one location where diff --git a/etc/pacman.conf.in b/etc/pacman.conf.in index 32071196..d1d596cb 100644 --- a/etc/pacman.conf.in +++ b/etc/pacman.conf.in @@ -33,6 +33,7 @@ Architecture = auto #ShowSize #UseDelta #TotalDownload +#CheckSpace # # REPOSITORIES diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index 4d0ca501..2879f560 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -155,6 +155,9 @@ void alpm_option_set_arch(const char *arch); int alpm_option_get_usedelta(); void alpm_option_set_usedelta(int usedelta); +int alpm_option_get_checkspace(); +void alpm_option_set_checkspace(int checkspace); + pmdb_t *alpm_option_get_localdb(); alpm_list_t *alpm_option_get_syncdbs(); diff --git a/lib/libalpm/handle.c b/lib/libalpm/handle.c index aa34cf45..ffa5dd67 100644 --- a/lib/libalpm/handle.c +++ b/lib/libalpm/handle.c @@ -232,6 +232,15 @@ int SYMEXPORT alpm_option_get_usedelta() return handle->usedelta; } +int SYMEXPORT alpm_option_get_checkspace() +{ + if (handle == NULL) { + pm_errno = PM_ERR_HANDLE_NULL; + return -1; + } + return handle->checkspace; +} + pmdb_t SYMEXPORT *alpm_option_get_localdb() { if (handle == NULL) { @@ -550,4 +559,9 @@ void SYMEXPORT alpm_option_set_usedelta(int usedelta) handle->usedelta = usedelta; } +void SYMEXPORT alpm_option_set_checkspace(int checkspace) +{ + handle->checkspace = checkspace; +} + /* vim: set ts=2 sw=2 noet: */ diff --git a/lib/libalpm/handle.h b/lib/libalpm/handle.h index 1834994e..46414b95 100644 --- a/lib/libalpm/handle.h +++ b/lib/libalpm/handle.h @@ -60,6 +60,7 @@ typedef struct _pmhandle_t { int usesyslog; /* Use syslog instead of logfile? */ /* TODO move to frontend */ char *arch; /* Architecture of packages we should allow */ int usedelta; /* Download deltas if possible */ + int checkspace; /* Check disk space before installing */ } pmhandle_t; /* global handle variable */ diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index 23476b8d..14f14621 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -998,10 +998,12 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data) } /* check available disk space */ - _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; + if(handle->checkspace) { + _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; + } } /* remove conflicting and to-be-replaced packages */ diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c index 4239667e..700b74db 100644 --- a/src/pacman/pacman.c +++ b/src/pacman/pacman.c @@ -956,6 +956,8 @@ static int _parse_options(char *key, char *value) } else if(strcmp(key, "TotalDownload") == 0) { config->totaldownload = 1; pm_printf(PM_LOG_DEBUG, "config: totaldownload\n"); + } else if(strcmp(key, "CheckSpace") == 0) { + alpm_option_set_checkspace(1); } else { pm_printf(PM_LOG_ERROR, _("directive '%s' without value not recognized\n"), key); return(1);