]> git.ipfire.org Git - thirdparty/libsolv.git/commitdiff
Add new SOLVER_FLAG_FOCUS_NEW focus type
authorMichael Schroeder <mls@suse.de>
Tue, 9 Jul 2024 11:06:16 +0000 (13:06 +0200)
committerMichael Schroeder <mls@suse.de>
Tue, 9 Jul 2024 11:06:16 +0000 (13:06 +0200)
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

bindings/solv.i
doc/gen/libsolv-bindings.3
doc/libsolv-bindings.txt
ext/testcase.c
src/solver.c
src/solver.h
test/testcases/focus/new1.t [new file with mode: 0644]
test/testcases/focus/new2.t [new file with mode: 0644]

index f871a819f6594ed67864c6e9aedd17deb51ef4d7..0648d80474d8896592aa07f7f7fa285b4736320c 100644 (file)
@@ -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;
index d2d3067d16878d18979fd895e1b30e504af85bb4..d5533d0d922d5c1bc40562f92b9b06bf78224688 100644 (file)
@@ -2,12 +2,12 @@
 .\"     Title: Libsolv-Bindings
 .\"    Author: [see the "Author" section]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      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\&.
index 45be37c87b14f21ae9fcf4f8edf38ad44befba7e..ac22bd2fac36c1e9479a0b682efa3d847532f59a 100644 (file)
@@ -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.
index 7b6179b5d13df3b83f73c946dc7a16bd4435f0e9..d3533b9bff24de3071c4e6a9a1126c574c6471da 100644 (file)
@@ -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 }
 };
 
index be7825d1b12c8587f72eec946217a82fe7a6cbbd..edd7ff81420b48c22079a701b2f5ef3a501ac134 100644 (file)
@@ -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;
index b1f8d262393ee0cd9d5b1d78712f414c93ad5759..05256503494a8642e799e40be286cccb0671d076 100644 (file)
@@ -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 (file)
index 0000000..00b87f8
--- /dev/null
@@ -0,0 +1,27 @@
+repo @System 0 testtags <inline>
+#>=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 <inline>
+#>=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 <inline>
+#>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 (file)
index 0000000..fd50087
--- /dev/null
@@ -0,0 +1,26 @@
+repo @System 0 testtags <inline>
+#>=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 <inline>
+#>=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 <inline>
+#>install ipa-client-4.9.11-5.el8.x86_64@available
+#>install krb5-pkinit-1.18.2-25.el8_8.x86_64@available