summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libopkg/opkg_conf.h1
-rw-r--r--libopkg/pkg_hash.c18
-rw-r--r--src/opkg-cl.c9
3 files changed, 25 insertions, 3 deletions
diff --git a/libopkg/opkg_conf.h b/libopkg/opkg_conf.h
index 3a60bc5..75b4cd6 100644
--- a/libopkg/opkg_conf.h
+++ b/libopkg/opkg_conf.h
@@ -77,6 +77,7 @@ struct opkg_conf
int force_removal_of_essential_packages;
int force_postinstall;
int force_remove;
+ int prefer_arch_to_version;
int check_signature;
int nodeps; /* do not follow dependencies */
char *offline_root;
diff --git a/libopkg/pkg_hash.c b/libopkg/pkg_hash.c
index a99cf6b..4bc0c3a 100644
--- a/libopkg/pkg_hash.c
+++ b/libopkg/pkg_hash.c
@@ -376,10 +376,22 @@ pkg_hash_fetch_best_installation_candidate(abstract_pkg_t *apkg,
if (constraint_fcn(matching, cdata)) {
opkg_msg(DEBUG, "Candidate: %s %s.\n",
matching->name, matching->version) ;
- good_pkg_by_name = matching;
/* It has been provided by hand, so it is what user want */
- if (matching->provided_by_hand == 1)
- break;
+ if (matching->provided_by_hand == 1) {
+ good_pkg_by_name = matching;
+ break;
+ }
+ /* Respect to the arch priorities when given alternatives */
+ if (good_pkg_by_name && conf->prefer_arch_to_version) {
+ if (matching->arch_priority >= good_pkg_by_name->arch_priority) {
+ good_pkg_by_name = matching;
+ opkg_msg(DEBUG, "%s %s wins by priority.\n",
+ matching->name, matching->version) ;
+ } else
+ opkg_msg(DEBUG, "%s %s wins by priority.\n",
+ good_pkg_by_name->name, good_pkg_by_name->version) ;
+ } else
+ good_pkg_by_name = matching;
}
}
diff --git a/src/opkg-cl.c b/src/opkg-cl.c
index 1b927e5..0073847 100644
--- a/src/opkg-cl.c
+++ b/src/opkg-cl.c
@@ -42,6 +42,7 @@ enum {
ARGS_OPT_FORCE_SPACE,
ARGS_OPT_FORCE_POSTINSTALL,
ARGS_OPT_FORCE_REMOVE,
+ ARGS_OPT_PREFER_ARCH_TO_VERSION,
ARGS_OPT_ADD_ARCH,
ARGS_OPT_ADD_DEST,
ARGS_OPT_NOACTION,
@@ -83,6 +84,8 @@ static struct option long_options[] = {
{"force_postinstall", 0, 0, ARGS_OPT_FORCE_POSTINSTALL},
{"force-remove", 0, 0, ARGS_OPT_FORCE_REMOVE},
{"force_remove", 0, 0, ARGS_OPT_FORCE_REMOVE},
+ {"prefer-arch-to-version", 0, 0, ARGS_OPT_PREFER_ARCH_TO_VERSION},
+ {"prefer-arch-to-version", 0, 0, ARGS_OPT_PREFER_ARCH_TO_VERSION},
{"noaction", 0, 0, ARGS_OPT_NOACTION},
{"download-only", 0, 0, ARGS_OPT_DOWNLOAD_ONLY},
{"nodeps", 0, 0, ARGS_OPT_NODEPS},
@@ -173,6 +176,9 @@ args_parse(int argc, char *argv[])
case ARGS_OPT_FORCE_REMOVE:
conf->force_remove = 1;
break;
+ case ARGS_OPT_PREFER_ARCH_TO_VERSION:
+ conf->prefer_arch_to_version = 1;
+ break;
case ARGS_OPT_NODEPS:
conf->nodeps = 1;
break;
@@ -271,6 +277,9 @@ usage()
printf("\t--offline-root <dir> offline installation of packages.\n");
printf("\t--add-arch <arch>:<prio> Register architecture with given priority\n");
printf("\t--add-dest <name>:<path> Register destination with given path\n");
+ printf("\t--prefer-arch-to-version\t Use the architecture priority package rather\n");
+ printf("\t than the higher version one if more\n");
+ printf("\t than one candidate is found.\n");
printf("\nForce Options:\n");
printf("\t--force-depends Install/remove despite failed dependencies\n");