summaryrefslogtreecommitdiffstats
path: root/lib/libalpm/remove.c
diff options
context:
space:
mode:
authorNagy Gabor <ngaba@bibl.u-szeged.hu>2007-11-18 18:45:46 +0100
committerChantry Xavier <shiningxc@gmail.com>2008-02-06 08:46:15 +0100
commite63366ae5e701d8e9ae33144f68e8786b092a468 (patch)
tree4b258502587555e3973486140a7a441ea54065fc /lib/libalpm/remove.c
parente81dec9b8c65f7c882f5f447cdc117783259f4a4 (diff)
downloadpacman-e63366ae5e701d8e9ae33144f68e8786b092a468.tar.gz
pacman-e63366ae5e701d8e9ae33144f68e8786b092a468.tar.xz
New remove option : -u / --unneeded (FS#6505).
With --unneeded option 'pacman -R' doesn't stop in case of dependency error; it removes the needed-dependency targets from the target-list instead. See also: http://archlinux.org/pipermail/pacman-dev/2007-October/009653.html . The patch also adds a new causingpkg field to pmdepmissing_t which indicates the to-be-removed package which would cause a dependency break. This is needed, because miss->depend.name may be a provision. miss->causingpkg will be useful in -R dependency error messages too. [Xavier: renamed inducer to causingpkg, removed the _alpm_pkgname_pkg_cmp helper function as requested by Aaron. This might be added by a further commit. Other small cleanups, updated manpage and bash completion.] Signed-off-by: Chantry Xavier <shiningxc@gmail.com>
Diffstat (limited to 'lib/libalpm/remove.c')
-rw-r--r--lib/libalpm/remove.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/lib/libalpm/remove.c b/lib/libalpm/remove.c
index 10a055bb..a0c308fb 100644
--- a/lib/libalpm/remove.c
+++ b/lib/libalpm/remove.c
@@ -124,11 +124,35 @@ int _alpm_remove_prepare(pmtrans_t *trans, pmdb_t *db, alpm_list_t **data)
alpm_list_free(lp);
lp = alpm_checkdeps(db, 1, trans->packages, NULL);
}
+ } else if (trans->flags & PM_TRANS_FLAG_UNNEEDED) {
+ /* Remove needed packages (which break dependencies) from the target list */
+ while(lp != NULL) {
+ alpm_list_t *i;
+ for(i = lp; i; i = i->next) {
+ pmdepmissing_t *miss = (pmdepmissing_t *)i->data;
+ void *vpkg;
+ pmpkg_t *pkg;
+ pmpkg_t *dummy = _alpm_pkg_new(miss->causingpkg, NULL);
+ trans->packages = alpm_list_remove(trans->packages, dummy,
+ _alpm_pkg_cmp, &vpkg);
+ _alpm_pkg_free(dummy);
+ pkg = vpkg;
+ if(pkg) {
+ _alpm_log(PM_LOG_WARNING, "removing %s from the target-list\n",
+ alpm_pkg_get_name(pkg));
+ _alpm_pkg_free(pkg);
+ }
+ }
+ alpm_list_free_inner(lp, (alpm_list_fn_free)_alpm_depmiss_free);
+ alpm_list_free(lp);
+ lp = alpm_checkdeps(db, 1, trans->packages, NULL);
+ }
} else {
if(data) {
*data = lp;
} else {
- FREELIST(lp);
+ alpm_list_free_inner(lp, (alpm_list_fn_free)_alpm_depmiss_free);
+ alpm_list_free(lp);
}
RET_ERR(PM_ERR_UNSATISFIED_DEPS, -1);
}