Separate PSM goals from individual stages
authorPanu Matilainen <pmatilai@redhat.com>
Thu, 25 Feb 2010 11:54:51 +0000 (13:54 +0200)
committerPanu Matilainen <pmatilai@redhat.com>
Thu, 25 Feb 2010 11:55:24 +0000 (13:55 +0200)
- no functional changes - supposedly
- nothing outside the PSM should need to know anything about its
  internals, the general goals need to be sufficient (not the case yet)
- define goals to match rpmteType so there's no need to re-re-re-map
  the operations
- loose the big unused individual stage string switch

lib/psm.c
lib/psm.h
lib/transaction.c

index 94e5273..1b46500 100644 (file)
--- a/lib/psm.c
+++ b/lib/psm.c
@@ -37,7 +37,7 @@ struct rpmpsm_s {
     rpmts ts;                  /*!< transaction set */
     rpmte te;                  /*!< current transaction element */
     rpmfi fi;                  /*!< transaction element file info */
-    const char * stepName;
+    const char * goalName;
     char * rpmio_flags;
     char * failedFile;
     int scriptTag;             /*!< Scriptlet data tag. */
@@ -324,7 +324,7 @@ rpmRC rpmInstallSourcePackage(rpmts ts, FD_t fd,
     }
 
     psm = rpmpsmNew(ts, te);
-    psm->goal = PSM_PKGINSTALL;
+    psm->goal = PKG_INSTALL;
 
        /* FIX: psm->fi->dnl should be owned. */
     if (rpmpsmStage(psm, PSM_PROCESS) == RPMRC_OK)
@@ -605,40 +605,6 @@ exit:
     return rc;
 }
 
-static const char * pkgStageString(pkgStage a)
-{
-    switch(a) {
-    case PSM_UNKNOWN:          return "unknown";
-
-    case PSM_PKGINSTALL:       return "  install";
-    case PSM_PKGERASE:         return "    erase";
-    case PSM_PKGCOMMIT:                return "   commit";
-
-    case PSM_INIT:             return "init";
-    case PSM_PRE:              return "pre";
-    case PSM_PROCESS:          return "process";
-    case PSM_POST:             return "post";
-    case PSM_UNDO:             return "undo";
-    case PSM_FINI:             return "fini";
-
-    case PSM_CREATE:           return "create";
-    case PSM_NOTIFY:           return "notify";
-    case PSM_DESTROY:          return "destroy";
-    case PSM_COMMIT:           return "commit";
-
-    case PSM_CHROOT_IN:                return "chrootin";
-    case PSM_CHROOT_OUT:       return "chrootout";
-    case PSM_SCRIPT:           return "script";
-    case PSM_TRIGGERS:         return "triggers";
-    case PSM_IMMED_TRIGGERS:   return "immedtriggers";
-
-    case PSM_RPMDB_ADD:                return "rpmdbadd";
-    case PSM_RPMDB_REMOVE:     return "rpmdbremove";
-
-    default:                   return "???";
-    }
-}
-
 rpmpsm rpmpsmUnlink(rpmpsm psm, const char * msg)
 {
     if (psm == NULL) return NULL;
@@ -689,7 +655,7 @@ rpmRC rpmpsmScriptStage(rpmpsm psm, rpmTag scriptTag)
     assert(psm != NULL);
     psm->scriptTag = scriptTag;
     if (scriptTag == RPMTAG_VERIFYSCRIPT) {
-       psm->stepName = "verify";
+       psm->goalName = "verify";
     }
     return rpmpsmStage(psm, PSM_SCRIPT);
 }
@@ -731,7 +697,7 @@ rpmRC rpmpsmStage(rpmpsm psm, pkgStage stage)
        break;
     case PSM_INIT:
        rpmlog(RPMLOG_DEBUG, "%s: %s has %d files, test = %d\n",
-               psm->stepName, rpmteNEVR(psm->te),
+               psm->goalName, rpmteNEVR(psm->te),
                rpmfiFC(fi), (rpmtsFlags(ts) & RPMTRANS_FLAG_TEST));
 
        /*
@@ -745,7 +711,7 @@ rpmRC rpmpsmStage(rpmpsm psm, pkgStage stage)
            break;
        }
 
-       if (psm->goal == PSM_PKGINSTALL) {
+       if (psm->goal == PKG_INSTALL) {
            rpmdbMatchIterator mi;
            Header oh;
            int fc = rpmfiFC(fi);
@@ -799,7 +765,7 @@ rpmRC rpmpsmStage(rpmpsm psm, pkgStage stage)
        
            rc = RPMRC_OK;
        }
-       if (psm->goal == PSM_PKGERASE) {
+       if (psm->goal == PKG_ERASE) {
            psm->scriptArg = psm->npkgs_installed - 1;
        }
        break;
@@ -810,7 +776,7 @@ rpmRC rpmpsmStage(rpmpsm psm, pkgStage stage)
        rc = rpmpsmNext(psm, PSM_CHROOT_IN);
        if (rc) break;
 
-       if (psm->goal == PSM_PKGINSTALL) {
+       if (psm->goal == PKG_INSTALL) {
            psm->scriptTag = RPMTAG_PREIN;
            psm->sense = RPMSENSE_TRIGGERPREIN;
            psm->countCorrection = 0;   /* XXX is this correct?!? */
