#include <pakfire/repo.h>
#include <pakfire/util.h>
+#include "errors.h"
#include "package.h"
#include "pakfire.h"
#include "repo.h"
Py_RETURN_NONE;
}
+static PyObject* Package_installcheck(PackageObject* self) {
+ char* problem = NULL;
+ int r;
+
+ // Perform the installcheck
+ r = pakfire_package_installcheck(self->package, &problem);
+
+ // Success!
+ if (r == 0)
+ Py_RETURN_NONE;
+
+ // We did not get the problem
+ else if (!problem) {
+ PyErr_SetFromErrno(PyExc_OSError);
+
+ // Otherwise raise a dependency error
+ } else {
+ PyErr_SetString(PyExc_DependencyError, problem);
+ free(problem);
+ }
+
+ return NULL;
+}
+
static struct PyMethodDef Package_methods[] = {
{
"dump",
METH_VARARGS|METH_KEYWORDS,
NULL,
},
+ {
+ "installcheck",
+ (PyCFunction)Package_installcheck,
+ METH_NOARGS,
+ NULL,
+ },
{ NULL },
};
r = pakfire_packagelist_walk(build->packages, pakfire_build_install_package, request);
// Solve the request
- r = pakfire_request_solve(request);
+ r = pakfire_request_solve(request, 0);
switch (r) {
// All okay
case 0:
}
// Solve the request
- r = pakfire_request_solve(request);
+ r = pakfire_request_solve(request, 0);
if (r)
goto ERROR;
PAKFIRE_PKG_DUMP_LONG = 1 << 1,
};
+// Installcheck
+int pakfire_package_installcheck(struct pakfire_package* pkg, char** problem);
+
#ifdef PAKFIRE_PRIVATE
#include <stdint.h>
PAKFIRE_REQ_VERIFY,
};
+enum pakfire_request_solve_flags {
+ PAKFIRE_REQ_SOLVE_INTERACTIVE,
+};
+
int pakfire_request_create(struct pakfire_request** request, struct pakfire* pakfire, int flags);
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);
+int pakfire_request_solve(struct pakfire_request* request, int flags);
int pakfire_request_add(struct pakfire_request* request,
const enum pakfire_request_action action, const char* what, int flags);
Solver* pakfire_request_get_solver(struct pakfire_request* request);
+char* pakfire_request_get_problem_string(struct pakfire_request* request);
+
int pakfire_request_next_problem(
struct pakfire_request* request, struct pakfire_problem** problem);
pakfire_package_get_string;
pakfire_package_get_uuid;
pakfire_package_id;
+ pakfire_package_installcheck;
pakfire_package_ref;
pakfire_package_set_checksum;
pakfire_package_set_filelist;
#include <pakfire/pakfire.h>
#include <pakfire/private.h>
#include <pakfire/repo.h>
+#include <pakfire/request.h>
#include <pakfire/string.h>
#include <pakfire/util.h>
return md;
}
+
+PAKFIRE_EXPORT int pakfire_package_installcheck(struct pakfire_package* pkg, char** problem) {
+ struct pakfire_request* request = NULL;
+ int r;
+
+ const char* nevra = pakfire_package_get_string(pkg, PAKFIRE_PKG_NEVRA);
+
+ // Create a new request
+ r = pakfire_request_create(&request, pkg->pakfire, 0);
+ if (r)
+ goto ERROR;
+
+ // Install the package
+ r = pakfire_request_add_package(request, PAKFIRE_REQ_INSTALL, pkg, 0);
+ if (r) {
+ ERROR(pkg->pakfire, "Could not add package %s to the request\n", nevra);
+ goto ERROR;
+ }
+
+ // Solve the request
+ r = pakfire_request_solve(request, 0);
+ if (r) {
+ DEBUG(pkg->pakfire, "Could not install %s:\n", nevra);
+
+ // Fetch the problem
+ *problem = pakfire_request_get_problem_string(request);
+ if (*problem)
+ DEBUG(pkg->pakfire, "%s\n", *problem);
+ }
+
+ERROR:
+ if (request)
+ pakfire_request_unref(request);
+
+ return r;
+}
}
// Solve the request
- r = pakfire_request_solve(request);
+ r = pakfire_request_solve(request, PAKFIRE_REQ_SOLVE_INTERACTIVE);
if (r)
goto ERROR;
goto ERROR;
// Solve the request
- r = pakfire_request_solve(request);
+ r = pakfire_request_solve(request, PAKFIRE_REQ_SOLVE_INTERACTIVE);
if (r)
goto ERROR;
Solver* solver;
Queue jobs;
-
- // Set if the request has been solved
- int solved:1;
};
static void pakfire_request_free(struct pakfire_request* request) {
return pakfire_ui_pick_solution(request->pakfire, request);
}
-int pakfire_request_solve(struct pakfire_request* request) {
+int pakfire_request_solve(struct pakfire_request* request, int flags) {
+ int solved = 0;
int r;
// Prepare pool
// Save time when we starting solving
clock_t solving_start = clock();
- for (;;) {
- r = solver_solve(request->solver, &request->jobs);
- if (r == 0)
+RETRY:
+ r = solver_solve(request->solver, &request->jobs);
+ switch (r) {
+ // Solved!
+ case 0:
+ // Mark as solved
+ solved = 1;
break;
- // We land here, if the request could not be solved
-
+ // Not Solved
+ default:
#ifdef ENABLE_DEBUG
- // Print all solutions
- solver_printallsolutions(request->solver);
+ // Print all solutions
+ solver_printallsolutions(request->solver);
#endif
- // Ask the user to pick a solution
- r = pakfire_request_pick_solution(request);
- if (r)
- return r;
- }
+ // Ask the user to pick a solution
+ if (flags & PAKFIRE_REQ_SOLVE_INTERACTIVE) {
+ r = pakfire_request_pick_solution(request);
+ if (r)
+ return r;
- // Mark the request as solved
- request->solved = 1;
+ // Retry solving
+ goto RETRY;
+ }
+ break;
+ }
// Save time when we finished solving
clock_t solving_end = clock();
(double)(solving_end - solving_start) * 1000 / CLOCKS_PER_SEC);
#ifdef ENABLE_DEBUG
- solver_printdecisions(request->solver);
+ if (solved)
+ solver_printdecisions(request->solver);
#endif
- // All okay
- return 0;
+ // Return zero if solved, otherwise return non-zero
+ if (solved)
+ return 0;
+
+ return 2;
}
static int pakfire_request_is_file(const char* what) {
return __pakfire_request_add(request, action, SOLVER_SOLVABLE, id, flags);
}
+char* pakfire_request_get_problem_string(struct pakfire_request* request) {
+ struct pakfire_problem* problem = NULL;
+ char* s = NULL;
+ int r;
+
+ for (;;) {
+ r = pakfire_request_next_problem(request, &problem);
+ if (r || !problem)
+ break;
+
+ const char* p = pakfire_problem_to_string(problem);
+
+ r = asprintf(&s, "%s%s\n", (s) ? s : "", p);
+ if (r < 0)
+ return NULL;
+ }
+
+ return s;
+}
+
int pakfire_request_next_problem(
struct pakfire_request* request, struct pakfire_problem** problem) {
Id id = 0;