1 --- rpm-5.4.9/lib/rpmfc.c.fc_deps~ 2012-05-15 02:23:23.157740011 +0200
2 +++ rpm-5.4.9/lib/rpmfc.c 2012-05-15 02:24:42.863147557 +0200
3 @@ -1763,12 +1763,14 @@ static int rpmfcGenerateScriptletDeps(co
7 -static void removeSillyDeps(Header h) {
8 +static unsigned removeSillyDeps(Header h, rpmfc fc) {
9 HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
10 - int xx, i, rnum, removed = 0;
12 + unsigned i, rnum, removed = 0;
13 const char **deps = NULL;
14 const char **versions = NULL;
15 evrFlags *flags = NULL;
16 + int *newpos = NULL, *ddictxPos = NULL;
18 he->tag = RPMTAG_REQUIRENAME;
19 xx = headerGet(h, he, 0);
20 @@ -1783,18 +1785,32 @@ static void removeSillyDeps(Header h) {
21 xx = headerGet(h, he, 0);
22 flags = (evrFlags*)he->p.ui32p;
24 + if (fc && fc->requires != NULL && fc->ddictx != NULL) {
25 + newpos = alloca(he->c*sizeof(newpos[0]));
27 + ddictxPos = alloca(fc->ddictx->nvals*sizeof(ddictxPos[0]));
29 for (i = 0; i < rnum-removed; i++) {
31 deps[i] = deps[i+removed];
32 versions[i] = versions[i+removed];
33 flags[i] = flags[i+removed];
35 + fc->requires->N[i] = fc->requires->N[i+removed];
36 + fc->requires->EVR[i] = fc->requires->EVR[i+removed];
37 + fc->requires->Flags[i] = fc->requires->Flags[i+removed];
40 + if (fc && fc->requires != NULL && fc->ddictx != NULL)
41 + newpos[i+removed] = i;
42 rpmds req = rpmdsSingle(RPMTAG_REQUIRENAME, deps[i], versions[i], flags[i]);
43 rpmds prov = rpmdsNew(h, (*deps[i] == '/' && !*versions[i]) ? RPMTAG_BASENAMES : RPMTAG_PROVIDENAME, 0);
44 if (rpmdsMatch(req, prov)) {
45 if (flags[i] & RPMSENSE_SCRIPT_PRE)
46 rpmlog(RPMLOG_ERR, "Requires(pre): on dependency provided by self: %s\n", rpmdsDNEVR(req));
48 + if (fc && fc->requires != NULL && fc->ddictx != NULL)
49 + newpos[i+removed] = -1;
50 rpmlog(RPMLOG_NOTICE, "Removing dependency on self: %s\n", rpmdsDNEVR(req));
53 @@ -1803,6 +1819,52 @@ static void removeSillyDeps(Header h) {
55 prov = rpmdsFree(prov);
57 + if (fc && fc->requires != NULL && fc->ddictx != NULL && removed) {
58 + fc->requires->Count -= removed;
60 + for (i = 0; i < fc->ddictx->nvals-rx; i++) {
62 + unsigned char deptype;
64 + ix = fc->ddictx->vals[i+rx];
65 + deptype = ((ix >> 24) & 0xff);
68 + if (deptype == 'P') {
69 + ddictxPos[i+rx] = i;
70 + fc->ddictx->vals[i] = fc->ddictx->vals[i+rx];
73 + if (newpos[ix] == -1) {
74 + ddictxPos[i+rx] = -1;
79 + ddictxPos[i+rx] = i;
80 + fc->ddictx->vals[i] = (deptype << 24) | (newpos[ix] & 0x00ffffff);
83 + fc->ddictx->nvals -= rx;
85 + for (i = 0; i < fc->fddictn->nvals; i++) {
87 + if (fc->fddictn->vals[i]) {
88 + unsigned j, ix = fc->fddictx->vals[i];
89 + for (j = 0, rx = 0; j < fc->fddictn->vals[i]; j++, ix++) {
90 + if (ddictxPos[ix] == -1)
92 + if (j == 0 || fc->fddictx->vals[i] == -1)
93 + fc->fddictx->vals[i] = ddictxPos[ix];
97 + fc->fddictn->vals[i] -= rx;
98 + if (fc->fddictn->vals[i] == 0)
99 + fc->fddictx->vals[i] = 0;
104 he->tag = RPMTAG_REQUIRENAME;
105 he->t = RPM_STRING_ARRAY_TYPE;
106 @@ -1820,6 +1882,7 @@ static void removeSillyDeps(Header h) {
113 rpmRC rpmfcGenerateDepends(void * _spec, void * _pkg)
114 @@ -1855,7 +1918,7 @@ rpmRC rpmfcGenerateDepends(void * _spec,
115 if (internaldeps == 0) {
116 /* ... then generate dependencies using %{__find_requires} et al. */
117 rc = rpmfcGenerateDependsHelper(spec, pkg, fi);
118 - removeSillyDeps(pkg->header);
119 + removeSillyDeps(pkg->header, NULL);
120 printDeps(pkg->header);
123 @@ -2045,6 +2108,8 @@ assert(he->p.ptr != NULL);
127 + removeSillyDeps(pkg->header, fc);
129 /* Add dependency dictionary(#dependencies) */
130 he->tag = RPMTAG_DEPENDSDICT;
131 he->t = RPM_UINT32_TYPE;
132 @@ -2073,8 +2138,6 @@ assert(ac == (int)he->c);
133 xx = headerPut(pkg->header, he, 0);
136 - removeSillyDeps(pkg->header);
138 printDeps(pkg->header);
140 if (fc != NULL && _rpmfc_debug) {