102 lines
3.1 KiB
Diff
102 lines
3.1 KiB
Diff
diff --git a/lib/transaction.c b/lib/transaction.c
|
|
index 7e432a3..42f1b12 100644
|
|
--- a/lib/transaction.c
|
|
+++ b/lib/transaction.c
|
|
@@ -910,33 +910,51 @@ static int runTransScripts(rpmts ts, rpmTag stag)
|
|
if (script == NULL && scriptprog == NULL)
|
|
continue;
|
|
|
|
- p->fd = rpmtsNotify(ts, p, RPMCALLBACK_INST_OPEN_FILE, 0, 0);
|
|
- p->h = NULL;
|
|
- if (rpmteFd(p) != NULL) {
|
|
- rpmVSFlags ovsflags = rpmtsVSFlags(ts);
|
|
- rpmVSFlags vsflags = ovsflags | RPMVSF_NEEDPAYLOAD;
|
|
- rpmRC rpmrc;
|
|
- ovsflags = rpmtsSetVSFlags(ts, vsflags);
|
|
- rpmrc = rpmReadPackageFile(ts, rpmteFd(p),
|
|
- rpmteNEVR(p), &p->h);
|
|
- vsflags = rpmtsSetVSFlags(ts, ovsflags);
|
|
- switch (rpmrc) {
|
|
- default:
|
|
- /* FIX: notify annotations */
|
|
- p->fd = rpmtsNotify(ts, p, RPMCALLBACK_INST_CLOSE_FILE, 0, 0);
|
|
- p->fd = NULL;
|
|
- break;
|
|
- case RPMRC_NOTTRUSTED:
|
|
- case RPMRC_NOKEY:
|
|
- case RPMRC_OK:
|
|
- break;
|
|
+ if (stag==RPMTAG_POSTTRANS) {
|
|
+ /* get (already installed) header from rpmdb */
|
|
+ rpmdbMatchIterator mi;
|
|
+ mi = rpmtsInitIterator(ts, RPMTAG_NAME, rpmteN(p), 0);
|
|
+ xx = rpmdbSetIteratorRE(mi, RPMTAG_EPOCH, RPMMIRE_STRCMP,
|
|
+ rpmteE(p));
|
|
+ xx = rpmdbSetIteratorRE(mi, RPMTAG_VERSION, RPMMIRE_STRCMP,
|
|
+ rpmteV(p));
|
|
+ xx = rpmdbSetIteratorRE(mi, RPMTAG_RELEASE, RPMMIRE_STRCMP,
|
|
+ rpmteR(p));
|
|
+ xx = rpmdbSetIteratorRE(mi, RPMTAG_ARCH, RPMMIRE_STRCMP,
|
|
+ rpmteA(p));
|
|
+
|
|
+ p->h = headerCopy(rpmdbNextIterator(mi));
|
|
+ mi = rpmdbFreeIterator(mi);
|
|
+ } else {
|
|
+ /* reread rpm file */
|
|
+ p->fd = rpmtsNotify(ts, p, RPMCALLBACK_INST_OPEN_FILE, 0, 0);
|
|
+ p->h = NULL;
|
|
+ if (rpmteFd(p) != NULL) {
|
|
+ rpmVSFlags ovsflags = rpmtsVSFlags(ts);
|
|
+ rpmVSFlags vsflags = ovsflags | RPMVSF_NEEDPAYLOAD;
|
|
+ rpmRC rpmrc;
|
|
+ ovsflags = rpmtsSetVSFlags(ts, vsflags);
|
|
+ rpmrc = rpmReadPackageFile(ts, rpmteFd(p),
|
|
+ rpmteNEVR(p), &p->h);
|
|
+ vsflags = rpmtsSetVSFlags(ts, ovsflags);
|
|
+ switch (rpmrc) {
|
|
+ default:
|
|
+ /* FIX: notify annotations */
|
|
+ p->fd = rpmtsNotify(ts, p, RPMCALLBACK_INST_CLOSE_FILE, 0, 0);
|
|
+ p->fd = NULL;
|
|
+ break;
|
|
+ case RPMRC_NOTTRUSTED:
|
|
+ case RPMRC_NOKEY:
|
|
+ case RPMRC_OK:
|
|
+ break;
|
|
+ }
|
|
}
|
|
- }
|
|
+ }
|
|
|
|
- if (rpmteFd(p) != NULL) {
|
|
- fi = rpmfiNew(ts, p->h, RPMTAG_BASENAMES, 1);
|
|
+ if (p->h) {
|
|
+ fi = rpmfiNew(ts, p->h, RPMTAG_BASENAMES, 1);
|
|
if (fi != NULL) { /* XXX can't happen */
|
|
- if (stag == RPMTAG_PRETRANS) {
|
|
+ if (stag == RPMTAG_PRETRANS) { /* isn't this the same? */
|
|
fi->te = p;
|
|
p->fi = fi;
|
|
} else {
|
|
@@ -944,14 +962,16 @@ static int runTransScripts(rpmts ts, rpmTag stag)
|
|
p->fi->te = p;
|
|
}
|
|
}
|
|
+ fi->h = p->h; // is this right?
|
|
psm = rpmpsmNew(ts, p, p->fi);
|
|
assert(psm != NULL);
|
|
xx = rpmpsmScriptStage(psm, stag, progtag);
|
|
psm = rpmpsmFree(psm);
|
|
-
|
|
- (void) rpmtsNotify(ts, p, RPMCALLBACK_INST_CLOSE_FILE, 0, 0);
|
|
- p->fd = NULL;
|
|
- p->h = headerFree(p->h);
|
|
+ if (p->fd != NULL) {
|
|
+ (void) rpmtsNotify(ts, p, RPMCALLBACK_INST_CLOSE_FILE, 0, 0);
|
|
+ p->fd = NULL;
|
|
+ }
|
|
+ p->h = fi->h = headerFree(p->h);
|
|
}
|
|
}
|
|
pi = rpmtsiFree(pi);
|