RPM Package Manager, CVS Repository
http://rpm5.org/cvs/
____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson
Root: /v/rpm/cvs Email: jbj@rpm5.org
Module: rpm Date: 01-Nov-2007 04:37:05
Branch: HEAD Handle: 2007110103370500
Modified files:
rpm CHANGES
rpm/python header-py.c
Log:
- jbj: upgrade to F8 & fix rpm-python. i18n tags w hdr_subscript are
b0rked.
Summary:
Revision Changes Path
1.1760 +1 -0 rpm/CHANGES
1.69 +22 -105 rpm/python/header-py.c
____________________________________________________________________________
patch -p0 <<'@@ .'
Index: rpm/CHANGES
============================================================================
$ cvs diff -u -r1.1759 -r1.1760 CHANGES
--- rpm/CHANGES 31 Oct 2007 19:21:13 -0000 1.1759
+++ rpm/CHANGES 1 Nov 2007 03:37:05 -0000 1.1760
@@ -1,4 +1,5 @@
4.5 -> 5.0:
+ - jbj: upgrade to F8 & fix rpm-python. i18n tags w hdr_subscript are b0rked.
- jbj: update loader maps for python lazy loads. rpm-python fixing to do.
- jbj: insturment headerNextIterator() statistics.
- jbj: trade a double free for a modest memory leak for the moment.
@@ .
patch -p0 <<'@@ .'
Index: rpm/python/header-py.c
============================================================================
$ cvs diff -u -r1.68 -r1.69 header-py.c
--- rpm/python/header-py.c 21 Oct 2007 23:22:56 -0000 1.68
+++ rpm/python/header-py.c 1 Nov 2007 03:37:05 -0000 1.69
@@ -679,95 +679,27 @@
}
/** \ingroup py_c
- * Retrieve tag info from header.
- * This is a "dressed" entry to headerGetEntry to do:
- * 1) DIRNAME/BASENAME/DIRINDICES -> FILENAMES tag conversions.
- * 2) i18n lookaside (if enabled).
- *
- * @param h header
- * @param tag tag
- * @retval type address of tag value data type
- * @retval p address of pointer to tag value(s)
- * @retval c address of number of values
- * @return 0 on success, 1 on bad magic, 2 on error
- */
-static int rpmHeaderGetEntry(Header h, rpmTag tag, /*@out@*/ rpmTagType *type,
- /*@out@*/ rpmTagData *p, /*@out@*/ rpmTagCount *c)
- /*@modifies *type, *p, *c @*/
-{
- HGE_t hge = (HGE_t)headerGetExtension;
- HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
- int xx;
-
- switch (tag) {
- case RPMTAG_OLDFILENAMES:
- {
- he->tag = RPMTAG_FILEPATHS;
- xx = hge(h, he, 0);
- if (p)
- (*p).ptr = he->p.ptr;
- else
- he->p.ptr = _free(he->p.ptr);
- if (c) *c = he->c;
- if (type) *type = he->t;
- return (he->c > 0 ? 1 : 0);
- } /*@notreached@*/ break;
-
- case RPMTAG_GROUP:
- case RPMTAG_DESCRIPTION:
- case RPMTAG_SUMMARY:
- { char fmt[128];
- const char * msgstr;
- const char * errstr;
-
- fmt[0] = '\0';
- (void) stpcpy( stpcpy( stpcpy( fmt, "%{"), tagName(tag)), "}\n");
-
- /* XXX FIXME: memory leak. */
- msgstr = headerSprintf(h, fmt, rpmTagTable, rpmHeaderFormats, &errstr);
- if (msgstr) {
- if (p)
- (*p).str = msgstr;
- else
- msgstr = _free(msgstr);
-
- if (type) *type = RPM_STRING_TYPE;
- if (c) *c = 1;
- return 1;
- } else {
- if (c) *c = 0;
- return 0;
- }
- } /*@notreached@*/ break;
-
- default:
- return headerGetEntry(h, tag, type, p, c);
- /*@notreached@*/ break;
- }
- /*@notreached@*/
-}
-
-/** \ingroup py_c
*/
static PyObject * hdr_subscript(hdrObject * s, PyObject * item)
/*@*/
{
+ HGE_t hge = (HGE_t)headerGetExtension;
HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
int_32 tag = -1;
- rpmTagData data;
int i;
PyObject * o, * metao;
int forceArray = 0;
- int freeData = 0;
- char * str;
const struct headerSprintfExtension_s * ext = NULL;
- const struct headerSprintfExtension_s * extensions = rpmHeaderFormats;
+ int xx;
if (PyCObject_Check (item))
ext = PyCObject_AsVoidPtr(item);
else
tag = tagNumFromPyObject (item);
+
if (tag == -1 && (PyString_Check(item) || PyUnicode_Check(item))) {
+ const struct headerSprintfExtension_s * extensions = rpmHeaderFormats;
+ char * str;
/* if we still don't have the tag, go looking for the header
extensions */
str = PyString_AsString(item);
@@ -785,15 +717,16 @@
/* Retrieve data from extension or header. */
if (ext) {
ext->u.tagFunction(s->h, he);
- data.ptr = he->p.ptr;
- freeData = he->freeData;
} else {
if (tag == -1) {
PyErr_SetString(PyExc_KeyError, "unknown header tag");
return NULL;
}
- if (!rpmHeaderGetEntry(s->h, tag, &he->t, &data, &he->c)) {
+ he->tag = tag;
+ xx = hge(s->h, he, 0);
+ if (!xx) {
+ he->p.ptr = _free(he->p.ptr);
switch (tag) {
case RPMTAG_EPOCH:
case RPMTAG_NAME:
@@ -844,11 +777,6 @@
case RPMTAG_FILEVERIFYFLAGS:
forceArray = 1;
break;
- case RPMTAG_SUMMARY:
- case RPMTAG_GROUP:
- case RPMTAG_DESCRIPTION:
- freeData = 1;
- break;
default:
break;
}
@@ -857,7 +785,7 @@
case RPM_OPENPGP_TYPE:
case RPM_ASN1_TYPE:
case RPM_BIN_TYPE:
- o = PyString_FromStringAndSize(data.str, he->c);
+ o = PyString_FromStringAndSize(he->p.str, he->c);
break;
case RPM_CHAR_TYPE:
@@ -865,13 +793,13 @@
if (he->c != 1 || forceArray) {
metao = PyList_New(0);
for (i = 0; i < he->c; i++) {
- o = PyInt_FromLong(data.i8p[i]);
+ o = PyInt_FromLong(he->p.i8p[i]);
PyList_Append(metao, o);
Py_DECREF(o);
}
o = metao;
} else {
- o = PyInt_FromLong(data.i8p[0]);
+ o = PyInt_FromLong(he->p.i8p[0]);
}
break;
@@ -879,13 +807,13 @@
if (he->c != 1 || forceArray) {
metao = PyList_New(0);
for (i = 0; i < he->c; i++) {
- o = PyInt_FromLong(data.i16p[i]);
+ o = PyInt_FromLong(he->p.i16p[i]);
PyList_Append(metao, o);
Py_DECREF(o);
}
o = metao;
} else {
- o = PyInt_FromLong(data.i16p[0]);
+ o = PyInt_FromLong(he->p.i16p[0]);
}
break;
@@ -893,13 +821,13 @@
if (he->c != 1 || forceArray) {
metao = PyList_New(0);
for (i = 0; i < he->c; i++) {
- o = PyInt_FromLong(data.i32p[i]);
+ o = PyInt_FromLong(he->p.i32p[i]);
PyList_Append(metao, o);
Py_DECREF(o);
}
o = metao;
} else {
- o = PyInt_FromLong(data.i32p[0]);
+ o = PyInt_FromLong(he->p.i32p[0]);
}
break;
@@ -907,47 +835,36 @@
if (he->c != 1 || forceArray) {
metao = PyList_New(0);
for (i = 0; i < he->c; i++) {
- o = PyInt_FromLong(data.i64p[i]);
+ o = PyInt_FromLong(he->p.i64p[i]);
PyList_Append(metao, o);
Py_DECREF(o);
}
o = metao;
} else {
- o = PyInt_FromLong(data.i64p[0]);
+ o = PyInt_FromLong(he->p.i64p[0]);
}
break;
case RPM_STRING_ARRAY_TYPE:
metao = PyList_New(0);
for (i = 0; i < he->c; i++) {
- o = PyString_FromString(data.argv[i]);
+ o = PyString_FromString(he->p.argv[i]);
PyList_Append(metao, o);
Py_DECREF(o);
}
o = metao;
- data.ptr = _free(data.ptr);
break;
case RPM_STRING_TYPE:
- if (he->c != 1 || forceArray) {
- metao = PyList_New(0);
- for (i=0; i < he->c; i++) {
- o = PyString_FromString(data.argv[i]);
- PyList_Append(metao, o);
- Py_DECREF(o);
- }
- o = metao;
- } else {
- o = PyString_FromString(data.argv[0]);
- if (freeData)
- data.ptr = _free(data.ptr);
- }
+ o = PyString_FromString(he->p.str);
break;
default:
PyErr_SetString(PyExc_TypeError, "unsupported type in header");
return NULL;
}
+ if (he->freeData)
+ he->p.ptr = _free(he->p.ptr);
return o;
}
@@ .
Received on Thu Nov 1 04:37:05 2007