Imported Upstream version 4.14.1
[platform/upstream/rpm.git] / python / spec-py.c
index 1850a50..47c1740 100644 (file)
@@ -19,7 +19,7 @@
  *  For example
  * \code
  *  import rpm
- *  rpm.addMacro("_topdir","/path/to/topdir")
+ *  rpm.rpmPushMacro("_topdir","/path/to/topdir")
  *  s=rpm.spec("foo.spec")
  *  print s.prep()
  * \endcode
@@ -45,19 +45,55 @@ struct specPkgObject_s {
     PyObject_HEAD
     /*type specific fields */
     rpmSpecPkg pkg;
+    specObject *source_spec;
 };
 
+static void specPkg_dealloc(specPkgObject * s)
+{
+    Py_DECREF(s->source_spec);
+}
+
+static PyObject *pkgGetSection(rpmSpecPkg pkg, int section)
+{
+    char *sect = rpmSpecPkgGetSection(pkg, section);
+    if (sect != NULL) {
+        PyObject *ps = PyBytes_FromString(sect);
+        free(sect);
+        if (ps != NULL)
+            return ps;
+    }
+    Py_RETURN_NONE;
+}
+
 static char specPkg_doc[] =
-"";
+"Package data parsed from spec file.";
 
 static PyObject * specpkg_get_header(specPkgObject *s, void *closure)
 {
     return makeHeader(rpmSpecPkgHeader(s->pkg));
 }
 
+static PyObject * specpkg_get_fileFile(specPkgObject *s, void *closure)
+{
+    return  pkgGetSection(s->pkg, RPMBUILD_FILE_FILE);
+}
+
+static PyObject * specpkg_get_fileList(specPkgObject *s, void *closure)
+{
+    return  pkgGetSection(s->pkg, RPMBUILD_FILE_LIST);
+}
+
+static PyObject * specpkg_get_policyList(specPkgObject *s, void *closure)
+{
+    return  pkgGetSection(s->pkg, RPMBUILD_POLICY);
+}
+
 static PyGetSetDef specpkg_getseters[] = {
-    { "header",        (getter) specpkg_get_header, NULL, NULL },
-    { NULL }   /* sentinel */
+    { "header",     (getter) specpkg_get_header,     NULL, NULL },
+    { "fileFile",   (getter) specpkg_get_fileFile,   NULL, NULL },
+    { "fileList",   (getter) specpkg_get_fileList,   NULL, NULL },
+    { "policyList", (getter) specpkg_get_policyList, NULL, NULL },
+    { NULL }   /* sentinel */
 };
 
 PyTypeObject specPkg_Type = {
@@ -65,7 +101,7 @@ PyTypeObject specPkg_Type = {
        "rpm.specpkg",                  /* tp_name */
        sizeof(specPkgObject),          /* tp_size */
        0,                              /* tp_itemsize */
-       0,                              /* tp_dealloc */
+       (destructor) specPkg_dealloc,   /* tp_dealloc */
        0,                              /* tp_print */
        0,                              /* tp_getattr */
        0,                              /* tp_setattr */
@@ -127,6 +163,12 @@ static PyObject * getSection(rpmSpec spec, int section)
     Py_RETURN_NONE;
 }
 
+static PyObject *
+spec_get_parsed(specObject * s, void *closure)
+{
+    return getSection(s->spec, RPMBUILD_NONE);
+}
+
 static PyObject * 
 spec_get_prep(specObject * s, void *closure) 
 {
@@ -144,6 +186,11 @@ static PyObject * spec_get_install(specObject * s, void *closure)
     return getSection(s->spec, RPMBUILD_INSTALL);
 }
 
+static PyObject * spec_get_check(specObject * s, void *closure)
+{
+    return getSection(s->spec, RPMBUILD_CHECK);
+}
+
 static PyObject * spec_get_clean(specObject * s, void *closure) 
 {
     return getSection(s->spec, RPMBUILD_CLEAN);
@@ -192,7 +239,7 @@ static PyObject * spec_get_packages(specObject *s, void *closure)
     iter = rpmSpecPkgIterInit(s->spec);
 
     while ((pkg = rpmSpecPkgIterNext(iter)) != NULL) {
-       PyObject *po = specPkg_Wrap(&specPkg_Type, pkg);
+       PyObject *po = specPkg_Wrap(&specPkg_Type, pkg, s);
         if (!po) {
             rpmSpecPkgIterFree(iter);
             Py_DECREF(pkgList);
@@ -214,9 +261,11 @@ static char spec_doc[] = "RPM Spec file object";
 
 static PyGetSetDef spec_getseters[] = {
     {"sources",   (getter) spec_get_sources, NULL, NULL },
+    {"parsed",    (getter) spec_get_parsed, NULL, NULL},
     {"prep",   (getter) spec_get_prep, NULL, NULL },
     {"build",   (getter) spec_get_build, NULL, NULL },
     {"install",   (getter) spec_get_install, NULL, NULL },
+    {"check",  (getter) spec_get_check, NULL, NULL },
     {"clean",   (getter) spec_get_clean, NULL, NULL },
     {"packages", (getter) spec_get_packages, NULL, NULL },
     {"sourceHeader", (getter) spec_get_source_header, NULL, NULL },
@@ -314,12 +363,14 @@ spec_Wrap(PyTypeObject *subtype, rpmSpec spec)
     return (PyObject *) s;
 }
 
-PyObject * specPkg_Wrap(PyTypeObject *subtype, rpmSpecPkg pkg
+PyObject * specPkg_Wrap(PyTypeObject *subtype, rpmSpecPkg pkg, specObject *source)
 {
     specPkgObject * s = (specPkgObject *)subtype->tp_alloc(subtype, 0);
     if (s == NULL) return NULL;
 
     s->pkg = pkg;
+    s->source_spec = source;
+    Py_INCREF(s->source_spec);
     return (PyObject *) s;
 }