[Rpm-maint] [PATCH] Allow deprecations to work accross colors (RhBug:713323)
Ales Kozumplik
akozumpl at redhat.com
Wed Dec 7 15:17:47 UTC 2011
This enables package maintainers to:
- Force removal of a no longer supported multilib library.
- Deprecate packages of different header color than the package's. Note:
even x86_64 packages can have header color 1 in which case we are
currently left with no means to deprecate them from another x86_64
package. (RhBug:751574)
---
lib/depends.c | 34 ++++++++++++++++++++++------------
1 files changed, 22 insertions(+), 12 deletions(-)
diff --git a/lib/depends.c b/lib/depends.c
index 43247f9..207a56e 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,
@@ -167,17 +178,18 @@ static void addObsoleteErasures(rpmts ts, tsMembers tsmem, rpm_color_t tscolor,
if ((Name = rpmdsN(obsoletes)) == NULL)
continue; /* XXX can't happen */
- /* XXX avoid self-obsoleting packages. */
- if (rstreq(rpmteN(p), Name))
- continue;
-
mi = rpmtsPrunedIterator(ts, RPMDBI_NAME, Name, 1);
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);
+ const char *oarch = headerGetString(oh, RPMTAG_ARCH);
+
+ /* avoid self-obsoleting packages */
+ if (rstreq(rpmteN(p), Name) && rstreq(rpmteA(p), oarch)) {
+ rpmlog(RPMLOG_DEBUG, " Not obsoleting: %s\n", ohNEVRA);
+ free(ohNEVRA);
continue;
+ }
/*
* Rpm prior to 3.0.3 does not have versioned obsoletes.
@@ -185,13 +197,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);
}
--
1.7.7.3
More information about the Rpm-maint
mailing list