[Rpm-maint] [PATCH] Change how transaction element is computed (RhBug:751574).

Ales Kozumplik akozumpl at redhat.com
Fri Dec 2 13:17:33 UTC 2011


- Previously, we looked at all the files in the package and their
  colors. We ORed colors of those packages that participated in Provides
  or Requires dependencies. This made the transaction element color
  volatile, changing e.g. when only a new dependency of an already present
  file was introduced.
- Now the header color is used for TE color as well (ORing colors of all
  files present).
- Colors are now compared against TE color with bitwise AND.
- depends.c:skipColor() is not longer a macro, to prevent double
  evaluation of the 'ocolor' parameter.
---
 lib/depends.c |   28 +++++++++++++++++++++-------
 lib/order.c   |    6 +++---
 lib/rpmal.c   |    4 ++--
 lib/rpmte.c   |    8 +++-----
 4 files changed, 29 insertions(+), 17 deletions(-)

diff --git a/lib/depends.c b/lib/depends.c
index 43247f9..64356fc 100644
--- a/lib/depends.c
+++ b/lib/depends.c
@@ -129,8 +129,19 @@ static rpmdbMatchIterator rpmtsPrunedIterator(rpmts ts, rpmDbiTagVal tag,
     return mi;
 }
 
-#define skipColor(_tscolor, _color, _ocolor) \
-	((_tscolor) && (_color) && (_ocolor) && !((_color) & (_ocolor)))
+/**
+ * Decides whether to skip a package upgrade/obsoletion on TE color.
+ *
+ * @param tscolor	color of this transaction
+ * @param color 	color of this transaction element
+ * @param ocolor 	header color of the upgraded/obsoleted package
+ *
+ * @return		non-zero if the package should be skipped
+ */
+static int skipColor(rpm_color_t tscolor, rpm_color_t color, rpm_color_t ocolor)
+{
+    return tscolor && color && ocolor && !(color & ocolor);
+}
 
 /* Add erase elements for older packages of same color (if any). */
 static void addUpgradeErasures(rpmts ts, tsMembers tsmem, rpm_color_t tscolor,
@@ -175,9 +186,14 @@ static void addObsoleteErasures(rpmts ts, tsMembers tsmem, rpm_color_t tscolor,
 
 	while((oh = rpmdbNextIterator(mi)) != NULL) {
 	    /* Ignore colored packages not in our rainbow. */
-	    if (skipColor(tscolor, hcolor, 
-			  headerGetNumber(oh, RPMTAG_HEADERCOLOR)))
+	    char * ohNEVRA = headerGetAsString(oh, RPMTAG_NEVRA);
+	    if (skipColor(tscolor, hcolor,
+			  headerGetNumber(oh, RPMTAG_HEADERCOLOR))) {
+		rpmlog(RPMLOG_DEBUG, "  Skipped obsoleting %s, color mismatch\n",
+		       ohNEVRA);
+		free(ohNEVRA);
 		continue;
+	    }
 
 	    /*
 	     * Rpm prior to 3.0.3 does not have versioned obsoletes.
@@ -185,13 +201,11 @@ static void addObsoleteErasures(rpmts ts, tsMembers tsmem, rpm_color_t tscolor,
 	     */
 	    if (rpmdsEVR(obsoletes) == NULL
                 || rpmdsAnyMatchesDep(oh, obsoletes, _rpmds_nopromote)) {
-		char * ohNEVRA = headerGetAsString(oh, RPMTAG_NEVRA);
 		rpmlog(RPMLOG_DEBUG, "  Obsoletes: %s\t\terases %s\n",
 			rpmdsDNEVR(obsoletes)+2, ohNEVRA);
-		free(ohNEVRA);
-
 		removePackage(ts, oh, p);
 	    }
+	    free(ohNEVRA);
 	}
 	rpmdbFreeIterator(mi);
     }
diff --git a/lib/order.c b/lib/order.c
index 0c8d1cb..77221ed 100644
--- a/lib/order.c
+++ b/lib/order.c
@@ -221,9 +221,9 @@ static void addQ(tsortInfo p, tsortInfo * qp, tsortInfo * rp,
     }
 
     if (rpmteType(p->te) == TR_ADDED)
-	tailcond = (pcolor && pcolor != prefcolor);
+	tailcond = (pcolor && !(pcolor & prefcolor));
     else
-	tailcond = (pcolor && pcolor == prefcolor);
+	tailcond = (pcolor && (pcolor & prefcolor));
 
     /* Find location in queue using metric tsi_qcnt and color. */
     for (qprev = NULL, q = (*qp);
@@ -231,7 +231,7 @@ static void addQ(tsortInfo p, tsortInfo * qp, tsortInfo * rp,
 	 qprev = q, q = q->tsi_suc)
     {
 	/* Place preferred color towards queue head on install, tail on erase */
-	if (tailcond && (pcolor != rpmteColor(q->te)))
+	if (tailcond && !(pcolor & rpmteColor(q->te)))
 	    continue;
 
 	if (q->tsi_qcnt <= p->tsi_qcnt)
diff --git a/lib/rpmal.c b/lib/rpmal.c
index bbf0abb..b7737a1 100644
--- a/lib/rpmal.c
+++ b/lib/rpmal.c
@@ -386,9 +386,9 @@ rpmalSatisfiesDepend(const rpmal al, const rpmds ds)
 	    for (rpmte *p = providers; *p; p++) {
 		rpm_color_t tecolor = rpmteColor(*p);
 		if (dscolor) {
-		    if (dscolor == tecolor) best = *p;
+		    if (dscolor & tecolor) best = *p;
 		} else if (al->prefcolor) {
-		    if (al->prefcolor == tecolor) best = *p;
+		    if (al->prefcolor & tecolor) best = *p;
 		}
 		if (best) break;
 	    }
diff --git a/lib/rpmte.c b/lib/rpmte.c
index 5b5d2ad..48d6c77 100644
--- a/lib/rpmte.c
+++ b/lib/rpmte.c
@@ -262,6 +262,7 @@ static void addTE(rpmte p, Header h, fnpyKey key, rpmRelocation * relocs)
 
     rpmteColorDS(p, RPMTAG_PROVIDENAME);
     rpmteColorDS(p, RPMTAG_REQUIRENAME);
+    p->color = headerGetNumber(h, RPMTAG_HEADERCOLOR);
     return;
 }
 
@@ -611,11 +612,8 @@ assert (ix < Count);
 
     /* Set color values in dependency set. */
     ds = rpmdsInit(ds);
-    while ((i = rpmdsNext(ds)) >= 0) {
-	val = colors[i];
-	te->color |= val;
-	(void) rpmdsSetColor(ds, val);
-    }
+    while ((i = rpmdsNext(ds)) >= 0)
+	(void) rpmdsSetColor(ds, colors[i]);
     free(colors);
 }
 
-- 
1.7.7.3



More information about the Rpm-maint mailing list