summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--debian/changelog6
-rw-r--r--python/apt_pkgmodule.cc2
-rw-r--r--python/apt_pkgmodule.h7
-rw-r--r--python/hashstring.cc140
-rw-r--r--python/indexrecords.cc121
-rw-r--r--python/makefile2
6 files changed, 277 insertions, 1 deletions
diff --git a/debian/changelog b/debian/changelog
index ca215554..1a80d081 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+python-apt (0.7.92) experimental; urgency=low
+
+ * Add apt_pkg.HashString and apt_pkg.IndexRecords (Closes: #456141)
+
+ -- Julian Andres Klode <jak@debian.org> Mon, 08 Jun 2009 17:23:37 +0200
+
python-apt (0.7.91) experimental; urgency=low
[ Julian Andres Klode ]
diff --git a/python/apt_pkgmodule.cc b/python/apt_pkgmodule.cc
index 4ad4e56c..085d12f4 100644
--- a/python/apt_pkgmodule.cc
+++ b/python/apt_pkgmodule.cc
@@ -603,6 +603,8 @@ extern "C" void initapt_pkg()
ADDTYPE(Module,"SourceRecords",&PkgSrcRecordsType);
/* ========================= sourcelist.cc ========================= */
ADDTYPE(Module,"SourceList",&PkgSourceListType);
+ ADDTYPE(Module,"IndexRecords",&PyIndexRecords_Type);
+ ADDTYPE(Module,"HashString",&PyHashString_Type);
// Tag file constants
PyModule_AddObject(Module,"REWRITE_PACKAGE_ORDER",
CharCharToList(TFRewritePackageOrder));
diff --git a/python/apt_pkgmodule.h b/python/apt_pkgmodule.h
index f7ef63c2..043e29cc 100644
--- a/python/apt_pkgmodule.h
+++ b/python/apt_pkgmodule.h
@@ -11,6 +11,7 @@
#define APT_PKGMODULE_H
#include <Python.h>
+#include <apt-pkg/hashes.h>
// Configuration Stuff
#define Configuration_Check(op) ((op)->ob_type == &ConfigurationType || \
@@ -106,5 +107,11 @@ extern PyTypeObject PackageIndexFileType;
// metaIndex
extern PyTypeObject MetaIndexType;
+// HashString
+PyObject *PyHashString_FromCpp(HashString *obj);
+extern PyTypeObject PyHashString_Type;
+
+// IndexRecord
+extern PyTypeObject PyIndexRecords_Type;
#endif
diff --git a/python/hashstring.cc b/python/hashstring.cc
new file mode 100644
index 00000000..02a80210
--- /dev/null
+++ b/python/hashstring.cc
@@ -0,0 +1,140 @@
+/* hashstring.cc - Wrapper around HashString
+ *
+ * Copyright 2009 Julian Andres Klode <jak@debian.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ */
+#include <Python.h>
+#include "generic.h"
+#include "apt_pkgmodule.h"
+#include <apt-pkg/hashes.h>
+
+static PyObject *HashString_NEW(PyTypeObject *type,PyObject *Args,
+ PyObject *kwds)
+{
+ const char *Hash;
+ const char *Type;
+ char *kwlist[] = {"type", "hash", NULL};
+ if (PyArg_ParseTupleAndKeywords(Args, kwds, "s|s", kwlist, &Type,
+ &Hash) == 0)
+ return 0;
+ CppPyObject<HashString*> *PyObj = CppPyObject_NEW<HashString*>(type);
+ if (Hash)
+ PyObj->Object = new HashString(Type,Hash);
+ else // Type is the combined form now (i.e. type:hash)
+ PyObj->Object = new HashString(Type);
+ return PyObj;
+}
+
+PyObject *PyHashString_FromCpp(HashString *obj)
+{
+ return CppPyObject_NEW<HashString*>(&PyHashString_Type, obj);
+}
+
+static PyObject *HashString_Repr(PyObject *self)
+{
+ HashString *hash = GetCpp<HashString*>(self);
+ char repr[100];
+ sprintf(repr, "<%s: \"%s\">", self->ob_type->tp_name, hash->toStr().c_str());
+ return PyString_FromString(repr);
+}
+
+static PyObject *HashString_ToStr(PyObject *self)
+{
+ HashString *hash = GetCpp<HashString*>(self);
+ return CppPyString(hash->toStr());
+}
+
+static PyObject *HashString_HashType(PyObject *self)
+{
+ HashString *hash = GetCpp<HashString*>(self);
+ return CppPyString(hash->HashType());
+}
+
+static const char *HashString_VerifyFile_doc =
+ "verify_file(filename: str) --> bool\n\n"
+ "Verify that the file indicated by filename matches the hash.";
+
+static PyObject *HashString_VerifyFile(PyObject *self,PyObject *args)
+{
+ HashString *hash = GetCpp<HashString*>(self);
+ char *filename;
+ if (PyArg_ParseTuple(args, "s", &filename) == 0)
+ return 0;
+ return PyBool_FromLong(hash->VerifyFile(filename));
+}
+
+static PyMethodDef HashString_Methods[] = {
+ {"to_str",(PyCFunction)HashString_ToStr,METH_NOARGS,
+ "to_str() --> str\n\nReturn a string, consisting of type:hash"},
+ {"verify_file",HashString_VerifyFile,METH_VARARGS,
+ HashString_VerifyFile_doc},
+ {"hash_type",(PyCFunction)HashString_HashType,METH_NOARGS,
+ "hash_type() --> str\n\nReturn the type of hash (MD5Sum,SHA1,SHA256)"},
+ {}
+};
+
+static const char *HashString_doc =
+ "HashString(type, hash) OR HashString('type:hash')\n\n"
+ "Create a new HashString object. The first form allows you to specify\n"
+ "a type and a hash, and the second form a single string where type and\n"
+ "hash are seperated by a colon, e.g.::\n\n"
+ " HashString('MD5Sum', '6cc1b6e6655e3555ac47e5b5fe26d04e')\n\n"
+ "Valid options for 'type' are: MD5Sum, SHA1, SHA256.";
+PyTypeObject PyHashString_Type = {
+ PyObject_HEAD_INIT(&PyType_Type)
+#if PY_MAJOR_VERSION < 3
+ 0, // ob_size
+#endif
+ "apt_pkg.HashString", // tp_name
+ sizeof(CppPyObject<HashString*>), // tp_basicsize
+ 0, // tp_itemsize
+ // Methods
+ CppDealloc<HashString*>, // tp_dealloc
+ 0, // tp_print
+ 0, // tp_getattr
+ 0, // tp_setattr
+ 0, // tp_compare
+ HashString_Repr, // tp_repr
+ 0, // tp_as_number
+ 0, // tp_as_sequence
+ 0, // tp_as_mapping
+ 0, // tp_hash
+ 0, // tp_call
+ HashString_ToStr, // tp_str
+ 0, // tp_getattro
+ 0, // tp_setattro
+ 0, // tp_as_buffer
+ Py_TPFLAGS_DEFAULT, // tp_flags
+ HashString_doc, // tp_doc
+ 0, // tp_traverse
+ 0, // tp_clear
+ 0, // tp_richcompare
+ 0, // tp_weaklistoffset
+ 0, // tp_iter
+ 0, // tp_iternext
+ HashString_Methods, // tp_methods
+ 0, // tp_members
+ 0, // 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
+ HashString_NEW, // tp_new
+};
diff --git a/python/indexrecords.cc b/python/indexrecords.cc
new file mode 100644
index 00000000..e6099a69
--- /dev/null
+++ b/python/indexrecords.cc
@@ -0,0 +1,121 @@
+/*
+ * indexrecords.cc - Wrapper around indexRecords
+ *
+ * Copyright 2009 Julian Andres Klode <jak@debian.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ */
+#include <Python.h>
+#include "apt_pkgmodule.h"
+#include "generic.h"
+#include <apt-pkg/indexrecords.h>
+
+static PyObject *IndexRecords_NEW(PyTypeObject *type,PyObject *Args,
+ PyObject *kwds)
+{
+ char * kwlist[] = {NULL};
+ if (PyArg_ParseTupleAndKeywords(Args, kwds, "", kwlist) == 0)
+ return 0;
+ indexRecords *records = new indexRecords();
+ CppPyObject<indexRecords*> *New = CppPyObject_NEW<indexRecords*>(type,
+ records);
+ return New;
+}
+
+static PyObject *IndexRecords_Load(PyObject *self,PyObject *args)
+{
+ const char *filename;
+ if (PyArg_ParseTuple(args, "s", &filename) == 0)
+ return 0;
+ indexRecords *records = GetCpp<indexRecords*>(self);
+ return HandleErrors(Py_BuildValue("i", records->Load(filename)));
+}
+
+static const char *IndexRecords_Lookup_doc = "lookup(metakey)\n\n"
+ "Lookup the filename given by metakey, return a tuple (size,hash).\n"
+ "The hash part is a HashString() object.";
+static PyObject *IndexRecords_Lookup(PyObject *self,PyObject *args)
+{
+ const char *keyname;
+ if (PyArg_ParseTuple(args, "s", &keyname) == 0)
+ return 0;
+ indexRecords *records = GetCpp<indexRecords*>(self);
+ const indexRecords::checkSum *result = records->Lookup(keyname);
+ return Py_BuildValue("(iO)",result->Size,
+ PyHashString_FromCpp((HashString*)&result->Hash));
+}
+
+static PyObject *IndexRecords_GetDist(PyObject *self)
+{
+ indexRecords *records = GetCpp<indexRecords*>(self);
+ return HandleErrors(PyString_FromString(records->GetDist().c_str()));
+}
+
+static PyMethodDef IndexRecords_Methods[] = {
+ {"load",IndexRecords_Load,METH_VARARGS,
+ "load(filename: str)\n\nLoad the file given by filename."},
+ {"get_dist",(PyCFunction)IndexRecords_GetDist,METH_NOARGS,
+ "get_dist() -> str\n\nReturn a distribution set in the release file."},
+ {"lookup",IndexRecords_Lookup,METH_VARARGS,IndexRecords_Lookup_doc},
+ {}
+};
+
+static char *IndexRecords_doc = "IndexRecords()\n\n"
+ "Representation of a release file.";
+PyTypeObject PyIndexRecords_Type = {
+ PyObject_HEAD_INIT(&PyType_Type)
+#if PY_MAJOR_VERSION < 3
+ 0, // ob_size
+#endif
+ "apt_pkg.IndexRecords", // tp_name
+ sizeof(CppPyObject<indexRecords*>), // tp_basicsize
+ 0, // tp_itemsize
+ // Methods
+ CppDealloc<indexRecords*>, // tp_dealloc
+ 0, // tp_print
+ 0, // tp_getattr
+ 0, // tp_setattr
+ 0, // tp_compare
+ 0, // tp_repr
+ 0, // tp_as_number
+ 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
+ IndexRecords_doc, // tp_doc
+ 0, // tp_traverse
+ 0, // tp_clear
+ 0, // tp_richcompare
+ 0, // tp_weaklistoffset
+ 0, // tp_iter
+ 0, // tp_iternext
+ IndexRecords_Methods, // tp_methods
+ 0, // tp_members
+ 0, // 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
+ IndexRecords_NEW, // tp_new
+};
diff --git a/python/makefile b/python/makefile
index 3e6458f4..f4d559ce 100644
--- a/python/makefile
+++ b/python/makefile
@@ -12,7 +12,7 @@ LIB_MAKES = apt-pkg/makefile
APT_PKG_SRC = apt_pkgmodule.cc configuration.cc generic.cc tag.cc string.cc \
cache.cc pkgrecords.cc pkgsrcrecords.cc sourcelist.cc \
depcache.cc progress.cc cdrom.cc acquire.cc pkgmanager.cc \
- indexfile.cc metaindex.cc
+ indexfile.cc metaindex.cc hashstring.cc indexrecords.cc
SOURCE := $(APT_PKG_SRC)
include $(PYTHON_H) progress.h