RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  [EMAIL PROTECTED]
  Module: rpm                              Date:   12-May-2008 22:20:20
  Branch: HEAD                             Handle: 2008051220201901

  Modified files:
    rpm                     CHANGES
    rpm/lib                 psm.c
    rpm/rpmdb               hdrfmt.c rpmtag.h

  Log:
    - jbj: permit :stat(foo) extraction from RPMTAG_PACKAGESTAT.
    - jbj: add RPMTAG_PACKAGESTAT, and store persistently in a rpmdb Header.

  Summary:
    Revision    Changes     Path
    1.2342      +2  -0      rpm/CHANGES
    2.299       +63 -10     rpm/lib/psm.c
    1.93        +12 -3      rpm/rpmdb/hdrfmt.c
    1.48        +1  -0      rpm/rpmdb/rpmtag.h
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.2341 -r1.2342 CHANGES
  --- rpm/CHANGES       12 May 2008 18:30:24 -0000      1.2341
  +++ rpm/CHANGES       12 May 2008 20:20:19 -0000      1.2342
  @@ -1,5 +1,7 @@
   
   5.1.0 -> 5.2a0:
  +    - jbj: permit :stat(foo) extraction from RPMTAG_PACKAGESTAT.
  +    - jbj: add RPMTAG_PACKAGESTAT, and store persistently in a rpmdb Header.
       - jbj: rpmrepo: achieve {primary,filelists,other}.xml spew parity w 
