[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