Commit 695a2f82 authored by byrn's avatar byrn Committed by Timo Teräs
Browse files

upgrade: implement --ignore to exclude some packages from upgrade

parent cfa8b736
...@@ -35,6 +35,7 @@ struct apk_changeset { ...@@ -35,6 +35,7 @@ struct apk_changeset {
#define APK_SOLVERF_REINSTALL 0x0004 #define APK_SOLVERF_REINSTALL 0x0004
#define APK_SOLVERF_LATEST 0x0008 #define APK_SOLVERF_LATEST 0x0008
#define APK_SOLVERF_IGNORE_CONFLICT 0x0010 #define APK_SOLVERF_IGNORE_CONFLICT 0x0010
#define APK_SOLVERF_IGNORE_UPGRADE 0x0020
void apk_solver_set_name_flags(struct apk_name *name, void apk_solver_set_name_flags(struct apk_name *name,
unsigned short solver_flags, unsigned short solver_flags,
......
...@@ -49,8 +49,8 @@ struct apk_solver_package_state { ...@@ -49,8 +49,8 @@ struct apk_solver_package_state {
unsigned short max_dep_chain; unsigned short max_dep_chain;
unsigned short pinning_allowed; unsigned short pinning_allowed;
unsigned short pinning_preferred; unsigned short pinning_preferred;
unsigned solver_flags : 4; unsigned solver_flags : 6;
unsigned solver_flags_inheritable : 4; unsigned solver_flags_inheritable : 6;
unsigned seen : 1; unsigned seen : 1;
unsigned pkg_available : 1; unsigned pkg_available : 1;
unsigned pkg_selectable : 1; unsigned pkg_selectable : 1;
......
...@@ -551,7 +551,8 @@ static int compare_providers(struct apk_solver_state *ss, ...@@ -551,7 +551,8 @@ static int compare_providers(struct apk_solver_state *ss,
return r; return r;
/* Prefer installed on self-upgrade */ /* Prefer installed on self-upgrade */
if (db->performing_self_upgrade && !(solver_flags & APK_SOLVERF_UPGRADE)) { if ((db->performing_self_upgrade && !(solver_flags & APK_SOLVERF_UPGRADE)) ||
(solver_flags & APK_SOLVERF_IGNORE_UPGRADE)) {
r = (pkgA->ipkg != NULL) - (pkgB->ipkg != NULL); r = (pkgA->ipkg != NULL) - (pkgB->ipkg != NULL);
if (r) if (r)
return r; return r;
...@@ -580,7 +581,8 @@ static int compare_providers(struct apk_solver_state *ss, ...@@ -580,7 +581,8 @@ static int compare_providers(struct apk_solver_state *ss,
return r; return r;
/* Prefer installed */ /* Prefer installed */
if (!(solver_flags & APK_SOLVERF_UPGRADE)) { if (!(solver_flags & APK_SOLVERF_UPGRADE) ||
(solver_flags & APK_SOLVERF_IGNORE_UPGRADE)) {
r = (pkgA->ipkg != NULL) - (pkgB->ipkg != NULL); r = (pkgA->ipkg != NULL) - (pkgB->ipkg != NULL);
if (r) if (r)
return r; return r;
......
...@@ -22,6 +22,7 @@ struct upgrade_ctx { ...@@ -22,6 +22,7 @@ struct upgrade_ctx {
unsigned short solver_flags; unsigned short solver_flags;
int no_self_upgrade : 1; int no_self_upgrade : 1;
int self_upgrade_only : 1; int self_upgrade_only : 1;
int ignore : 1;
}; };
static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int optch, const char *optarg) static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int optch, const char *optarg)
...@@ -35,6 +36,9 @@ static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int opt ...@@ -35,6 +36,9 @@ static int option_parse_applet(void *ctx, struct apk_db_options *dbopts, int opt
case 0x10001: case 0x10001:
uctx->self_upgrade_only = 1; uctx->self_upgrade_only = 1;
break; break;
case 0x10002:
uctx->ignore = 1;
break;
case 'a': case 'a':
uctx->solver_flags |= APK_SOLVERF_AVAILABLE; uctx->solver_flags |= APK_SOLVERF_AVAILABLE;
break; break;
...@@ -59,6 +63,8 @@ static const struct apk_option options_applet[] = { ...@@ -59,6 +63,8 @@ static const struct apk_option options_applet[] = {
{ 0x10000, "no-self-upgrade", { 0x10000, "no-self-upgrade",
"Do not do early upgrade of 'apk-tools' package" }, "Do not do early upgrade of 'apk-tools' package" },
{ 0x10001, "self-upgrade-only", "Only do self-upgrade" }, { 0x10001, "self-upgrade-only", "Only do self-upgrade" },
{ 0x10002, "ignore", "Ignore the upgrade of PACKAGE. Partial "
"upgrades not supported, this might break your system."},
}; };
static const struct apk_option_group optgroup_applet = { static const struct apk_option_group optgroup_applet = {
...@@ -158,6 +164,15 @@ static int upgrade_main(void *ctx, struct apk_database *db, struct apk_string_ar ...@@ -158,6 +164,15 @@ static int upgrade_main(void *ctx, struct apk_database *db, struct apk_string_ar
if (uctx->self_upgrade_only) if (uctx->self_upgrade_only)
return 0; return 0;
if (uctx->ignore) {
char **pkg_name;
struct apk_name *name;
foreach_array_item(pkg_name, args) {
name = apk_db_get_name(db, APK_BLOB_STR(*pkg_name));
apk_solver_set_name_flags(name, solver_flags | APK_SOLVERF_IGNORE_UPGRADE, 0);
}
}
if (solver_flags & APK_SOLVERF_AVAILABLE) { if (solver_flags & APK_SOLVERF_AVAILABLE) {
apk_dependency_array_copy(&world, db->world); apk_dependency_array_copy(&world, db->world);
foreach_array_item(dep, world) { foreach_array_item(dep, world) {
......
@ARGS
--test-repo upgrade.repo
--test-instdb upgrade.installed
--test-world app
upgrade --ignore app
@EXPECT
OK: 0 MiB in 2 packages
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment