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);
}
METH_NOARGS,
NULL
},
+ {
+ "run",
+ (PyCFunction)Transaction_run,
+ METH_NOARGS,
+ NULL,
+ },
{ NULL },
};
#include <solv/pooltypes.h>
+#include <pakfire/transaction.h>
#include <pakfire/types.h>
typedef enum _pakfire_step_types {
#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;
return step->pool;
}
+int pakfire_step_run(PakfireStep step, pakfire_action_type action);
+
#endif
#endif /* PAKFIRE_STEP_H */
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;
pakfire_transaction_get_packages;
pakfire_transaction_get_step;
pakfire_transaction_installsizechange;
+ pakfire_transaction_run;
# util
pakfire_free;
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;
+}
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;
+}
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: