[prev in list] [next in list] [prev in thread] [next in thread]
List: rpm-cvs
Subject: [CVS] RPM: rpm/ CHANGES rpm/rpmdb/ hdrfmt.c rpm/ rpmpopt.in
From: "Jeff Johnson" <jbj () rpm5 ! org>
Date: 2009-01-25 21:21:15
Message-ID: 20090125212115.B04E9215F47 () rpm5 ! org
[Download RAW message or body]
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: 25-Jan-2009 22:21:15
Branch: HEAD Handle: 2009012521211401
Modified files:
rpm CHANGES rpmpopt.in
rpm/rpmdb hdrfmt.c
Log:
- jbj: finish up yum:{primary,filelists}.yaml header extension tags.
Summary:
Revision Changes Path
1.2760 +1 -0 rpm/CHANGES
1.128 +283 -0 rpm/rpmdb/hdrfmt.c
2.76 +26 -42 rpm/rpmpopt.in
____________________________________________________________________________
patch -p0 <<'@@ .'
Index: rpm/CHANGES
============================================================================
$ cvs diff -u -r1.2759 -r1.2760 CHANGES
--- rpm/CHANGES 25 Jan 2009 18:38:00 -0000 1.2759
+++ rpm/CHANGES 25 Jan 2009 21:21:14 -0000 1.2760
@@ -1,5 +1,6 @@
5.2a2 -> 5.2a3:
+ - jbj: finish up yum:{primary,filelists}.yaml header extension tags.
- jbj: rpmrepo: compile in queryformat strings.
- jbj: add doublequotes around queryformats for #include use in rpmrepo.c.
- jbj: blueprint/use yum:{primary,filelists,other}.sqlite queryformats.
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmdb/hdrfmt.c
============================================================================
$ cvs diff -u -r1.127 -r1.128 hdrfmt.c
--- rpm/rpmdb/hdrfmt.c 5 Jan 2009 00:34:43 -0000 1.127
+++ rpm/rpmdb/hdrfmt.c 25 Jan 2009 21:21:15 -0000 1.128
@@ -3000,6 +3000,7 @@
RFhe->p.ptr = _free(RFhe->p.ptr);
return rc;
}
+
static int PRCOSkip(rpmTag tag, rpmTagData N, rpmTagData EVR, rpmTagData F,
rpmuint32_t i)
/*@*/
@@ -3395,6 +3396,133 @@
return PRCOsqlTag(h, he, RPMTAG_OBSOLETEVERSION, RPMTAG_OBSOLETEFLAGS);
}
+static int PRCOyamlTag(Header h, HE_t he, rpmTag EVRtag, rpmTag Ftag)
+ /*@globals internalState @*/
+ /*@modifies he, internalState @*/
+{
+ rpmTag tag = he->tag;
+ rpmTagData N = { .ptr = NULL };
+ rpmTagData EVR = { .ptr = NULL };
+ rpmTagData F = { .ptr = NULL };
+ size_t nb;
+ rpmuint32_t ac;
+ rpmuint32_t c;
+ rpmuint32_t i;
+ char *t;
+ int rc = 1; /* assume failure */
+ int indent = 0;
+ int xx;
+
+/*@-compmempass@*/ /* use separate HE_t, not rpmTagData, containers. */
+ xx = headerGet(h, he, 0);
+ if (xx == 0) goto exit;
+ N.argv = he->p.argv;
+ c = he->c;
+
+ he->tag = EVRtag;
+ xx = headerGet(h, he, 0);
+ if (xx == 0) goto exit;
+ EVR.argv = he->p.argv;
+
+ he->tag = Ftag;
+ xx = headerGet(h, he, 0);
+ if (xx == 0) goto exit;
+ F.ui32p = he->p.ui32p;
+
+ nb = sizeof(*he->p.argv);
+ ac = 0;
+ for (i = 0; i < c; i++) {
+/*@-nullstate@*/ /* EVR.argv might be NULL */
+ if (PRCOSkip(tag, N, EVR, F, i))
+ continue;
+/*@=nullstate@*/
+ ac++;
+ nb += sizeof(*he->p.argv);
+ nb += sizeof("- ");
+ if (*N.argv[i] == '/')
+ nb += yamlstrlen(N.argv[i], indent);
+ else
+ nb += strlen(N.argv[i]);
+ if (EVR.argv != NULL && EVR.argv[i] != NULL && *EVR.argv[i] != '\0') {
+ nb += sizeof(" >= ") - 1;
+ nb += strlen(EVR.argv[i]);
+ }
+ }
+
+ he->t = RPM_STRING_ARRAY_TYPE;
+ he->c = ac;
+ he->freeData = 1;
+ he->p.argv = xmalloc(nb + BUFSIZ); /* XXX hack: leave slop */
+ t = (char *) &he->p.argv[he->c + 1];
+ ac = 0;
+ for (i = 0; i < c; i++) {
+/*@-nullstate@*/ /* EVR.argv might be NULL */
+ if (PRCOSkip(tag, N, EVR, F, i))
+ continue;
+/*@=nullstate@*/
+ he->p.argv[ac++] = t;
+ t = stpcpy(t, "- ");
+ if (*N.argv[i] == '/') {
+ t = yamlstrcpy(t, N.argv[i], indent); t += strlen(t);
+ } else
+ t = stpcpy(t, N.argv[i]);
+/*@-readonlytrans@*/
+ if (EVR.argv != NULL && EVR.argv[i] != NULL && *EVR.argv[i] != '\0') {
+ static char *Fstr[] = { "?0","<",">","?3","=","<=",">=","?7" };
+ rpmuint32_t Fx = ((F.ui32p[i] >> 1) & 0x7);
+ t = stpcpy( stpcpy( stpcpy(t, " "), Fstr[Fx]), " ");
+ t = stpcpy(t, EVR.argv[i]);
+ }
+/*@=readonlytrans@*/
+ *t++ = '\0';
+ }
+ he->p.argv[he->c] = NULL;
+/*@=compmempass@*/
+ rc = 0;
+
+exit:
+/*@-kepttrans@*/ /* N.argv may be kept. */
+ N.argv = _free(N.argv);
+/*@=kepttrans@*/
+/*@-usereleased@*/ /* EVR.argv may be dead. */
+ EVR.argv = _free(EVR.argv);
+/*@=usereleased@*/
+ F.ui32p = _free(F.ui32p);
+ return rc;
+}
+
+static int PyamlTag(Header h, HE_t he)
+ /*@globals internalState @*/
+ /*@modifies he, internalState @*/
+{
+ he->tag = RPMTAG_PROVIDENAME;
+ return PRCOyamlTag(h, he, RPMTAG_PROVIDEVERSION, RPMTAG_PROVIDEFLAGS);
+}
+
+static int RyamlTag(Header h, HE_t he)
+ /*@globals internalState @*/
+ /*@modifies he, internalState @*/
+{
+ he->tag = RPMTAG_REQUIRENAME;
+ return PRCOyamlTag(h, he, RPMTAG_REQUIREVERSION, RPMTAG_REQUIREFLAGS);
+}
+
+static int CyamlTag(Header h, HE_t he)
+ /*@globals internalState @*/
+ /*@modifies he, internalState @*/
+{
+ he->tag = RPMTAG_CONFLICTNAME;
+ return PRCOyamlTag(h, he, RPMTAG_CONFLICTVERSION, RPMTAG_CONFLICTFLAGS);
+}
+
+static int OyamlTag(Header h, HE_t he)
+ /*@globals internalState @*/
+ /*@modifies he, internalState @*/
+{
+ he->tag = RPMTAG_OBSOLETENAME;
+ return PRCOyamlTag(h, he, RPMTAG_OBSOLETEVERSION, RPMTAG_OBSOLETEFLAGS);
+}
+
static int FDGSkip(rpmTagData DN, rpmTagData BN, rpmTagData DI, rpmuint32_t i)
/*@*/
{
@@ -3701,6 +3829,149 @@
return FDGsqlTag(h, he, 2);
}
+static int FDGyamlTag(Header h, HE_t he, int lvl)
+ /*@globals internalState @*/
+ /*@modifies he, internalState @*/
+{
+ rpmTagData BN = { .ptr = NULL };
+ rpmTagData DN = { .ptr = NULL };
+ rpmTagData DI = { .ptr = NULL };
+ rpmTagData FMODES = { .ptr = NULL };
+ rpmTagData FFLAGS = { .ptr = NULL };
+ size_t nb;
+ rpmuint32_t ac;
+ rpmuint32_t c;
+ rpmuint32_t i;
+ char *t;
+ int rc = 1; /* assume failure */
+ int indent = 0;
+ int xx;
+
+/*@-compmempass@*/ /* use separate HE_t, not rpmTagData, containers. */
+ he->tag = RPMTAG_BASENAMES;
+ xx = headerGet(h, he, 0);
+ if (xx == 0) goto exit;
+ BN.argv = he->p.argv;
+ c = he->c;
+
+ he->tag = RPMTAG_DIRNAMES;
+ xx = headerGet(h, he, 0);
+ if (xx == 0) goto exit;
+ DN.argv = he->p.argv;
+
+ he->tag = RPMTAG_DIRINDEXES;
+ xx = headerGet(h, he, 0);
+ if (xx == 0) goto exit;
+ DI.ui32p = he->p.ui32p;
+
+ he->tag = RPMTAG_FILEMODES;
+ xx = headerGet(h, he, 0);
+ if (xx == 0) goto exit;
+ FMODES.ui16p = he->p.ui16p;
+
+ he->tag = RPMTAG_FILEFLAGS;
+ xx = headerGet(h, he, 0);
+ if (xx == 0) goto exit;
+ FFLAGS.ui32p = he->p.ui32p;
+
+ nb = sizeof(*he->p.argv);
+ ac = 0;
+ for (i = 0; i < c; i++) {
+ if (lvl > 0 && FDGSkip(DN, BN, DI, i) != lvl)
+ continue;
+ ac++;
+ nb += sizeof(*he->p.argv);
+ nb += sizeof("- ");
+ nb += yamlstrlen(DN.argv[DI.ui32p[i]], indent);
+ nb += yamlstrlen(BN.argv[i], indent);
+ if (FFLAGS.ui32p[i] & 0x40) /* XXX RPMFILE_GHOST */
+ nb += sizeof("") - 1;
+ else if (S_ISDIR(FMODES.ui16p[i]))
+ nb += sizeof("/") - 1;
+ }
+
+ he->t = RPM_STRING_ARRAY_TYPE;
+ he->c = ac;
+ he->freeData = 1;
+ he->p.argv = xmalloc(nb);
+ t = (char *) &he->p.argv[he->c + 1];
+ ac = 0;
+ /* FIXME: Files, then dirs, finally ghosts breaks sort order. */
+ for (i = 0; i < c; i++) {
+ if (lvl > 0 && FDGSkip(DN, BN, DI, i) != lvl)
+ continue;
+ if (FFLAGS.ui32p[i] & 0x40) /* XXX RPMFILE_GHOST */
+ continue;
+ if (S_ISDIR(FMODES.ui16p[i]))
+ continue;
+ he->p.argv[ac++] = t;
+ t = stpcpy(t, "- ");
+ t = yamlstrcpy(t, DN.argv[DI.ui32p[i]], indent); t += strlen(t);
+ t = yamlstrcpy(t, BN.argv[i], indent); t += strlen(t);
+ t = stpcpy(t, "");
+ *t++ = '\0';
+ }
+ for (i = 0; i < c; i++) {
+ if (lvl > 0 && FDGSkip(DN, BN, DI, i) != lvl)
+ continue;
+ if (FFLAGS.ui32p[i] & 0x40) /* XXX RPMFILE_GHOST */
+ continue;
+ if (!S_ISDIR(FMODES.ui16p[i]))
+ continue;
+ he->p.argv[ac++] = t;
+ t = stpcpy(t, "- ");
+ t = yamlstrcpy(t, DN.argv[DI.ui32p[i]], indent); t += strlen(t);
+ t = yamlstrcpy(t, BN.argv[i], indent); t += strlen(t);
+ t = stpcpy(t, "/");
+ *t++ = '\0';
+ }
+ for (i = 0; i < c; i++) {
+ if (lvl > 0 && FDGSkip(DN, BN, DI, i) != lvl)
+ continue;
+ if (!(FFLAGS.ui32p[i] & 0x40)) /* XXX RPMFILE_GHOST */
+ continue;
+ he->p.argv[ac++] = t;
+ t = stpcpy(t, "- ");
+ t = yamlstrcpy(t, DN.argv[DI.ui32p[i]], indent); t += strlen(t);
+ t = yamlstrcpy(t, BN.argv[i], indent); t += strlen(t);
+ *t++ = '\0';
+ }
+
+ he->p.argv[he->c] = NULL;
+/*@=compmempass@*/
+ rc = 0;
+
+exit:
+/*@-kepttrans@*/ /* {BN,DN,DI}.argv may be kept. */
+ BN.argv = _free(BN.argv);
+/*@-usereleased@*/ /* DN.argv may be dead. */
+ DN.argv = _free(DN.argv);
+/*@=usereleased@*/
+ DI.ui32p = _free(DI.ui32p);
+/*@=kepttrans@*/
+ FMODES.ui16p = _free(FMODES.ui16p);
+/*@-usereleased@*/ /* FFLAGS.argv may be dead. */
+ FFLAGS.ui32p = _free(FFLAGS.ui32p);
+/*@=usereleased@*/
+ return rc;
+}
+
+static int F1yamlTag(Header h, HE_t he)
+ /*@globals internalState @*/
+ /*@modifies he, internalState @*/
+{
+ he->tag = RPMTAG_BASENAMES;
+ return FDGyamlTag(h, he, 1);
+}
+
+static int F2yamlTag(Header h, HE_t he)
+ /*@globals internalState @*/
+ /*@modifies he, internalState @*/
+{
+ he->tag = RPMTAG_BASENAMES;
+ return FDGyamlTag(h, he, 2);
+}
+
/**
* Encode the basename of a string for use in XML CDATA.
* @param he tag container
@@ -4471,6 +4742,18 @@
{ .tagFunction = F1xmlTag } },
{ HEADER_EXT_TAG, "RPMTAG_FILESXMLENTRY2",
{ .tagFunction = F2xmlTag } },
+ { HEADER_EXT_TAG, "RPMTAG_PROVIDEYAMLENTRY",
+ { .tagFunction = PyamlTag } },
+ { HEADER_EXT_TAG, "RPMTAG_REQUIREYAMLENTRY",
+ { .tagFunction = RyamlTag } },
+ { HEADER_EXT_TAG, "RPMTAG_CONFLICTYAMLENTRY",
+ { .tagFunction = CyamlTag } },
+ { HEADER_EXT_TAG, "RPMTAG_OBSOLETEYAMLENTRY",
+ { .tagFunction = OyamlTag } },
+ { HEADER_EXT_TAG, "RPMTAG_FILESYAMLENTRY1",
+ { .tagFunction = F1yamlTag } },
+ { HEADER_EXT_TAG, "RPMTAG_FILESYAMLENTRY2",
+ { .tagFunction = F2yamlTag } },
{ HEADER_EXT_TAG, "RPMTAG_PROVIDESQLENTRY",
{ .tagFunction = PsqlTag } },
{ HEADER_EXT_TAG, "RPMTAG_REQUIRESQLENTRY",
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmpopt.in
============================================================================
$ cvs diff -u -r2.75 -r2.76 rpmpopt.in
--- rpm/rpmpopt.in 25 Jan 2009 17:22:17 -0000 2.75
+++ rpm/rpmpopt.in 25 Jan 2009 21:21:14 -0000 2.76
@@ -2,7 +2,7 @@
# \verbatim
#
# @USRLIBRPM@/@configure_input@
-# $Id: rpmpopt.in,v 2.75 2009/01/25 17:22:17 jbj Exp $
+# $Id: rpmpopt.in,v 2.76 2009/01/25 21:21:14 jbj Exp $
#
# This file *should not be modified*. Local customizations
# belong in /etc/popt, not here. This file will be replaced
@@ -264,6 +264,7 @@
rpm alias --yum:primary.yaml --qf '\
Package:\
\n Id: %|HDRID?{%{HDRID}}:{-}|\
+\n Idtype: sha\
\n Name: %{NAME:yaml}\
\n Arch: %{ARCH:yaml}\
\n Version: %{VERSION:yaml}\
@@ -271,9 +272,15 @@
\n Release: %{RELEASE:yaml}\
\n Summary: %{SUMMARY:yaml}\
\n Description: %{DESCRIPTION:yaml}\
+\n Packager: %|PACKAGER?{%{PACKAGER:yaml}}:{-}|\
\n Url: %|URL?{%{URL:yaml}}:{-}|\
\n Filetime: %{PACKAGETIME}\
\n Buildtime: %{BUILDTIME}\
+\n Packagesize: %{PACKAGESIZE}\
+\n Size: %{SIZE}\
+\n Archivesize: %{ARCHIVESIZE}\
+\n Location: %{PACKAGEORIGIN:yaml}\
+\n BaseURL: %|PACKAGEBASEURL?{%{PACKAGEBASEURL:yaml}}:{-}|\
\n License: %|license?{%{LICENSE:yaml}}:{-}|\
\n Vendor: %|vendor?{%{VENDOR:yaml}}:{-}|\
\n Group: %|group?{%{GROUP:yaml}}:{-}|\
@@ -281,59 +288,34 @@
\n Sourcerpm: %|sourcerpm?{%{SOURCERPM:yaml}}:{-}|\
\n Hdrstart: %{HEADERSTARTOFF}\
\n Hdrend: %{HEADERENDOFF}\
-\n Packager: %|PACKAGER?{%{PACKAGER:yaml}}:{-}|\
-\n Packagesize: %{PACKAGESIZE}\
-\n Size: %{SIZE}\
-\n Archivesize: %{ARCHIVESIZE}\
-\n Location: %{PACKAGEORIGIN:yaml}\
-\n BaseURL: %|PACKAGEBASEURL?{%{PACKAGEBASEURL:yaml}}:{-}|\
-\n Idtype: sha\
-\n Rpm:\
-%|license?{\
-\n License: %{LICENSE:yaml}\
-}|\
-%|vendor?{\
-\n Vendor: %{VENDOR:yaml}\
-}|\
-%|group?{\
-\n Group: %{GROUP:yaml}\
-}|\
-%|buildhost?{\
-\n Buildhost: %{BUILDHOST:yaml}\
-}|\
-%|sourcerpm?{\
-\n Sourcerpm: %{SOURCERPM:yaml}\
-}|\
-\n Hdrstart: %{HEADERSTARTOFF}\
-\n Hdrend: %{HEADERENDOFF}\
-%|providexmlentry?{\
-\n Provides:\
+%|providename?{\
+\n Provides:\
[\
-\n - %{providesqlentry}\
+\n %{provideyamlentry}\
]\
}|\
-%|requirexmlentry?{\
-\n Requires:\
+%|requirename?{\
+\n Requires:\
[\
-\n - %{requiresqlentry}\
+\n %{requireyamlentry}\
]\
}|\
-%|conflictxmlentry?{\
-\n Conflicts:\
+%|conflictname?{\
+\n Conflicts:\
[\
-\n - %{conflictsqlentry}\
+\n %{conflictyamlentry}\
]\
}|\
-%|obsoletexmlentry?{\
-\n Obsoletes:\
+%|obsoletename?{\
+\n Obsoletes:\
[\
-\n - %{obsoletesqlentry}\
+\n %{obsoleteyamlentry}\
]\
}|\
%|filesxmlentry1?{\
-\n Files:\
+\n Files:\
[\
-\n - %{filessqlentry1}\
+\n %{filesyamlentry1}\
]\
}|\
\n'\
@@ -348,15 +330,16 @@
rpm alias --yum:filelists.yaml --qf '\
Filelists:\
\n Id: %|HDRID?{%{HDRID}}:{XXX}|\
+\n Idtype: sha\
\n Name: %{NAME:yaml}\
\n Arch: %{ARCH:yaml}\
\n Epoch: %|EPOCH?{%{EPOCH}}:{0}|\
\n Version: %{VERSION:yaml}\
\n Release: %{RELEASE:yaml}\
\n Files:\
-%|filesxmlentry2?{\
+%|filesyamlentry2?{\
[\
-\n - %{filesxmlentry2}\
+\n %{filesyamlentry2}\
]\
}|\
\n' \
@@ -371,6 +354,7 @@
rpm alias --yum:other.yaml --qf '\
Other:\
\n Id: %|HDRID?{%{HDRID}}:{XXX}|\
+\n Idtype: sha\
\n Name: %{NAME:yaml}\
\n Arch: %{ARCH:yaml}\
\n Epoch: %|EPOCH?{%{EPOCH}}:{0}|\
@@ .
______________________________________________________________________
RPM Package Manager http://rpm5.org
CVS Sources Repository rpm-cvs@rpm5.org
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic