Blob Blame History Raw
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);