} else {
debug(dbg_depcondetail," checking package %s provided by pkg %s",
checkversion->ed->name,possdependee->name);
- if (versionsatisfied3(&checkversion->version,&provider->version,
+ if (!versionsatisfied3(&checkversion->version,&provider->version,
checkversion->verrel)) {
varbufaddstr(oemsgs,_(" Version of "));
varbufaddstr(oemsgs,checkversion->ed->name);
provider= provider->nextrev) {
if (provider->up->type != dep_provides) continue;
debug(dbg_depcondetail," checking provider %s",provider->up->up->name);
- if (possi->verrel == dvr_none)
+ if (possi->verrel == dvr_none) {
+ /* A simple package dep, no version */
thisf= deppossi_ok_found(provider->up->up,pkg,removing,possi->ed,
&matched,NULL,&interestingwarnings,&oemsgs,NULL);
- else
- thisf= deppossi_ok_found(provider->up->up,pkg,removing,possi->ed,
- &matched,possi,&interestingwarnings,&oemsgs,provider);
+ } else if (provider->verrel == dvr_exact) {
+ /* For versioned depends, we only check providers with
+ * dvr_exact. It doesn't make sense to check ones without a
+ * version since we have nothing to verify it. Also, it is
+ * way too complex to allow anything but exact in a provided
+ * version. A few examples below to deter you from
+ * trying:
+ *
+ * - foo depends on pkg1 (>= 0.6), bar provides pkg1 (<= 1.0).
+ * Should pass (easy enough)
+ *
+ * - foo depends on pkg1 (>= 0.7) and (<= 1.1), bar
+ * provides pkg1 (>= 1.2). Should fail (little harder)
+ *
+ * - foo depends on pkg1 (>= 0.4), bar provides pkg1 (<= 1.0)
+ * and (>= 0.5), IOW, inclusive of only those versions.
+ * This would require backchecking the other provided
+ * versions in the possi, which would make things sickly
+ * complex and overly time consuming.
+ *
+ * There's probably some miracle formula to do this, but I
+ * don't see it, and there's little to gain, IMNHO. Also,
+ * packages can get around most of these by providing
+ * multiple dvr_exact versions. -- Ben
+ */
+ thisf= deppossi_ok_found(provider->up->up,pkg,removing,possi->ed,
+ &matched,possi,&interestingwarnings,&oemsgs,provider);
+ }
if (thisf > found) found= thisf;
}
}