From: Michael Tremer Date: Fri, 3 Nov 2017 18:48:19 +0000 (+0100) Subject: Add scaffolding for running a transaction X-Git-Tag: 0.9.28~1285^2~1301 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dea70c9f0f864abb09c363ae1aedc2d2811e6789;p=pakfire.git Add scaffolding for running a transaction Signed-off-by: Michael Tremer --- diff --git a/src/_pakfire/transaction.c b/src/_pakfire/transaction.c index 2f84fd099..c7e461b75 100644 --- a/src/_pakfire/transaction.c +++ b/src/_pakfire/transaction.c @@ -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 }, }; diff --git a/src/libpakfire/include/pakfire/step.h b/src/libpakfire/include/pakfire/step.h index 37d34709f..06efdc22e 100644 --- a/src/libpakfire/include/pakfire/step.h +++ b/src/libpakfire/include/pakfire/step.h @@ -23,6 +23,7 @@ #include +#include #include 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 */ diff --git a/src/libpakfire/include/pakfire/transaction.h b/src/libpakfire/include/pakfire/transaction.h index 689954477..352303b8c 100644 --- a/src/libpakfire/include/pakfire/transaction.h +++ b/src/libpakfire/include/pakfire/transaction.h @@ -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; diff --git a/src/libpakfire/libpakfire.sym b/src/libpakfire/libpakfire.sym index 05024cd6e..fe05fc7ee 100644 --- a/src/libpakfire/libpakfire.sym +++ b/src/libpakfire/libpakfire.sym @@ -270,6 +270,7 @@ global: pakfire_transaction_get_packages; pakfire_transaction_get_step; pakfire_transaction_installsizechange; + pakfire_transaction_run; # util pakfire_free; diff --git a/src/libpakfire/step.c b/src/libpakfire/step.c index d733bcc45..04800f320 100644 --- a/src/libpakfire/step.c +++ b/src/libpakfire/step.c @@ -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; +} diff --git a/src/libpakfire/transaction.c b/src/libpakfire/transaction.c index 2d6f84dd3..5a7c0e782 100644 --- a/src/libpakfire/transaction.c +++ b/src/libpakfire/transaction.c @@ -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; +} diff --git a/src/pakfire/cli.py b/src/pakfire/cli.py index 79f59af9a..f1382e23b 100644 --- a/src/pakfire/cli.py +++ b/src/pakfire/cli.py @@ -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: