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

Reply via email to