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:   20-Sep-2008 23:10:31
  Branch: HEAD                             Handle: 2008092021103001

  Modified files:
    rpm                     CHANGES
    rpm/lib                 psm.c

  Log:
    - jbj: permit multiple triggers to fire from packages.

  Summary:
    Revision    Changes     Path
    1.2554      +1  -0      rpm/CHANGES
    2.311       +78 -93     rpm/lib/psm.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.2553 -r1.2554 CHANGES
  --- rpm/CHANGES       20 Sep 2008 15:31:47 -0000      1.2553
  +++ rpm/CHANGES       20 Sep 2008 21:10:30 -0000      1.2554
  @@ -1,5 +1,6 @@
   
   5.1.0 -> 5.2a0:
  +    - jbj: permit multiple triggers to fire from packages.
       - jbj: don't install symclash.* to avoid picking up a dependency on 
python.
       - jbj: fix: check added file names against installed conflicts.
       - jbj: update nl.po (Translation Project).
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/psm.c
  ============================================================================
  $ cvs diff -u -r2.310 -r2.311 psm.c
  --- rpm/lib/psm.c     7 Sep 2008 15:10:55 -0000       2.310
  +++ rpm/lib/psm.c     20 Sep 2008 21:10:31 -0000      2.311
  @@ -1013,35 +1013,35 @@
    * @param sourceH
    * @param triggeredH
    * @param arg2
  - * @param triggersAlreadyRun
  + * @param done
    * @return
    */
   static rpmRC handleOneTrigger(const rpmpsm psm,
                        Header sourceH, Header triggeredH,
  -                     int arg2, unsigned char * triggersAlreadyRun)
  +                     int arg2, /[EMAIL PROTECTED]@*/ unsigned char * done)
        /[EMAIL PROTECTED] rpmGlobalMacroContext, h_errno, fileSystem, [EMAIL 
PROTECTED]/
        /[EMAIL PROTECTED] psm, sourceH, triggeredH, *triggersAlreadyRun,
                rpmGlobalMacroContext, fileSystem, internalState @*/
   {
       int scareMem = 0;
  -    HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
  +    HE_t Nhe = memset(alloca(sizeof(*Nhe)), 0, sizeof(*Nhe));
  +    HE_t Ihe = memset(alloca(sizeof(*Ihe)), 0, sizeof(*Ihe));
  +    HE_t She = memset(alloca(sizeof(*She)), 0, sizeof(*She));
  +    HE_t Phe = memset(alloca(sizeof(*Phe)), 0, sizeof(*Phe));
       const rpmts ts = psm->ts;
       rpmds trigger = NULL;
  -    const char ** triggerScripts;
  -    const char ** triggerProgs;
  -    rpmuint32_t * triggerIndices;
       const char * sourceName;
       const char * triggerName;
       rpmRC rc = RPMRC_OK;
       int xx;
       int i;
   
  -    he->tag = RPMTAG_NAME;
  -    xx = headerGet(sourceH, he, 0);
  -    sourceName = he->p.str;
  -    he->tag = RPMTAG_NAME;
  -    xx = headerGet(triggeredH, he, 0);
  -    triggerName = he->p.str;
  +    Nhe->tag = RPMTAG_NAME;
  +    xx = headerGet(sourceH, Nhe, 0);
  +    sourceName = Nhe->p.str;
  +    Nhe->tag = RPMTAG_NAME;
  +    xx = headerGet(triggeredH, Nhe, 0);
  +    triggerName = Nhe->p.str;
   
       trigger = rpmdsInit(rpmdsNew(triggeredH, RPMTAG_TRIGGERNAME, scareMem));
       if (trigger == NULL)
  @@ -1052,63 +1052,54 @@
       while ((i = rpmdsNext(trigger)) >= 0) {
        const char * Name;
        rpmuint32_t Flags = rpmdsFlags(trigger);
  +     int arg1;
  +     int index;
  +
  +     if (!(Flags & psm->sense))
  +         continue;
   
        if ((Name = rpmdsN(trigger)) == NULL)
            continue;   /* XXX can't happen */
  -
        if (strcmp(Name, sourceName))
            continue;
  -     if (!(Flags & psm->sense))
  -         continue;
  -
  -     /*
  -      * XXX Trigger on any provided dependency, not just the package NEVR.
  -      */
  +     /* XXX Trigger on any provided dependency, not just the package NEVR. */
        if (!rpmdsAnyMatchesDep(sourceH, trigger, 1))
            continue;
  +     if (done && done[i])
  +         continue;
   
  -     he->tag = RPMTAG_TRIGGERINDEX;
  -     xx = headerGet(triggeredH, he, 0);
  -     triggerIndices = he->p.ui32p;
  -     he->tag = RPMTAG_TRIGGERSCRIPTS;
  -     xx = headerGet(triggeredH, he, 0);
  -     triggerScripts = he->p.argv;
  -     he->tag = RPMTAG_TRIGGERSCRIPTPROG;
  -     xx = headerGet(triggeredH, he, 0);
  -     triggerProgs = he->p.argv;
  -
  -     if (triggerIndices && triggerScripts && triggerProgs) {
  -         int arg1;
  -         int index;
  -
  -         arg1 = rpmdbCountPackages(rpmtsGetRdb(ts), triggerName);
  -         if (arg1 < 0) {
  -             /* XXX W2DO? fails as "execution of script failed" */
  -             rc = RPMRC_FAIL;
  -         } else {
  -             arg1 += psm->countCorrection;
  -             index = triggerIndices[i];
  -             if (triggersAlreadyRun == NULL ||
  -                 triggersAlreadyRun[index] == 0)
  -             {
  -                 rc = runScript(psm, triggeredH, "%trigger", 1,
  -                         triggerProgs + index, triggerScripts[index],
  -                         arg1, arg2);
  -                 if (triggersAlreadyRun != NULL)
  -                     triggersAlreadyRun[index] = 1;
  -             }
  -         }
  +     Ihe->tag = RPMTAG_TRIGGERINDEX;
  +     xx = headerGet(triggeredH, Ihe, 0);
  +     if (!(xx && Ihe->p.ui32p && Ihe->c)) goto bottom;
  +
  +     She->tag = RPMTAG_TRIGGERSCRIPTS;
  +     xx = headerGet(triggeredH, She, 0);
  +     if (!(xx && She->p.argv && She->c)) goto bottom;
  +
  +     Phe->tag = RPMTAG_TRIGGERSCRIPTPROG;
  +     xx = headerGet(triggeredH, Phe, 0);
  +     if (!(xx && Phe->p.argv && Phe->c)) goto bottom;
  +
  +     arg1 = rpmdbCountPackages(rpmtsGetRdb(ts), triggerName);
  +     if (arg1 < 0) {
  +         /* XXX W2DO? fails as "execution of script failed" */
  +         rc = RPMRC_FAIL;
  +         goto bottom;
        }
   
  -     triggerIndices = _free(triggerIndices);
  -     triggerScripts = _free(triggerScripts);
  -     triggerProgs = _free(triggerProgs);
  +     arg1 += psm->countCorrection;
  +     index = Ihe->p.ui32p[i];
  +     /* XXX FIXME: permit trigger scripts with arguments. */
  +     rc = runScript(psm, triggeredH, "%trigger", 1,
  +                         Phe->p.argv + index, She->p.argv[index],
  +                         arg1, arg2);
  +     if (done)
  +         done[i] = 1;
   
  -     /*
  -      * Each target/source header pair can only result in a single
  -      * script being run.
  -      */
  -     break;
  +bottom:
  +     Ihe->p.ptr = _free(Ihe->p.ptr);
  +     She->p.ptr = _free(She->p.ptr);
  +     Phe->p.ptr = _free(Phe->p.ptr);
       }
   
       trigger = rpmdsFree(trigger);
  @@ -1173,59 +1164,53 @@
        /[EMAIL PROTECTED] psm, rpmGlobalMacroContext,
                fileSystem, internalState @*/
   {
  -    HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
  +    HE_t Nhe = memset(alloca(sizeof(*Nhe)), 0, sizeof(*Nhe));
  +    HE_t Ihe = memset(alloca(sizeof(*Ihe)), 0, sizeof(*Ihe));
  +    HE_t Fhe = memset(alloca(sizeof(*Fhe)), 0, sizeof(*Fhe));
       const rpmts ts = psm->ts;
       rpmfi fi = psm->fi;
  -    const char ** triggerNames;
  -    int numTriggers;
  -    rpmuint32_t * triggerIndices;
  -    int numTriggerIndices;
  -    unsigned char * triggersRun;
  +    unsigned char * done = NULL;
  +    Header sourceH = NULL;
  +    unsigned i;
       rpmRC rc = RPMRC_OK;
  -    size_t nb;
       int xx;
   
   assert(fi->h != NULL);
       if (fi->h == NULL)       return rc;      /* XXX can't happen */
   
  -    he->tag = RPMTAG_TRIGGERNAME;
  -    xx = headerGet(fi->h, he, 0);
  -    triggerNames = he->p.argv;
  -    numTriggers = he->c;
  -    he->tag = RPMTAG_TRIGGERINDEX;
  -    xx = headerGet(fi->h, he, 0);
  -    triggerIndices = he->p.ui32p;
  -    numTriggerIndices = he->c;
  +    Nhe->tag = RPMTAG_TRIGGERNAME;
  +    xx = headerGet(fi->h, Nhe, 0);
  +    if (!(xx && Nhe->p.argv && Nhe->c)) goto exit;
  +    Ihe->tag = RPMTAG_TRIGGERINDEX;
  +    xx = headerGet(fi->h, Ihe, 0);
  +    if (!(xx && Ihe->p.ui32p && Ihe->c)) goto exit;
  +    Fhe->tag = RPMTAG_TRIGGERFLAGS;
  +    xx = headerGet(fi->h, Fhe, 0);
  +    if (!(xx && Fhe->p.ui32p && Fhe->c)) goto exit;
   
  -    if (!(triggerNames && numTriggers > 0 && triggerIndices && 
numTriggerIndices > 0))
  -     goto exit;
  +    done = xcalloc(Ihe->c, sizeof(*done));
   
  -    nb = sizeof(*triggersRun) * numTriggerIndices;
  -    triggersRun = memset(alloca(nb), 0, nb);
  -
  -    {        Header sourceH = NULL;
  -     int i;
  -
  -     for (i = 0; i < numTriggers; i++) {
  -         rpmdbMatchIterator mi;
  +    for (i = 0; i < Nhe->c; i++) {
  +     rpmdbMatchIterator mi;
   
  -         if (triggersRun[triggerIndices[i]] != 0) continue;
  +     if (!(Fhe->p.ui32p[i] & psm->sense))
  +             continue;
        
  -         mi = rpmtsInitIterator(ts, RPMTAG_NAME, triggerNames[i], 0);
  +     mi = rpmtsInitIterator(ts, RPMTAG_NAME, Nhe->p.argv[i], 0);
   
  -         while((sourceH = rpmdbNextIterator(mi)) != NULL) {
  +     while((sourceH = rpmdbNextIterator(mi)) != NULL) {
                rc |= handleOneTrigger(psm, sourceH, fi->h,
  -                             rpmdbGetIteratorCount(mi),
  -                             triggersRun);
  -         }
  -
  -         mi = rpmdbFreeIterator(mi);
  +                             rpmdbGetIteratorCount(mi), done);
        }
  +
  +     mi = rpmdbFreeIterator(mi);
       }
   
   exit:
  -    triggerIndices = _free(triggerIndices);
  -    triggerNames = _free(triggerNames);
  +    done = _free(done);
  +    Fhe->p.ptr = _free(Fhe->p.ptr);
  +    Ihe->p.ptr = _free(Ihe->p.ptr);
  +    Nhe->p.ptr = _free(Nhe->p.ptr);
       return rc;
   }
   
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                rpm-cvs@rpm5.org

Reply via email to