diff options
author | pauln <devnull@localhost> | 2004-03-10 22:44:29 +0000 |
---|---|---|
committer | pauln <devnull@localhost> | 2004-03-10 22:44:29 +0000 |
commit | aeab20571904cd350fdecfe2238a4ff617bdcacb (patch) | |
tree | 8d2eaa4be12841a1dd7d42f41e32cc00119db851 /python/spec-py.c | |
parent | f557b1bda0f5a15d6030dd9464a6f352199da4f9 (diff) | |
download | rpm-aeab20571904cd350fdecfe2238a4ff617bdcacb.tar.gz rpm-aeab20571904cd350fdecfe2238a4ff617bdcacb.tar.bz2 rpm-aeab20571904cd350fdecfe2238a4ff617bdcacb.zip |
Initial rpm.spec implementation
CVS patchset: 7160
CVS date: 2004/03/10 22:44:29
Diffstat (limited to 'python/spec-py.c')
-rw-r--r-- | python/spec-py.c | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/python/spec-py.c b/python/spec-py.c new file mode 100644 index 000000000..9005c804f --- /dev/null +++ b/python/spec-py.c @@ -0,0 +1,208 @@ +/** \ingroup py_c + * \file python/spec-py.c + */ + +#include "system.h" + +#include "spec-py.h" + +/** \ingroup python + * \name Class: Rpmspec + * \class Rpmspec + * \brief A python rpm.spec object represents an RPM spec file set. + * + * The spec file is at the heart of RPM's packaging building process. Similar + * in concept to a makefile, it contains information required by RPM to build + * the package, as well as instructions telling RPM how to build it. The spec + * file also dictates exactly what files are a part of the package, and where + * they should be installed. + * + * The rpm.spec object represents a parsed specfile to aid extraction of data. + * + * For example + * \code + * import rpm + * rpm.addMacro("_topdir","/path/to/topdir") + * ts=rpm.ts() + * s=ts.parseSpec("foo.spec") + * print s.prep() + * \endcode + * + * Macros set using add macro will be used allowing testing of conditional builds + * + */ + + +static void +spec_dealloc(specObject * s) +{ + if (s->spec) { + freeSpec(s->spec); + } + PyObject_Del(s); +} + +static int +spec_print(specObject * s) +{ + return 0; +} + +static PyObject * +spec_get_buildroot(specObject * s) +{ + Spec spec = specFromSpec(s); + if (spec->buildRootURL) { + return Py_BuildValue("s", spec->buildRootURL); + } + else { + return NULL; + } +} + +static PyObject * +spec_get_prep(specObject * s) +{ + Spec spec = specFromSpec(s); + if (spec->prep) { + StringBuf sb = newStringBuf(); + sb=spec->prep; + return Py_BuildValue("s",getStringBuf(sb)); + } + else { + return NULL; + } +} + +static PyObject * +spec_get_build(specObject * s) +{ + Spec spec = specFromSpec(s); + if (spec->build) { + StringBuf sb = newStringBuf(); + sb=spec->build; + return Py_BuildValue("s",getStringBuf(sb)); + } + else { + return NULL; + } +} + +static PyObject * +spec_get_install(specObject * s) +{ + Spec spec = specFromSpec(s); + if (spec->install) { + StringBuf sb = newStringBuf(); + sb=spec->install; + return Py_BuildValue("s",getStringBuf(sb)); + } + else { + return NULL; + } +} + +static PyObject * +spec_get_clean(specObject * s) +{ + Spec spec = specFromSpec(s); + if (spec->clean) { + StringBuf sb = newStringBuf(); + sb=spec->clean; + return Py_BuildValue("s",getStringBuf(sb)); + } + else { + return NULL; + } +} + +static PyObject * +spec_get_sources(specObject *s) +{ + struct Source * source; + PyObject *sourceList, *srcUrl; + + sourceList = PyList_New(0); + Spec spec = specFromSpec(s); + source = spec->sources; + + while (source != NULL) { + srcUrl = Py_BuildValue("(sii)", source->fullSource, source->num, source->flags); + PyList_Append(sourceList, srcUrl); + source=source->next; + } + + return PyList_AsTuple(sourceList); + +} + +static char spec_doc[] = "RPM Spec file object"; + +static PyMethodDef spec_Spec_methods[] = { + {"sources", (PyCFunction) spec_get_sources, 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 }, + {"clean", (PyCFunction) spec_get_clean, METH_VARARGS, NULL }, + {"buildRoot", (PyCFunction) spec_get_buildroot, METH_VARARGS, NULL }, + {NULL} /* Sentinel */ +}; + +PyTypeObject spec_Type = { + PyObject_HEAD_INIT(&PyType_Type) + 0, /*ob_size*/ + "rpm.spec", /*tp_name*/ + sizeof(specObject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + (destructor) spec_dealloc, /*tp_dealloc*/ + (printfunc) spec_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*/ + spec_doc, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + spec_Spec_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 */ +}; + +Spec specFromSpec(specObject *s) +{ + return s->spec; +} + +specObject * +spec_Wrap(Spec spec) +{ + specObject * s = PyObject_New(specObject, &spec_Type); + if (s == NULL) + return NULL; + s->spec = spec; + return s; +} |