]> git.ipfire.org Git - pakfire.git/commitdiff
Add scaffolding for running a transaction
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 3 Nov 2017 18:48:19 +0000 (19:48 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 3 Nov 2017 18:48:19 +0000 (19:48 +0100)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/_pakfire/transaction.c
src/libpakfire/include/pakfire/step.h
src/libpakfire/include/pakfire/transaction.h
src/libpakfire/libpakfire.sym
src/libpakfire/step.c
src/libpakfire/transaction.c
src/pakfire/cli.py

index 2f84fd0991ec293e47d60b222393cf096a5a5686..c7e461b75ad6418416b5815631967d5be994366f 100644 (file)
@@ -111,6 +111,18 @@ static PyObject* Transaction_dump(TransactionObject* self) {
        return PyUnicode_FromString(string);
 }
 
+static PyObject* Transaction_run(TransactionObject* self) {
+       int r = pakfire_transaction_run(self->transaction);
+
+       if (r) {
+               PyErr_SetString(PyExc_RuntimeError, "Could not run transaction");
+               return NULL;
+       }
+
+       Py_RETURN_NONE;
+}
+
+
 static Py_ssize_t Transaction_len(TransactionObject* self) {
        return pakfire_transaction_count(self->transaction);
 }
@@ -122,6 +134,12 @@ static struct PyMethodDef Transaction_methods[] = {
                METH_NOARGS,
                NULL
        },
+       {
+               "run",
+               (PyCFunction)Transaction_run,
+               METH_NOARGS,
+               NULL,
+       },
        { NULL },
 };
 
index 37d34709f8854443068674fe9bbc54b4384e9b5b..06efdc22eb4820c255f1ca8e71b0230e4ae10c6f 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <solv/pooltypes.h>
 
