summaryrefslogtreecommitdiff
path: root/python/apt_instmodule.cc
diff options
context:
space:
mode:
authorJulian Andres Klode <jak@debian.org>2009-04-15 20:29:30 +0200
committerJulian Andres Klode <jak@debian.org>2009-04-15 20:29:30 +0200
commit49c10e3b9f6760280761f1255f3182637ba0ac9e (patch)
tree611819fece2da28d796b184457fb413f1f7b497d /python/apt_instmodule.cc
parent23d29169c30b2f05a0c2943832a7cf7288ff5802 (diff)
parentabc7c861e85265b0725aa82a51fe41f9183bc506 (diff)
downloadpython-apt-49c10e3b9f6760280761f1255f3182637ba0ac9e.tar.gz
python-apt (0.7.90) experimental; urgency=low
* Introduce support for Python 3 (Closes: #523645) * Support the 'in' operator (e.g. "k in d") in Configuration{,Ptr,Sub} objects (e.g. apt_pkg.Config) and in TagSections (apt_pkg.ParseSection()) * Replace support for file objects with a more generic support for any object providing a fileno() method and for file descriptors (integers). * Add support for the Breaks fields * Only create Package objects when they are requested, do not keep them in a dict. Saves 10MB for 25,000 packages on my machine. * apt/package.py: Allow to set the candidate of a package (Closes: #523997) - Support assignments to the 'candidate' property of Package objects. - Initial patch by Sebastian Heinlein -- Julian Andres Klode <jak@debian.org> Wed, 15 Apr 2009 13:47:42 +0200
Diffstat (limited to 'python/apt_instmodule.cc')
-rw-r--r--python/apt_instmodule.cc56
1 files changed, 49 insertions, 7 deletions
diff --git a/python/apt_instmodule.cc b/python/apt_instmodule.cc
index 48868d86..09e3937e 100644
--- a/python/apt_instmodule.cc
+++ b/python/apt_instmodule.cc
@@ -35,14 +35,17 @@ static PyObject *debExtractControl(PyObject *Self,PyObject *Args)
{
char *Member = "control";
PyObject *File;
- if (PyArg_ParseTuple(Args,"O!|s",&PyFile_Type,&File,&Member) == 0)
+ if (PyArg_ParseTuple(Args,"O|s",&File,&Member) == 0)
return 0;
// Subscope makes sure any clean up errors are properly handled.
PyObject *Res = 0;
{
// Open the file and associate the .deb
- FileFd Fd(fileno(PyFile_AsFile(File)),false);
+ int fileno = PyObject_AsFileDescriptor(File);
+ if (fileno == -1)
+ return 0;
+ FileFd Fd(fileno,false);
debDebFile Deb(Fd);
if (_error->PendingError() == true)
return HandleErrors();
@@ -76,7 +79,7 @@ static PyObject *debExtractArchive(PyObject *Self,PyObject *Args)
char *Rootdir = NULL;
char cwd[512];
PyObject *File;
- if (PyArg_ParseTuple(Args,"O!|s",&PyFile_Type,&File,&Rootdir) == 0)
+ if (PyArg_ParseTuple(Args,"O|s",&File,&Rootdir) == 0)
return 0;
// Subscope makes sure any clean up errors are properly handled.
@@ -89,7 +92,10 @@ static PyObject *debExtractArchive(PyObject *Self,PyObject *Args)
}
// Open the file and associate the .deb
- FileFd Fd(fileno(PyFile_AsFile(File)),false);
+ int fileno = PyObject_AsFileDescriptor(File);
+ if (fileno == -1)
+ return 0;
+ FileFd Fd(fileno,false);
debDebFile Deb(Fd);
if (_error->PendingError() == true) {
if (Rootdir != NULL)
@@ -118,11 +124,14 @@ static PyObject *arCheckMember(PyObject *Self,PyObject *Args)
char *Member = NULL;
bool res = false;
PyObject *File;
- if (PyArg_ParseTuple(Args,"O!s",&PyFile_Type,&File,&Member) == 0)
+ if (PyArg_ParseTuple(Args,"Os",&File,&Member) == 0)
return 0;
// Open the file and associate the .deb
- FileFd Fd(fileno(PyFile_AsFile(File)),false);
+ int fileno = PyObject_AsFileDescriptor(File);
+ if (fileno == -1)
+ return 0;
+ FileFd Fd(fileno,false);
ARArchive AR(Fd);
if (_error->PendingError() == true)
return HandleErrors(Py_BuildValue("b",res));
@@ -153,8 +162,41 @@ static PyMethodDef methods[] =
{}
};
+#if PY_MAJOR_VERSION >= 3
+struct module_state {
+ PyObject *error;
+};
+#define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
+
+static int apt_inst_traverse(PyObject *m, visitproc visit, void *arg) {
+ Py_VISIT(GETSTATE(m)->error);
+ return 0;
+}
+
+static int apt_inst_clear(PyObject *m) {
+ Py_CLEAR(GETSTATE(m)->error);
+ return 0;
+}
+
+static struct PyModuleDef moduledef = {
+ PyModuleDef_HEAD_INIT,
+ "apt_inst",
+ NULL,
+ sizeof(struct module_state),
+ methods,
+ NULL,
+ apt_inst_traverse,
+ apt_inst_clear,
+ NULL
+};
+
+extern "C" PyObject * PyInit_apt_inst()
+{
+ return PyModule_Create(&moduledef);
+}
+#else
extern "C" void initapt_inst()
{
Py_InitModule("apt_inst",methods);
}
- /*}}}*/
+#endif /*}}}*/