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

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  j...@rpm5.org
  Module: rpm                              Date:   07-Dec-2009 18:53:47
  Branch: HEAD                             Handle: 2009120717534601

  Modified files:
    rpm                     CHANGES
    rpm/lib                 rpmts.c
    rpm/rpmdb               rpmdb.c

  Log:
    - rpmdb: handle optional .A just like optional -V and -R patterns.

  Summary:
    Revision    Changes     Path
    1.3183      +1  -0      rpm/CHANGES
    2.177       +3  -73     rpm/lib/rpmts.c
    1.348       +4  -2      rpm/rpmdb/rpmdb.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.3182 -r1.3183 CHANGES
  --- rpm/CHANGES       4 Dec 2009 23:22:51 -0000       1.3182
  +++ rpm/CHANGES       7 Dec 2009 17:53:46 -0000       1.3183
  @@ -1,5 +1,6 @@
   
   5.2b1 -> 5.3a1
  +    - jbj: rpmdb: handle optional .A just like optional -V and -R patterns.
       - jbj: rpmdb: use RPMTAG_NVRA patterns for RPMDBI_LABEL rpmmi iterators.
       - jbj: rpmdb: permit anchored patterns on RPMDBI_LABEL retrieves. strings
        are escaped and anchored. Still only RPMTAG_NAME, RPMTAG_NVRA next.
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/rpmts.c
  ============================================================================
  $ cvs diff -u -r2.176 -r2.177 rpmts.c
  --- rpm/lib/rpmts.c   4 Dec 2009 04:51:43 -0000       2.176
  +++ rpm/lib/rpmts.c   7 Dec 2009 17:53:47 -0000       2.177
  @@ -141,79 +141,9 @@
   rpmmi rpmtsInitIterator(const rpmts ts, rpmTag rpmtag,
                        const void * keyp, size_t keylen)
   {
  -    rpmmi mi;
  -    const char * arch = NULL;
  -    int xx;
  -
  -    if (ts->rdb == NULL && rpmtsOpenDB(ts, ts->dbmode))
  -     return NULL;
  -
  -    /* Parse out "N(EVR).A" tokens from a label key. */
  -    if (rpmtag == RPMDBI_LABEL && keyp != NULL) {
  -     const char * s = keyp;
  -     const char *se;
  -     size_t slen = strlen(s);
  -     char *t = alloca(slen+1);
  -     int level = 0;
  -     int c;
  -
  -     keyp = t;
  -     while ((c = *s++) != '\0') {
  -         switch (c) {
  -         default:
  -             *t++ = (char)c;
  -             /*...@switchbreak@*/ break;
  -         case '(':
  -             /* XXX Fail if nested parens. */
  -             if (level++ != 0) {
  -                 rpmlog(RPMLOG_ERR, _("extra '(' in package label: %s\n"), 
(char *)keyp);
  -                 return NULL;
  -             }
  -             /* Parse explicit epoch. */
  -             for (se = s; *se && xisdigit(*se); se++)
  -                 {};
  -             if (*se == ':') {
  -                 /* XXX skip explicit epoch's (for now) */
  -                 *t++ = '-';
  -                 s = se + 1;
  -             } else {
  -                 /* No Epoch: found. Convert '(' to '-' and chug. */
  -                 *t++ = '-';
  -             }
  -             /*...@switchbreak@*/ break;
  -         case ')':
  -             /* XXX Fail if nested parens. */
  -             if (--level != 0) {
  -                 rpmlog(RPMLOG_ERR, _("missing '(' in package label: %s\n"), 
(char *)keyp);
  -                 return NULL;
  -             }
  -             /* Don't copy trailing ')' */
  -             /*...@switchbreak@*/ break;
  -         }
  -     }
  -     if (level) {
  -         rpmlog(RPMLOG_ERR, _("missing ')' in package label: %s\n"), (char 
*)keyp);
  -         return NULL;
  -     }
  -     *t = '\0';
  -     t = (char *) keyp;
  -     t = strrchr(t, '.');
  -     /* Is this a valid ".arch" suffix? */
  -     if (t != NULL && rpmnsArch(t+1)) {
  -        *t++ = '\0';
  -        arch = t;
  -     }
  -    }
  -
  -    mi = rpmmiInit(ts->rdb, rpmtag, keyp, keylen);
  -
  -    /* Verify header signature/digest during retrieve (if not disabled). */
  -    if (mi && !(rpmtsVSFlags(ts) & RPMVSF_NOHDRCHK))
  -     (void) rpmmiSetHdrChk(mi, ts);
  -
  -    /* Select specified arch only. */
  -    if (arch != NULL)
  -     xx = rpmmiAddPattern(mi, RPMTAG_ARCH, RPMMIRE_DEFAULT, arch);
  +    rpmmi mi = (ts->rdb == NULL && rpmtsOpenDB(ts, ts->dbmode))
  +     ? NULL
  +     : rpmmiInit(ts->rdb, rpmtag, keyp, keylen);
       return mi;
   }
   /*...@=compdef@*/
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/rpmdb.c
  ============================================================================
  $ cvs diff -u -r1.347 -r1.348 rpmdb.c
  --- rpm/rpmdb/rpmdb.c 6 Dec 2009 20:22:01 -0000       1.347
  +++ rpm/rpmdb/rpmdb.c 7 Dec 2009 17:53:47 -0000       1.348
  @@ -1296,7 +1296,7 @@
       char * te;
   
       if (_pre == NULL) _pre = "^";
  -    if (_post == NULL) _post = "(-[^-]+-[^-]+|-[^-]+|)\\.[^.]+$";
  +    if (_post == NULL) _post = 
"(-[^-]+-[^-]+\\.[^.]+|-[^-]+\\.[^.]+|\\.[^.]+|)$";
   
       /* Find the PCRE pattern length, including escapes. */
       for (se = s; *se != '\0'; se++, nt++)
  @@ -1480,9 +1480,11 @@
       {        rpmTag _tag = RPMTAG_NVRA;
        rpmMireMode _mode = RPMMIRE_PCRE;
        /* Add ^...$ *RE anchors. Escape pattern characters. */
  +     static const char _pre[] = "^";
  +     static const char _post[] = 
"(-[^-]+-[^-]+\\.[^.]+|-[^-]+\\.[^.]+|\\.[^.]+|)$";
        const char * _pat = (s[0] == '^' || s[ns-1] == '$')
                ? xstrdup(s)
  -             : _str2PCREpat("^", s, "(-[^-]+-[^-]+|-[^-]+|)\\.[^.]+$");
  +             : _str2PCREpat(_pre, s, _post);
        ret = rpmdbMireKeys(dbi->dbi_rpmdb, _tag, _mode, _pat, matches);
        _pat = _free(_pat);
       }
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                rpm-cvs@rpm5.org

Reply via email to