]> git.ipfire.org Git - pakfire.git/commitdiff
request: Add some experimental code removing selectors
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 23 Apr 2021 09:51:13 +0000 (09:51 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 23 Apr 2021 09:51:13 +0000 (09:51 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/_pakfire/request.c
src/libpakfire/include/pakfire/request.h
src/libpakfire/libpakfire.sym
src/libpakfire/request.c
src/pakfire/base.py
src/pakfire/builder.py

index 4a4ad16266681b27769da50146978baadc03896b..1e0ea3baba751cca0a7c4c4a29ab0cf18d2a586c 100644 (file)
@@ -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;
index cd216150b1a3c88f0fbc7fb9247dc407664a2075..f1f0744e3cc8782fbd0f827070b9afd336c6c6b3 100644 (file)
@@ -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);
index 738c31f11ea12b26a464d0c547bc51cea40d53d1..0297a9b2185b6d0fb74b4d9a4675e8408c597f16 100644 (file)
@@ -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;
index 36edd63c787583719b94547ce803e0bafb0abd08..24cd41cedf2df90f7621ef0da709d0bd144bcde9 100644 (file)
@@ -22,6 +22,7 @@
 #include <stdlib.h>
 
 #include <solv/queue.h>
+#include <solv/selection.h>
 #include <solv/solver.h>
 #include <solv/transaction.h>
 
@@ -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));
 
index d831264bd1de12e66bd6aaf04090e7002da0a06f..b21ebfe60cf49068678d3d0c79c9846200ba4a36 100644 (file)
@@ -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
index 4dafe0d293ae9e474e98147144f65eb68098f46c..cfa3828389db323e80c9bf3df20184ad2b5baadb 100644 (file)
@@ -49,7 +49,7 @@ BUILD_LOG_HEADER = """
 """
 
 BUILD_PACKAGES = [
-       "@Build",
+       #"@Build",
        "ccache",
        "pakfire-build",
        "/bin/bash",