+#include <pakfire/transaction.h>
 #include <pakfire/types.h>
 
 typedef enum _pakfire_step_types {
@@ -47,6 +48,21 @@ int pakfire_step_needs_download(PakfireStep step);
 
 #ifdef PAKFIRE_PRIVATE
 
+typedef enum _pakfire_script_types {
+       PAKFIRE_SCRIPT_PREIN,
+       PAKFIRE_SCRIPT_PREUN,
+       PAKFIRE_SCRIPT_PREUP,
+       PAKFIRE_SCRIPT_PRETRANSIN,
+       PAKFIRE_SCRIPT_PRETRANSUN,
+       PAKFIRE_SCRIPT_PRETRANSUP,
+       PAKFIRE_SCRIPT_POSTIN,
+       PAKFIRE_SCRIPT_POSTUN,
+       PAKFIRE_SCRIPT_POSTUP,
+       PAKFIRE_SCRIPT_POSTTRANSIN,
+       PAKFIRE_SCRIPT_POSTTRANSUN,
+       PAKFIRE_SCRIPT_POSTTRANSUP,
+} pakfire_script_type;
+
 struct _PakfireStep {
        PakfirePool pool;
        PakfireTransaction transaction;
@@ -57,6 +73,8 @@ static inline PakfirePool pakfire_step_pool(PakfireStep step) {
        return step->pool;
 }
 
+int pakfire_step_run(PakfireStep step, pakfire_action_type action);
+
 #endif
 
 #endif /* PAKFIRE_STEP_H */
index 68995447798318196ec1115e77f8ae10d6c7b2fd..352303b8cc67302befa73a16626b582131d49a29 100644 (file)
@@ -37,8 +37,18 @@ PakfirePackageList pakfire_transaction_get_packages(PakfireTransaction transacti
 
 char* pakfire_transaction_dump(PakfireTransaction transaction, size_t width);
 
+int pakfire_transaction_run(PakfireTransaction transaction);
+
 #ifdef PAKFIRE_PRIVATE
 
+typedef enum _pakfire_action_types {
+       PAKFIRE_ACTION_NOOP      = 0,
+       PAKFIRE_ACTION_VERIFY    = 1 << 0,
+       PAKFIRE_ACTION_EXECUTE   = 1 << 1,
+       PAKFIRE_ACTION_PRETRANS  = 1 << 2,
+       PAKFIRE_ACTION_POSTTRANS = 1 << 3,
+} pakfire_action_type;
+
 struct _PakfireTransaction {
        PakfirePool pool;
        Transaction* transaction;
index 05024cd6eb406b9b124d0682c60bb838de4cb121..fe05fc7eefac08d9bfaaf61a78a41b6d3bb1ed54 100644 (file)
@@ -270,6 +270,7 @@ global:
        pakfire_transaction_get_packages;
        pakfire_transaction_get_step;
        pakfire_transaction_installsizechange;
+       pakfire_transaction_run;
 
        # util
        pakfire_free;
index d733bcc458b16625dbed77cca511b2f2bfba834a..04800f320404fced4f352fcf7393cb38411bc52b 100644 (file)
@@ -181,3 +181,56 @@ finish:
 
        return ret;
 }
+
+static int pakfire_step_verify(PakfireStep step) {
+       // The package must have been downloaded
+       if (pakfire_step_needs_download(step))
+               return 1;
+
+       // TODO verify package and signature
+
+       return 0;
+}
+
+static int pakfire_step_run_script(PakfireStep step, pakfire_script_type script) {
+       return 0; // XXX
+}
+
+int pakfire_step_run(PakfireStep step, const pakfire_action_type action) {
+       pakfire_step_type type = pakfire_step_get_type(step);
+
+       // Get the package
+       PakfirePackage pkg = pakfire_step_get_package(step);
+
+       int r = 0;
+       switch (action) {
+               // Verify this step
+               case PAKFIRE_ACTION_VERIFY:
+                       r = pakfire_step_verify(step);
+                       goto END;
+
+               // Run the pre-transaction scripts
+               case PAKFIRE_ACTION_PRETRANS:
+                       // XXX TODO
+                       goto END;
+
+               // Run the post-transaction scripts
+               case PAKFIRE_ACTION_POSTTRANS:
+                       // XXX TODO
+                       goto END;
+
+               // Execute the action of this script
+               case PAKFIRE_ACTION_EXECUTE:
+                       // XXX TODO
+                       goto END;
+
+               // Do nothing
+               case PAKFIRE_ACTION_NOOP:
+                       goto END;
+       }
+
+END:
+       pakfire_package_free(pkg);
+
+       return r;
+}
index 2d6f84dd342c490785db1dd84ef39fe74fd250bc..5a7c0e78220aed9c46902b40b6275d346fb96459 100644 (file)
@@ -264,3 +264,50 @@ char* pakfire_transaction_dump(PakfireTransaction transaction, size_t width) {
 
        return string;
 }
+
+static int pakfire_transaction_run_steps(PakfireTransaction transaction, const pakfire_action_type action) {
+       size_t steps = pakfire_transaction_count(transaction);
+
+       // Walk through all steps
+       int r = 0;
+       for (unsigned int i = 0; i < steps; i++) {
+               PakfireStep step = pakfire_transaction_get_step(transaction, i);
+
+               // Verify the step
+               r = pakfire_step_run(step, action);
+
+               // Free memory
+               pakfire_step_free(step);
+
+               // End loop if action was unsuccessful
+               if (r)
+                       break;
+       }
+
+       return r;
+}
+
+int pakfire_transaction_run(PakfireTransaction transaction) {
+       int r = 0;
+
+       // Verify steps
+       r = pakfire_transaction_run_steps(transaction, PAKFIRE_ACTION_VERIFY);
+       if (r)
+               return r;
+
+       // Execute all pre transaction actions
+       r = pakfire_transaction_run_steps(transaction, PAKFIRE_ACTION_PRETRANS);
+       if (r)
+               return r;
+
+       r = pakfire_transaction_run_steps(transaction, PAKFIRE_ACTION_EXECUTE);
+       if (r)
+               return r;
+
+       // Execute all post transaction actions
+       r = pakfire_transaction_run_steps(transaction, PAKFIRE_ACTION_POSTTRANS);
+       if (r)
+               return r;
+
+       return 0;
+}
index 79f59af9ae13301da6f92475edd80d1b38476d9a..f1382e23bfb2f9887f7ca1254ee4e5750922fb73 100644 (file)
@@ -267,7 +267,8 @@ class Cli(object):
                        self.ui.message(_("Aborted by user"))
                        return
 
-               # XXX run the transaction
+               # Run the transaction
+               transaction.run()
 
        def handle_info(self, ns):
                with self.pakfire(ns) as p: