diff options
| -rw-r--r-- | lib/libalpm/alpm.h | 5 | ||||
| -rw-r--r-- | lib/libalpm/remove.c | 29 | ||||
| -rw-r--r-- | src/pacman/callback.c | 4 | 
3 files changed, 37 insertions, 1 deletions
| diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index 96da8db0..bf726fc2 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -348,7 +348,10 @@ typedef enum _alpm_event_t {  	/** Disk space usage will be computed for a package */  	ALPM_EVENT_DISKSPACE_START,  	/** Disk space usage was computed for a package */ -	ALPM_EVENT_DISKSPACE_DONE +	ALPM_EVENT_DISKSPACE_DONE, +	/** An optdepend for another package is being removed +	 * The requiring package and its dependency are passed to the callback */ +	ALPM_EVENT_OPTDEP_REQUIRED  } alpm_event_t;  /** Event callback */ diff --git a/lib/libalpm/remove.c b/lib/libalpm/remove.c index f189e30d..0a4a5f97 100644 --- a/lib/libalpm/remove.c +++ b/lib/libalpm/remove.c @@ -158,6 +158,32 @@ static void remove_prepare_keep_needed(alpm_handle_t *handle, alpm_list_t *lp)  }  /** + * @brief Send a callback for any optdepend being removed. + * + * @param handle the context handle + * @param lp list of packages to be removed + */ +static void remove_notify_needed_optdepends(alpm_handle_t *handle, alpm_list_t *lp) +{ +	alpm_list_t *i; + +	for(i = _alpm_db_get_pkgcache(handle->db_local); i; i = alpm_list_next(i)) { +		alpm_pkg_t *pkg = i->data; +		alpm_list_t *optdeps = alpm_pkg_get_optdepends(pkg); + +		if(optdeps && !_alpm_pkg_find(lp, pkg->name)) { +			alpm_list_t *j; +			for(j = optdeps; j; j = alpm_list_next(j)) { +				alpm_depend_t *optdep = j->data; +				if(_alpm_pkg_find(lp, optdep->name)) { +					EVENT(handle, ALPM_EVENT_OPTDEP_REQUIRED, pkg, optdep); +				} +			} +		} +	} +} + +/**   * @brief Transaction preparation for remove actions.   *   * This functions takes a pointer to a alpm_list_t which will be @@ -228,6 +254,9 @@ int _alpm_remove_prepare(alpm_handle_t *handle, alpm_list_t **data)  		}  	} +	/* Note packages being removed that are optdepends for installed packages */ +	remove_notify_needed_optdepends(handle, trans->remove); +  	if(!(trans->flags & ALPM_TRANS_FLAG_NODEPS)) {  		EVENT(handle, ALPM_EVENT_CHECKDEPS_DONE, NULL, NULL);  	} diff --git a/src/pacman/callback.c b/src/pacman/callback.c index 01c6b619..a51aa4b6 100644 --- a/src/pacman/callback.c +++ b/src/pacman/callback.c @@ -239,6 +239,10 @@ void cb_event(alpm_event_t event, void *data1, void *data2)  				printf(_("checking available disk space...\n"));  			}  			break; +		case ALPM_EVENT_OPTDEP_REQUIRED: +			printf(_(":: %s optionally requires %s\n"), alpm_pkg_get_name(data1), +				alpm_dep_compute_string(data2)); +			break;  		/* all the simple done events, with fallthrough for each */  		case ALPM_EVENT_FILECONFLICTS_DONE:  		case ALPM_EVENT_CHECKDEPS_DONE: | 
