From: Michael Tremer Date: Fri, 23 Apr 2021 09:51:13 +0000 (+0000) Subject: request: Add some experimental code removing selectors X-Git-Tag: 0.9.28~1285^2~259 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cdcd6acb326411c3643a12c3b36efa71b1d76bb4;p=pakfire.git request: Add some experimental code removing selectors Signed-off-by: Michael Tremer --- diff --git a/src/_pakfire/request.c b/src/_pakfire/request.c index 4a4ad1626..1e0ea3bab 100644 --- a/src/_pakfire/request.c +++ b/src/_pakfire/request.c @@ -52,7 +52,7 @@ static int Request_init(RequestObject* self, PyObject* args, PyObject* kwds) { 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; @@ -102,6 +102,21 @@ static PyObject* Request_operation_return(int r) { } 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; diff --git a/src/libpakfire/include/pakfire/request.h b/src/libpakfire/include/pakfire/request.h index cd216150b..f1f0744e3 100644 --- a/src/libpakfire/include/pakfire/request.h +++ b/src/libpakfire/include/pakfire/request.h @@ -39,7 +39,7 @@ enum _pakfire_solver_flags { 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); @@ -48,6 +48,7 @@ int pakfire_request_solve(struct pakfire_request* request, int flags); 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); diff --git a/src/libpakfire/libpakfire.sym b/src/libpakfire/libpakfire.sym index 738c31f11..0297a9b21 100644 --- a/src/libpakfire/libpakfire.sym +++ b/src/libpakfire/libpakfire.sym @@ -379,6 +379,7 @@ global: pakfire_request_get_pool; pakfire_request_get_problems; pakfire_request_get_transaction; + pakfire_request_install; pakfire_request_install_package; pakfire_request_install_relation; pakfire_request_install_selector; diff --git a/src/libpakfire/request.c b/src/libpakfire/request.c index 36edd63c7..24cd41ced 100644 --- a/src/libpakfire/request.c +++ b/src/libpakfire/request.c @@ -22,6 +22,7 @@ #include #include +#include #include #include @@ -48,9 +49,13 @@ struct pakfire_request { 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; @@ -60,6 +65,10 @@ PAKFIRE_EXPORT int pakfire_request_create(struct pakfire_request** request, Pakf queue_init(&req->jobs); + // Always solve for the best solution? + if (flags & PAKFIRE_SOLVER_FORCE_BEST) + req->flags |= SOLVER_FORCEBEST; + *request = req; return 0; } @@ -182,13 +191,6 @@ PAKFIRE_EXPORT int pakfire_request_solve(struct pakfire_request* request, int fl 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++) @@ -227,6 +229,62 @@ PAKFIRE_EXPORT PakfireTransaction pakfire_request_get_transaction(struct pakfire 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)); diff --git a/src/pakfire/base.py b/src/pakfire/base.py index d831264bd..b21ebfe60 100644 --- a/src/pakfire/base.py +++ b/src/pakfire/base.py @@ -168,6 +168,11 @@ class PakfireContext(object): # XXX handle files and URLs + for req in requires: + request.install(req) + + return request.solve(**kwargs) + for req in requires: # Handle groups # TODO should move into libpakfire diff --git a/src/pakfire/builder.py b/src/pakfire/builder.py index 4dafe0d29..cfa382838 100644 --- a/src/pakfire/builder.py +++ b/src/pakfire/builder.py @@ -49,7 +49,7 @@ BUILD_LOG_HEADER = """ """ BUILD_PACKAGES = [ - "@Build", + #"@Build", "ccache", "pakfire-build", "/bin/bash",