Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Take PKG_ATTR_{VITAL,LOCKED} into account when solving for pkg upgrade.
Gleb Popov committed 2 years ago
commit ccfbf0c0812bb28681f33729db635fef7a8d9294
parent b34c6e3
1 file changed +28 -0
modified libpkg/pkg_solve.c
@@ -1,5 +1,7 @@
/*-
 * Copyright (c) 2013-2017 Vsevolod Stakhov <vsevolod@FreeBSD.org>
+
 * Copyright (c) 2024 Serenity Cyber Security, LLC <license@futurecrew.ru>
+
 *                    Author: Gleb Popov <arrowd@FreeBSD.org>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
@@ -53,6 +55,7 @@ enum pkg_solve_rule_type {
	PKG_RULE_REQUEST_CONFLICT,
	PKG_RULE_REQUEST,
	PKG_RULE_REQUIRE,
+
	PKG_RULE_VITAL,
	PKG_RULE_MAX
};

@@ -63,6 +66,7 @@ static const char *rule_reasons[] = {
	[PKG_RULE_EXPLICIT_CONFLICT] = "conflict",
	[PKG_RULE_REQUEST] = "request",
	[PKG_RULE_REQUIRE] = "require",
+
	[PKG_RULE_VITAL] = "vital",
	[PKG_RULE_MAX] = NULL
};

@@ -244,6 +248,10 @@ pkg_print_rule_buf(struct pkg_solve_rule *rule, xstring *sb)
					it->next ? ", " : "");
		}
		break;
+
	case PKG_RULE_VITAL:
+
		fprintf(sb->fp, "The following package is marked vital: %s-%s",
+
				rule->items->var->uid, rule->items->var->unit->pkg->version);
+
		break;
	default:
		break;
	}
@@ -621,6 +629,17 @@ pkg_solve_add_chain_rule(struct pkg_solve_problem *problem,
}

static int
+
pkg_solve_add_vital_rule(struct pkg_solve_problem *problem,
+
	struct pkg_solve_variable *var)
+
{
+
	struct pkg_solve_rule* rule = pkg_solve_rule_new(PKG_RULE_VITAL);
+
	pkg_solve_item_new(rule, var, 1);
+
	tll_push_front(problem->rules, rule);
+

+
	return (EPKG_OK);
+
}
+

+
static int
pkg_solve_process_universe_variable(struct pkg_solve_problem *problem,
		struct pkg_solve_variable *var)
{
@@ -631,6 +650,7 @@ pkg_solve_process_universe_variable(struct pkg_solve_problem *problem,
	struct pkg_jobs *j = problem->j;
	struct pkg_job_request *jreq = NULL;
	bool chain_added = false;
+
	bool force = j->flags & PKG_FLAG_FORCE;

	LL_FOREACH(var, cur_var) {
		pkg = cur_var->unit->pkg;
@@ -649,6 +669,10 @@ pkg_solve_process_universe_variable(struct pkg_solve_problem *problem,
			cur_var->assumed_reponame = pkg->reponame;
		}

+
		if (pkg->locked || (pkg->vital && !force)) {
+
			pkg_solve_add_vital_rule(problem, cur_var);
+
		}
+

		/* Depends */
		LL_FOREACH(pkg->depends, dep) {
			if (pkg_solve_add_depend_rule(problem, cur_var, dep,
@@ -949,6 +973,10 @@ pkg_solve_set_initial_assumption(struct pkg_solve_problem *problem,
	case PKG_RULE_REQUIRE:
		/* XXX: deal with require rules somehow */
		break;
+
	case PKG_RULE_VITAL:
+
		var = item->var;
+
		picosat_set_default_phase_lit(problem->sat, var->order, 1);
+
		break;
	default:
		/* No nothing */
		return;