diff options
-rw-r--r-- | lib/rpmfiles.h | 7 | ||||
-rw-r--r-- | lib/rpmtriggers.c | 40 |
2 files changed, 30 insertions, 17 deletions
diff --git a/lib/rpmfiles.h b/lib/rpmfiles.h index acac6fdf9..1ef55c7c0 100644 --- a/lib/rpmfiles.h +++ b/lib/rpmfiles.h @@ -137,14 +137,17 @@ typedef rpmFlags rpmfiFlags; (RPMFI_NOFILECLASS | RPMFI_NOFILEDEPS | RPMFI_NOFILELANGS | \ RPMFI_NOFILECOLORS | RPMFI_NOFILEVERIFYFLAGS) -#define RPMFI_FLAGS_ONLY_FILENAMES \ +#define RPMFI_FLAGS_FILETRIGGER \ (RPMFI_NOFILECLASS | RPMFI_NOFILEDEPS | RPMFI_NOFILELANGS | \ RPMFI_NOFILEUSER | RPMFI_NOFILEGROUP | RPMFI_NOFILEMODES | \ RPMFI_NOFILESIZES | RPMFI_NOFILECAPS | RPMFI_NOFILELINKTOS | \ RPMFI_NOFILEDIGESTS | RPMFI_NOFILEMTIMES | RPMFI_NOFILERDEVS | \ - RPMFI_NOFILEINODES | RPMFI_NOFILESTATES | RPMFI_NOFILECOLORS | \ + RPMFI_NOFILEINODES | RPMFI_NOFILECOLORS | \ RPMFI_NOFILEVERIFYFLAGS | RPMFI_NOFILEFLAGS) +#define RPMFI_FLAGS_ONLY_FILENAMES \ + (RPMFI_FLAGS_FILETRIGGER | RPMFI_NOFILESTATES) + typedef enum rpmFileIter_e { RPMFI_ITER_FWD = 0, RPMFI_ITER_BACK = 1, diff --git a/lib/rpmtriggers.c b/lib/rpmtriggers.c index 08ed14e0b..7935360f0 100644 --- a/lib/rpmtriggers.c +++ b/lib/rpmtriggers.c @@ -11,6 +11,7 @@ #include "lib/rpmdb_internal.h" #include "lib/rpmds_internal.h" #include "lib/rpmfi_internal.h" +#include "lib/rpmte_internal.h" #include "lib/rpmchroot.h" #define TRIGGER_PRIORITY_BOUND 10000 @@ -116,12 +117,15 @@ void rpmtriggersPrepPostUnTransFileTrigs(rpmts ts, rpmte te) char pfx[keylen + 1]; memcpy(pfx, key, keylen); pfx[keylen] = '\0'; - /* Check if file trigger matches any file in this te */ + /* Check if file trigger matches any installed file in this te */ rpmfi fi = rpmfilesFindPrefix(files, pfx); - if (rpmfiFC(fi) > 0) { - /* If yes then store it */ - rpmdbAppendIterator(mi, rpmdbIndexIteratorPkgOffsets(ii), + while (rpmfiNext(fi) >= 0) { + if (RPMFILE_IS_INSTALLED(rpmfiFState(fi))) { + /* If yes then store it */ + rpmdbAppendIterator(mi, rpmdbIndexIteratorPkgOffsets(ii), rpmdbIndexIteratorNumPkgs(ii)); + break; + } } rpmfiFree(fi); } @@ -230,7 +234,7 @@ static rpmfiles rpmtsNextFiles(rpmts ts, rpmdbMatchIterator mi) h = rpmdbNextIterator(mi); if (h) { files = rpmfilesNew(pool, h, RPMTAG_BASENAMES, - RPMFI_FLAGS_ONLY_FILENAMES); + RPMFI_FLAGS_FILETRIGGER); } } @@ -243,17 +247,19 @@ typedef struct matchFilesIter_s { rpmds rpmdsTrigger; rpmfiles files; rpmfi fi; + rpmfs fs; const char *pfx; rpmdbMatchIterator pi; packageHash tranPkgs; } *matchFilesIter; -static matchFilesIter matchFilesIterator(rpmds trigger, rpmfiles files) +static matchFilesIter matchFilesIterator(rpmds trigger, rpmfiles files, rpmte te) { matchFilesIter mfi = xcalloc(1, sizeof(*mfi)); rpmdsInit(trigger); mfi->rpmdsTrigger = trigger; mfi->files = rpmfilesLink(files); + mfi->fs = rpmteGetFileStates(te); return mfi; } @@ -289,11 +295,13 @@ static const char *matchFilesNext(matchFilesIter mfi) if (!mfi->ts) do { /* Get next file from mfi->fi */ - rpmfiNext(mfi->fi); - matchFile = rpmfiFN(mfi->fi); - if (strlen(matchFile)) - break; matchFile = NULL; + while (matchFile == NULL && rpmfiNext(mfi->fi) >= 0) { + if (!XFA_SKIPPING(rpmfsGetAction(mfi->fs, rpmfiFX(mfi->fi)))) + matchFile = rpmfiFN(mfi->fi); + } + if (matchFile) + break; /* If we are done with current mfi->fi, create mfi->fi for next prefix */ fx = rpmdsNext(mfi->rpmdsTrigger); @@ -305,11 +313,13 @@ static const char *matchFilesNext(matchFilesIter mfi) /* or we iterate over files in rpmdb */ else do { - rpmfiNext(mfi->fi); - matchFile = rpmfiFN(mfi->fi); - if (strlen(matchFile)) - break; matchFile = NULL; + while (matchFile == NULL && rpmfiNext(mfi->fi) >= 0) { + if (RPMFILE_IS_INSTALLED(rpmfiFState(mfi->fi))) + matchFile = rpmfiFN(mfi->fi); + } + if (matchFile) + break; /* If we are done with current mfi->fi, create mfi->fi for next package */ rpmfilesFree(mfi->files); @@ -395,7 +405,7 @@ static int runHandleTriggersInPkg(rpmts ts, rpmte te, Header h, case 0: /* Create iterator over files in te that this trigger matches */ files = rpmteFiles(te); - mfi = matchFilesIterator(rpmdsTrigger, files); + mfi = matchFilesIterator(rpmdsTrigger, files, te); break; case 1: /* Create iterator over files in ts that this trigger matches */ |