]> git.ipfire.org Git - pakfire.git/commitdiff
request: No longer return problems when solving failed
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 1 Nov 2022 14:22:15 +0000 (14:22 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 1 Nov 2022 14:22:15 +0000 (14:22 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/build.c
src/libpakfire/include/pakfire/request.h
src/libpakfire/include/pakfire/ui.h
src/libpakfire/libpakfire.sym
src/libpakfire/pakfire.c
src/libpakfire/request.c
src/libpakfire/ui.c

index dc3f5e60b4e9802db155799419f38aebbcc330f4..c669b3abbcceaac1c17fc75c439203601bceebaa 100644 (file)
@@ -1326,7 +1326,7 @@ static int pakfire_build_install_test(struct pakfire_build* build) {
        r = pakfire_packagelist_walk(build->packages, pakfire_build_install_package, request);
 
        // Solve the request
-       r = pakfire_request_solve(request, NULL, NULL);
+       r = pakfire_request_solve(request, NULL);
        switch (r) {
                // All okay
                case 0:
index 629ab1f9117472e917edc20f09b4c6ca2e8435fc..a626ccf7eea455d8d23042d69bb6bfd1f8a4e69b 100644 (file)
@@ -46,7 +46,7 @@ struct pakfire_request* pakfire_request_ref(struct pakfire_request* request);
 struct pakfire_request* pakfire_request_unref(struct pakfire_request* request);
 
 int pakfire_request_solve(struct pakfire_request* request,
-       struct pakfire_transaction** transaction, struct pakfire_problem*** problems);
+       struct pakfire_transaction** transaction);
 
 int pakfire_request_install(struct pakfire_request* request, const char* what, int flags);
 int pakfire_request_install_package(struct pakfire_request* request, struct pakfire_package* package);
index 223c878c84c86da405547173659293689eb8e604..dc1c0357a0f1dfe3fa89c7c0fad96a70c1b748fa 100644 (file)
 
 #ifdef PAKFIRE_PRIVATE
 
-#include <pakfire/problem.h>
 #include <pakfire/request.h>
 
 int pakfire_ui_confirm(struct pakfire* pakfire, void* data,
        const char* message, const char* question);
 
-int pakfire_ui_pick_solution(struct pakfire* pakfire, struct pakfire_request* request,
-       struct pakfire_problem** problems);
+int pakfire_ui_pick_solution(struct pakfire* pakfire, struct pakfire_request* request);
 
 #endif
 
index 64801f82d612e956afe85f9cd65ddb3058b4202e..757db5115d22b6697a046028aaa74c6c09038ec8 100644 (file)
@@ -267,7 +267,6 @@ global:
        pakfire_request_erase;
        pakfire_request_erase_package;
        pakfire_request_get_pool;
-       pakfire_request_get_problems;
        pakfire_request_get_transaction;
        pakfire_request_install;
        pakfire_request_install_package;
index 379a7bcd79e54a74d72be713457b590138decc05..b814b603c2e88f8381806fded42c3db86dde6ba5 100644 (file)
@@ -1686,7 +1686,6 @@ static int pakfire_perform_transaction(
                void* status_callback_data) {
        struct pakfire_request* request = NULL;
        struct pakfire_transaction* transaction = NULL;
-       struct pakfire_problem** problems = NULL;
        int r = 1;
 
        // Packages cannot be NULL
@@ -1729,7 +1728,7 @@ static int pakfire_perform_transaction(
 
        // Solve the request
        while (!solved) {
-               r = pakfire_request_solve(request, &transaction, &problems);
+               r = pakfire_request_solve(request, &transaction);
                switch (r) {
                        case 0:
                                solved = 1;
@@ -1737,18 +1736,10 @@ static int pakfire_perform_transaction(
 
                        // Dependency error
                        case 2:
-                               if (!problems)
-                                       goto ERROR;
-
                                // Let the user choose a problem
-                               r = pakfire_ui_pick_solution(pakfire, request, problems);
+                               r = pakfire_ui_pick_solution(pakfire, request);
                                if (r)
                                        goto ERROR;
-
-                               // Free problems
-                               for (struct pakfire_problem** problem = problems; *problem; problem++)
-                                       pakfire_problem_unref(*problem);
-                               free(problems);
                                break;
 
                        // Another error occured
@@ -1778,12 +1769,6 @@ ERROR:
        // Release lock
        pakfire_release_lock(pakfire);
 
-       // Cleanup
-       if (problems) {
-               for (struct pakfire_problem** problem = problems; *problem; problem++)
-                       pakfire_problem_unref(*problem);
-               free(problems);
-       }
        if (transaction)
                pakfire_transaction_unref(transaction);
        if (request)
@@ -1844,7 +1829,6 @@ static int pakfire_perform_transaction_simple(struct pakfire* pakfire, int solve
                pakfire_status_callback status_callback, void* status_callback_data) {
        struct pakfire_request* request = NULL;
        struct pakfire_transaction* transaction = NULL;
-       struct pakfire_problem** problems = NULL;
        int r = 1;
 
        // Acquire lock
@@ -1866,7 +1850,7 @@ static int pakfire_perform_transaction_simple(struct pakfire* pakfire, int solve
 
        // Solve the request
        while (!solved) {
-               r = pakfire_request_solve(request, &transaction, &problems);
+               r = pakfire_request_solve(request, &transaction);
                switch (r) {
                        case 0:
                                solved = 1;
@@ -1874,18 +1858,11 @@ static int pakfire_perform_transaction_simple(struct pakfire* pakfire, int solve
 
                        // Dependency error
                        case 2:
-                               if (!problems)
-                                       goto ERROR;
-
                                // Let the user choose a problem
-                               r = pakfire_ui_pick_solution(pakfire, request, problems);
+                               r = pakfire_ui_pick_solution(pakfire, request);
                                if (r)
                                        goto ERROR;
 
-                               // Free problems
-                               for (struct pakfire_problem** problem = problems; *problem; problem++)
-                                       pakfire_problem_unref(*problem);
-                               free(problems);
                                break;
 
                        // Another error occured
@@ -1915,11 +1892,6 @@ ERROR:
        // Release lock
        pakfire_release_lock(pakfire);
 
-       if (problems) {
-               for (struct pakfire_problem** problem = problems; *problem; problem++)
-                       pakfire_problem_unref(*problem);
-               free(problems);
-       }
        if (transaction)
                pakfire_transaction_unref(transaction);
        if (request)
index 848608133c8e9872a0ff3db080d33f7bf9084fe9..2206e196d2046c609c96c5765b43f509b34d2837 100644 (file)
@@ -207,61 +207,16 @@ Solver* pakfire_request_get_solver(struct pakfire_request* request) {
        return request->solver;
 }
 
-static int pakfire_request_get_problems(struct pakfire_request* request,
-               struct pakfire_problem*** problems) {
-       struct pakfire_problem* problem;
-
-       unsigned int count = solver_problem_count(request->solver);
-       if (!count)
-               return 0;
-
-       // Allocate array
-       *problems = calloc(count + 1, sizeof(**problems));
-       if (!*problems)
-               return 1;
-
-       Id p = 0;
-       for (unsigned int i = 0; i < count; i++) {
-               p = solver_next_problem(request->solver, p);
-               if (!p)
-                       break;
-
-               // Create problem
-               int r = pakfire_problem_create(&problem, request->pakfire, request, p);
-               if (r)
-                       goto ERROR;
-
-               // Append to array
-               (*problems)[i] = problem;
-       };
-
-       return 0;
-
-ERROR:
-       if (*problems) {
-               for (struct pakfire_problem** _problem = *problems; *_problem; _problem++)
-                       pakfire_problem_unref(*_problem);
-               free(*problems);
-
-               // Reset pointer
-               *problems = NULL;
-       }
-
-       return 1;
-}
-
 PAKFIRE_EXPORT int pakfire_request_solve(struct pakfire_request* request,
-               struct pakfire_transaction** transaction, struct pakfire_problem*** problems) {
+               struct pakfire_transaction** transaction) {
        int r;
 
        // Prepare pool
        pakfire_pool_internalize(request->pakfire);
 
-       // Reset pointers
+       // Reset pointer
        if (transaction)
                *transaction = NULL;
-       if (problems)
-               *problems = NULL;
 
 #ifdef ENABLE_DEBUG
        Pool* pool = pakfire_get_solv_pool(request->pakfire);
@@ -280,13 +235,6 @@ PAKFIRE_EXPORT int pakfire_request_solve(struct pakfire_request* request,
                solver_printallsolutions(request->solver);
 #endif
 
-               // Fetch problems
-               if (problems) {
-                       r = pakfire_request_get_problems(request, problems);
-                       if (r)
-                               return r;
-               }
-
                return 2;
        }
 
index befb2ad180c3b75eaa7f778105ab4caf0af7c32b..ca0d1164d084c744826b768031b28e25916cc626 100644 (file)
@@ -118,94 +118,78 @@ ERROR:
        return r;
 }
 
-static struct pakfire_solution** pakfire_ui_append_solutions(
-               struct pakfire_solution** list, struct pakfire_solution** solutions) {
-       unsigned int existing_length = 0;
-       unsigned int appended_length = 0;
+static struct pakfire_solution** pakfire_ui_append_solution(
+               struct pakfire_solution** list, struct pakfire_solution* solution) {
+       unsigned int length = 0;
 
-       // Count lengths of list
+       // Count length of list
        if (list) {
-               for (struct pakfire_solution** solution = list; *solution; solution++)
-                       existing_length++;
+               for (struct pakfire_solution** s = list; *s; s++)
+                       length++;
        }
 
-       // Count what is to be appended
-       for (struct pakfire_solution** solution = solutions; *solution; solution++)
-               appended_length++;
-
        // Increase array size
-       list = reallocarray(list, existing_length + appended_length + 1, sizeof(*list));
+       list = reallocarray(list, length + 2, sizeof(*list));
        if (!list)
                return NULL;
 
-       // Append all elements to list
-       for (unsigned int i = 0; i < appended_length; i++)
-               list[existing_length + i] = pakfire_solution_ref(solutions[i]);
+       // Append the new element to the list
+       list[length] = pakfire_solution_ref(solution);
 
        // Terminate the list
-       list[existing_length + appended_length] = NULL;
+       list[length + 1] = NULL;
 
        return list;
 }
 
-int pakfire_ui_pick_solution(struct pakfire* pakfire, struct pakfire_request* request,
-               struct pakfire_problem** problems) {
-       if (!problems) {
-               errno = EINVAL;
-               return 1;
-       }
-
-       struct pakfire_solution** all_solutions = NULL;
-       unsigned int num_solutions = 0;
+int pakfire_ui_pick_solution(struct pakfire* pakfire, struct pakfire_request* request) {
+       struct pakfire_problem* problem = NULL;
        struct pakfire_solution** solutions = NULL;
+       struct pakfire_solution* solution = NULL;
+       unsigned int num_solutions = 0;
        int r;
 
        // Print a headline
        printf("%s\n", _("One or more problems have occurred solving your request:"));
 
        // Print all problems
-       for (struct pakfire_problem** problem = problems; *problem; problem++) {
-               const char* s = pakfire_problem_to_string(*problem);
-
-               printf("  * %s\n", s);
-
-               // Fetch all solutions to this problem
-               r = pakfire_problem_get_solutions(*problem, &solutions);
+       for (;;) {
+               r = pakfire_request_next_problem(request, &problem);
                if (r)
                        goto ERROR;
 
-               // Skip the rest if there are no solutions
-               if (!solutions)
-                       continue;
+               // No more problems
+               if (!problem)
+                       break;
 
-               // Append solutions to list
-               all_solutions = pakfire_ui_append_solutions(all_solutions, solutions);
-               if (!all_solutions)
-                       goto ERROR;
+               const char* s = pakfire_problem_to_string(problem);
+
+               printf("  * %s\n", s);
 
                // Show a little headline
                printf("    %s\n", _("Possible solutions:"));
 
-               // Print solutions
-               for (struct pakfire_solution** solution = solutions; *solution; solution++) {
-                       s = pakfire_solution_to_string(*solution);
-                       if (!s) {
-                               for (struct pakfire_solution** _solution = solutions; *_solution; _solution++)
-                                       pakfire_solution_unref(*_solution);
-                               free(solutions);
+               for (;;) {
+                       r = pakfire_problem_next_solution(problem, &solution);
+                       if (r)
+                               goto ERROR;
+
+                       // No more solutions
+                       if (!solution)
+                               break;
+
+                       // Append the solution to the list
+                       solutions = pakfire_ui_append_solution(solutions, solution);
+                       if (!solutions)
                                goto ERROR;
-                       }
+
+                       s = pakfire_solution_to_string(solution);
 
                        printf("      [%d] %s\n", ++num_solutions, s);
                }
 
                // Empty line
                printf("\n");
-
-               // Free solutions
-               for (struct pakfire_solution** solution = solutions; *solution; solution++)
-                       pakfire_solution_unref(*solution);
-               free(solutions);
        }
 
        unsigned int choice = 0;
@@ -221,7 +205,7 @@ int pakfire_ui_pick_solution(struct pakfire* pakfire, struct pakfire_request* re
                goto ERROR;
 
        // Fetch selected solution into the solver
-       r = pakfire_request_take_solution(request, all_solutions[choice - 1]);
+       r = pakfire_request_take_solution(request, solutions[choice - 1]);
        if (r)
                goto ERROR;
 
@@ -229,10 +213,10 @@ int pakfire_ui_pick_solution(struct pakfire* pakfire, struct pakfire_request* re
        r = 0;
 
 ERROR:
-       if (all_solutions) {
-               for (struct pakfire_solution** solution = all_solutions; *solution; solution++)
-                       pakfire_solution_unref(*solution);
-               free(all_solutions);
+       if (solutions) {
+               for (struct pakfire_solution** s = solutions; *s; s++)
+                       pakfire_solution_unref(*s);
+               free(solutions);
        }
 
        return r;