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: 22-Sep-2008 21:58:06 Branch: HEAD Handle: 2008092219580501 Modified files: rpm CHANGES rpm/lib psm.c Log: - jbj: fire triggers on directory paths. Summary: Revision Changes Path 1.2563 +1 -0 rpm/CHANGES 2.316 +46 -0 rpm/lib/psm.c ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/CHANGES ============================================================================ $ cvs diff -u -r1.2562 -r1.2563 CHANGES --- rpm/CHANGES 22 Sep 2008 18:10:24 -0000 1.2562 +++ rpm/CHANGES 22 Sep 2008 19:58:05 -0000 1.2563 @@ -1,5 +1,6 @@ 5.1.0 -> 5.2a0: + - jbj: fire triggers on directory paths. - jbj: use rpmds iterator and getters for trigger->N parse side effects. - jbj: hdrfmt: triggerconds header extension display was incorrect. - jbj: expose rpmdsType() in rpmds ABI. @@ . patch -p0 <<'@@ .' Index: rpm/lib/psm.c ============================================================================ $ cvs diff -u -r2.315 -r2.316 psm.c --- rpm/lib/psm.c 22 Sep 2008 18:10:24 -0000 2.315 +++ rpm/lib/psm.c 22 Sep 2008 19:58:06 -0000 2.316 @@ -1163,8 +1163,46 @@ assert(fi->h != NULL); psm->countCorrection = 0; + ds = rpmdsNew(fi->h, tagno, scareMem); + if ((ds = rpmdsInit(ds)) != NULL) + while ((i = rpmdsNext(ds)) >= 0) { + unsigned prev, instance; + unsigned nvals; + ARGint_t vals; + + depName = _free(depName); + depName = xstrdup(rpmdsN(ds)); + + mi = rpmtsInitIterator(ts, RPMTAG_TRIGGERNAME, depName, 0); +if (_jbj) +fprintf(stderr, "=== runTriggers(%p) sense 0x%x N %s depName %s mi %p\n", psm, psm->sense, N, depName, mi); + nvals = argiCount(instances); + vals = argiData(instances); + if (nvals > 0) + (void) rpmdbPruneIterator(mi, (int *)vals, nvals, 1); + + prev = 0; + while((triggeredH = rpmdbNextIterator(mi)) != NULL) { + instance = rpmdbGetIteratorOffset(mi); + if (prev == instance) + continue; + rc |= handleOneTrigger(psm, fi->h, triggeredH, numPackage); + prev = instance; + (void) argiAdd(&instances, -1, instance); + (void) argiSort(instances, NULL); + } + mi = rpmdbFreeIterator(mi); + } + instances = argiFree(instances); + depName = _free(depName); + ds = rpmdsFree(ds); + + /* If not limited to NEVRA triggers, try dirnames index. */ + if (tagno != RPMTAG_NAME) { + tagno = RPMTAG_DIRNAMES; + ds = rpmdsNew(fi->h, tagno, scareMem); if ((ds = rpmdsInit(ds)) != NULL) while ((i = rpmdsNext(ds)) >= 0) { unsigned prev, instance; @@ -1199,6 +1237,8 @@ instances = argiFree(instances); depName = _free(depName); ds = rpmdsFree(ds); + } + psm->countCorrection = countCorrection; return rc; @@ -1260,6 +1300,12 @@ if (!(Flags & psm->sense)) continue; + /* If not limited to NEVRA triggers, use dirnames index for paths. */ + if (tagno != RPMTAG_NAME) { + if (Name[0] == '/') + tagno = RPMTAG_BASENAMES; + } + mi = rpmtsInitIterator(ts, tagno, Name, 0); if (_jbj) fprintf(stderr, "=== runImmedTriggers(%p) indices[%d] %d sense 0x%x N %s mi %p\n", psm, i, Ihe->p.ui32p[i], psm->sense, Name, mi); @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org