summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Schiffer2021-03-13 01:00:40 +0000
committerDaniel Golle2021-03-15 00:27:38 +0000
commit5936c4f9660248284e8a9b040ea3153d3ea888de (patch)
tree54ffa5d729297aefda2e0de11e4decbdf7c95857
parentd3a63b327383a2ac1a8f925a58a2f6a7808f5181 (diff)
downloadopkg-lede-5936c4f9660248284e8a9b040ea3153d3ea888de.tar.gz
libopkg: pkg_hash: prefer original packages to satisfy dependencies
When one package "provides" another non-virtual package, prefer to use the original package instead of the providing package. Example: Consider packages "foo" and "bar", where "foo" provides "bar". The current code will sort all candidates by name and use the last entry by default, so "foo" would be used to satisfy a dependency on "bar". Change the logic to prefer the actual package "bar" in this case. Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
-rw-r--r--libopkg/pkg_hash.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/libopkg/pkg_hash.c b/libopkg/pkg_hash.c
index dbed3fe..a07a25e 100644
--- a/libopkg/pkg_hash.c
+++ b/libopkg/pkg_hash.c
@@ -284,6 +284,7 @@ pkg_t *pkg_hash_fetch_best_installation_candidate(abstract_pkg_t * apkg,
int nmatching = 0;
int wrong_arch_found = 0;
int arch_priority;
+ int good_pkg_score = 0;
pkg_vec_t *matching_pkgs;
abstract_pkg_vec_t *matching_apkgs;
abstract_pkg_vec_t *provided_apkg_vec;
@@ -409,9 +410,18 @@ pkg_t *pkg_hash_fetch_best_installation_candidate(abstract_pkg_t * apkg,
for (i = 0; i < matching_pkgs->len; i++) {
pkg_t *matching = matching_pkgs->pkgs[i];
if (constraint_fcn(matching, cdata)) {
- opkg_msg(DEBUG, "Candidate: %s %s.\n",
- matching->name, pkg_get_string(matching, PKG_VERSION));
+ int score = 1;
+ if (strcmp(matching->name, apkg->name) == 0)
+ score++;
+
+ opkg_msg(DEBUG, "Candidate: %s %s (score %d).\n",
+ matching->name, pkg_get_string(matching, PKG_VERSION),
+ score);
+ if (score < good_pkg_score)
+ continue;
+
good_pkg_by_name = matching;
+ good_pkg_score = score;
/* It has been provided by hand, so it is what user want */
if (matching->provided_by_hand == 1)
break;