[pacman-dev] [patch] resolvedeps cleanup + pactest
ngaba at petra.hos.u-szeged.hu
ngaba at petra.hos.u-szeged.hu
Tue Jul 10 14:56:05 EDT 2007
Hi!
I attached a cleanup patch for resolvedeps + a pathologic pactest file
to demonstrate, that the old version was negligent. See my notes about
alpm_depcmp's speed here:
http://www.archlinux.org/pipermail/pacman-dev/2007-June/008539.html
This patch fails with sync022, but that pactest is broken IMHO.
Bye, ngaba
PS: the patch was created with diff -Naur, sry.
----------------------------------------------------------------
This message was sent using IMP, the Internet Messaging Program.
-------------- next part --------------
diff -Naur pacman-git/lib/libalpm/deps.c pacman-git.new/lib/libalpm/deps.c
--- pacman-git/lib/libalpm/deps.c 2007-07-10 17:35:32.000000000 +0200
+++ pacman-git.new/lib/libalpm/deps.c 2007-07-10 15:11:26.000000000 +0200
@@ -577,13 +577,14 @@
/* populates *list with packages that need to be installed to satisfy all
* dependencies (recursive) for syncpkg
*
- * make sure *list and *trail are already initialized
+ * make sure *list is already initialized
+ * return value of list is undefined in case of error
+ * Assumption: alpm_list_add adds the entry to the end of the list
*/
int _alpm_resolvedeps(pmdb_t *local, alpm_list_t *dbs_sync, pmpkg_t *syncpkg,
- alpm_list_t *list, alpm_list_t *trail, pmtrans_t *trans,
- alpm_list_t **data)
+ alpm_list_t *list, pmtrans_t *trans, alpm_list_t **data)
{
- alpm_list_t *i, *j;
+ alpm_list_t *i, *j, *k;
alpm_list_t *targ;
alpm_list_t *deps = NULL;
@@ -605,14 +606,16 @@
for(i = deps; i; i = i->next) {
int found = 0;
pmdepmissing_t *miss = i->data;
- pmpkg_t *sync = NULL;
+ pmdepend_t *missdep = &(miss->depend);
+
+ pmpkg_t *sync;
- /* check if one of the packages in *list already provides this dependency */
+ /* check if one of the packages in *list already satisfies this dependency */
for(j = list; j && !found; j = j->next) {
pmpkg_t *sp = j->data;
- if(alpm_list_find_str(alpm_pkg_get_provides(sp), miss->depend.name)) {
- _alpm_log(PM_LOG_DEBUG, _("%s provides dependency %s -- skipping"),
- alpm_pkg_get_name(sp), miss->depend.name);
+ if(alpm_depcmp(sp, missdep)) {
+ _alpm_log(PM_LOG_DEBUG, _("%s satisfies dependency %s -- skipping"),
+ alpm_pkg_get_name(sp), missdep->name);
found = 1;
}
}
@@ -620,28 +623,18 @@
continue;
}
- /* find the package in one of the repositories */
- /* check literals */
- for(j = dbs_sync; !sync && j; j = j->next) {
- sync = _alpm_db_get_pkgfromcache(j->data, miss->depend.name);
- }
- /*TODO this autoresolves the first 'provides' package... we should fix this
+ /*TODO this autoresolves the first 'satisfier' package... we should fix this
* somehow */
- /* check provides */
- if(!sync) {
- for(j = dbs_sync; !sync && j; j = j->next) {
- alpm_list_t *provides;
- provides = _alpm_db_whatprovides(j->data, miss->depend.name);
- if(provides) {
- sync = provides->data;
- }
- alpm_list_free(provides);
+ for(j = dbs_sync; j && !found; j = j->next) {
+ for(k = _alpm_db_get_pkgcache(j->data); k && !found; k = k->next) {
+ sync = k->data;
+ found = alpm_depcmp(sync, missdep);
}
}
- if(!sync) {
+ if(!found) {
_alpm_log(PM_LOG_ERROR, _("cannot resolve dependencies for \"%s\" (\"%s\" is not in the package set)"),
- miss->target, miss->depend.name);
+ miss->target, missdep->name);
if(data) {
if((miss = malloc(sizeof(pmdepmissing_t))) == NULL) {
_alpm_log(PM_LOG_ERROR, _("malloc failure: could not allocate %d bytes"), sizeof(pmdepmissing_t));
@@ -655,49 +648,37 @@
pm_errno = PM_ERR_UNSATISFIED_DEPS;
goto error;
}
- if(_alpm_pkg_find(alpm_pkg_get_name(sync), list)) {
- /* this dep is already in the target list */
- _alpm_log(PM_LOG_DEBUG, _("dependency %s is already in the target list -- skipping"),
- alpm_pkg_get_name(sync));
- continue;
- }
- if(!_alpm_pkg_find(alpm_pkg_get_name(sync), trail)) {
- /* check pmo_ignorepkg and pmo_s_ignore to make sure we haven't pulled in
- * something we're not supposed to.
- */
- int usedep = 1;
- if(alpm_list_find_str(handle->ignorepkg, alpm_pkg_get_name(sync))) {
- pmpkg_t *dummypkg = _alpm_pkg_new(miss->target, NULL);
- QUESTION(trans, PM_TRANS_CONV_INSTALL_IGNOREPKG, dummypkg, sync, NULL, &usedep);
- _alpm_pkg_free(dummypkg);
+ /* check pmo_ignorepkg and pmo_s_ignore to make sure we haven't pulled in
+ * something we're not supposed to.
+ */
+ int usedep = 1;
+ if(alpm_list_find_str(handle->ignorepkg, alpm_pkg_get_name(sync))) {
+ pmpkg_t *dummypkg = _alpm_pkg_new(miss->target, NULL);
+ QUESTION(trans, PM_TRANS_CONV_INSTALL_IGNOREPKG, dummypkg, sync, NULL, &usedep);
+ _alpm_pkg_free(dummypkg);
+ }
+ if(usedep) {
+ _alpm_log(PM_LOG_DEBUG, _("pulling dependency %s (needed by %s)"),
+ alpm_pkg_get_name(sync), alpm_pkg_get_name(syncpkg));
+ list = alpm_list_add(list, sync);
+ if(_alpm_resolvedeps(local, dbs_sync, sync, list, trans, data)) {
+ goto error;
}
- if(usedep) {
- trail = alpm_list_add(trail, sync);
- if(_alpm_resolvedeps(local, dbs_sync, sync, list, trail, trans, data)) {
+ } else {
+ _alpm_log(PM_LOG_ERROR, _("cannot resolve dependencies for \"%s\""), miss->target);
+ if(data) {
+ if((miss = malloc(sizeof(pmdepmissing_t))) == NULL) {
+ _alpm_log(PM_LOG_ERROR, _("malloc failure: could not allocate %d bytes"), sizeof(pmdepmissing_t));
+ FREELIST(*data);
+ pm_errno = PM_ERR_MEMORY;
goto error;
}
- _alpm_log(PM_LOG_DEBUG, _("pulling dependency %s (needed by %s)"),
- alpm_pkg_get_name(sync), alpm_pkg_get_name(syncpkg));
- list = alpm_list_add(list, sync);
- } else {
- _alpm_log(PM_LOG_ERROR, _("cannot resolve dependencies for \"%s\""), miss->target);
- if(data) {
- if((miss = malloc(sizeof(pmdepmissing_t))) == NULL) {
- _alpm_log(PM_LOG_ERROR, _("malloc failure: could not allocate %d bytes"), sizeof(pmdepmissing_t));
- FREELIST(*data);
- pm_errno = PM_ERR_MEMORY;
- goto error;
- }
- *miss = *(pmdepmissing_t *)i->data;
- *data = alpm_list_add(*data, miss);
- }
- pm_errno = PM_ERR_UNSATISFIED_DEPS;
- goto error;
+ *miss = *(pmdepmissing_t *)i->data;
+ *data = alpm_list_add(*data, miss);
}
- } else {
- /* cycle detected -- skip it */
- _alpm_log(PM_LOG_DEBUG, _("dependency cycle detected: %s"), sync->name);
+ pm_errno = PM_ERR_UNSATISFIED_DEPS;
+ goto error;
}
}
diff -Naur pacman-git/lib/libalpm/deps.h pacman-git.new/lib/libalpm/deps.h
--- pacman-git/lib/libalpm/deps.h 2007-07-10 17:35:32.000000000 +0200
+++ pacman-git.new/lib/libalpm/deps.h 2007-07-10 15:05:40.000000000 +0200
@@ -60,7 +60,7 @@
alpm_list_t *packages);
alpm_list_t *_alpm_removedeps(pmdb_t *db, alpm_list_t *targs);
int _alpm_resolvedeps(pmdb_t *local, alpm_list_t *dbs_sync, pmpkg_t *syncpkg,
- alpm_list_t *list, alpm_list_t *trail, pmtrans_t *trans,
+ alpm_list_t *list, pmtrans_t *trans,
alpm_list_t **data);
#endif /* _ALPM_DEPS_H */
diff -Naur pacman-git/lib/libalpm/sync.c pacman-git.new/lib/libalpm/sync.c
--- pacman-git/lib/libalpm/sync.c 2007-07-10 17:35:32.000000000 +0200
+++ pacman-git.new/lib/libalpm/sync.c 2007-07-10 15:07:40.000000000 +0200
@@ -379,7 +379,6 @@
{
alpm_list_t *deps = NULL;
alpm_list_t *list = NULL; /* allow checkdeps usage with trans->packages */
- alpm_list_t *trail = NULL; /* breadcrumb list to avoid running in circles */
alpm_list_t *i, *j;
int ret = 0;
@@ -404,7 +403,7 @@
for(i = trans->packages; i; i = i->next) {
pmpkg_t *spkg = ((pmsyncpkg_t *)i->data)->pkg;
if(_alpm_resolvedeps(db_local, dbs_sync, spkg, list,
- trail, trans, data) == -1) {
+ trans, data) == -1) {
/* pm_errno is set by resolvedeps */
ret = -1;
goto cleanup;
@@ -473,7 +472,6 @@
goto cleanup;
}
- alpm_list_free(trail);
}
/* We don't care about conflicts if we're just printing uris */
@@ -709,7 +707,6 @@
cleanup:
alpm_list_free(list);
- alpm_list_free(trail);
return(ret);
}
-------------- next part --------------
self.description = "Install a package from a sync db with cascaded dependencies + provides"
sp1 = pmpkg("dummy", "1.0-2")
sp1.depends = ["dep1", "dep2=1.0-2"]
sp2 = pmpkg("dep1")
sp2.files = ["bin/dep1"]
sp2.provides = ["dep2"]
sp3 = pmpkg("dep2", "1.0-2")
for p in sp1, sp2, sp3:
self.addpkg2db("sync", p);
self.args = "-S %s" % sp1.name
self.addrule("PACMAN_RETCODE=0")
self.addrule("PKG_VERSION=dummy|1.0-2")
self.addrule("PKG_EXIST=dep1")
self.addrule("PKG_EXIST=dep2")
More information about the pacman-dev
mailing list