if (!PyArg_ParseTuple(args, "O!", &PakfireType, &pakfire))
return -1;
- int r = pakfire_request_create(&self->request, pakfire->pakfire);
+ int r = pakfire_request_create(&self->request, pakfire->pakfire, 0);
if (r) {
PyErr_SetFromErrno(PyExc_OSError);
return -1;
}
static PyObject* Request_install(RequestObject* self, PyObject* args) {
+ const char* what = NULL;
+
+ if (!PyArg_ParseTuple(args, "s", &what))
+ return NULL;
+
+ int r = pakfire_request_install(self->request, what);
+ if (r) {
+ PyErr_SetFromErrno(PyExc_OSError);
+ return NULL;
+ }
+
+ Py_RETURN_NONE;
+
+ // XXX DEAD CODE
+
PakfirePackage pkg = NULL;
PakfireRelation relation = NULL;
PakfireSelector selector = NULL;
PAKFIRE_SOLVER_ALLOW_VENDORCHANGE = 1 << 5,
};
-int pakfire_request_create(struct pakfire_request** request, Pakfire pakfire);
+int pakfire_request_create(struct pakfire_request** request, Pakfire pakfire, int flags);
struct pakfire_request* pakfire_request_ref(struct pakfire_request* request);
struct pakfire_request* pakfire_request_unref(struct pakfire_request* request);
PakfireProblem pakfire_request_get_problems(struct pakfire_request* request);
PakfireTransaction pakfire_request_get_transaction(struct pakfire_request* request);
+int pakfire_request_install(struct pakfire_request* request, const char* what);
int pakfire_request_install_package(struct pakfire_request* request, PakfirePackage package);
int pakfire_request_install_relation(struct pakfire_request* request, PakfireRelation relation);
int pakfire_request_install_selector(struct pakfire_request* request, PakfireSelector selector);
#include <stdlib.h>
#include <solv/queue.h>
+#include <solv/selection.h>
#include <solv/solver.h>
#include <solv/transaction.h>
Transaction* transaction;
Queue jobs;
+
+ // Flags that should be set for all jobs
+ int flags;
};
-PAKFIRE_EXPORT int pakfire_request_create(struct pakfire_request** request, Pakfire pakfire) {
+PAKFIRE_EXPORT int pakfire_request_create(struct pakfire_request** request,
+ Pakfire pakfire, int flags) {
struct pakfire_request* req = calloc(1, sizeof(*req));
if (!req)
return ENOMEM;
queue_init(&req->jobs);
+ // Always solve for the best solution?
+ if (flags & PAKFIRE_SOLVER_FORCE_BEST)
+ req->flags |= SOLVER_FORCEBEST;
+
*request = req;
return 0;
}
Queue queue;
queue_init_clone(&queue, &request->jobs);
- /* Apply forcebest */
- if (flags & PAKFIRE_SOLVER_FORCE_BEST) {
- for (int i = 0; i < queue.count; i += 2) {
- queue.elements[i] |= SOLVER_FORCEBEST;
- }
- }
-
/* turn off implicit obsoletes for installonly packages */
Queue* installonly = pakfire_get_installonly_queue(request->pakfire);
for (int i = 0; i < installonly->count; i++)
return pakfire_transaction_create(request->pakfire, request->transaction);
}
+static int pakfire_request_add_job(struct pakfire_request* request, int action, const char* what) {
+ Pool* pool = pakfire_get_solv_pool(request->pakfire);
+
+ // Add all file provides
+ pool_addfileprovides(pool);
+
+ // Make sure whatprovides are populated
+ pool_createwhatprovides(pool);
+
+ Queue jobs;
+ queue_init(&jobs);
+
+ int flags =
+ // Select packages by name
+ SELECTION_NAME|
+ // Select packages by what they provide
+ SELECTION_PROVIDES|
+ // Process globbing patterns
+ SELECTION_GLOB|
+ // Select packages by their canonical name
+ SELECTION_CANON|
+ // Process .arch
+ SELECTION_DOTARCH|
+ // Process -release
+ SELECTION_REL;
+
+ // Process filelists?
+ if (*what == '/')
+ flags |= SELECTION_FILELIST;
+
+ // Select all packages
+ selection_make(pool, &jobs, what, flags);
+
+ // Did we find anything?
+ if (jobs.count == 0) {
+ ERROR(request->pakfire, "No match for '%s'\n", what);
+ return 1;
+ }
+
+ DEBUG(request->pakfire, "Found %d match(es) for '%s'\n", jobs.count / 2, what);
+
+ // Set action and global flags
+ for (int i = 0; i < jobs.count; i += 2)
+ jobs.elements[i] |= request->flags | action;
+
+ // Merge jobs into the main job queue
+ queue_insertn(&request->jobs, request->jobs.count, jobs.count, jobs.elements);
+ queue_free(&jobs);
+
+ return 0;
+}
+
+PAKFIRE_EXPORT int pakfire_request_install(struct pakfire_request* request, const char* what) {
+ return pakfire_request_add_job(request, SOLVER_INSTALL, what);
+}
+
PAKFIRE_EXPORT int pakfire_request_install_package(struct pakfire_request* request, PakfirePackage package) {
queue_push2(&request->jobs, SOLVER_SOLVABLE|SOLVER_INSTALL, pakfire_package_id(package));