diff mbox series

[opkg,v2] pkg_hash: don't suggest incompatible packages

Message ID 20201027023957.1228316-1-mail@aparcar.org
State Accepted
Delegated to: Daniel Golle
Headers show
Series [opkg,v2] pkg_hash: don't suggest incompatible packages | expand

Commit Message

Paul Spooren Oct. 27, 2020, 2:39 a.m. UTC
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>
---
v2:
  - Only resolve dependencies if architecture is selected and package is
    not already added. That should save some precious CPU cycles.

 libopkg/pkg_hash.c | 22 ++++++++++++++++++----
 1 file changed, 18 insertions(+), 4 deletions(-)
diff mbox series

Patch

diff --git a/libopkg/pkg_hash.c b/libopkg/pkg_hash.c
index 52c64ff..6715ebd 100644
--- a/libopkg/pkg_hash.c
+++ b/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);
 				}
 			}