[prev in list] [next in list] [prev in thread] [next in thread] 

List:       rpm-cvs
Subject:    [CVS] RPM: rpm/ CHANGES rpm/rpmdb/ hdrfmt.c
From:       "Jeff Johnson" <jbj () rpm5 ! org>
Date:       2008-06-20 16:02:27
Message-ID: 20080620160227.E112234848A () 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:   20-Jun-2008 18:02:27
  Branch: HEAD                             Handle: 2008062016022700

  Modified files:
    rpm                     CHANGES
    rpm/rpmdb               hdrfmt.c

  Log:
    - jbj: add RPMTAG_WHATNEEDS header extension

  Summary:
    Revision    Changes     Path
    1.2430      +1  -0      rpm/CHANGES
    1.109       +228 -21    rpm/rpmdb/hdrfmt.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.2429 -r1.2430 CHANGES
  --- rpm/CHANGES	20 Jun 2008 12:02:10 -0000	1.2429
  +++ rpm/CHANGES	20 Jun 2008 16:02:27 -0000	1.2430
  @@ -1,5 +1,6 @@
   
   5.1.0 -> 5.2a0:
  +    - jbj: add RPMTAG_WHATNEEDS header extension.
       - jbj: move rpmns.[ch] to -lrpmdb for use with header format extensions.
       - jbj: pass rpmdb to header format extenensions with header.
       - jbj: move rpmevr.[ch] to -lrpmdb for use with header format extensions.
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/hdrfmt.c
  ============================================================================
  $ cvs diff -u -r1.108 -r1.109 hdrfmt.c
  --- rpm/rpmdb/hdrfmt.c	15 Jun 2008 04:43:02 -0000	1.108
  +++ rpm/rpmdb/hdrfmt.c	20 Jun 2008 16:02:27 -0000	1.109
  @@ -45,13 +45,14 @@
   
   #define	_RPMTAG_INTERNAL
   #include <rpmtag.h>
  +#define _RPMEVR_INTERNAL
  +#include <rpmevr.h>	/* XXX RPMSENSE_FOO */
  +#include <rpmns.h>
  +#include <rpmdb.h>
   
   #include <rpmlib.h>	/* XXX rpmfi, rpmMkdirPath */
   #include <rpmfi.h>	/* XXX RPMFILE_FOO */
   
  -#define _RPMEVR_INTERNAL
  -#include <rpmevr.h>	/* XXX RPMSENSE_FOO */
  -
   #include "legacy.h"
   #include "misc.h"
   
  @@ -2346,33 +2347,20 @@
   }
   
   /**
  - * Retrieve Depends: and Conflicts: for --deb:control.
  + * Return Debian formatted dependencies as string array.
    * @param h		header
    * @retval *he		tag container
  + * @param Nhe		dependency name container
  + * @param EVRhe		dependency epoch:version-release container
  + * @param Fhe		dependency flags container
    * @return		0 on success
    */
  -static int debevrTag(Header h, HE_t he, rpmTag tagN, rpmTag tagEVR, rpmTag tagF)
  +static int debevrfmtTag(Header h, HE_t he, HE_t Nhe, HE_t EVRhe, HE_t Fhe)
   	/*@modifies he @*/
   {
  -    HE_t Nhe = memset(alloca(sizeof(*Nhe)), 0, sizeof(*Nhe));
  -    HE_t EVRhe = memset(alloca(sizeof(*EVRhe)), 0, sizeof(*EVRhe));
  -    HE_t Fhe = memset(alloca(sizeof(*Fhe)), 0, sizeof(*Fhe));
       char * t, * te;
       size_t nb = 0;
       int rc = 1;
  -    int xx;
  -
  -    Nhe->tag = tagN;
  -    if (!(xx = headerGet(h, Nhe, 0)))
  -	goto exit;
  -    EVRhe->tag = tagEVR;
  -    if (!(xx = headerGet(h, EVRhe, 0)))
  -	goto exit;
  -assert(EVRhe->c == Nhe->c);
  -    Fhe->tag = tagF;
  -    if (!(xx = headerGet(h, Fhe, 0)))
  -	goto exit;
  -assert(Fhe->c == Nhe->c);
   
       he->t = RPM_STRING_ARRAY_TYPE;
       he->c = 0;
  @@ -2412,6 +2400,41 @@
       he->p.argv[he->c] = NULL;
       rc = 0;
   
  +    return rc;
  +}
  +
  +/**
  + * Retrieve and return Debian formatted dependecies for --deb:control.
  + * @param h		header
  + * @retval *he		tag container
  + * @param tagN		dependency tag name
  + * @param tagEVR	dependency tag epoch:version-release
  + * @param tagF		dependency tag flags
  + * @return		0 on success
  + */
  +static int debevrTag(Header h, HE_t he, rpmTag tagN, rpmTag tagEVR, rpmTag tagF)
  +	/*@modifies he @*/
  +{
  +    HE_t Nhe = memset(alloca(sizeof(*Nhe)), 0, sizeof(*Nhe));
  +    HE_t EVRhe = memset(alloca(sizeof(*EVRhe)), 0, sizeof(*EVRhe));
  +    HE_t Fhe = memset(alloca(sizeof(*Fhe)), 0, sizeof(*Fhe));
  +    int rc = 1;
  +    int xx;
  +
  +    Nhe->tag = tagN;
  +    if (!(xx = headerGet(h, Nhe, 0)))
  +	goto exit;
  +    EVRhe->tag = tagEVR;
  +    if (!(xx = headerGet(h, EVRhe, 0)))
  +	goto exit;
  +assert(EVRhe->c == Nhe->c);
  +    Fhe->tag = tagF;
  +    if (!(xx = headerGet(h, Fhe, 0)))
  +	goto exit;
  +assert(Fhe->c == Nhe->c);
  +
  +    rc = debevrfmtTag(h, he, Nhe, EVRhe, Fhe);
  +
   exit:
       Nhe->p.ptr = _free(Nhe->p.ptr);
       EVRhe->p.ptr = _free(EVRhe->p.ptr);
  @@ -2549,6 +2572,188 @@
       return rc;
   }
   
  +static int rpmEVRoverlap(EVR_t a, EVR_t b)
  +	/*@*/
  +{
  +    rpmsenseFlags aF = a->Flags;
  +    rpmsenseFlags bF = b->Flags;
  +    int sense;
  +    int result;
  +
  +    if (a->E == NULL)	a->E = "0";
  +    if (b->E == NULL)	b->E = "0";
  +    if (a->V == NULL)	a->V = "";
  +    if (b->V == NULL)	b->V = "";
  +    if (a->R == NULL)	a->R = "";
  +    if (b->R == NULL)	b->R = "";
  +    sense = rpmEVRcompare(a, b);
  +
  +    /* Detect overlap of {A,B} range. */
  +    if (aF == RPMSENSE_NOTEQUAL || bF == RPMSENSE_NOTEQUAL)
  +        result = (sense != 0);
  +    else if (sense < 0 && ((aF & RPMSENSE_GREATER) || (bF & RPMSENSE_LESS)))
  +        result = 1;
  +    else if (sense > 0 && ((aF & RPMSENSE_LESS) || (bF & RPMSENSE_GREATER)))
  +        result = 1;
  +    else if (sense == 0 &&
  +        (((aF & RPMSENSE_EQUAL) && (bF & RPMSENSE_EQUAL)) ||
  +         ((aF & RPMSENSE_LESS) && (bF & RPMSENSE_LESS)) ||
  +         ((aF & RPMSENSE_GREATER) && (bF & RPMSENSE_GREATER))))
  +        result = 1;
  +    else
  +        result = 0;
  +    return result;
  +}
  +
  +static int wnlookupTag(Header h, ARGV_t *avp,
  +		HE_t PNhe, /*@null@*/ HE_t PEVRhe, /*@null@*/ HE_t PFhe)
  +	/*@modifies he @*/
  +{
  +    HE_t NVRAhe = memset(alloca(sizeof(*NVRAhe)), 0, sizeof(*NVRAhe));
  +    HE_t RNhe = memset(alloca(sizeof(*RNhe)), 0, sizeof(*RNhe));
  +    HE_t REVRhe = memset(alloca(sizeof(*REVRhe)), 0, sizeof(*REVRhe));
  +    HE_t RFhe = memset(alloca(sizeof(*RFhe)), 0, sizeof(*RFhe));
  +    rpmdb rpmdb = headerGetRpmdb(h);
  +    const char * key = PNhe->p.argv[PNhe->ix];
  +    size_t keylen = 0;
  +    rpmdbMatchIterator mi;
  +    rpmTag tagN = RPMTAG_REQUIRENAME;
  +    rpmTag tagEVR = RPMTAG_REQUIREVERSION;
  +    rpmTag tagF = RPMTAG_REQUIREFLAGS;
  +    EVR_t Pevr = memset(alloca(sizeof(*Pevr)), 0, sizeof(*Pevr));
  +    EVR_t Revr = memset(alloca(sizeof(*Revr)), 0, sizeof(*Revr));
  +    Header oh;
  +    int xx;
  +
  +    if (PEVRhe != NULL)
  +	xx = rpmEVRparse(PEVRhe->p.argv[PNhe->ix], Pevr);
  +    if (PFhe != NULL)
  +	Pevr->Flags = (PFhe->p.ui32p[PNhe->ix] & RPMSENSE_SENSEMASK);
  +
  +    RNhe->tag = tagN;
  +    REVRhe->tag = tagEVR;
  +    RFhe->tag = tagF;
  +
  +    mi = rpmdbInitIterator(rpmdb, tagN, key, keylen);
  +    while ((oh = rpmdbNextIterator(mi)) != NULL) {
  +	if (!headerGet(oh, RNhe, 0))
  +	    goto bottom;
  +	if (PEVRhe != NULL) {
  +	    if (!headerGet(oh, REVRhe, 0))
  +		goto bottom;
  +assert(REVRhe->c == RNhe->c);
  +	    if (!headerGet(oh, RFhe, 0))
  +		goto bottom;
  +assert(RFhe->c == RNhe->c);
  +	}
  +
  +	for (RNhe->ix = 0; RNhe->ix < (int)RNhe->c; RNhe->ix++) {
  +	    if (strcmp(PNhe->p.argv[PNhe->ix], RNhe->p.argv[RNhe->ix]))
  +		continue;
  +	    if (PEVRhe == NULL)
  +		goto bingo;
  +	    Revr->Flags = RFhe->p.ui32p[RNhe->ix] & RPMSENSE_SENSEMASK;
  +	    if (!(Pevr->Flags && Revr->Flags))
  +		goto bingo;
  +	    xx = rpmEVRparse(REVRhe->p.argv[RNhe->ix], Revr);
  +	    xx = rpmEVRoverlap(Pevr, Revr);
  +	    Revr->str = _free(Revr->str);
  +	    memset(Revr, 0, sizeof(*Revr));
  +	    if (xx)
  +		goto bingo;
  +	}
  +	goto bottom;
  +
  +bingo:
  +	NVRAhe->tag = RPMTAG_NVRA;
  +	xx = headerGet(oh, NVRAhe, 0);
  +	if (!(*avp != NULL && argvSearch(*avp, NVRAhe->p.str, NULL) != NULL)) {
  +	    xx = argvAdd(avp, NVRAhe->p.str);
  +	    xx = argvSort(*avp, NULL);
  +	}
  +
  +bottom:
  +	RNhe->p.ptr = _free(RNhe->p.ptr);
  +	REVRhe->p.ptr = _free(REVRhe->p.ptr);
  +	RFhe->p.ptr = _free(RFhe->p.ptr);
  +	NVRAhe->p.ptr = _free(NVRAhe->p.ptr);
  +    }
  +    mi = rpmdbFreeIterator(mi);
  +
  +    Pevr->str = _free(Pevr->str);
  +
  +    return 0;
  +}
  +
  +static int whatneedsTag(Header h, HE_t he)
  +	/*@modifies he @*/
  +{
  +    HE_t PNhe = memset(alloca(sizeof(*PNhe)), 0, sizeof(*PNhe));
  +    HE_t PEVRhe = memset(alloca(sizeof(*PEVRhe)), 0, sizeof(*PEVRhe));
  +    HE_t PFhe = memset(alloca(sizeof(*PFhe)), 0, sizeof(*PFhe));
  +    HE_t FNhe = memset(alloca(sizeof(*FNhe)), 0, sizeof(*FNhe));
  +    ARGV_t av = NULL;
  +    int rc = 1;
  +
  +    PNhe->tag = RPMTAG_PROVIDENAME;
  +    if (!headerGet(h, PNhe, 0))
  +	goto exit;
  +    PEVRhe->tag = RPMTAG_PROVIDEVERSION;
  +    if (!headerGet(h, PEVRhe, 0))
  +	goto exit;
  +assert(PEVRhe->c == PNhe->c);
  +    PFhe->tag = RPMTAG_PROVIDEFLAGS;
  +    if (!headerGet(h, PFhe, 0))
  +	goto exit;
  +assert(PFhe->c == PNhe->c);
  +
  +    FNhe->tag = RPMTAG_FILEPATHS;
  +    if (!headerGet(h, FNhe, 0))
  +	goto exit;
  +
  +    for (PNhe->ix = 0; PNhe->ix < (int)PNhe->c; PNhe->ix++)
  +	(void) wnlookupTag(h, &av, PNhe, PEVRhe, PFhe);
  +    for (FNhe->ix = 0; FNhe->ix < (int)FNhe->c; FNhe->ix++)
  +	(void) wnlookupTag(h, &av, FNhe, NULL, NULL);
  +    if (av == NULL)
  +	goto exit;
  +
  +    /* Convert package NVRA array to Header string array. */
  +    {	size_t nb = 0;
  +	char * te;
  +	uint32_t i;
  +
  +	he->t = RPM_STRING_ARRAY_TYPE;
  +	he->c = argvCount(av);
  +	nb = 0;
  +	for (i = 0; i < he->c; i++) {
  +	    nb += sizeof(*he->p.argv);
  +	    nb += strlen(av[i]) + 1;
  +	}
  +	nb += sizeof(*he->p.argv);
  +
  +	he->p.argv = xmalloc(nb);
  +	te = (char *) &he->p.argv[he->c+1];
  +
  +	for (i = 0; i < he->c; i++) {
  +	    he->p.argv[i] = te;
  +	    te = stpcpy(te, av[i]);
  +	    te++;
  +	}
  +	he->p.argv[he->c] = NULL;
  +    }
  +
  +    av = argvFree(av);
  +    rc = 0;
  +
  +exit:
  +    PNhe->p.ptr = _free(PNhe->p.ptr);
  +    PEVRhe->p.ptr = _free(PEVRhe->p.ptr);
  +    PFhe->p.ptr = _free(PFhe->p.ptr);
  +    FNhe->p.ptr = _free(FNhe->p.ptr);
  +    return rc;
  +}
  +
   static int PRCOSkip(rpmTag tag, rpmTagData N, rpmTagData EVR, rpmTagData F,
   		uint32_t i)
   	/*@*/
  @@ -3958,6 +4163,8 @@
   	{ .tagFunction = debobsoletesTag } },
       { HEADER_EXT_TAG, "RPMTAG_DEBPROVIDES",
   	{ .tagFunction = debprovidesTag } },
  +    { HEADER_EXT_TAG, "RPMTAG_WHATNEEDS",
  +	{ .tagFunction = whatneedsTag } },
       { HEADER_EXT_FORMAT, "armor",
   	{ .fmtFunction = armorFormat } },
       { HEADER_EXT_FORMAT, "base64",
  @@ .
______________________________________________________________________
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