[Rpm-maint] PATCH: Python: allow access to packages & headers from spec object

Daniel P. Berrange berrange at redhat.com
Thu Sep 18 15:23:47 UTC 2008


I'm trying todo some automated processing & analysis of RPM specfiles
and have found the python binding is lacking a number of key features

 - The 'spec' object allows access to the lists of sources, but doesn't
   expose the RPMBUILD_ISXXXX constants

 - The 'spec' object does not provide access to the 'packages' objects
   so you can't query most metadata about the spec.

 - None of the RPMTAG_XXX constants are defined, which makes using the
   'header' object unpleasant.

This patch addresses all these missing pieces. I'm not entirely clear on 
whether the reference counting / object lifecycle stuff is correct here
though. It seems like there's the possibility of python garbage collecting
the 'spec' object while there's still a live 'pkg' and/or 'header' object
live. 

 Makefile.am |    1 
 pkg-py.c    |  113 +++++++++++++++++++++++++++
 pkg-py.h    |   26 ++++++
 rpmmodule.c |  251 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 spec-py.c   |   30 ++++++-
 5 files changed, 420 insertions(+), 1 deletion(-)


Daniel

diff -rupN rpm-4.5.90.git8461.orig/python/Makefile.am rpm-4.5.90.git8461.new/python/Makefile.am
--- rpm-4.5.90.git8461.orig/python/Makefile.am	2008-06-26 05:26:01.000000000 -0400
+++ rpm-4.5.90.git8461.new/python/Makefile.am	2008-09-18 07:24:51.000000000 -0400
@@ -36,5 +36,6 @@ _rpmmodule_la_SOURCES = rpmmodule.c syst
 	rpmmacro-py.c rpmmacro-py.h \
 	rpmte-py.c rpmte-py.h \
 	rpmts-py.c rpmts-py.h \
+	pkg-py.c pkg-py.h \
 	spec-py.c spec-py.h
 endif