createrepo.
       - jbj: rpmrepo: compute origin *.rpm file digest while reading.
       - jbj: preserve stat(2) & digest through headerReload().
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/psm.c
  ============================================================================
  $ cvs diff -u -r2.298 -r2.299 psm.c
  --- rpm/lib/psm.c     12 Mar 2008 19:41:11 -0000      2.298
  +++ rpm/lib/psm.c     12 May 2008 20:20:20 -0000      2.299
  @@ -1606,13 +1606,37 @@
       he->c = 1;
       xx = headerPut(fi->h, he, 0);
   
  -    /* Add the header's origin (i.e. URL) */
  -    he->tag = RPMTAG_PACKAGEORIGIN;
  -    he->t = RPM_STRING_TYPE;
  -    he->p.str = headerGetOrigin(fi->h);
  -    he->c = 1;
  -    if (he->p.str != NULL)
  -     xx = headerPut(fi->h, he, 0);
  +    /* Add the header's origin/digest/stat (i.e. URL) */
  +    {        const char * fn = headerGetOrigin(fi->h);
  +     const char * digest = headerGetDigest(fi->h);
  +     struct stat * st = headerGetStatbuf(fi->h);
  +
  +     if (fn != NULL) {
  +         he->tag = RPMTAG_PACKAGEORIGIN;
  +         he->t = RPM_STRING_TYPE;
  +         he->p.str = fn;
  +         he->c = 1;
  +         xx = headerPut(fi->h, he, 0);
  +         if (digest != NULL) {
  +             he->tag = RPMTAG_PACKAGEDIGEST;
  +             he->t = RPM_STRING_TYPE;
  +             he->p.str = headerGetDigest(fi->h);
  +             he->c = 1;
  +             xx = headerPut(fi->h, he, 0);
  +         }
  +         if (st != NULL) {
  +             if (st->st_mode == 0 && st->st_mtime == 0 && st->st_size == 0)
  +                 xx = Stat(fn, st);
  +             if (st->st_mode != 0) {
  +                 he->tag = RPMTAG_PACKAGESTAT;
  +                 he->t = RPM_BIN_TYPE;
  +                 he->p.ptr = (void *)st;
  +                 he->c = sizeof(*st);
  +                 xx = headerPut(fi->h, he, 0);
  +             }
  +         }
  +     }
  +    }
   
       /* XXX Don't clobber forward/backward upgrade chain on rollbacks */
       if (rpmtsType(ts) != RPMTRANS_TYPE_ROLLBACK)
  @@ -1913,15 +1937,28 @@
        }
        if (psm->goal == PSM_PKGSAVE) {
            int noArchiveSize = 0;
  -         const char * origin;
  +         const char * origin = NULL;
  +         const char * digest = NULL;
  +         const struct stat * st = NULL;
  +         size_t nstbytes = 0;
   
            /* Regenerate original header. */
            {   void * uh = NULL;
   
  -             /* Save original header's origin (i.e. URL) */
  +             /* Save original header's origin/digest/stat (i.e. URL) */
                he->tag = RPMTAG_PACKAGEORIGIN;
                xx = headerGet(fi->h, he, 0);
                origin = he->p.str;
  +             he->tag = RPMTAG_PACKAGEDIGEST;
  +             xx = headerGet(fi->h, he, 0);
  +             if (xx && he->p.str != NULL)
  +                 digest = he->p.str;
  +             he->tag = RPMTAG_PACKAGESTAT;
  +             xx = headerGet(fi->h, he, 0);
  +             if (xx && he->p.ptr != NULL && he->c == sizeof(*st)) {
  +                 st = he->p.ptr;
  +                 nstbytes = he->c;
  +             }
   
                /* Retrieve original header blob. */
                he->tag = RPMTAG_HEADERIMMUTABLE;
  @@ -2013,7 +2050,7 @@
                he->c = 1;
                xx = headerPut(psm->oh, he, 0);
   
  -             /* Add original header's origin (i.e. URL) */
  +             /* Add original header's origin/digest/stat (i.e. URL) */
                if (origin != NULL) {
                    he->tag = RPMTAG_PACKAGEORIGIN;
                    he->t = RPM_STRING_TYPE;
  @@ -2022,6 +2059,22 @@
                    xx = headerPut(psm->oh, he, 0);
                    origin = _free(origin);
                }
  +             if (digest != NULL) {
  +                 he->tag = RPMTAG_PACKAGEDIGEST;
  +                 he->t = RPM_STRING_TYPE;
  +                 he->p.str = digest;
  +                 he->c = 1;
  +                 xx = headerPut(psm->oh, he, 0);
  +                 digest = _free(digest);
  +             }
  +             if (st != NULL) {
  +                 he->tag = RPMTAG_PACKAGESTAT;
  +                 he->t = RPM_BIN_TYPE;
  +                 he->p.ptr = st;
  +                 he->c = nstbytes;
  +                 xx = headerPut(psm->oh, he, 0);
  +                 st = _free(st);
  +             }
   
                /* Copy upgrade chain link tags. */
                xx = hCopyTag(fi->h, psm->oh, RPMTAG_INSTALLTID);
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/hdrfmt.c
  ============================================================================
  $ cvs diff -u -r1.92 -r1.93 hdrfmt.c
  --- rpm/rpmdb/hdrfmt.c        12 May 2008 18:17:56 -0000      1.92
  +++ rpm/rpmdb/hdrfmt.c        12 May 2008 20:20:20 -0000      1.93
  @@ -3227,7 +3227,7 @@
   {
       /[EMAIL PROTECTED]@*/
       static const char *avdefault[] = { "mode", NULL };
  -    const char * fn = he->p.str;
  +    const char * fn = NULL;
       struct stat sb, *st = &sb;
       int ix = (he->ix > 0 ? he->ix : 0);
       char * val = NULL;
  @@ -3236,11 +3236,20 @@
   
   assert(ix == 0);
       switch(he->t) {
  +    case RPM_BIN_TYPE:
  +     /* XXX limit to RPMTAG_PACKAGESTAT ... */
  +     if (he->tag == RPMTAG_PACKAGESTAT)
  +     if (he->c == sizeof(*st)) {
  +         st = (struct stat *)he->p.ptr;
  +         break;
  +     }
  +     /[EMAIL PROTECTED] @*/
       default:
        val = xstrdup(_("(invalid type :stat)"));
        goto exit;
        /[EMAIL PROTECTED]@*/ break;
       case RPM_STRING_TYPE:
  +     fn = he->p.str;
        if (Lstat(fn, st) == 0)
            break;
        val = rpmExpand("(Lstat:", fn, ":", strerror(errno), ")", NULL);
  @@ -3307,7 +3316,7 @@
            break;
   #endif
        case STAT_KEYS_SLINK:
  -         if (S_ISLNK(st->st_mode)) {
  +         if (fn != NULL && S_ISLNK(st->st_mode)) {
                ssize_t size = Readlink(fn, b, nb);
                if (size == -1) {
                    nval = rpmExpand("(Readlink:", fn, ":", strerror(errno), 
")", NULL);
  @@ -3318,7 +3327,7 @@
            }
            break;
        case STAT_KEYS_DIGEST:
  -         if (S_ISREG(st->st_mode)) {
  +         if (fn != NULL && S_ISREG(st->st_mode)) {
                uint32_t digval = keyValue(keyDigests, nkeyDigests, av[i]);
                uint32_t algo = (digval ? digval : PGPHASHALGO_SHA1);
                FD_t fd = Fopen(fn, "r%{?_rpmgio}");
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/rpmtag.h
  ============================================================================
  $ cvs diff -u -r1.47 -r1.48 rpmtag.h
  --- rpm/rpmdb/rpmtag.h        12 May 2008 18:17:56 -0000      1.47
  +++ rpm/rpmdb/rpmtag.h        12 May 2008 20:20:20 -0000      1.48
  @@ -419,6 +419,7 @@
       RPMTAG_PACKAGETIME               = 1213, /* l */
       RPMTAG_PACKAGESIZE               = 1214, /* l */
       RPMTAG_PACKAGEDIGEST     = 1215, /* s */
  +    RPMTAG_PACKAGESTAT               = 1216, /* x */
   
   /[EMAIL PROTECTED]@*/
       RPMTAG_FIRSTFREE_TAG     /*!< internal */
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                [email protected]

Reply via email to