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