diff -rupN rpm-4.5.90.git8461.orig/python/pkg-py.c rpm-4.5.90.git8461.new/python/pkg-py.c
--- rpm-4.5.90.git8461.orig/python/pkg-py.c	1969-12-31 19:00:00.000000000 -0500
+++ rpm-4.5.90.git8461.new/python/pkg-py.c	2008-09-18 07:24:45.000000000 -0400
@@ -0,0 +1,113 @@
+/** \ingroup py_c
+ * \file python/pkg-py.c
+ */
+
+#include "system.h"
+
+#include "pkg-py.h"
+#include "header-py.h"
+
+/** \ingroup python
+ * \name Class: Rpmpkg
+ * \class Rpmpkg
+ *
+ */
+
+
+static void 
+pkg_dealloc(pkgObject * s) 
+{
+        PyObject_Del(s);
+}
+
+static int
+pkg_print(pkgObject * s)
+{
+    return 0;
+}
+
+
+static hdrObject *
+pkg_get_header(pkgObject *s)
+{
+    PyObject *headerObj;
+    Package pkg;
+
+    pkg = pkgFromPkg(s);
+    if ( pkg != NULL) {
+        return hdr_Wrap(pkg->header);
+    }
+    else {
+        return NULL;
+    }
+
+}
+
+/**
+ */
+
+static char pkg_doc[] = "RPM Pkg file object";
+
+static PyMethodDef pkg_Pkg_methods[] = {
+    {"header",   (PyCFunction) pkg_get_header, METH_VARARGS,  NULL },
+    {NULL}  /* Sentinel */
+};
+
+PyTypeObject pkg_Type = {
+    PyObject_HEAD_INIT(&PyType_Type)
+    0,                         /*ob_size*/
+    "rpm.pkg",               /*tp_name*/
+    sizeof(pkgObject),        /*tp_basicsize*/
+    0,                         /*tp_itemsize*/
+    (destructor) pkg_dealloc, /*tp_dealloc*/
+    (printfunc) pkg_print,    /*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*/
+    pkg_doc,                  /* tp_doc */
+    0,                         /* tp_traverse */
+    0,                         /* tp_clear */
+    0,                         /* tp_richcompare */
+    0,                         /* tp_weaklistoffset */
+    0,                         /* tp_iter */
+    0,                         /* tp_iternext */
+    pkg_Pkg_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 */
+    0,                         /* tp_new */
+    0,                         /* tp_free */
+    0,                         /* tp_is_gc */
+};
+
+Package pkgFromPkg(pkgObject *s) 
+{
+    return s->pkg;
+}
+
+pkgObject *
+pkg_Wrap(Package pkg) 
+{
+    pkgObject * s = PyObject_New(pkgObject, &pkg_Type);
+    if (s == NULL)
+        return NULL;
+    s->pkg = pkg; 
+    return s;
+}
diff -rupN rpm-4.5.90.git8461.orig/python/pkg-py.h rpm-4.5.90.git8461.new/python/pkg-py.h
--- rpm-4.5.90.git8461.orig/python/pkg-py.h	1969-12-31 19:00:00.000000000 -0500
+++ rpm-4.5.90.git8461.new/python/pkg-py.h	2008-09-18 07:24:48.000000000 -0400
@@ -0,0 +1,26 @@
+#ifndef RPMPYTHON_PKG
+#define RPMPYTHON_PKG
+
+#include <rpm/rpmbuild.h>
+
+/** \ingroup py_c
+ * \file python/pkg-py.h
+ */
+
+typedef struct pkgObject_s {
+    PyObject_HEAD
+    /*type specific fields */
+    Package pkg;
+} pkgObject;
+
+extern PyTypeObject pkg_Type;
+
+/**
+ */
+Package pkgFromPkg(pkgObject * pkg);
+
+/**
+ */
+pkgObject * pkg_Wrap(Package pkg);
+
+#endif /* RPMPYTHON_PKG */
diff -rupN rpm-4.5.90.git8461.orig/python/rpmmodule.c rpm-4.5.90.git8461.new/python/rpmmodule.c
--- rpm-4.5.90.git8461.orig/python/rpmmodule.c	2008-06-30 08:15:38.000000000 -0400
+++ rpm-4.5.90.git8461.new/python/rpmmodule.c	2008-09-18 07:59:37.000000000 -0400
@@ -21,6 +21,7 @@
 #include "rpmte-py.h"
 #include "rpmts-py.h"
 #include "spec-py.h"
+#include "pkg-py.h"
 
 #include "debug.h"
 
@@ -247,6 +248,7 @@ void init_rpm(void)
     if (PyType_Ready(&rpmte_Type) < 0) return;
     if (PyType_Ready(&rpmts_Type) < 0) return;
     if (PyType_Ready(&spec_Type) < 0) return;
+    if (PyType_Ready(&pkg_Type) < 0) return;
 #endif
 
     m = Py_InitModule3("_rpm", rpmModuleMethods, rpm__doc__);
@@ -304,6 +306,9 @@ void init_rpm(void)
 
     Py_INCREF(&spec_Type);
     PyModule_AddObject(m, "spec", (PyObject *) &spec_Type);
+
+    Py_INCREF(&pkg_Type);
+    PyModule_AddObject(m, "pkg", (PyObject *) &pkg_Type);
 #else
     hdr_Type.ob_type = &PyType_Type;
     rpmal_Type.ob_type = &PyType_Type;
@@ -315,6 +320,7 @@ void init_rpm(void)
     rpmte_Type.ob_type = &PyType_Type;
     rpmts_Type.ob_type = &PyType_Type;
     spec_Type.ob_type =  &PyType_Type;
+    pkg_Type.ob_type =  &PyType_Type;
 #endif
 
     dict = PyDict_New();
@@ -492,5 +498,250 @@ void init_rpm(void)
     REGISTER_ENUM(RPMDBI_PACKAGES);
 
     REGISTER_ENUM((int)RPMAL_NOMATCH);
