VersionCmpResult CompareVersions(EvalContext *ctx, const char *v1, const char *v2, Attributes a, const Promise *pp, PromiseResult *result) { VersionCmpResult cmp_result; const char *cmp_operator = ""; switch (a.packages.package_select) { case PACKAGE_VERSION_COMPARATOR_EQ: case PACKAGE_VERSION_COMPARATOR_NONE: cmp_result = CompareVersionsEqual(ctx, v1, v2, a, pp, result); cmp_operator = "=="; break; case PACKAGE_VERSION_COMPARATOR_NEQ: cmp_result = InvertResult(CompareVersionsEqual(ctx, v1, v2, a, pp, result)); cmp_operator = "!="; break; case PACKAGE_VERSION_COMPARATOR_LT: cmp_result = CompareVersionsLess(ctx, v1, v2, a, pp, result); cmp_operator = "<"; break; case PACKAGE_VERSION_COMPARATOR_GT: cmp_result = CompareVersionsLess(ctx, v2, v1, a, pp, result); cmp_operator = ">"; break; case PACKAGE_VERSION_COMPARATOR_GE: cmp_result = InvertResult(CompareVersionsLess(ctx, v1, v2, a, pp, result)); cmp_operator = ">="; break; case PACKAGE_VERSION_COMPARATOR_LE: cmp_result = InvertResult(CompareVersionsLess(ctx, v2, v1, a, pp, result)); cmp_operator = "<="; break; default: ProgrammingError("Unexpected comparison value: %d", a.packages.package_select); break; } const char *text_result; switch (cmp_result) { case VERCMP_NO_MATCH: text_result = "no"; break; case VERCMP_MATCH: text_result = "yes"; break; default: text_result = "Incompatible version format. Can't decide"; break; } Log(LOG_LEVEL_VERBOSE, "Checking whether package version %s %s %s: %s", v1, cmp_operator, v2, text_result); return cmp_result; }
VersionCmpResult CompareVersions(const char *v1, const char *v2, Attributes a, Promise *pp) { switch (a.packages.package_select) { case cfa_eq: case cfa_cmp_none: return CompareVersionsEqual(v1, v2, a, pp); case cfa_neq: return InvertResult(CompareVersionsEqual(v1, v2, a, pp)); case cfa_lt: return CompareVersionsLess(v1, v2, a, pp); case cfa_gt: return CompareVersionsLess(v2, v1, a, pp); case cfa_ge: return InvertResult(CompareVersionsLess(v1, v2, a, pp)); case cfa_le: return InvertResult(CompareVersionsLess(v2, v1, a, pp)); default: FatalError("Unexpected comparison value: %d", a.packages.package_select); } }
static VersionCmpResult CompareVersionsEqual(EvalContext *ctx, const char *v1, const char *v2, Attributes a, Promise *pp) { if (a.packages.package_version_equal_command) { return RunCmpCommand(ctx, a.packages.package_version_equal_command, v1, v2, a, pp); } else if (a.packages.package_version_less_command) { /* emulate v1 == v2 by !(v1 < v2) && !(v2 < v1) */ return AndResults(InvertResult(CompareVersionsLess(ctx, v1, v2, a, pp)), InvertResult(CompareVersionsLess(ctx, v2, v1, a, pp))); } else { /* Built-in fallback */ return ComparePackageVersionsInternal(v1, v2, PACKAGE_VERSION_COMPARATOR_EQ); } }
static VersionCmpResult CompareVersionsEqual(const char *v1, const char *v2, Attributes a, Promise *pp) { if (a.packages.package_version_equal_command) { return RunCmpCommand(a.packages.package_version_equal_command, v1, v2, a, pp); } else if (a.packages.package_version_less_command) { /* emulate v1 == v2 by !(v1 < v2) && !(v2 < v1) */ return AndResults(InvertResult(CompareVersionsLess(v1, v2, a, pp)), InvertResult(CompareVersionsLess(v2, v1, a, pp))); } else { /* Built-in fallback */ return ComparePackageVersionsInternal(v1, v2, cfa_eq); } }
VersionCmpResult CompareVersions(EvalContext *ctx, const char *v1, const char *v2, Attributes a, Promise *pp) { switch (a.packages.package_select) { case PACKAGE_VERSION_COMPARATOR_EQ: case PACKAGE_VERSION_COMPARATOR_NONE: return CompareVersionsEqual(ctx, v1, v2, a, pp); case PACKAGE_VERSION_COMPARATOR_NEQ: return InvertResult(CompareVersionsEqual(ctx, v1, v2, a, pp)); case PACKAGE_VERSION_COMPARATOR_LT: return CompareVersionsLess(ctx, v1, v2, a, pp); case PACKAGE_VERSION_COMPARATOR_GT: return CompareVersionsLess(ctx, v2, v1, a, pp); case PACKAGE_VERSION_COMPARATOR_GE: return InvertResult(CompareVersionsLess(ctx, v1, v2, a, pp)); case PACKAGE_VERSION_COMPARATOR_LE: return InvertResult(CompareVersionsLess(ctx, v2, v1, a, pp)); default: ProgrammingError("Unexpected comparison value: %d", a.packages.package_select); } }