--- rpm-5.4.5/build/reqprov.c.fc_overlap~ 2012-03-02 13:44:16.088580152 +0100 +++ rpm-5.4.5/build/reqprov.c 2012-03-02 13:59:18.740030066 +0100 @@ -158,11 +158,10 @@ int addReqProv(/*@unused@*/ Spec spec, H he->p.argv = versions; xx = headerMod(h, he, 0); rpmlog(RPMLOG_WARNING, "%s overlaps %s, removing %s\n", rpmdsDNEVR(old), rpmdsDNEVR(new), rpmdsDNEVR(old)); - } else if (res < 0) { + } else if (res < 0) rpmlog(RPMLOG_WARNING, "%s overlaps %s, removing %s\n", rpmdsDNEVR(new), rpmdsDNEVR(old), rpmdsDNEVR(new)); - } else { - rpmlog(RPMLOG_DEBUG, "%s overlaps %s, removing %s and merging flags\n", rpmdsDNEVR(new), rpmdsDNEVR(old), rpmdsDNEVR(new)); - } + else if (flags[len] != Flags) + rpmlog(RPMLOG_WARNING, "%s overlaps %s, removing %s and merging flags\n", rpmdsDNEVR(new), rpmdsDNEVR(old), rpmdsDNEVR(new)); flags[len] |= newflags; he->tag = flagtag; --- rpm-5.4.5/lib/rpmfc.c.fc_overlap~ 2012-03-01 18:00:49.989188179 +0100 +++ rpm-5.4.5/lib/rpmfc.c 2012-03-01 19:53:37.145561224 +0100 @@ -518,7 +518,7 @@ assert(EVR != NULL); * build/reqprov.c:addReqProv() */ int overlap = 0, res = 0; - if (*depsp && rpmExpandNumeric("%{?_use_internal_dependency_generator}")) { + if (*depsp) { int ix = rpmdsSearch(*depsp, ds); if (ix >= 0) { /* do not consider dependency ranges like R: foo > 1, R: foo < 3 @@ -550,18 +550,33 @@ assert(EVR != NULL); rEVR->Flags = (*depsp)->Flags[(*depsp)->i]; res = rpmEVRcompare(lEVR, rEVR); - if (res > 0) { - (*depsp)->Flags[(*depsp)->i] = Flags; - (*depsp)->EVR[(*depsp)->i] = EVR; - rpmlog(RPMLOG_WARNING, "%s overlaps %s, removing %s\n", rpmdsDNEVR(*depsp), rpmdsDNEVR(ds), rpmdsDNEVR(*depsp)); - } else if (res < 0) { - rpmlog(RPMLOG_WARNING, "%s overlaps %s, removing %s\n", rpmdsDNEVR(ds), rpmdsDNEVR(*depsp), rpmdsDNEVR(ds)); - } else { - rpmlog(RPMLOG_DEBUG, "%s overlaps %s, removing %s and merging flags\n", rpmdsDNEVR(ds), rpmdsDNEVR(*depsp), rpmdsDNEVR(ds)); + if (res == 0 && rpmdsFlags(*depsp) == rpmdsFlags(ds)) + overlap = 0; + else { + char *oldVal = xstrdup(strchr(rpmfcFileDep(buf, fc->ix, *depsp), ' ')); + if (res > 0) { + (*depsp)->Flags[(*depsp)->i] = Flags; + (*depsp)->EVR[(*depsp)->i] = EVR; + rpmlog(RPMLOG_WARNING, "%s overlaps %s, removing %s\n", rpmdsDNEVR(*depsp), rpmdsDNEVR(ds), rpmdsDNEVR(*depsp)); + } else if (res < 0) + rpmlog(RPMLOG_WARNING, "%s overlaps %s, removing %s\n", rpmdsDNEVR(ds), rpmdsDNEVR(*depsp), rpmdsDNEVR(ds)); + else + rpmlog(RPMLOG_WARNING, "%s overlaps %s, removing %s and merging flags\n", rpmdsDNEVR(ds), rpmdsDNEVR(*depsp), rpmdsDNEVR(ds)); + + (*depsp)->Flags[(*depsp)->i] |= newflags; + + /* update references in dictionary */ + for (ix = 0; ix < argvCount(fc->ddict); ix++) { + if (!strcmp(strchr(fc->ddict[ix], ' '), oldVal)) { + size_t fcix = atol(fc->ddict[ix]); + _free(fc->ddict[ix]); + fc->ddict[ix] = xstrdup(rpmfcFileDep(buf, fcix, *depsp)); + } + } + argvSort(fc->ddict, NULL); + free(oldVal); } - (*depsp)->Flags[(*depsp)->i] |= newflags; - lEVR = rpmEVRfree(lEVR); rEVR = rpmEVRfree(rEVR); } @@ -573,7 +588,7 @@ assert(EVR != NULL); xx = rpmdsMerge(depsp, ds); /* Add to file dependencies. */ - xx = rpmfcSaveArg(&fc->ddict, rpmfcFileDep(buf, fc->ix, ds)); + xx = rpmfcSaveArg(&fc->ddict, rpmfcFileDep(buf, fc->ix, overlap ? *depsp : ds)); (void)rpmdsFree(ds); ds = NULL;