]> git.ipfire.org Git - pakfire.git/commitdiff
requests: Move the solution picking here
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 4 Nov 2022 11:27:25 +0000 (11:27 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 4 Nov 2022 11:27:25 +0000 (11:27 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/pakfire.c
src/libpakfire/request.c

index 427a40fa296296ef870e027fc1bd0edde8e18a0e..92809d0b9f75a13823d93399451921397b86877d 100644 (file)
@@ -1751,29 +1751,10 @@ static int pakfire_perform_transaction(
                }
        }
 
-       int solved = 0;
-
        // Solve the request
-       while (!solved) {
-               r = pakfire_request_solve(request);
-               switch (r) {
-                       case 0:
-                               solved = 1;
-                               break;
-
-                       // Dependency error
-                       case 2:
-                               // Let the user choose a problem
-                               r = pakfire_ui_pick_solution(pakfire, request);
-                               if (r)
-                                       goto ERROR;
-                               break;
-
-                       // Another error occured
-                       default:
-                               goto ERROR;
-               }
-       }
+       r = pakfire_request_solve(request);
+       if (r)
+               goto ERROR;
 
        // Fetch the transaction
        r = pakfire_request_get_transaction(request, &transaction);
@@ -1877,30 +1858,10 @@ static int pakfire_perform_transaction_simple(struct pakfire* pakfire, int solve
        if (r)
                goto ERROR;
 
-       int solved = 0;
-
        // Solve the request
-       while (!solved) {
-               r = pakfire_request_solve(request);
-               switch (r) {
-                       case 0:
-                               solved = 1;
-                               break;
-
-                       // Dependency error
-                       case 2:
-                               // Let the user choose a problem
-                               r = pakfire_ui_pick_solution(pakfire, request);
-                               if (r)
-                                       goto ERROR;
-
-                               break;
-
-                       // Another error occured
-                       default:
-                               goto ERROR;
-               }
-       }
+       r = pakfire_request_solve(request);
+       if (r)
+               goto ERROR;
 
        // Fetch the transaction
        r = pakfire_request_get_transaction(request, &transaction);
index 8cc773d8c8feac30db02247ed709932f0ed1619b..696632420a5d5f3ce9ccfd745e7b5814fa2e168f 100644 (file)
@@ -42,6 +42,7 @@
 #include <pakfire/request.h>
 #include <pakfire/string.h>
 #include <pakfire/transaction.h>
+#include <pakfire/ui.h>
 #include <pakfire/util.h>
 
 struct pakfire_request {
@@ -50,6 +51,9 @@ struct pakfire_request {
 
        Solver* solver;
        Queue jobs;
+
+       // Set if the request has been solved
+       int solved:1;
 };
 
 /*
@@ -214,7 +218,14 @@ Solver* pakfire_request_get_solver(struct pakfire_request* request) {
        return request->solver;
 }
 
+static int pakfire_request_pick_solution(struct pakfire_request* request) {
+       // XXX TODO this is just a dummy
+       return pakfire_ui_pick_solution(request->pakfire, request);
+}
+
 int pakfire_request_solve(struct pakfire_request* request) {
+       int r;
+
        // Prepare pool
        pakfire_pool_internalize(request->pakfire);
 
@@ -230,14 +241,27 @@ int pakfire_request_solve(struct pakfire_request* request) {
        // Save time when we starting solving
        clock_t solving_start = clock();
 
-       if (solver_solve(request->solver, &request->jobs)) {
+       for (;;) {
+               r = solver_solve(request->solver, &request->jobs);
+               if (r == 0)
+                       break;
+
+               // We land here, if the request could not be solved
+
 #ifdef ENABLE_DEBUG
+               // Print all solutions
                solver_printallsolutions(request->solver);
 #endif
 
-               return 2;
+               // Ask the user to pick a solution
+               r = pakfire_request_pick_solution(request);
+               if (r)
+                       return r;
        }
 
+       // Mark the request as solved
+       request->solved = 1;
+
        // Save time when we finished solving
        clock_t solving_end = clock();