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: 25-Sep-2008 05:16:30 Branch: HEAD Handle: 2008092503163000 Modified files: rpm CHANGES rpm/lib psm.c Log: - jbj: rpmpsm: simplify runTriggers() by adding rpmTriggersLoop(). Summary: Revision Changes Path 1.2575 +1 -0 rpm/CHANGES 2.327 +61 -72 rpm/lib/psm.c ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/CHANGES ============================================================================ $ cvs diff -u -r1.2574 -r1.2575 CHANGES --- rpm/CHANGES 25 Sep 2008 01:43:56 -0000 1.2574 +++ rpm/CHANGES 25 Sep 2008 03:16:30 -0000 1.2575 @@ -1,5 +1,6 @@ 5.1.0 -> 5.2a0: + - jbj: rpmpsm: simplify runTriggers() by adding rpmTriggersLoop(). - jbj: rpmpsm: extract trigger tags once, simplify code, consistent naming. - jbj: rpmpsm: extract NVRA and INSTALLPREFIXES lazily & persistently. - jbj: speed up dirname triggers from glob patterns. almost spiffy ... @@ . patch -p0 <<'@@ .' Index: rpm/lib/psm.c ============================================================================ $ cvs diff -u -r2.326 -r2.327 psm.c --- rpm/lib/psm.c 25 Sep 2008 01:43:57 -0000 2.326 +++ rpm/lib/psm.c 25 Sep 2008 03:16:30 -0000 2.327 @@ -1021,13 +1021,12 @@ /** * Execute triggers. - * @todo Trigger on any provides, not just package NVR. * @param psm package state machine data * @param sourceH * @param triggeredH * @param arg2 * @param delslash delete trailing slash in trigger names? - * @return + * @return RPMRC_OK on success */ static rpmRC handleOneTrigger(const rpmpsm psm, Header sourceH, Header triggeredH, @@ -1167,11 +1166,13 @@ } /** - * Run trigger scripts in the database that are fired by this header. + * Run a dependency set loop against rpmdb triggers. * @param psm package state machine data - * @return 0 on success + * @param tagno dependency set to run against rpmdb + * @param arg2 scriptlet arg2 + * @return RPMRC_OK on success */ -static rpmRC runTriggers(rpmpsm psm) +static rpmRC runTriggersLoop(rpmpsm psm, rpmTag tagno, int arg2) /[EMAIL PROTECTED] rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/ /[EMAIL PROTECTED] psm, rpmGlobalMacroContext, @@ -1180,42 +1181,15 @@ static int scareMem = 0; const rpmts ts = psm->ts; rpmfi fi = psm->fi; - const char * N = NULL; + rpmds ds = rpmdsNew(fi->h, tagno, scareMem); const char * depName = NULL; - int numPackage = -1; - int countCorrection = psm->countCorrection; - Header triggeredH; - rpmdbMatchIterator mi; ARGI_t instances = NULL; - rpmds ds; - rpmTag tagno; + rpmdbMatchIterator mi; + Header triggeredH; rpmRC rc = RPMRC_OK; int i; int xx; - /* Select RPMTAG_NAME or RPMTAG_PROVIDENAME index for triggering. */ - if (_trigger_tag == 0) { - const char * t = rpmExpand("%{?_trigger_tag}", NULL); -/[EMAIL PROTECTED]@*/ - _trigger_tag = (!strcmp(t, "name") ? RPMTAG_NAME : RPMTAG_PROVIDENAME); -/[EMAIL PROTECTED]@*/ - t = _free(t); - } - tagno = _trigger_tag; - -assert(psm->te != NULL); - N = rpmteN(psm->te); -assert(N != NULL); - numPackage = rpmdbCountPackages(rpmtsGetRdb(ts), N) + psm->countCorrection; - if (numPackage < 0) - return RPMRC_NOTFOUND; - -assert(fi != NULL); -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; @@ -1227,7 +1201,8 @@ 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); +fprintf(stderr, "=== runTriggersLoop(%p) sense 0x%x depName %s mi %p\n", psm, psm->sense, depName, mi); + nvals = argiCount(instances); vals = argiData(instances); if (nvals > 0) @@ -1238,7 +1213,7 @@ instance = rpmdbGetIteratorOffset(mi); if (prev == instance) continue; - rc |= handleOneTrigger(psm, fi->h, triggeredH, numPackage, 0); + rc |= handleOneTrigger(psm, fi->h, triggeredH, arg2, 0); prev = instance; xx = argiAdd(&instances, -1, instance); xx = argiSort(instances, NULL); @@ -1250,47 +1225,61 @@ depName = _free(depName); ds = rpmdsFree(ds); - /* If not limited to NEVRA triggers, try filenames index. */ - if (tagno != RPMTAG_NAME) { - tagno = RPMTAG_BASENAMES; - 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)); + return rc; +} - 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); +/** + * Run trigger scripts in the database that are fired by this header. + * @param psm package state machine data + * @return 0 on success + */ +static rpmRC runTriggers(rpmpsm psm) + /[EMAIL PROTECTED] rpmGlobalMacroContext, h_errno, + fileSystem, internalState @*/ + /[EMAIL PROTECTED] psm, rpmGlobalMacroContext, + fileSystem, internalState @*/ +{ + const rpmts ts = psm->ts; + rpmfi fi = psm->fi; + int numPackage; + rpmTag tagno; + rpmRC rc = RPMRC_OK; - prev = 0; - while((triggeredH = rpmdbNextIterator(mi)) != NULL) { - instance = rpmdbGetIteratorOffset(mi); - if (prev == instance) - continue; - rc |= handleOneTrigger(psm, fi->h, triggeredH, numPackage, 0); - prev = instance; - (void) argiAdd(&instances, -1, instance); - (void) argiSort(instances, NULL); - } + /* Select RPMTAG_NAME or RPMTAG_PROVIDENAME index for triggering. */ + if (_trigger_tag == 0) { + const char * t = rpmExpand("%{?_trigger_tag}", NULL); +/[EMAIL PROTECTED]@*/ + _trigger_tag = (!strcmp(t, "name") ? RPMTAG_NAME : RPMTAG_PROVIDENAME); +/[EMAIL PROTECTED]@*/ + t = _free(t); + } + tagno = _trigger_tag; - mi = rpmdbFreeIterator(mi); +assert(psm->te != NULL); + { const char * N = rpmteN(psm->te); +assert(N != NULL); + numPackage = rpmdbCountPackages(rpmtsGetRdb(ts), N); + numPackage += psm->countCorrection; + if (numPackage < 0) + return RPMRC_NOTFOUND; } +assert(fi != NULL); +assert(fi->h != NULL); - instances = argiFree(instances); - depName = _free(depName); - ds = rpmdsFree(ds); - } + /* XXX Save/restore count correction. */ + { int countCorrection = psm->countCorrection; + + psm->countCorrection = 0; + + /* Try name/providename triggers first. */ + rc |= runTriggersLoop(psm, tagno, numPackage); - psm->countCorrection = countCorrection; + /* If not limited to NEVRA triggers, also try file path triggers. */ + if (tagno != RPMTAG_NAME) + rc |= runTriggersLoop(psm, RPMTAG_BASENAMES, numPackage); + + psm->countCorrection = countCorrection; + } return rc; } @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org