From: Michael Tremer Date: Thu, 24 Jun 2021 21:39:07 +0000 (+0000) Subject: request: Return any problems X-Git-Tag: 0.9.28~1175 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5bdd89a5d98647e50b0bc0847b76d7964e706c32;p=pakfire.git request: Return any problems Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/include/pakfire/problem.h b/src/libpakfire/include/pakfire/problem.h index 2561c90de..b60284348 100644 --- a/src/libpakfire/include/pakfire/problem.h +++ b/src/libpakfire/include/pakfire/problem.h @@ -26,6 +26,7 @@ #include struct pakfire_problem; +struct pakfire_request; int pakfire_problem_create(struct pakfire_problem** problem, struct pakfire_request* request, Id id); struct pakfire_problem* pakfire_problem_ref(struct pakfire_problem* problem); diff --git a/src/libpakfire/include/pakfire/request.h b/src/libpakfire/include/pakfire/request.h index 47dd65e68..496b258fb 100644 --- a/src/libpakfire/include/pakfire/request.h +++ b/src/libpakfire/include/pakfire/request.h @@ -25,6 +25,7 @@ #include #include +struct pakfire_problem; struct pakfire_request; enum pakfire_request_flags { @@ -46,8 +47,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* pakfire_request_get_problems(struct pakfire_request* request); + struct pakfire_transaction** transaction, struct pakfire_problem*** problems); int pakfire_request_install(struct pakfire_request* request, const char* what, int flags); int pakfire_request_install_package(struct pakfire_request* request, PakfirePackage package); diff --git a/src/libpakfire/pakfire.c b/src/libpakfire/pakfire.c index 00dd72ef8..6fe53b551 100644 --- a/src/libpakfire/pakfire.c +++ b/src/libpakfire/pakfire.c @@ -1612,6 +1612,7 @@ static int pakfire_perform_transaction(Pakfire pakfire, const char** packages, const char** locks, int flags, int* changed) { struct pakfire_request* request = NULL; struct pakfire_transaction* transaction = NULL; + struct pakfire_problem** problems = NULL; int r = 1; // Packages cannot be NULL @@ -1651,7 +1652,7 @@ static int pakfire_perform_transaction(Pakfire pakfire, } // Solve the request - r = pakfire_request_solve(request, &transaction); + r = pakfire_request_solve(request, &transaction, &problems); if (r) goto ERROR; @@ -1668,6 +1669,11 @@ static int pakfire_perform_transaction(Pakfire pakfire, r = 0; ERROR: + if (problems) { + for (struct pakfire_problem** problem = problems; *problem; problem++) + pakfire_problem_unref(*problem); + free(problems); + } if (transaction) pakfire_transaction_unref(transaction); if (request) @@ -1699,6 +1705,7 @@ static int pakfire_perform_transaction_simple(Pakfire pakfire, int flags, int* changed) { struct pakfire_request* request = NULL; struct pakfire_transaction* transaction = NULL; + struct pakfire_problem** problems = NULL; int r = 1; // Refresh repositories @@ -1717,7 +1724,7 @@ static int pakfire_perform_transaction_simple(Pakfire pakfire, goto ERROR; // Solve the request - r = pakfire_request_solve(request, &transaction); + r = pakfire_request_solve(request, &transaction, &problems); if (r) goto ERROR; @@ -1734,6 +1741,11 @@ static int pakfire_perform_transaction_simple(Pakfire pakfire, r = 0; ERROR: + if (problems) { + for (struct pakfire_problem** problem = problems; *problem; problem++) + pakfire_problem_unref(*problem); + free(problems); + } if (transaction) pakfire_transaction_unref(transaction); if (request) diff --git a/src/libpakfire/request.c b/src/libpakfire/request.c index db9ad6bf0..0e8169e2f 100644 --- a/src/libpakfire/request.c +++ b/src/libpakfire/request.c @@ -141,12 +141,55 @@ 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, p); + if (r) + goto ERROR; + + // Append to array + (*problems)[i] = problem; + }; + + return 0; + +ERROR: + if (*problems) { + for (struct pakfire_problem** problem = *problems; *problem; problem++) + free(*problem); + free(*problems); + } + + return 1; +} + PAKFIRE_EXPORT int pakfire_request_solve(struct pakfire_request* request, - struct pakfire_transaction** transaction) { + struct pakfire_transaction** transaction, struct pakfire_problem*** problems) { + int r; + pakfire_pool_apply_changes(request->pakfire); - // Reset pointer + // Reset pointers *transaction = NULL; + *problems = NULL; #ifdef ENABLE_DEBUG Pool* pool = pakfire_get_solv_pool(request->pakfire); @@ -165,7 +208,12 @@ PAKFIRE_EXPORT int pakfire_request_solve(struct pakfire_request* request, solver_printallsolutions(request->solver); #endif - return 1; + // Fetch problems + r = pakfire_request_get_problems(request, problems); + if (r) + return 1; + + return 2; } // Save time when we finished solving @@ -179,7 +227,7 @@ PAKFIRE_EXPORT int pakfire_request_solve(struct pakfire_request* request, #endif // If the solving process was successful, we create the transaction - int r = pakfire_transaction_create(transaction, request->pakfire, request->solver); + r = pakfire_transaction_create(transaction, request->pakfire, request->solver); if (r) goto ERROR; @@ -193,23 +241,6 @@ ERROR: return r; } -PAKFIRE_EXPORT struct pakfire_problem* pakfire_request_get_problems(struct pakfire_request* request) { - Id problem = 0; - struct pakfire_problem* ret = NULL; - struct pakfire_problem* p; - - while ((problem = solver_next_problem(request->solver, problem)) != 0) { - pakfire_problem_create(&p, request, problem); - - if (ret) - pakfire_problem_append(ret, p); - else - ret = p; - } - - return ret; -} - static int pakfire_request_is_file(const char* what) { return pakfire_string_endswith(what, ".pfm"); }