rpmte rpmalSatisfiesDepend(const rpmal al, const rpmds ds) { rpmte *providers = rpmalAllSatisfiesDepend(al, ds); rpmte best = NULL; if (providers) { if (al->tscolor) { /* * For colored dependencies, try to find a matching provider. * Otherwise prefer provider of ts preferred color. */ rpm_color_t dscolor = rpmdsColor(ds); for (rpmte *p = providers; *p; p++) { rpm_color_t tecolor = rpmteColor(*p); if (dscolor) { if (dscolor == tecolor) best = *p; } else if (al->prefcolor) { if (al->prefcolor == tecolor) best = *p; } if (best) break; } } /* if not decided by now, just pick first match */ if (!best) best = providers[0]; free(providers); } return best; }
static VALUE rpmds_Color_get(VALUE s) { rpmds ds = rpmds_ptr(s); if (_debug) fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds); return INT2FIX(rpmdsColor(ds)); }
rpmds rpmdsCurrent(rpmds ds) { rpmds cds = NULL; if (ds != NULL && ds->i >= 0 && ds->i < ds->Count) { cds = singleDS(ds->tagN, ds->N[ds->i], ds->EVR[ds->i], ds->Flags[ds->i], ds->instance, rpmdsColor(ds)); } return cds; }
static VALUE rpmds_Color_set(VALUE s, VALUE v) { rpmds ds = rpmds_ptr(s); int color = FIX2INT(v); if (_debug) fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds); (void) rpmdsSetColor(ds, color); return INT2FIX(rpmdsColor(ds)); }
rpmds rpmdsCurrent(rpmds ds) { rpmds cds = NULL; int ti = -1; if (ds != NULL && ds->i >= 0 && ds->i < ds->Count) { if (ds->ti) ti = ds->ti[ds->i]; /* Using parent's pool so we can just use the same id's */ cds = singleDSPool(ds->pool, ds->tagN, ds->N[ds->i], ds->EVR[ds->i], rpmdsFlags(ds), ds->instance, rpmdsColor(ds), ti); } return cds; }
/* Check a dependency set for problems */ static void checkDS(rpmts ts, depCache dcache, rpmte te, const char * pkgNEVRA, rpmds ds, rpm_color_t tscolor) { rpm_color_t dscolor; /* require-problems are unsatisfied, others appear "satisfied" */ int is_problem = (rpmdsTagN(ds) == RPMTAG_REQUIRENAME); ds = rpmdsInit(ds); while (rpmdsNext(ds) >= 0) { /* Ignore colored dependencies not in our rainbow. */ dscolor = rpmdsColor(ds); if (tscolor && dscolor && !(tscolor & dscolor)) continue; if (unsatisfiedDepend(ts, dcache, ds) == is_problem) rpmteAddDepProblem(te, pkgNEVRA, ds, NULL); } }
rpmte rpmalSatisfiesDepend(const rpmal al, const rpmte te, const rpmds ds) { rpmte *providers = rpmalAllSatisfiesDepend(al, ds); rpmte best = NULL; int bestscore = 0; if (providers) { rpm_color_t dscolor = rpmdsColor(ds); for (rpmte *p = providers; *p; p++) { int score = 0; /* * For colored dependencies, prefer a matching colored provider. * Otherwise prefer provider of ts preferred color. */ if (al->tscolor) { rpm_color_t tecolor = rpmteColor(*p); if (dscolor) { if (dscolor == tecolor) score += 2; } else if (al->prefcolor) { if (al->prefcolor == tecolor) score += 2; } } /* Being self-provided is a bonus */ if (*p == te) score += 1; if (score > bestscore) { bestscore = score; best = *p; } } /* if not decided by now, just pick first match */ if (!best) best = providers[0]; free(providers); } return best; }
static void rpmalAddProvides(rpmal al, rpmalNum pkgNum, rpmds provides) { struct availableIndexEntry_s indexEntry; rpm_color_t dscolor; int skipconf = (al->tsflags & RPMTRANS_FLAG_NOCONFIGS); indexEntry.pkgNum = pkgNum; if (rpmdsInit(provides) != NULL) while (rpmdsNext(provides) >= 0) { /* Ignore colored provides not in our rainbow. */ dscolor = rpmdsColor(provides); if (al->tscolor && dscolor && !(al->tscolor & dscolor)) continue; /* Ignore config() provides if the files wont be installed */ if (skipconf & (rpmdsFlags(provides) & RPMSENSE_CONFIG)) continue; indexEntry.entryIx = rpmdsIx(provides); rpmalProvidesHashAddEntry(al->providesHash, rpmdsN(provides), indexEntry); } }
static PyObject * rpmdsDep_Color(rpmdsDepObject * s) { return Py_BuildValue("i", rpmdsColor(s->ds)); }