100 lines
3.8 KiB
Diff
100 lines
3.8 KiB
Diff
Add the --prefer-arch-to-version option
|
|
|
|
If there were more than one candidate which had the same pkg name in the
|
|
candidate list, for example, the same pkg with different versions, then
|
|
it would use the last one which was the highest version one in the past,
|
|
but it will use the higher arch priority when this option is specified.
|
|
|
|
Upstream-Status: Pending
|
|
|
|
Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
|
|
---
|
|
libopkg/opkg_conf.h | 1 +
|
|
libopkg/pkg_hash.c | 18 +++++++++++++++---
|
|
src/opkg-cl.c | 9 +++++++++
|
|
3 files changed, 25 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/libopkg/opkg_conf.h b/libopkg/opkg_conf.h
|
|
--- 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
|
|
--- 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
|
|
--- 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");
|
|
--
|
|
1.7.1
|
|
|