Python wrapper for libalpm and python implementation of pacman (pycman). Backported to Python 2.
109 lines
2.4 KiB
Diff
109 lines
2.4 KiB
Diff
From a5e026eb17fd6c32ecb92aa40b71b5c6900fdabe Mon Sep 17 00:00:00 2001
|
|
From: Ray Donnelly <mingw.android@gmail.com>
|
|
Date: Fri, 11 Mar 2016 11:55:59 +0000
|
|
Subject: [PATCH 1/5] Python2 compat: Module initialization
|
|
|
|
From https://docs.python.org/3/howto/cporting.html
|
|
---
|
|
src/pyalpm.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
|
|
1 file changed, 57 insertions(+), 5 deletions(-)
|
|
|
|
diff --git src/pyalpm.c src/pyalpm.c
|
|
index 507f564..47c48cc 100644
|
|
--- src/pyalpm.c
|
|
+++ src/pyalpm.c
|
|
@@ -78,6 +78,28 @@ static PyObject *pyalpm_vercmp(PyObject *self, PyObject *args) {
|
|
return PyLong_FromLong(result);
|
|
}
|
|
|
|
+/*
|
|
+ https://docs.python.org/3/howto/cporting.html
|
|
+*/
|
|
+
|
|
+struct module_state {
|
|
+ PyObject *error;
|
|
+};
|
|
+
|
|
+#if PY_MAJOR_VERSION >= 3
|
|
+#define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
|
|
+#else
|
|
+#define GETSTATE(m) (&_state)
|
|
+static struct module_state _state;
|
|
+#endif
|
|
+
|
|
+static PyObject *
|
|
+error_out(PyObject *m) {
|
|
+ struct module_state *st = GETSTATE(m);
|
|
+ PyErr_SetString(st->error, "something bad happened");
|
|
+ return NULL;
|
|
+}
|
|
+
|
|
static PyMethodDef methods[] = {
|
|
{"version", version_alpm, METH_NOARGS, "returns pyalpm version."},
|
|
{"alpmversion", alpmversion_alpm, METH_NOARGS, "returns alpm version."},
|
|
@@ -101,26 +123,56 @@ static PyMethodDef methods[] = {
|
|
{NULL, NULL, 0, NULL}
|
|
};
|
|
|
|
+#if PY_MAJOR_VERSION >= 3
|
|
+
|
|
+static int pyalpm_traverse(PyObject *m, visitproc visit, void *arg) {
|
|
+ Py_VISIT(GETSTATE(m)->error);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int pyalpm_clear(PyObject *m) {
|
|
+ Py_CLEAR(GETSTATE(m)->error);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
static struct PyModuleDef pyalpm_def = {
|
|
PyModuleDef_HEAD_INIT,
|
|
"alpm",
|
|
"This module wraps the libalpm library",
|
|
- -1,
|
|
+ sizeof(struct module_state),
|
|
methods,
|
|
- NULL, NULL, NULL, NULL,
|
|
+ NULL,
|
|
+ pyalpm_traverse,
|
|
+ pyalpm_clear,
|
|
+ NULL,
|
|
};
|
|
|
|
-PyMODINIT_FUNC PyInit_pyalpm(void)
|
|
-{
|
|
- PyObject* m = PyModule_Create(&pyalpm_def);
|
|
+#define INITERROR return NULL
|
|
|
|
+PyMODINIT_FUNC
|
|
+PyInit_pyalpm(void)
|
|
+
|
|
+#else
|
|
+#define INITERROR return
|
|
+
|
|
+void
|
|
+initpyalpm(void)
|
|
+#endif
|
|
+{
|
|
+#if PY_MAJOR_VERSION >= 3
|
|
+ PyObject *m = PyModule_Create(&pyalpm_def);
|
|
+#else
|
|
+ PyObject *m = Py_InitModule("pyalpm", methods);
|
|
+#endif
|
|
init_pyalpm_error(m);
|
|
init_pyalpm_handle(m);
|
|
init_pyalpm_package(m);
|
|
init_pyalpm_db(m);
|
|
init_pyalpm_transaction(m);
|
|
|
|
+#if PY_MAJOR_VERSION >= 3
|
|
return m;
|
|
+#endif
|
|
}
|
|
|
|
/* vim: set ts=2 sw=2 et: */
|
|
--
|
|
2.7.1
|
|
|