+
+    /* Sync with build/rpmspec.h */
+    REGISTER_ENUM(RPMBUILD_ISSOURCE);
+    REGISTER_ENUM(RPMBUILD_ISPATCH);
+    REGISTER_ENUM(RPMBUILD_ISICON);
+    REGISTER_ENUM(RPMBUILD_ISNO);
+
+
+    /* Sync with lib/rpmtag.h */
+    REGISTER_ENUM(RPMTAG_HEADERIMAGE);
+    REGISTER_ENUM(RPMTAG_HEADERSIGNATURES);
+    REGISTER_ENUM(RPMTAG_HEADERIMMUTABLE);
+    REGISTER_ENUM(RPMTAG_HEADERREGIONS);
+    REGISTER_ENUM(RPMTAG_HEADERI18NTABLE);
+    REGISTER_ENUM(RPMTAG_SIG_BASE);
+    REGISTER_ENUM(RPMTAG_SIGSIZE);
+    REGISTER_ENUM(RPMTAG_SIGLEMD5_1);
+    REGISTER_ENUM(RPMTAG_SIGPGP);
+    REGISTER_ENUM(RPMTAG_SIGLEMD5_2);
+    REGISTER_ENUM(RPMTAG_SIGMD5);
+    REGISTER_ENUM(RPMTAG_PKGID);
+    REGISTER_ENUM(RPMTAG_SIGGPG);
+    REGISTER_ENUM(RPMTAG_SIGPGP5);
+    REGISTER_ENUM(RPMTAG_BADSHA1_1);
+    REGISTER_ENUM(RPMTAG_BADSHA1_2);
+    REGISTER_ENUM(RPMTAG_PUBKEYS);
+    REGISTER_ENUM(RPMTAG_DSAHEADER);
+    REGISTER_ENUM(RPMTAG_RSAHEADER);
+    REGISTER_ENUM(RPMTAG_SHA1HEADER);
+    REGISTER_ENUM(RPMTAG_HDRID);
+    REGISTER_ENUM(RPMTAG_LONGSIGSIZE);
+    REGISTER_ENUM(RPMTAG_LONGARCHIVESIZE);
+    REGISTER_ENUM(RPMTAG_NAME);
+    REGISTER_ENUM(RPMTAG_N);
+    REGISTER_ENUM(RPMTAG_VERSION);
+    REGISTER_ENUM(RPMTAG_V);
+    REGISTER_ENUM(RPMTAG_RELEASE);
+    REGISTER_ENUM(RPMTAG_R);
+    REGISTER_ENUM(RPMTAG_EPOCH);
+    REGISTER_ENUM(RPMTAG_E);
+    REGISTER_ENUM(RPMTAG_SUMMARY);
+    REGISTER_ENUM(RPMTAG_DESCRIPTION);
+    REGISTER_ENUM(RPMTAG_BUILDTIME);
+    REGISTER_ENUM(RPMTAG_BUILDHOST);
+    REGISTER_ENUM(RPMTAG_INSTALLTIME);
+    REGISTER_ENUM(RPMTAG_SIZE);
+    REGISTER_ENUM(RPMTAG_DISTRIBUTION);
+    REGISTER_ENUM(RPMTAG_VENDOR);
+    REGISTER_ENUM(RPMTAG_GIF);
+    REGISTER_ENUM(RPMTAG_XPM);
+    REGISTER_ENUM(RPMTAG_LICENSE);
+    REGISTER_ENUM(RPMTAG_PACKAGER);
+    REGISTER_ENUM(RPMTAG_GROUP);
+    REGISTER_ENUM(RPMTAG_CHANGELOG);
+    REGISTER_ENUM(RPMTAG_SOURCE);
+    REGISTER_ENUM(RPMTAG_PATCH);
+    REGISTER_ENUM(RPMTAG_URL);
+    REGISTER_ENUM(RPMTAG_OS);
+    REGISTER_ENUM(RPMTAG_ARCH);
+    REGISTER_ENUM(RPMTAG_PREIN);
+    REGISTER_ENUM(RPMTAG_POSTIN);
+    REGISTER_ENUM(RPMTAG_PREUN);
+    REGISTER_ENUM(RPMTAG_POSTUN);
+    REGISTER_ENUM(RPMTAG_OLDFILENAMES);
+    REGISTER_ENUM(RPMTAG_FILESIZES);
+    REGISTER_ENUM(RPMTAG_FILESTATES);
+    REGISTER_ENUM(RPMTAG_FILEMODES);
+    REGISTER_ENUM(RPMTAG_FILEUIDS);
+    REGISTER_ENUM(RPMTAG_FILEGIDS);
+    REGISTER_ENUM(RPMTAG_FILERDEVS);
+    REGISTER_ENUM(RPMTAG_FILEMTIMES);
+    REGISTER_ENUM(RPMTAG_FILEDIGESTS);
+    REGISTER_ENUM(RPMTAG_FILEMD5S);
+    REGISTER_ENUM(RPMTAG_FILELINKTOS);
+    REGISTER_ENUM(RPMTAG_FILEFLAGS);
+    REGISTER_ENUM(RPMTAG_ROOT);
+    REGISTER_ENUM(RPMTAG_FILEUSERNAME);
+    REGISTER_ENUM(RPMTAG_FILEGROUPNAME);
+    REGISTER_ENUM(RPMTAG_EXCLUDE);
+    REGISTER_ENUM(RPMTAG_EXCLUSIVE);
+    REGISTER_ENUM(RPMTAG_ICON);
+    REGISTER_ENUM(RPMTAG_SOURCERPM);
+    REGISTER_ENUM(RPMTAG_FILEVERIFYFLAGS);
+    REGISTER_ENUM(RPMTAG_ARCHIVESIZE);
+    REGISTER_ENUM(RPMTAG_PROVIDENAME);
+    REGISTER_ENUM(RPMTAG_PROVIDES);
+    REGISTER_ENUM(RPMTAG_P);
+    REGISTER_ENUM(RPMTAG_REQUIREFLAGS);
+    REGISTER_ENUM(RPMTAG_REQUIRENAME);
+    REGISTER_ENUM(RPMTAG_REQUIRES);
+    REGISTER_ENUM(RPMTAG_REQUIREVERSION);
+    REGISTER_ENUM(RPMTAG_NOSOURCE);
+    REGISTER_ENUM(RPMTAG_NOPATCH);
+    REGISTER_ENUM(RPMTAG_CONFLICTFLAGS);
+    REGISTER_ENUM(RPMTAG_CONFLICTNAME);
+    REGISTER_ENUM(RPMTAG_CONFLICTS);
+    REGISTER_ENUM(RPMTAG_C);
+    REGISTER_ENUM(RPMTAG_CONFLICTVERSION);
+    REGISTER_ENUM(RPMTAG_DEFAULTPREFIX);
+    REGISTER_ENUM(RPMTAG_BUILDROOT);
+    REGISTER_ENUM(RPMTAG_INSTALLPREFIX);
+    REGISTER_ENUM(RPMTAG_EXCLUDEARCH);
+    REGISTER_ENUM(RPMTAG_EXCLUDEOS);
+    REGISTER_ENUM(RPMTAG_EXCLUSIVEARCH);
+    REGISTER_ENUM(RPMTAG_EXCLUSIVEOS);
+    REGISTER_ENUM(RPMTAG_AUTOREQPROV);
+    REGISTER_ENUM(RPMTAG_RPMVERSION);
+    REGISTER_ENUM(RPMTAG_TRIGGERSCRIPTS);
+    REGISTER_ENUM(RPMTAG_TRIGGERNAME);
+    REGISTER_ENUM(RPMTAG_TRIGGERVERSION);
+    REGISTER_ENUM(RPMTAG_TRIGGERFLAGS);
+    REGISTER_ENUM(RPMTAG_TRIGGERINDEX);
+    REGISTER_ENUM(RPMTAG_VERIFYSCRIPT);
+    REGISTER_ENUM(RPMTAG_CHANGELOGTIME);
+    REGISTER_ENUM(RPMTAG_CHANGELOGNAME);
+    REGISTER_ENUM(RPMTAG_CHANGELOGTEXT);
+    REGISTER_ENUM(RPMTAG_BROKENMD5);
+    REGISTER_ENUM(RPMTAG_PREREQ);
+    REGISTER_ENUM(RPMTAG_PREINPROG);
+    REGISTER_ENUM(RPMTAG_POSTINPROG);
+    REGISTER_ENUM(RPMTAG_PREUNPROG);
+    REGISTER_ENUM(RPMTAG_POSTUNPROG);
+    REGISTER_ENUM(RPMTAG_BUILDARCHS);
+    REGISTER_ENUM(RPMTAG_OBSOLETENAME);
+    REGISTER_ENUM(RPMTAG_OBSOLETES);
+    REGISTER_ENUM(RPMTAG_O);
+    REGISTER_ENUM(RPMTAG_VERIFYSCRIPTPROG);
+    REGISTER_ENUM(RPMTAG_TRIGGERSCRIPTPROG);
+    REGISTER_ENUM(RPMTAG_DOCDIR);
+    REGISTER_ENUM(RPMTAG_COOKIE);
+    REGISTER_ENUM(RPMTAG_FILEDEVICES);
+    REGISTER_ENUM(RPMTAG_FILEINODES);
+    REGISTER_ENUM(RPMTAG_FILELANGS);
+    REGISTER_ENUM(RPMTAG_PREFIXES);
+    REGISTER_ENUM(RPMTAG_INSTPREFIXES);
+    REGISTER_ENUM(RPMTAG_TRIGGERIN);
+    REGISTER_ENUM(RPMTAG_TRIGGERUN);
+    REGISTER_ENUM(RPMTAG_TRIGGERPOSTUN);
+    REGISTER_ENUM(RPMTAG_AUTOREQ);
+    REGISTER_ENUM(RPMTAG_AUTOPROV);
+    REGISTER_ENUM(RPMTAG_CAPABILITY);
+    REGISTER_ENUM(RPMTAG_SOURCEPACKAGE);
+    REGISTER_ENUM(RPMTAG_OLDORIGFILENAMES);
+    REGISTER_ENUM(RPMTAG_BUILDPREREQ);
+    REGISTER_ENUM(RPMTAG_BUILDREQUIRES);
+    REGISTER_ENUM(RPMTAG_BUILDCONFLICTS);
+    REGISTER_ENUM(RPMTAG_BUILDMACROS);
+    REGISTER_ENUM(RPMTAG_PROVIDEFLAGS);
+    REGISTER_ENUM(RPMTAG_PROVIDEVERSION);
+    REGISTER_ENUM(RPMTAG_OBSOLETEFLAGS);
+    REGISTER_ENUM(RPMTAG_OBSOLETEVERSION);
+    REGISTER_ENUM(RPMTAG_DIRINDEXES);
+    REGISTER_ENUM(RPMTAG_BASENAMES);
+    REGISTER_ENUM(RPMTAG_DIRNAMES);
+    REGISTER_ENUM(RPMTAG_ORIGDIRINDEXES);
+    REGISTER_ENUM(RPMTAG_ORIGBASENAMES);
+    REGISTER_ENUM(RPMTAG_ORIGDIRNAMES);
+    REGISTER_ENUM(RPMTAG_OPTFLAGS);
+    REGISTER_ENUM(RPMTAG_DISTURL);
+    REGISTER_ENUM(RPMTAG_PAYLOADFORMAT);
+    REGISTER_ENUM(RPMTAG_PAYLOADCOMPRESSOR);
+    REGISTER_ENUM(RPMTAG_PAYLOADFLAGS);
+    REGISTER_ENUM(RPMTAG_INSTALLCOLOR);
+    REGISTER_ENUM(RPMTAG_INSTALLTID);
+    REGISTER_ENUM(RPMTAG_REMOVETID);
+    REGISTER_ENUM(RPMTAG_SHA1RHN);
+    REGISTER_ENUM(RPMTAG_RHNPLATFORM);
+    REGISTER_ENUM(RPMTAG_PLATFORM);
+    REGISTER_ENUM(RPMTAG_PATCHESNAME);
+    REGISTER_ENUM(RPMTAG_PATCHESFLAGS);
+    REGISTER_ENUM(RPMTAG_PATCHESVERSION);
+    REGISTER_ENUM(RPMTAG_CACHECTIME);
+    REGISTER_ENUM(RPMTAG_CACHEPKGPATH);
+    REGISTER_ENUM(RPMTAG_CACHEPKGSIZE);
+    REGISTER_ENUM(RPMTAG_CACHEPKGMTIME);
+    REGISTER_ENUM(RPMTAG_FILECOLORS);
+    REGISTER_ENUM(RPMTAG_FILECLASS);
+    REGISTER_ENUM(RPMTAG_CLASSDICT);
+    REGISTER_ENUM(RPMTAG_FILEDEPENDSX);
+    REGISTER_ENUM(RPMTAG_FILEDEPENDSN);
+    REGISTER_ENUM(RPMTAG_DEPENDSDICT);
+    REGISTER_ENUM(RPMTAG_SOURCEPKGID);
+    REGISTER_ENUM(RPMTAG_FILECONTEXTS);
+    REGISTER_ENUM(RPMTAG_FSCONTEXTS);
+    REGISTER_ENUM(RPMTAG_RECONTEXTS);
+    REGISTER_ENUM(RPMTAG_POLICIES);
+    REGISTER_ENUM(RPMTAG_PRETRANS);
+    REGISTER_ENUM(RPMTAG_POSTTRANS);
+    REGISTER_ENUM(RPMTAG_PRETRANSPROG);
+    REGISTER_ENUM(RPMTAG_POSTTRANSPROG);
+    REGISTER_ENUM(RPMTAG_DISTTAG);
+    REGISTER_ENUM(RPMTAG_SUGGESTSNAME);
+    REGISTER_ENUM(RPMTAG_SUGGESTS);
+    REGISTER_ENUM(RPMTAG_SUGGESTSVERSION);
+    REGISTER_ENUM(RPMTAG_SUGGESTSFLAGS);
+    REGISTER_ENUM(RPMTAG_ENHANCESNAME);
+    REGISTER_ENUM(RPMTAG_ENHANCES);
+    REGISTER_ENUM(RPMTAG_ENHANCESVERSION);
+    REGISTER_ENUM(RPMTAG_ENHANCESFLAGS);
+    REGISTER_ENUM(RPMTAG_PRIORITY);
+    REGISTER_ENUM(RPMTAG_CVSID);
+    REGISTER_ENUM(RPMTAG_SVNID);
+    REGISTER_ENUM(RPMTAG_BLINKPKGID);
+    REGISTER_ENUM(RPMTAG_BLINKHDRID);
+    REGISTER_ENUM(RPMTAG_BLINKNEVRA);
+    REGISTER_ENUM(RPMTAG_FLINKPKGID);
+    REGISTER_ENUM(RPMTAG_FLINKHDRID);
+    REGISTER_ENUM(RPMTAG_FLINKNEVRA);
+    REGISTER_ENUM(RPMTAG_PACKAGEORIGIN);
+    REGISTER_ENUM(RPMTAG_TRIGGERPREIN);
+    REGISTER_ENUM(RPMTAG_BUILDSUGGESTS);
+    REGISTER_ENUM(RPMTAG_BUILDENHANCES);
+    REGISTER_ENUM(RPMTAG_SCRIPTSTATES);
+    REGISTER_ENUM(RPMTAG_SCRIPTMETRICS);
+    REGISTER_ENUM(RPMTAG_BUILDCPUCLOCK);
+    REGISTER_ENUM(RPMTAG_FILEDIGESTALGO);
+    REGISTER_ENUM(RPMTAG_VARIANTS);
+    REGISTER_ENUM(RPMTAG_XMAJOR);
+    REGISTER_ENUM(RPMTAG_XMINOR);
+    REGISTER_ENUM(RPMTAG_REPOTAG);
+    REGISTER_ENUM(RPMTAG_KEYWORDS);
+    REGISTER_ENUM(RPMTAG_BUILDPLATFORMS);
+    REGISTER_ENUM(RPMTAG_PACKAGECOLOR);
+    REGISTER_ENUM(RPMTAG_PACKAGEPREFCOLOR);
+    REGISTER_ENUM(RPMTAG_XATTRSDICT);
+    REGISTER_ENUM(RPMTAG_FILEXATTRSX);
+    REGISTER_ENUM(RPMTAG_DEPATTRSDICT);
+    REGISTER_ENUM(RPMTAG_CONFLICTATTRSX);
+    REGISTER_ENUM(RPMTAG_OBSOLETEATTRSX);
+    REGISTER_ENUM(RPMTAG_PROVIDEATTRSX);
+    REGISTER_ENUM(RPMTAG_REQUIREATTRSX);
+    REGISTER_ENUM(RPMTAG_BUILDPROVIDES);
+    REGISTER_ENUM(RPMTAG_BUILDOBSOLETES);
+    REGISTER_ENUM(RPMTAG_FILENAMES);
+    REGISTER_ENUM(RPMTAG_FILEPROVIDE);
+    REGISTER_ENUM(RPMTAG_FILEREQUIRE);
+    REGISTER_ENUM(RPMTAG_FSNAMES);
+    REGISTER_ENUM(RPMTAG_FSSIZES);
+    REGISTER_ENUM(RPMTAG_TRIGGERCONDS);
+    REGISTER_ENUM(RPMTAG_TRIGGERTYPE);
+    REGISTER_ENUM(RPMTAG_ORIGFILENAMES);
+    REGISTER_ENUM(RPMTAG_LONGFILESIZES);
+    REGISTER_ENUM(RPMTAG_LONGSIZE);
+
+
 }
 
