summaryrefslogtreecommitdiff
path: root/python/pkgsrcrecords.cc
diff options
context:
space:
mode:
authorMichael Vogt <michael.vogt@ubuntu.com>2010-02-17 16:17:36 +0100
committerMichael Vogt <michael.vogt@ubuntu.com>2010-02-17 16:17:36 +0100
commitd1b2c0fbd34cee0ffced8270149b87def7675b2a (patch)
treef4b8a14fc619b2e6ea297385e289b2549f6f21a4 /python/pkgsrcrecords.cc
parentc62bdd0b1b633b134ba551847da0c1e8d12115c2 (diff)
parent930f6a2899b0b410777397fb206a8eba8c99100c (diff)
downloadpython-apt-d1b2c0fbd34cee0ffced8270149b87def7675b2a.tar.gz
merged from the debian-sid branch
Diffstat (limited to 'python/pkgsrcrecords.cc')
-rw-r--r--python/pkgsrcrecords.cc283
1 files changed, 209 insertions, 74 deletions
diff --git a/python/pkgsrcrecords.cc b/python/pkgsrcrecords.cc
index 36493e7b..41ee6276 100644
--- a/python/pkgsrcrecords.cc
+++ b/python/pkgsrcrecords.cc
@@ -58,7 +58,6 @@ static PyObject *PkgSrcRecordsRestart(PyObject *Self,PyObject *Args)
{
PkgSrcRecordsStruct &Struct = GetCpp<PkgSrcRecordsStruct>(Self);
- char *Name = 0;
if (PyArg_ParseTuple(Args,"") == 0)
return 0;
@@ -70,87 +69,202 @@ static PyObject *PkgSrcRecordsRestart(PyObject *Self,PyObject *Args)
static PyMethodDef PkgSrcRecordsMethods[] =
{
+ {"lookup",PkgSrcRecordsLookup,METH_VARARGS,doc_PkgSrcRecordsLookup},
+ {"restart",PkgSrcRecordsRestart,METH_VARARGS,doc_PkgSrcRecordsRestart},
+#ifdef COMPAT_0_7
{"Lookup",PkgSrcRecordsLookup,METH_VARARGS,doc_PkgSrcRecordsLookup},
{"Restart",PkgSrcRecordsRestart,METH_VARARGS,doc_PkgSrcRecordsRestart},
+#endif
{}
};
-static PyObject *PkgSrcRecordsAttr(PyObject *Self,char *Name)
-{
+/**
+ * Get the PkgSrcRecordsStruct from a PyObject. If no package has been looked
+ * up, set an AttributeError using the given name.
+ */
+static inline PkgSrcRecordsStruct &GetStruct(PyObject *Self,char *name) {
PkgSrcRecordsStruct &Struct = GetCpp<PkgSrcRecordsStruct>(Self);
+ if (Struct.Last == 0)
+ PyErr_SetString(PyExc_AttributeError,name);
+ return Struct;
+}
- if (Struct.Last != 0)
- {
- if (strcmp("Package",Name) == 0)
- return CppPyString(Struct.Last->Package());
- else if (strcmp("Version",Name) == 0)
- return CppPyString(Struct.Last->Version());
- else if (strcmp("Maintainer",Name) == 0)
- return CppPyString(Struct.Last->Maintainer());
- else if (strcmp("Section",Name) == 0)
- return CppPyString(Struct.Last->Section());
- else if (strcmp("Record",Name) == 0)
- return CppPyString(Struct.Last->AsStr());
- else if (strcmp("Binaries",Name) == 0) {
- PyObject *List = PyList_New(0);
-
- for(const char **b = Struct.Last->Binaries();
- *b != 0;
- ++b)
- PyList_Append(List, CppPyString(*b));
- return List; // todo
- } else if (strcmp("Index",Name) == 0) {
- const pkgIndexFile &tmp = Struct.Last->Index();
- return CppOwnedPyObject_NEW<pkgIndexFile*>(Self,&PackageIndexFileType, (pkgIndexFile*)&tmp);
- } else if (strcmp("Files",Name) == 0) {
- PyObject *List = PyList_New(0);
-
- vector<pkgSrcRecords::File> f;
- if(!Struct.Last->Files(f))
- return NULL; // error
-
- PyObject *v;
- for(unsigned int i=0;i<f.size();i++) {
- v = Py_BuildValue("(siss)",
- f[i].MD5Hash.c_str(),
- f[i].Size,
- f[i].Path.c_str(),
- f[i].Type.c_str());
- PyList_Append(List, v);
- Py_DECREF(v);
+static PyObject *PkgSrcRecordsGetPackage(PyObject *Self,void*) {
+ PkgSrcRecordsStruct &Struct = GetStruct(Self,"Package");
+ return (Struct.Last != 0) ? CppPyString(Struct.Last->Package()) : 0;
+}
+static PyObject *PkgSrcRecordsGetVersion(PyObject *Self,void*) {
+ PkgSrcRecordsStruct &Struct = GetStruct(Self,"Version");
+ return (Struct.Last != 0) ? CppPyString(Struct.Last->Version()) : 0;
+}
+static PyObject *PkgSrcRecordsGetMaintainer(PyObject *Self,void*) {
+ PkgSrcRecordsStruct &Struct = GetStruct(Self,"Maintainer");
+ return (Struct.Last != 0) ? CppPyString(Struct.Last->Maintainer()) : 0;
+}
+static PyObject *PkgSrcRecordsGetSection(PyObject *Self,void*) {
+ PkgSrcRecordsStruct &Struct = GetStruct(Self,"Section");
+ return (Struct.Last != 0) ? CppPyString(Struct.Last->Section()) : 0;
+}
+static PyObject *PkgSrcRecordsGetRecord(PyObject *Self,void*) {
+ PkgSrcRecordsStruct &Struct = GetStruct(Self,"Record");
+ return (Struct.Last != 0) ? CppPyString(Struct.Last->AsStr()) : 0;
+}
+static PyObject *PkgSrcRecordsGetBinaries(PyObject *Self,void*) {
+ PkgSrcRecordsStruct &Struct = GetStruct(Self,"Binaries");
+ if (Struct.Last == 0)
+ return 0;
+ PyObject *List = PyList_New(0);
+ for(const char **b = Struct.Last->Binaries(); *b != 0; ++b)
+ PyList_Append(List, CppPyString(*b));
+ return List; // todo
+}
+static PyObject *PkgSrcRecordsGetIndex(PyObject *Self,void*) {
+ PkgSrcRecordsStruct &Struct = GetStruct(Self,"Index");
+ if (Struct.Last == 0)
+ return 0;
+ const pkgIndexFile &tmp = Struct.Last->Index();
+ CppPyObject<pkgIndexFile*> *PyObj;
+ PyObj = CppPyObject_NEW<pkgIndexFile*>(Self,&PyIndexFile_Type,
+ (pkgIndexFile*)&tmp);
+ // Do not delete the pkgIndexFile*, it is managed by PkgSrcRecords::Parser.
+ PyObj->NoDelete=true;
+ return PyObj;
+}
+
+static PyObject *PkgSrcRecordsGetFiles(PyObject *Self,void*) {
+ PkgSrcRecordsStruct &Struct = GetStruct(Self,"Files");
+ if (Struct.Last == 0)
+ return 0;
+ PyObject *List = PyList_New(0);
+
+ vector<pkgSrcRecords::File> f;
+ if(!Struct.Last->Files(f))
+ return NULL; // error
+
+ PyObject *v;
+ for(unsigned int i=0;i<f.size();i++) {
+ v = Py_BuildValue("(siss)",
+ f[i].MD5Hash.c_str(),
+ f[i].Size,
+ f[i].Path.c_str(),
+ f[i].Type.c_str());
+ PyList_Append(List, v);
+ Py_DECREF(v);
+ }
+ return List;
+}
+
+static PyObject *PkgSrcRecordsGetBuildDepends(PyObject *Self,void*) {
+ PkgSrcRecordsStruct &Struct = GetStruct(Self,"BuildDepends");
+ if (Struct.Last == 0)
+ return 0;
+
+ PyObject *Dict = PyDict_New();
+ PyObject *Dep = 0;
+ PyObject *LastDep = 0;
+ PyObject *OrGroup = 0;
+
+ vector<pkgSrcRecords::Parser::BuildDepRec> bd;
+ if(!Struct.Last->BuildDepends(bd, false /* arch-only*/))
+ return NULL; // error
+
+ PyObject *v;
+ for(unsigned int i=0;i<bd.size();i++) {
+
+ Dep = PyString_FromString(pkgSrcRecords::Parser::BuildDepType(bd[i].Type));
+
+ LastDep = PyDict_GetItem(Dict,Dep);
+ if (LastDep == 0)
+ {
+ LastDep = PyList_New(0);
+ PyDict_SetItem(Dict,Dep,LastDep);
+ Py_DECREF(LastDep);
}
- return List;
- } else if (strcmp("BuildDepends",Name) == 0) {
- PyObject *List = PyList_New(0);
-
- vector<pkgSrcRecords::Parser::BuildDepRec> bd;
- if(!Struct.Last->BuildDepends(bd, false /* arch-only*/))
- return NULL; // error
-
- PyObject *v;
- for(unsigned int i=0;i<bd.size();i++) {
- v = Py_BuildValue("(ssii)", bd[i].Package.c_str(),
- bd[i].Version.c_str(), bd[i].Op, bd[i].Type);
- PyList_Append(List, v);
+ Py_DECREF(Dep);
+ OrGroup = PyList_New(0);
+ PyList_Append(LastDep, OrGroup);
+ Py_DECREF(OrGroup);
+
+ // Add at least one package to the group, add more if Or is set.
+ while (1)
+ {
+ v = Py_BuildValue("(sss)", bd[i].Package.c_str(),
+ bd[i].Version.c_str(), pkgCache::CompType(bd[i].Op));
+ PyList_Append(OrGroup, v);
Py_DECREF(v);
- }
- return List;
- }
+ if (pkgCache::Dep::Or != (bd[i].Op & pkgCache::Dep::Or) || i == bd.size())
+ break;
+ i++;
+ }
+
}
+ return Dict;
+}
+
+#ifdef COMPAT_0_7
+static PyObject *PkgSrcRecordsGetBuildDepends_old(PyObject *Self,void*) {
+ PkgSrcRecordsStruct &Struct = GetStruct(Self,"BuildDepends");
+ if (Struct.Last == 0)
+ return 0;
+ PyObject *List = PyList_New(0);
+
+ vector<pkgSrcRecords::Parser::BuildDepRec> bd;
+ if(!Struct.Last->BuildDepends(bd, false /* arch-only*/))
+ return NULL; // error
+
+ PyObject *v;
+ for(unsigned int i=0;i<bd.size();i++) {
+ v = Py_BuildValue("(ssii)", bd[i].Package.c_str(),
+ bd[i].Version.c_str(), bd[i].Op, bd[i].Type);
+ PyList_Append(List, v);
+ Py_DECREF(v);
+ }
+ return List;
+}
+#endif
+
+static PyGetSetDef PkgSrcRecordsGetSet[] = {
+ {"binaries",PkgSrcRecordsGetBinaries},
+ {"build_depends",PkgSrcRecordsGetBuildDepends},
+ {"files",PkgSrcRecordsGetFiles},
+ {"index",PkgSrcRecordsGetIndex},
+ {"maintainer",PkgSrcRecordsGetMaintainer},
+ {"package",PkgSrcRecordsGetPackage},
+ {"record",PkgSrcRecordsGetRecord},
+ {"section",PkgSrcRecordsGetSection},
+ {"version",PkgSrcRecordsGetVersion},
+#ifdef COMPAT_0_7
+ {"Binaries",PkgSrcRecordsGetBinaries},
+ {"BuildDepends",PkgSrcRecordsGetBuildDepends_old,0,"Deprecated function and deprecated output format."},
+ {"Files",PkgSrcRecordsGetFiles},
+ {"Index",PkgSrcRecordsGetIndex},
+ {"Maintainer",PkgSrcRecordsGetMaintainer},
+ {"Package",PkgSrcRecordsGetPackage},
+ {"Record",PkgSrcRecordsGetRecord},
+ {"Section",PkgSrcRecordsGetSection},
+ {"Version",PkgSrcRecordsGetVersion},
+#endif
+ {}
+};
- return Py_FindMethod(PkgSrcRecordsMethods,Self,Name);
+static PyObject *PkgSrcRecordsNew(PyTypeObject *type,PyObject *args,PyObject *kwds) {
+ char *kwlist[] = {0};
+ if (PyArg_ParseTupleAndKeywords(args,kwds,"",kwlist) == 0)
+ return 0;
+
+ return HandleErrors(CppPyObject_NEW<PkgSrcRecordsStruct>(NULL, type));
}
-PyTypeObject PkgSrcRecordsType =
+
+PyTypeObject PySourceRecords_Type =
{
- PyObject_HEAD_INIT(&PyType_Type)
- 0, // ob_size
- "pkgSrcRecords", // tp_name
+ PyVarObject_HEAD_INIT(&PyType_Type, 0)
+ "apt_pkg.SourceRecords", // tp_name
sizeof(CppPyObject<PkgSrcRecordsStruct>), // tp_basicsize
0, // tp_itemsize
// Methods
CppDealloc<PkgSrcRecordsStruct>, // tp_dealloc
0, // tp_print
- PkgSrcRecordsAttr, // tp_getattr
+ 0, // tp_getattr
0, // tp_setattr
0, // tp_compare
0, // tp_repr
@@ -158,23 +272,44 @@ PyTypeObject PkgSrcRecordsType =
0, // tp_as_sequence
0, // tp_as_mapping
0, // tp_hash
+ 0, // tp_call
+ 0, // tp_str
+ 0, // tp_getattro
+ 0, // tp_setattro
+ 0, // tp_as_buffer
+ (Py_TPFLAGS_DEFAULT | // tp_flags
+ Py_TPFLAGS_BASETYPE),
+ "SourceRecords Object", // tp_doc
+ 0, // tp_traverse
+ 0, // tp_clear
+ 0, // tp_richcompare
+ 0, // tp_weaklistoffset
+ 0, // tp_iter
+ 0, // tp_iternext
+ PkgSrcRecordsMethods, // tp_methods
+ 0, // tp_members
+ PkgSrcRecordsGetSet, // tp_getset
+ 0, // tp_base
+ 0, // tp_dict
+ 0, // tp_descr_get
+ 0, // tp_descr_set
+ 0, // tp_dictoffset
+ 0, // tp_init
+ 0, // tp_alloc
+ PkgSrcRecordsNew, // tp_new
};
/*}}}*/
+#ifdef COMPAT_0_7
PyObject *GetPkgSrcRecords(PyObject *Self,PyObject *Args)
{
-#if 0
- PyObject *Owner;
- if (PyArg_ParseTuple(Args,"O!",&PkgCacheType,&Owner) == 0)
- return 0;
-
- return HandleErrors(CppOwnedPyObject_NEW<PkgSrcRecordsStruct>(Owner,
- &PkgSrcRecordsType));
-#endif
+ PyErr_WarnEx(PyExc_DeprecationWarning, "apt_pkg.GetPkgSrcRecords() is "
+ "deprecated. Please see apt_pkg.SourceRecords() for the "
+ "replacement.", 1);
if (PyArg_ParseTuple(Args,"") == 0)
return 0;
- return HandleErrors(CppPyObject_NEW<PkgSrcRecordsStruct>(&PkgSrcRecordsType));
+ return HandleErrors(CppPyObject_NEW<PkgSrcRecordsStruct>(NULL, &PySourceRecords_Type));
}
-
+#endif