return obj;
}
-static void Pakfire_status_callback(struct pakfire* pakfire, void* data,
- int progress, const char* status) {
- PyObject* callback = (PyObject*)data;
-
- // Do not attempt to call nothing
- if (!callback)
- return;
-
- // Acquire GIL
- PyGILState_STATE state = PyGILState_Ensure();
-
- // Compile arguments
- PyObject* args = Py_BuildValue("(is)", progress, status);
- if (args) {
- // Call the callback
- PyObject* result = PyObject_CallObject(callback, args);
-
- Py_XDECREF(result);
- Py_DECREF(args);
- }
-
- // Release the GIL
- PyGILState_Release(state);
-}
-
static int convert_packages(PyObject* object, void* address) {
char*** packages = (char***)address;
return 0;
}
-static PyObject* Pakfire_install(PakfireObject* self, PyObject* args, PyObject* kwargs) {
- char* kwlist[] = {
- "packages",
- "without_recommended",
- "allow_uninstall",
- "allow_downgrade",
- "status_callback",
- NULL
- };
- char** packages = NULL;
- int without_recommended = 0;
- int allow_uninstall = 0;
- int allow_downgrade = 0;
- int solver_flags = 0;
- int transaction_flags = 0;
- PyObject* status_callback = NULL;
- int r;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|$pppO", kwlist,
- convert_packages, &packages, &without_recommended, &allow_uninstall,
- &allow_downgrade, &status_callback))
- return NULL;
-
- // Check if callback is callable
- if (status_callback && !PyCallable_Check(status_callback)) {
- PyErr_SetString(PyExc_TypeError, "status_callback must be callable");
- return NULL;
- }
-
-
- // Do not install recommended packages
- if (without_recommended)
- solver_flags |= PAKFIRE_TRANSACTION_WITHOUT_RECOMMENDED;
-
- // Can the solver uninstall packages?
- if (allow_uninstall)
- solver_flags |= PAKFIRE_TRANSACTION_ALLOW_UNINSTALL;
-
- // Can the solver downgrade packages?
- if (allow_downgrade)
- solver_flags |= PAKFIRE_TRANSACTION_ALLOW_DOWNGRADE;
-
- Py_BEGIN_ALLOW_THREADS
-
- // Run pakfire_install
- r = pakfire_install(self->pakfire, transaction_flags, solver_flags,
- (const char**)packages, NULL, 0, NULL, Pakfire_status_callback, status_callback);
-
- Py_END_ALLOW_THREADS
-
- if (r)
- PyErr_SetFromErrno(PyExc_OSError);
-
- if (packages) {
- for (char** package = packages; *package; package++)
- free(*package);
- free(packages);
- }
-
- if (r)
- return NULL;
-
- Py_RETURN_NONE;
-}
-
-static PyObject* Pakfire_erase(PakfireObject* self, PyObject* args, PyObject* kwargs) {
- char* kwlist[] = {
- "packages",
- "keep_dependencies",
- "status_callback",
- NULL
- };
- char** packages = NULL;
- int keep_dependencies = 0;
- int transaction_flags = 0;
- int flags = 0;
- PyObject* status_callback = NULL;
- int r;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|$pO", kwlist,
- convert_packages, &packages, &keep_dependencies, &status_callback))
- return NULL;
-
- // Check if callback is callable
- if (status_callback && !PyCallable_Check(status_callback)) {
- PyErr_SetString(PyExc_TypeError, "status_callback must be callable");
- return NULL;
- }
-
- if (keep_dependencies)
- flags |= PAKFIRE_JOB_KEEP_DEPS;
-
- Py_BEGIN_ALLOW_THREADS
-
- // Run pakfire_erase
- r = pakfire_erase(self->pakfire, transaction_flags, 0, (const char**)packages,
- NULL, flags, NULL, Pakfire_status_callback, status_callback);
-
- Py_END_ALLOW_THREADS
-
- if (r)
- PyErr_SetFromErrno(PyExc_OSError);
-
- if (packages) {
- for (char** package = packages; *package; package++)
- free(*package);
- free(packages);
- }
-
- if (r)
- return NULL;
-
- Py_RETURN_NONE;
-}
-
-static PyObject* Pakfire_update(PakfireObject* self, PyObject* args, PyObject* kwargs) {
- char* kwlist[] = {
- "packages",
- "excludes",
- "allow_uninstall",
- "allow_downgrade",
- "status_callback",
- NULL
- };
- char** packages = NULL;
- char** excludes = NULL;
- int allow_uninstall = 0;
- int allow_downgrade = 0;
- int solver_flags = 0;
- int transaction_flags = 0;
- PyObject* status_callback = NULL;
- int r;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O&|$O&ppO", kwlist,
- convert_packages, &packages, convert_packages, &excludes,
- &allow_uninstall, &allow_downgrade, &status_callback))
- return NULL;
-
- // Check if callback is callable
- if (status_callback && !PyCallable_Check(status_callback)) {
- PyErr_SetString(PyExc_TypeError, "status_callback must be callable");
- return NULL;
- }
-
- // Can the solver uninstall packages?
- if (allow_uninstall)
- solver_flags |= PAKFIRE_TRANSACTION_ALLOW_UNINSTALL;
-
- // Can the solver downgrade packages?
- if (allow_downgrade)
- solver_flags |= PAKFIRE_TRANSACTION_ALLOW_DOWNGRADE;
-
- Py_BEGIN_ALLOW_THREADS
-
- // Run pakfire_update
- r = pakfire_update(self->pakfire, transaction_flags, solver_flags,
- (const char**)packages, (const char**)excludes, 0, NULL,
- Pakfire_status_callback, status_callback);
-
- Py_END_ALLOW_THREADS
-
- if (r)
- PyErr_SetFromErrno(PyExc_OSError);
-
- if (packages) {
- for (char** package = packages; *package; package++)
- free(*package);
- free(packages);
- }
-
- if (excludes) {
- for (char** exclude = excludes; *exclude; exclude++)
- free(*exclude);
- free(excludes);
- }
-
- if (r)
- return NULL;
-
- Py_RETURN_NONE;
-}
-
static PyObject* Pakfire_generate_key(PakfireObject* self, PyObject* args, PyObject* kwds) {
char* kwlist[] = { "algorithm", "comment", NULL };
struct pakfire_key* key = NULL;
Py_RETURN_NONE;
}
-static PyObject* Pakfire_check(PakfireObject* self) {
- struct pakfire_filelist* errors = NULL;
- int r;
-
- // Allocate a filelist for errors
- r = pakfire_filelist_create(&errors, self->pakfire);
- if (r)
- goto ERROR;
-
- Py_BEGIN_ALLOW_THREADS
-
- // Perform check
- r = pakfire_check(self->pakfire, errors);
-
- Py_END_ALLOW_THREADS
-
- if (r)
- goto ERROR;
-
- const size_t num_errors = pakfire_filelist_length(errors);
-
- // Did we find any errors?
- if (num_errors) {
- PyObject* _errors = PyList_FromFileList(errors);
- if (!_errors)
- goto ERROR;
-
- pakfire_filelist_unref(errors);
-
- // Raise CheckFileVerificationError
- PyErr_SetObject(PyExc_CheckFileVerificationError, _errors);
- Py_DECREF(_errors);
- return NULL;
- }
-
- pakfire_filelist_unref(errors);
- Py_RETURN_NONE;
-
-ERROR:
- // Cleanup
- if (errors)
- pakfire_filelist_unref(errors);
-
- // Raise exception from errno
- PyErr_SetFromErrno(PyExc_OSError);
- return NULL;
-}
-
-static PyObject* Pakfire_sync(PakfireObject* self, PyObject* args, PyObject* kwargs) {
- char* kwlist[] = {
- "keep_orphaned",
- "status_callback",
- NULL,
- };
- int keep_orphaned = 0;
- int flags = 0;
- PyObject* status_callback = NULL;
- int r;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|$pO", kwlist,
- &keep_orphaned, &status_callback))
- return NULL;
-
- if (keep_orphaned)
- flags |= PAKFIRE_JOB_KEEP_ORPHANED;
-
- Py_BEGIN_ALLOW_THREADS
-
- r = pakfire_sync(self->pakfire, 0, flags, NULL,
- Pakfire_status_callback, status_callback);
- if (r) {
- Py_BLOCK_THREADS
- PyErr_SetFromErrno(PyExc_OSError);
- return NULL;
- }
-
- Py_END_ALLOW_THREADS
-
- Py_RETURN_NONE;
-}
-
static PyObject* Pakfire_open(PakfireObject* self, PyObject* args) {
struct pakfire_archive* archive = NULL;
const char* path = NULL;
METH_VARARGS|METH_KEYWORDS,
NULL
},
- {
- "check",
- (PyCFunction)Pakfire_check,
- METH_NOARGS,
- NULL,
- },
{
"clean",
(PyCFunction)Pakfire_clean,
METH_VARARGS,
NULL
},
- {
- "erase",
- (PyCFunction)Pakfire_erase,
- METH_VARARGS|METH_KEYWORDS,
- NULL
- },
{
"execute",
(PyCFunction)Pakfire_execute,
METH_VARARGS,
NULL,
},
- {
- "install",
- (PyCFunction)Pakfire_install,
- METH_VARARGS|METH_KEYWORDS,
- NULL,
- },
{
"mkimage",
(PyCFunction)Pakfire_mkimage,
METH_VARARGS|METH_KEYWORDS,
NULL,
},
- {
- "sync",
- (PyCFunction)Pakfire_sync,
- METH_VARARGS|METH_KEYWORDS,
- NULL,
- },
- {
- "update",
- (PyCFunction)Pakfire_update,
- METH_VARARGS|METH_KEYWORDS,
- NULL
- },
{
"version_compare",
(PyCFunction)Pakfire_version_compare,
// Convenience functions to install/erase/update packages
-static int pakfire_perform_transaction(
- struct pakfire* pakfire,
- int transaction_flags,
- int solver_flags,
- const enum pakfire_job_action action,
- const char** packages,
- const char** locks,
- int job_flags,
- int* changed,
- pakfire_status_callback status_callback,
- void* status_callback_data) {
- struct pakfire_transaction* transaction = NULL;
- int r = 1;
-
- // Packages cannot be NULL
- if (!packages) {
- errno = EINVAL;
- return 1;
- }
-
- // Acquire lock
- r = pakfire_acquire_lock(pakfire);
- if (r)
- goto ERROR;
-
- // Create a new transaction
- r = pakfire_transaction_create(&transaction, pakfire, solver_flags);
- if (r)
- goto ERROR;
-
- // Set status callback
- if (status_callback)
- pakfire_transaction_set_status_callback(
- transaction, status_callback, status_callback_data);
-
- // Lock anything that should be locked
- if (locks) {
- for (const char** lock = locks; *lock; lock++) {
- r = pakfire_transaction_request(transaction, PAKFIRE_JOB_LOCK, *lock, 0);
- if (r) {
- ERROR(pakfire, "Could not lock '%s': %m\n", *lock);
- goto ERROR;
- }
- }
- }
-
- // Perform action on all packages
- for (const char** package = packages; *package; package++) {
- r = pakfire_transaction_request(transaction, action, *package, job_flags);
- if (r) {
- ERROR(pakfire, "Could not find '%s': %m\n", *package);
- goto ERROR;
- }
- }
-
- // Solve the transaction
- r = pakfire_transaction_solve(transaction, PAKFIRE_REQ_SOLVE_INTERACTIVE, NULL);
- if (r)
- goto ERROR;
-
- // Set how many packages have been changed
- if (changed)
- *changed = pakfire_transaction_count(transaction);
-
- // Run the transaction
- r = pakfire_transaction_run(transaction);
- if (r)
- goto ERROR;
-
- // Success
- r = 0;
-
-ERROR:
- // Release lock
- pakfire_release_lock(pakfire);
-
- if (transaction)
- pakfire_transaction_unref(transaction);
-
- return r;
-}
-
-PAKFIRE_EXPORT int pakfire_install(
- struct pakfire* pakfire,
- int transaction_flags,
- int solver_flags,
- const char** packages,
- const char** locks,
- int flags,
- int* changed,
- pakfire_status_callback status_callback,
- void* status_callback_data) {
- return pakfire_perform_transaction(
- pakfire,
- transaction_flags,
- solver_flags,
- PAKFIRE_JOB_INSTALL,
- packages,
- locks,
- flags,
- changed,
- status_callback,
- status_callback_data);
-}
-
-PAKFIRE_EXPORT int pakfire_erase(
- struct pakfire* pakfire,
- int transaction_flags,
- int solver_flags,
- const char** packages,
- const char** locks,
- int flags,
- int* changed,
- pakfire_status_callback status_callback,
- void* status_callback_data) {
- return pakfire_perform_transaction(
- pakfire,
- transaction_flags,
- solver_flags,
- PAKFIRE_JOB_ERASE,
- packages,
- locks,
- flags,
- changed,
- status_callback,
- status_callback_data);
-}
-
-static int pakfire_perform_transaction_simple(struct pakfire* pakfire, int solver_flags,
- const enum pakfire_job_action action, int job_flags, int* changed,
- pakfire_status_callback status_callback, void* status_callback_data) {
- struct pakfire_transaction* transaction = NULL;
- int r = 1;
-
- // Acquire lock
- r = pakfire_acquire_lock(pakfire);
- if (r)
- goto ERROR;
-
- // Create a new transaction
- r = pakfire_transaction_create(&transaction, pakfire, solver_flags);
- if (r)
- goto ERROR;
-
- // Set status callback
- if (status_callback)
- pakfire_transaction_set_status_callback(
- transaction, status_callback, status_callback_data);
-
- // Perform action
- r = pakfire_transaction_request(transaction, action, NULL, job_flags);
- if (r)
- goto ERROR;
-
- // Solve the transaction
- r = pakfire_transaction_solve(transaction, PAKFIRE_REQ_SOLVE_INTERACTIVE, NULL);
- if (r)
- goto ERROR;
-
- // Set how many packages have been changed
- if (changed)
- *changed = pakfire_transaction_count(transaction);
-
- // Run the transaction
- r = pakfire_transaction_run(transaction);
- if (r)
- goto ERROR;
-
- // Success
- r = 0;
-
-ERROR:
- // Release lock
- pakfire_release_lock(pakfire);
-
- if (transaction)
- pakfire_transaction_unref(transaction);
-
- return r;
-}
-
-PAKFIRE_EXPORT int pakfire_update(
- struct pakfire* pakfire,
- int transaction_flags,
- int solver_flags,
- const char** packages,
- const char** locks,
- int flags,
- int* changed,
- pakfire_status_callback status_callback,
- void* status_callback_data) {
- // If no packages are being passed, we will try to update everything
- // XXX add locks
- if (!packages)
- return pakfire_perform_transaction_simple(
- pakfire, solver_flags, PAKFIRE_JOB_UPDATE_ALL, flags, changed,
- status_callback, status_callback_data);
-
- return pakfire_perform_transaction(pakfire, transaction_flags, solver_flags,
- PAKFIRE_JOB_UPDATE, packages, locks, flags, changed,
- status_callback, status_callback_data);
-}
-
static int pakfire_verify(struct pakfire* pakfire, int *changed) {
+#if 0
return pakfire_perform_transaction_simple(pakfire, 0, PAKFIRE_JOB_VERIFY,
0, changed, NULL, NULL);
+#endif
+ #warning TODO
+ return 0;
}
static int pakfire_check_files(struct pakfire* pakfire,
return r;
}
-
-PAKFIRE_EXPORT int pakfire_sync(struct pakfire* pakfire, int solver_flags, int flags,
- int* changed, pakfire_status_callback status_callback, void* status_callback_data) {
- return pakfire_perform_transaction_simple(pakfire, solver_flags,
- PAKFIRE_JOB_SYNC, flags, changed, status_callback, status_callback_data);
-}