diff -rupN rpm-4.5.90.git8461.orig/python/spec-py.c rpm-4.5.90.git8461.new/python/spec-py.c
--- rpm-4.5.90.git8461.orig/python/spec-py.c	2008-06-26 05:26:01.000000000 -0400
+++ rpm-4.5.90.git8461.new/python/spec-py.c	2008-09-18 07:24:45.000000000 -0400
@@ -5,6 +5,7 @@
 #include "system.h"
 
 #include "spec-py.h"
+#include "pkg-py.h"
 
 /** \ingroup python
  * \name Class: Rpmspec
@@ -147,13 +148,40 @@ spec_get_sources(specObject *s)
 
 }
 
+static PyObject *
+spec_get_packages(specObject *s)
+{
+    Package pkg;
+    PyObject *packageList, *pkgObj;
+    rpmSpec spec;
+
+    packageList = PyList_New(0);
+    spec = specFromSpec(s);
+    if ( spec != NULL) {
+        pkg = spec->packages;
+
+        while (pkg != NULL) {
+            pkgObj = (PyObject *)pkg_Wrap(pkg);
+            PyList_Append(packageList, pkgObj);
+            pkg=pkg->next;
+        } 
+
+        return PyList_AsTuple(packageList);
+    }
+    else {
+        return NULL;
+    }
+
+}
+
 /**
  */
 
-static char spec_doc[] = "RPM Spec file object";
+static char spec_doc[] = "RPM Spec file package object";
 
 static PyMethodDef spec_Spec_methods[] = {
     {"sources",   (PyCFunction) spec_get_sources, METH_VARARGS,  NULL },
+    {"packages",   (PyCFunction) spec_get_packages, METH_VARARGS,  NULL },
     {"prep",   (PyCFunction) spec_get_prep, METH_VARARGS,  NULL },
     {"build",   (PyCFunction) spec_get_build, METH_VARARGS,  NULL },
     {"install",   (PyCFunction) spec_get_install, METH_VARARGS,  NULL },


-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|



More information about the Rpm-maint mailing list