[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