File findsupplements.diff of Package rpm

Add support for supplements to the internal dependency
generator.

Index: build/rpmfc.c
===================================================================
--- build/rpmfc.c.orig	2011-12-09 14:46:56.296892644 +0100
+++ build/rpmfc.c	2011-12-09 14:47:08.510313829 +0100
@@ -57,6 +57,7 @@ struct rpmfc_s {
 
     rpmds provides;	/*!< (no. provides) package provides */
     rpmds requires;	/*!< (no. requires) package requires */
+    rpmds supplements;	/*!< (no. supplements) package supplements */
 };
 
 struct rpmfcTokens_s {
@@ -504,6 +505,14 @@ static int rpmfcHelper(rpmfc fc, unsigne
 	dsContext = RPMSENSE_FIND_REQUIRES;
 	tagN = RPMTAG_REQUIRENAME;
 	break;
+    case 'S':
+	if (fc->skipProv)
+	    return 0;
+	depname = "supplements";
+	depsp = &fc->supplements;
+	dsContext = RPMSENSE_FIND_REQUIRES|RPMSENSE_STRONG|RPMSENSE_MISSINGOK;
+	tagN = RPMTAG_ENHANCESNAME;
+	break;
     }
 
     /* If the entire path is filtered out, there's nothing more to do */
@@ -779,6 +788,7 @@ rpmfc rpmfcFree(rpmfc fc)
 
 	fc->provides = rpmdsFree(fc->provides);
 	fc->requires = rpmdsFree(fc->requires);
+	fc->supplements = rpmdsFree(fc->supplements);
     }
     fc = _free(fc);
     return NULL;
@@ -831,6 +841,7 @@ rpmRC rpmfcApply(rpmfc fc)
 	for (ARGV_t fattr = fc->fattrs[fc->ix]; fattr && *fattr; fattr++) {
 	    xx += rpmfcHelper(fc, 'P', *fattr);
 	    xx += rpmfcHelper(fc, 'R', *fattr);
+	    xx += rpmfcHelper(fc, 'S', *fattr);
 	}
     }
 
@@ -873,6 +884,11 @@ rpmRC rpmfcApply(rpmfc fc)
 	    dix = rpmdsFind(fc->requires, ds);
 	    ds = rpmdsFree(ds);
 	    break;
+	case 'S':
+	    ds = rpmdsSingle(RPMTAG_ENHANCESNAME, N, EVR, Flags);
+	    dix = rpmdsFind(fc->supplements, ds);
+	    ds = rpmdsFree(ds);
+	    break;
 	}
 
 /* XXX assertion incorrect while generating -debuginfo deps. */
@@ -1384,6 +1400,18 @@ rpmRC rpmfcGenerateDepends(const rpmSpec
 	}
     }
 
+    /* Add Supplements: */
+    if (fc->supplements != NULL && rpmdsCount(fc->supplements) > 0 && !fc->skipReq) {
+	rpmds pi = rpmdsInit(fc->supplements);
+	while (rpmdsNext(pi) >= 0) {
+	    rpmsenseFlags flags = rpmdsFlags(pi);
+	
+	    headerPutString(pkg->header, RPMTAG_ENHANCESNAME, rpmdsN(pi));
+	    headerPutString(pkg->header, RPMTAG_ENHANCESVERSION, rpmdsEVR(pi));
+	    headerPutUint32(pkg->header, RPMTAG_ENHANCESFLAGS, &flags, 1);
+	}
+    }
+
     /* Add dependency dictionary(#dependencies) */
     if (rpmtdFromArgi(&td, RPMTAG_DEPENDSDICT, fc->ddictx)) {
 	assert(rpmtdType(&td) == RPM_INT32_TYPE);