summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Gregory <andrew.gregory.8@gmail.com>2012-09-16 12:53:40 -0400
committerAllan McRae <allan@archlinux.org>2012-12-14 12:35:34 +1000
commit5a247ccbd4953e9bdd383ad30ca90ed740c9db3d (patch)
tree6927d3d7fd1ba4b58e6b660c1c9737dac58cd7c3
parent927fdc0079c48b5bb401ac6e112d2d864919c5cc (diff)
downloadpacman-5a247ccbd4953e9bdd383ad30ca90ed740c9db3d.tar.xz
Fix overzealous package removal with unmet dependencies
Signed-off-by: Andrew Gregory <andrew.gregory.8@gmail.com> [Allan: Remove expected failure from fixed pactests] Signed-off-by: Allan McRae <allan@archlinux.org>
-rw-r--r--lib/libalpm/deps.c82
-rw-r--r--test/pacman/tests/sync140.py2
-rw-r--r--test/pacman/tests/sync141.py2
-rw-r--r--test/pacman/tests/unresolvable001.py2
4 files changed, 41 insertions, 47 deletions
diff --git a/lib/libalpm/deps.c b/lib/libalpm/deps.c
index 2a06bb04..6841097d 100644
--- a/lib/libalpm/deps.c
+++ b/lib/libalpm/deps.c
@@ -725,7 +725,7 @@ int _alpm_resolvedeps(alpm_handle_t *handle, alpm_list_t *localpkgs,
alpm_list_t *rem, alpm_list_t **data)
{
int ret = 0;
- alpm_list_t *i, *j;
+ alpm_list_t *j;
alpm_list_t *targ;
alpm_list_t *deps = NULL;
alpm_list_t *packages_copy;
@@ -742,49 +742,49 @@ int _alpm_resolvedeps(alpm_handle_t *handle, alpm_list_t *localpkgs,
*packages = alpm_list_add(*packages, pkg);
_alpm_log(handle, ALPM_LOG_DEBUG, "started resolving dependencies\n");
- for(i = alpm_list_last(*packages); i; i = i->next) {
- alpm_pkg_t *tpkg = i->data;
- targ = alpm_list_add(NULL, tpkg);
- deps = alpm_checkdeps(handle, localpkgs, rem, targ, 0);
- alpm_list_free(targ);
-
- for(j = deps; j; j = j->next) {
- alpm_depmissing_t *miss = j->data;
- alpm_depend_t *missdep = miss->depend;
- /* check if one of the packages in the [*packages] list already satisfies
- * this dependency */
- if(find_dep_satisfier(*packages, missdep)) {
- _alpm_depmiss_free(miss);
- continue;
- }
- /* check if one of the packages in the [preferred] list already satisfies
- * this dependency */
- alpm_pkg_t *spkg = find_dep_satisfier(preferred, missdep);
- if(!spkg) {
- /* find a satisfier package in the given repositories */
- spkg = resolvedep(handle, missdep, handle->dbs_sync, *packages, 0);
- }
- if(!spkg) {
- handle->pm_errno = ALPM_ERR_UNSATISFIED_DEPS;
- char *missdepstring = alpm_dep_compute_string(missdep);
- _alpm_log(handle, ALPM_LOG_WARNING,
- _("cannot resolve \"%s\", a dependency of \"%s\"\n"),
- missdepstring, tpkg->name);
- free(missdepstring);
- if(data) {
- *data = alpm_list_add(*data, miss);
- }
- ret = -1;
- } else {
- _alpm_log(handle, ALPM_LOG_DEBUG,
- "pulling dependency %s (needed by %s)\n",
- spkg->name, tpkg->name);
- *packages = alpm_list_add(*packages, spkg);
- _alpm_depmiss_free(miss);
+ targ = alpm_list_add(NULL, pkg);
+ deps = alpm_checkdeps(handle, localpkgs, rem, targ, 0);
+ alpm_list_free(targ);
+ targ = NULL;
+
+ for(j = deps; j; j = j->next) {
+ alpm_depmissing_t *miss = j->data;
+ alpm_depend_t *missdep = miss->depend;
+ /* check if one of the packages in the [*packages] list already satisfies
+ * this dependency */
+ if(find_dep_satisfier(*packages, missdep)) {
+ _alpm_depmiss_free(miss);
+ continue;
+ }
+ /* check if one of the packages in the [preferred] list already satisfies
+ * this dependency */
+ alpm_pkg_t *spkg = find_dep_satisfier(preferred, missdep);
+ if(!spkg) {
+ /* find a satisfier package in the given repositories */
+ spkg = resolvedep(handle, missdep, handle->dbs_sync, *packages, 0);
+ }
+ if(spkg && _alpm_resolvedeps(handle, localpkgs, spkg, preferred, packages, rem, data) == 0) {
+ _alpm_log(handle, ALPM_LOG_DEBUG,
+ "pulling dependency %s (needed by %s)\n",
+ spkg->name, pkg->name);
+ _alpm_depmiss_free(miss);
+ } else if(resolvedep(handle, missdep, (targ = alpm_list_add(NULL, handle->db_local)), rem, 0)) {
+ _alpm_depmiss_free(miss);
+ } else {
+ handle->pm_errno = ALPM_ERR_UNSATISFIED_DEPS;
+ char *missdepstring = alpm_dep_compute_string(missdep);
+ _alpm_log(handle, ALPM_LOG_WARNING,
+ _("cannot resolve \"%s\", a dependency of \"%s\"\n"),
+ missdepstring, pkg->name);
+ free(missdepstring);
+ if(data) {
+ *data = alpm_list_add(*data, miss);
}
+ ret = -1;
}
- alpm_list_free(deps);
}
+ alpm_list_free(targ);
+ alpm_list_free(deps);
if(ret != 0) {
alpm_list_free(*packages);
diff --git a/test/pacman/tests/sync140.py b/test/pacman/tests/sync140.py
index d20da985..ce21cc33 100644
--- a/test/pacman/tests/sync140.py
+++ b/test/pacman/tests/sync140.py
@@ -24,5 +24,3 @@ self.addrule("PACMAN_RETCODE=0")
self.addrule("PKG_VERSION=glibc|1.0-1")
self.addrule("PKG_VERSION=gcc-libs|1.0-1")
self.addrule("PKG_VERSION=pcre|1.0-2")
-
-self.expectfailure = True
diff --git a/test/pacman/tests/sync141.py b/test/pacman/tests/sync141.py
index b2c996eb..f2f01364 100644
--- a/test/pacman/tests/sync141.py
+++ b/test/pacman/tests/sync141.py
@@ -24,5 +24,3 @@ self.addrule("PACMAN_RETCODE=0")
self.addrule("PKG_VERSION=c_glibc|1.0-1")
self.addrule("PKG_VERSION=b_gcc-libs|1.0-1")
self.addrule("PKG_VERSION=a_pcre|1.0-2")
-
-self.expectfailure = True
diff --git a/test/pacman/tests/unresolvable001.py b/test/pacman/tests/unresolvable001.py
index c98a4c02..9d54c3e5 100644
--- a/test/pacman/tests/unresolvable001.py
+++ b/test/pacman/tests/unresolvable001.py
@@ -17,5 +17,3 @@ self.addrule("PACMAN_RETCODE=0")
self.addrule("PKG_EXIST=package")
self.addrule("PKG_EXIST=dep")
self.addrule("PKG_VERSION=dep|1.0-1")
-
-self.expectfailure = True