upgrade: implement --ignore to exclude some packages from upgrade
parent
cfa8b736f8
commit
695a2f8231
|
@ -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 {
|
||||||
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,
|
||||||
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,
|
||||||
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 {
|
||||||
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
|
||||||
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[] = {
|
||||||
{ 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
|
||||||
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) {
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
@ARGS
|
||||||
|
--test-repo upgrade.repo
|
||||||
|
--test-instdb upgrade.installed
|
||||||
|
--test-world app
|
||||||
|
upgrade --ignore app
|
||||||
|
@EXPECT
|
||||||
|
OK: 0 MiB in 2 packages
|
Loading…
Reference in New Issue