[pacman-dev] CVS update of pacman-lib/lib/libalpm (add.c deps.c)
Date: Tuesday, February 20, 2007 @ 03:44:32 Author: aaron Path: /home/cvs-pacman/pacman-lib/lib/libalpm Modified: add.c (1.117 -> 1.118) deps.c (1.67 -> 1.68) * Some cascade removal changes. Mainly code cleanup, but this is an attempt to track down the great "Codemac Segfault" * Fixed sortdeps - use the alpm_pkg_get functions to ensure data --------+ add.c | 3 + deps.c | 96 ++++++++++++++++++++++++++++++++------------------------------- 2 files changed, 53 insertions(+), 46 deletions(-) Index: pacman-lib/lib/libalpm/add.c diff -u pacman-lib/lib/libalpm/add.c:1.117 pacman-lib/lib/libalpm/add.c:1.118 --- pacman-lib/lib/libalpm/add.c:1.117 Mon Feb 19 21:14:27 2007 +++ pacman-lib/lib/libalpm/add.c Tue Feb 20 03:44:32 2007 @@ -441,6 +441,9 @@ /* Add files in the NEW package's backup array to the noupgrade array * so this removal operation doesn't kill them */ + /* TODO if we add here, all backup=() entries for all targets, new and + * old, we cover all bases, including backup=() locations changing hands. + * But is this viable? */ alpm_list_t *old_noupgrade = alpm_list_strdup(handle->noupgrade); for(b = newpkg->backup; b; b = b->next) { _alpm_log(PM_LOG_DEBUG, _("adding %s to the NoUpgrade array temporarilly"), (char *)b->data); Index: pacman-lib/lib/libalpm/deps.c diff -u pacman-lib/lib/libalpm/deps.c:1.67 pacman-lib/lib/libalpm/deps.c:1.68 --- pacman-lib/lib/libalpm/deps.c:1.67 Sun Feb 18 13:29:28 2007 +++ pacman-lib/lib/libalpm/deps.c Tue Feb 20 03:44:32 2007 @@ -138,9 +138,7 @@ for(i = newtargs; i; i = i->next) { pmpkg_t *p = (pmpkg_t*)i->data; _alpm_log(PM_LOG_DEBUG, "sorting %s", p->name); - /* TODO this may not always work if p->data is a fd, not db */ - _alpm_db_read(p->data, INFRQ_DEPENDS, p); - for(j = p->depends; j; j = j->next) { + for(j = alpm_pkg_get_depends(p); j; j = j->next) { pmdepend_t dep; pmpkg_t *q = NULL; if(_alpm_splitdep(j->data, &dep)) { @@ -438,6 +436,35 @@ return(0); } +/* These parameters are messy. We check if this package, given a list of + * targets (and a db), is safe to remove. We do NOT remove it if it is in the + * target list */ +static int can_remove_package(pmdb_t *db, pmpkg_t *pkg, alpm_list_t *targets) +{ + alpm_list_t *i; + + if(_alpm_pkg_isin(pkg->name, targets)) { + return(0); + } + + /* see if it was explicitly installed */ + if(alpm_pkg_get_reason(pkg) == PM_PKG_REASON_EXPLICIT) { + _alpm_log(PM_LOG_DEBUG, _("excluding %s -- explicitly installed"), pkg->name); + return(0); + } + + /* see if other packages need it */ + for(i = alpm_pkg_get_requiredby(pkg); i; i = i->next) { + pmpkg_t *reqpkg = _alpm_db_get_pkgfromcache(db, i->data); + if(reqpkg && !_alpm_pkg_isin(reqpkg->name, targets)) { + return(0); + } + } + + /* it's ok to remove */ + return(1); +} + /* return a new alpm_list_t target list containing all packages in the original * target list, as well as all their un-needed dependencies. By un-needed, * I mean dependencies that are *only* required for packages in the target @@ -456,67 +483,44 @@ for(i = targs; i; i = i->next) { pmpkg_t *pkg = i->data; - if(pkg) { - _alpm_db_read(db, INFRQ_DEPENDS, pkg); - } else { - continue; - } - for(j = pkg->depends; j; j = j->next) { + for(j = alpm_pkg_get_depends(pkg); j; j = j->next) { pmdepend_t depend; pmpkg_t *dep; - int needed = 0; - if(_alpm_splitdep(j->data, &depend)) { continue; } dep = _alpm_db_get_pkgfromcache(db, depend.name); if(dep == NULL) { - /* package not found... look for a provisio instead */ - k = _alpm_db_whatprovides(db, depend.name); - if(k == NULL) { + /* package not found... look for a provision instead */ + alpm_list_t *provides = _alpm_db_whatprovides(db, depend.name); + if(!provides) { /* Not found, that's fine, carry on */ _alpm_log(PM_LOG_DEBUG, _("cannot find package \"%s\" or anything that provides it!"), depend.name); continue; } - dep = _alpm_db_get_pkgfromcache(db, ((pmpkg_t *)k->data)->name); - if(dep == NULL) { - _alpm_log(PM_LOG_ERROR, _("dep is NULL!")); - /* wtf */ - continue; - } - FREELISTPTR(k); - } - - _alpm_db_read(db, INFRQ_DEPENDS, dep); + for(k = provides; k; k = k->next) { + pmpkg_t *provpkg = k->data; + if(can_remove_package(db, provpkg, newtargs)) { + pmpkg_t *pkg = _alpm_pkg_new(provpkg->name, provpkg->version); + _alpm_db_read(db, INFRQ_ALL, pkg); - if(_alpm_pkg_isin(dep->name, targs)) { - continue; - } + _alpm_log(PM_LOG_DEBUG, _("adding '%s' to the targets"), pkg->name); - /* see if it was explicitly installed */ - if(dep->reason == PM_PKG_REASON_EXPLICIT) { - _alpm_log(PM_LOG_DEBUG, _("excluding %s -- explicitly installed"), dep->name); - needed = 1; - } - - /* see if other packages need it */ - for(k = dep->requiredby; k && !needed; k = k->next) { - pmpkg_t *dummy = _alpm_db_get_pkgfromcache(db, k->data); - if(!_alpm_pkg_isin(dummy->name, targs)) { - needed = 1; + /* add it to the target list */ + newtargs = alpm_list_add(newtargs, pkg); + newtargs = _alpm_removedeps(db, newtargs); + } } - } - if(!needed) { + FREELISTPTR(provides); + } else if(can_remove_package(db, dep, newtargs)) { pmpkg_t *pkg = _alpm_pkg_new(dep->name, dep->version); - if(pkg == NULL) { - continue; - } - /* add it to the target list */ - _alpm_log(PM_LOG_DEBUG, _("loading ALL info for '%s'"), pkg->name); _alpm_db_read(db, INFRQ_ALL, pkg); - newtargs = alpm_list_add(newtargs, pkg); + _alpm_log(PM_LOG_DEBUG, _("adding '%s' to the targets"), pkg->name); + + /* add it to the target list */ + newtargs = alpm_list_add(newtargs, pkg); newtargs = _alpm_removedeps(db, newtargs); } }
participants (1)
-
Aaron Griffin