瀏覽代碼

pkg_hash: don't suggest incompatible packages

Up until now opkg would suggest packages with unsatisfied dependencies
as installable candidates. This is a frequent issue for the kmod feed in
snapshot images. In these cases opkg suggest a newer kmod version than
compatible with the installed kernel, because the same package is
available both in the kmods archive and the target specific packages
feed.

This commit fixes the issue by dropping all package problematic
candidates by checking if all their dependencies could be installed.

Signed-off-by: Paul Spooren <mail@aparcar.org>
Paul Spooren 3 年之前
父節點
當前提交
8769c75199
共有 1 個文件被更改,包括 18 次插入4 次删除
  1. 18 4
      libopkg/pkg_hash.c

+ 18 - 4
libopkg/pkg_hash.c

@@ -20,6 +20,7 @@
 #include "hash_table.h"
 #include "pkg.h"
 #include "opkg_message.h"
+#include "pkg_depends.h"
 #include "pkg_vec.h"
 #include "pkg_hash.h"
 #include "parse_util.h"
@@ -376,10 +377,23 @@ pkg_t *pkg_hash_fetch_best_installation_candidate(abstract_pkg_t * apkg,
 				if ((arch_priority > 0)
 				    &&
 				    (!pkg_vec_contains(matching_pkgs, maybe))) {
-					max_count++;
-					abstract_pkg_vec_insert(matching_apkgs,
-								maybe->parent);
-					pkg_vec_insert(matching_pkgs, maybe);
+					char **unresolved = NULL;
+					pkg_vec_t *depends = pkg_vec_alloc();
+					pkg_hash_fetch_unsatisfied_dependencies(maybe, depends,
+						&unresolved);
+
+					if (!unresolved) {
+						max_count++;
+						abstract_pkg_vec_insert(matching_apkgs,
+									maybe->parent);
+						pkg_vec_insert(matching_pkgs, maybe);
+					} else {
+						char **tmp = unresolved;
+						while (tmp)
+							free(*(tmp++));
+						free(unresolved);
+					}
+					pkg_vec_free(depends);
 				}
 			}