@@ -831,7 +797,7 @@ rpmRC rpmpsmStage(rpmpsm psm, pkgStage stage)
            }
        }
 
-       if (psm->goal == PSM_PKGERASE) {
+       if (psm->goal == PKG_ERASE) {
            psm->scriptTag = RPMTAG_PREUN;
            psm->sense = RPMSENSE_TRIGGERUN;
            psm->countCorrection = -1;
@@ -853,7 +819,7 @@ rpmRC rpmpsmStage(rpmpsm psm, pkgStage stage)
     case PSM_PROCESS:
        if (rpmtsFlags(ts) & RPMTRANS_FLAG_TEST)        break;
 
-       if (psm->goal == PSM_PKGINSTALL) {
+       if (psm->goal == PKG_INSTALL) {
            FD_t payload = NULL;
 
            if (rpmtsFlags(ts) & RPMTRANS_FLAG_JUSTDB)  break;
@@ -910,7 +876,7 @@ rpmRC rpmpsmStage(rpmpsm psm, pkgStage stage)
                break;
            }
        }
-       if (psm->goal == PSM_PKGERASE) {
+       if (psm->goal == PKG_ERASE) {
            int fc = rpmfiFC(fi);
 
            if (rpmtsFlags(ts) & RPMTRANS_FLAG_JUSTDB)  break;
@@ -943,7 +909,7 @@ rpmRC rpmpsmStage(rpmpsm psm, pkgStage stage)
     case PSM_POST:
        if (rpmtsFlags(ts) & RPMTRANS_FLAG_TEST)        break;
 
-       if (psm->goal == PSM_PKGINSTALL) {
+       if (psm->goal == PKG_INSTALL) {
            rpm_time_t installTime = (rpm_time_t) time(NULL);
            rpmfs fs = rpmteGetFileStates(psm->te);
            rpm_count_t fc = rpmfsFC(fs);
@@ -993,7 +959,7 @@ rpmRC rpmpsmStage(rpmpsm psm, pkgStage stage)
                rc = markReplacedFiles(psm);
 
        }
-       if (psm->goal == PSM_PKGERASE) {
+       if (psm->goal == PKG_ERASE) {
 
            psm->scriptTag = RPMTAG_POSTUN;
            psm->sense = RPMSENSE_TRIGGERPOSTUN;
@@ -1027,10 +993,10 @@ rpmRC rpmpsmStage(rpmpsm psm, pkgStage stage)
            if (psm->failedFile)
                rpmlog(RPMLOG_ERR,
                        _("%s failed on file %s: %s\n"),
-                       psm->stepName, psm->failedFile, cpioStrerror(rc));
+                       psm->goalName, psm->failedFile, cpioStrerror(rc));
            else
                rpmlog(RPMLOG_ERR, _("%s failed: %s\n"),
-                       psm->stepName, cpioStrerror(rc));
+                       psm->goalName, cpioStrerror(rc));
 
            /* XXX notify callback on error. */
            psm->what = RPMCALLBACK_CPIO_ERROR;
@@ -1039,7 +1005,7 @@ rpmRC rpmpsmStage(rpmpsm psm, pkgStage stage)
            xx = rpmpsmNext(psm, PSM_NOTIFY);
        }
 
-       if (psm->goal == PSM_PKGERASE) {
+       if (psm->goal == PKG_ERASE) {
            if (psm->te != NULL) 
                rpmteSetHeader(psm->te, NULL);
        }
@@ -1048,17 +1014,6 @@ rpmRC rpmpsmStage(rpmpsm psm, pkgStage stage)
        fi->apath = _free(fi->apath);
        break;
 
-    case PSM_PKGINSTALL:
-    case PSM_PKGERASE:
-       psm->goal = stage;
-       psm->stepName = pkgStageString(stage);
-
-       rc = rpmpsmNext(psm, PSM_INIT);
-       if (!rc) rc = rpmpsmNext(psm, PSM_PRE);
-       if (!rc) rc = rpmpsmNext(psm, PSM_PROCESS);
-       if (!rc) rc = rpmpsmNext(psm, PSM_POST);
-       xx = rpmpsmNext(psm, PSM_FINI);
-       break;
     case PSM_PKGCOMMIT:
        break;
 
@@ -1155,3 +1110,36 @@ rpmRC rpmpsmStage(rpmpsm psm, pkgStage stage)
 
     return rc;
 }
+
+static const char * pkgGoalString(pkgGoal goal)
+{
+    switch(goal) {
+    case PKG_INSTALL:  return "  install";
+    case PKG_ERASE:    return "    erase";
+    default:           return "???";
+    }
+}
+
+rpmRC rpmpsmRun(rpmpsm psm, pkgGoal goal)
+{
+    rpmRC rc = RPMRC_FAIL;
+
+    if (psm) {
+       psm->goal = goal;
+       psm->goalName = pkgGoalString(goal);
+
+       switch (goal) {
+       case PKG_INSTALL:
+       case PKG_ERASE:
+           rc = rpmpsmNext(psm, PSM_INIT);
+           if (!rc) rc = rpmpsmNext(psm, PSM_PRE);
+           if (!rc) rc = rpmpsmNext(psm, PSM_PROCESS);
+           if (!rc) rc = rpmpsmNext(psm, PSM_POST);
+           (void) rpmpsmNext(psm, PSM_FINI);
+           break;
+       default:
+           break;
+       }
+    }
+    return rc;
+}
index d9cd824..059154d 100644 (file)
--- a/lib/psm.h
+++ b/lib/psm.h
@@ -6,12 +6,19 @@
  * Package state machine to handle a package from a transaction set.
  */
 
-#include <rpm/rpmcallback.h>
+#include <rpm/rpmte.h>
 
 extern int _psm_debug;
 
 typedef struct rpmpsm_s * rpmpsm;
 
+typedef enum pkgGoal_e {
+    PKG_NONE           = 0,
+    /* permit using rpmteType() for install + erase goals */
+    PKG_INSTALL                = TR_ADDED,
+    PKG_ERASE          = TR_REMOVED,
+} pkgGoal;
+
 typedef enum pkgStage_e {
     PSM_UNKNOWN                =  0,
     PSM_INIT           =  1,
@@ -21,8 +28,6 @@ typedef enum pkgStage_e {
     PSM_UNDO           =  5,
     PSM_FINI           =  6,
 
-    PSM_PKGINSTALL     =  7,
-    PSM_PKGERASE       =  8,
     PSM_PKGCOMMIT      = 10,
 
     PSM_CREATE         = 17,
@@ -81,6 +86,9 @@ rpmpsm rpmpsmFree(rpmpsm psm);
 RPM_GNUC_INTERNAL
 rpmpsm rpmpsmNew(rpmts ts, rpmte te);
 
+RPM_GNUC_INTERNAL
+rpmRC rpmpsmRun(rpmpsm psm, pkgGoal goal);
+
 /**
  * Package state machine driver.
  * @param psm          package state machine data
index fb23c98..e91901a 100644 (file)
@@ -1443,20 +1443,9 @@ static int rpmtsProcess(rpmts ts)
                rpmteNEVR(p), rpmteA(p), rpmteO(p), rpmteColor(p));
 
        if (rpmteOpen(p, ts, 1)) {
-           rpmpsm psm = NULL;
-           pkgStage stage = PSM_UNKNOWN;
-
-           switch (tetype) {
-           case TR_ADDED:
-               stage = PSM_PKGINSTALL;
-               break;
-           case TR_REMOVED:
-               stage = PSM_PKGERASE;
-               break;
-           }
-           psm = rpmpsmNew(ts, p);
+           rpmpsm psm = rpmpsmNew(ts, p);
            (void) rpmswEnter(rpmtsOp(ts, op), 0);
-           failed = rpmpsmStage(psm, stage);
+           failed = rpmpsmRun(psm, rpmteType(p));
            (void) rpmswExit(rpmtsOp(ts, op), 0);
            psm = rpmpsmFree(psm);
            rpmteClose(p, ts, 1);