From: Michael Schroeder Date: Tue, 9 Jul 2024 11:06:16 +0000 (+0200) Subject: Add new SOLVER_FLAG_FOCUS_NEW focus type X-Git-Tag: 0.7.30~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8151b3a8b415ecec89043daecafa6059fc1424cf;p=thirdparty%2Flibsolv.git Add new SOLVER_FLAG_FOCUS_NEW focus type First resolve the given jobs, then the dependencies of the resulting packages ignoreing the ones provided by currently installed packages. After that resolve all already installed packages. This is similar to SOLVER_FLAG_FOCUS_BEST but less aggressive in updating packages. Fixes issue #549 --- diff --git a/bindings/solv.i b/bindings/solv.i index f871a819..0648d804 100644 --- a/bindings/solv.i +++ b/bindings/solv.i @@ -3887,6 +3887,7 @@ returnself(matchsolvable) static const int SOLVER_FLAG_INSTALL_ALSO_UPDATES = SOLVER_FLAG_INSTALL_ALSO_UPDATES; static const int SOLVER_FLAG_ONLY_NAMESPACE_RECOMMENDED = SOLVER_FLAG_ONLY_NAMESPACE_RECOMMENDED; static const int SOLVER_FLAG_STRICT_REPO_PRIORITY = SOLVER_FLAG_STRICT_REPO_PRIORITY; + static const int SOLVER_FLAG_FOCUS_NEW = SOLVER_FLAG_FOCUS_NEW; static const int SOLVER_REASON_UNRELATED = SOLVER_REASON_UNRELATED; static const int SOLVER_REASON_UNIT_RULE = SOLVER_REASON_UNIT_RULE; diff --git a/doc/gen/libsolv-bindings.3 b/doc/gen/libsolv-bindings.3 index d2d3067d..d5533d0d 100644 --- a/doc/gen/libsolv-bindings.3 +++ b/doc/gen/libsolv-bindings.3 @@ -2,12 +2,12 @@ .\" Title: Libsolv-Bindings .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 03/27/2024 +.\" Date: 07/09/2024 .\" Manual: LIBSOLV .\" Source: libsolv .\" Language: English .\" -.TH "LIBSOLV\-BINDINGS" "3" "03/27/2024" "libsolv" "LIBSOLV" +.TH "LIBSOLV\-BINDINGS" "3" "07/09/2024" "libsolv" "LIBSOLV" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -4101,6 +4101,11 @@ Resolve installed packages before resolving the given jobs\&. Setting this flag First resolve the given jobs, then the dependencies of the resulting packages, then resolve all already installed packages\&. This will result in more packages being updated as when the flag is not used\&. .RE .PP +\fBSOLVER_FLAG_FOCUS_NEW\fR +.RS 4 +First resolve the given jobs, then the dependencies of the resulting packages ignoreing the ones provided by currently installed packages\&. After that resolve all already installed packages\&. This is similar to SOLVER_FLAG_FOCUS_BEST but less aggressive in updating packages\&. +.RE +.PP \fBSOLVER_FLAG_INSTALL_ALSO_UPDATES\fR .RS 4 Update the package if a job is already fulfilled by an installed package\&. diff --git a/doc/libsolv-bindings.txt b/doc/libsolv-bindings.txt index 45be37c8..ac22bd2f 100644 --- a/doc/libsolv-bindings.txt +++ b/doc/libsolv-bindings.txt @@ -2450,6 +2450,13 @@ resulting packages, then resolve all already installed packages. This will result in more packages being updated as when the flag is not used. +*SOLVER_FLAG_FOCUS_NEW*:: +First resolve the given jobs, then the dependencies of the +resulting packages ignoreing the ones provided by currently +installed packages. After that resolve all already installed +packages. This is similar to SOLVER_FLAG_FOCUS_BEST but less +aggressive in updating packages. + *SOLVER_FLAG_INSTALL_ALSO_UPDATES*:: Update the package if a job is already fulfilled by an installed package. diff --git a/ext/testcase.c b/ext/testcase.c index 7b6179b5..d3533b9b 100644 --- a/ext/testcase.c +++ b/ext/testcase.c @@ -139,6 +139,7 @@ static struct solverflags2str { { SOLVER_FLAG_INSTALL_ALSO_UPDATES, "installalsoupdates", 0 }, { SOLVER_FLAG_ONLY_NAMESPACE_RECOMMENDED, "onlynamespacerecommended", 0 }, { SOLVER_FLAG_STRICT_REPO_PRIORITY, "strictrepopriority", 0 }, + { SOLVER_FLAG_FOCUS_NEW, "focusnew", 0 }, { 0, 0, 0 } }; diff --git a/src/solver.c b/src/solver.c index be7825d1..edd7ff81 100644 --- a/src/solver.c +++ b/src/solver.c @@ -1576,6 +1576,8 @@ solver_get_flag(Solver *solv, int flag) return solv->break_orphans; case SOLVER_FLAG_FOCUS_INSTALLED: return solv->focus_installed; + case SOLVER_FLAG_FOCUS_NEW: + return solv->focus_new; case SOLVER_FLAG_FOCUS_BEST: return solv->focus_best; case SOLVER_FLAG_YUM_OBSOLETES: @@ -1664,6 +1666,9 @@ solver_set_flag(Solver *solv, int flag, int value) case SOLVER_FLAG_FOCUS_INSTALLED: solv->focus_installed = value; break; + case SOLVER_FLAG_FOCUS_NEW: + solv->focus_new = value; + break; case SOLVER_FLAG_FOCUS_BEST: solv->focus_best = value; break; @@ -2071,7 +2076,7 @@ resolve_dependencies(Solver *solv, int level, int disablerules, Queue *dq) Rule *r; int origlevel = level; Id p, *dp; - int focusbest = solv->focus_best && solv->do_extra_reordering; + int focusbest = (solv->focus_new || solv->focus_best) && solv->do_extra_reordering; Repo *installed = solv->installed; /* @@ -2113,6 +2118,18 @@ resolve_dependencies(Solver *solv, int level, int disablerules, Queue *dq) if (!p) continue; /* sorry */ } + if (!solv->focus_best) + { + /* check that no positive literal is already installed */ + if (r->p > 1 && pool->solvables[r->p].repo == installed) + continue; + dp = pool->whatprovidesdata + r->d; + while ((p = *dp++) != 0) + if (p > 1 && pool->solvables[p].repo == installed) + break; + if (p) + continue; + } } if (dq->count) queue_empty(dq); @@ -2898,8 +2915,8 @@ solver_run_sat(Solver *solv, int disablerules, int doweak) systemlevel = level + 1; } - /* resolve job dependencies in the focus_best case */ - if (level < systemlevel && solv->focus_best && !solv->focus_installed && solv->installed && solv->installed->nsolvables && !solv->installed->disabled) + /* resolve job dependencies in the focus_new/best case */ + if (level < systemlevel && (solv->focus_new || solv->focus_best) && !solv->focus_installed && solv->installed && solv->installed->nsolvables && !solv->installed->disabled) { solv->do_extra_reordering = 1; olevel = level; diff --git a/src/solver.h b/src/solver.h index b1f8d262..05256503 100644 --- a/src/solver.h +++ b/src/solver.h @@ -173,6 +173,7 @@ struct s_Solver { int noautotarget; /* true: do not assume targeted for up/dup jobs that contain no installed solvable */ int focus_installed; /* true: resolve update rules first */ int focus_best; /* true: resolve job dependencies first */ + int focus_new; /* true: resolve job dependencies first but ignore dependencies met by installed packages */ int do_yum_obsoletes; /* true: add special yumobs rules */ int urpmreorder; /* true: do special urpm package reordering */ int strongrecommends; /* true: create weak rules for recommends */ @@ -337,6 +338,7 @@ typedef struct s_Solver Solver; #define SOLVER_FLAG_INSTALL_ALSO_UPDATES 26 #define SOLVER_FLAG_ONLY_NAMESPACE_RECOMMENDED 27 #define SOLVER_FLAG_STRICT_REPO_PRIORITY 28 +#define SOLVER_FLAG_FOCUS_NEW 29 #define GET_USERINSTALLED_NAMES (1 << 0) /* package names instead of ids */ #define GET_USERINSTALLED_INVERTED (1 << 1) /* autoinstalled */ diff --git a/test/testcases/focus/new1.t b/test/testcases/focus/new1.t new file mode 100644 index 00000000..00b87f8d --- /dev/null +++ b/test/testcases/focus/new1.t @@ -0,0 +1,27 @@ +repo @System 0 testtags +#>=Pkg: krb5-libs 1.18.2 22.el8_7 x86_64 +#>=Prv: krb5-libs(x86-64) = 1.18.2-22.el8_7 + +repo available 0 testtags +#>=Pkg: ipa-client 4.9.11 5.el8 x86_64 +#>=Req: krb5-pkinit-openssl +#> +#>=Pkg: krb5-libs 1.18.2 25.el8_8 x86_64 +#>=Prv: krb5-libs(x86-64) = 1.18.2-25.el8_8 +#> +#>=Pkg: krb5-pkinit 1.18.2 25.el8_8 x86_64 +#>=Req: krb5-libs(x86-64) = 1.18.2-25.el8_8 +#>=Prv: krb5-pkinit-openssl = 1.18.2-25.el8_8 +#> +#>=Pkg: krb5-pkinit 1.18.2 22.el8_7 x86_64 +#>=Req: krb5-libs(x86-64) = 1.18.2-22.el8_7 +#>=Prv: krb5-pkinit-openssl = 1.18.2-22.el8_7 + +system x86_64 rpm @System +solverflags focusnew + +job install pkg ipa-client-4.9.11-5.el8.x86_64@available +result transaction,problems +#>install ipa-client-4.9.11-5.el8.x86_64@available +#>install krb5-pkinit-1.18.2-25.el8_8.x86_64@available +#>upgrade krb5-libs-1.18.2-22.el8_7.x86_64@@System krb5-libs-1.18.2-25.el8_8.x86_64@available diff --git a/test/testcases/focus/new2.t b/test/testcases/focus/new2.t new file mode 100644 index 00000000..fd500875 --- /dev/null +++ b/test/testcases/focus/new2.t @@ -0,0 +1,26 @@ +repo @System 0 testtags +#>=Pkg: krb5-libs 1.18.2 22.el8_7 x86_64 +#>=Prv: krb5-libs(x86-64) = 1.18.2-22.el8_7 + +repo available 0 testtags +#>=Pkg: ipa-client 4.9.11 5.el8 x86_64 +#>=Req: krb5-pkinit-openssl +#> +#>=Pkg: krb5-libs 1.18.2 25.el8_8 x86_64 +#>=Prv: krb5-libs(x86-64) = 1.18.2-25.el8_8 +#> +#>=Pkg: krb5-pkinit 1.18.2 25.el8_8 x86_64 +#>=Req: krb5-libs(x86-64) +#>=Prv: krb5-pkinit-openssl = 1.18.2-25.el8_8 +#> +#>=Pkg: krb5-pkinit 1.18.2 22.el8_7 x86_64 +#>=Req: krb5-libs(x86-64) +#>=Prv: krb5-pkinit-openssl = 1.18.2-22.el8_7 + +system x86_64 rpm @System +solverflags focusnew + +job install pkg ipa-client-4.9.11-5.el8.x86_64@available +result transaction,problems +#>install ipa-client-4.9.11-5.el8.x86_64@available +#>install krb5-pkinit-1.18.2-25.el8_8.x86_64@available