From 693b4bcdb0f22904a521a7c8ac4f13e697dc4d71 Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Sat, 27 May 2017 21:49:53 +0000 Subject: version: add support for fuzzy version matching This is useful for requirements such as: python3=~3.6, which would match python3-3.6.[0-9]. This implementation should in theory be backwards compatible with the implementation in Adelie. --- src/package.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'src/package.c') diff --git a/src/package.c b/src/package.c index c1d7b775d9..0bb37473c5 100644 --- a/src/package.c +++ b/src/package.c @@ -31,6 +31,7 @@ static const apk_spn_match_def apk_spn_dependency_comparer = { [7] = (1<<4) /*<*/ | (1<<5) /*=*/ | (1<<6) /*<*/, + [15] = (1<<6) /*~*/ }; static const apk_spn_match_def apk_spn_dependency_separator = { @@ -190,9 +191,9 @@ void apk_blob_pull_dep(apk_blob_t *b, struct apk_database *db, struct apk_depend { struct apk_name *name; apk_blob_t bdep, bname, bop, bver = APK_BLOB_NULL, btag; - int mask = APK_DEPMASK_ANY, conflict = 0, tag = 0; + int mask = APK_DEPMASK_ANY, conflict = 0, tag = 0, fuzzy = 0; - /* [!]name[<,<=,=,>=,>,><]ver */ + /* [!]name[<,<=,<~,=,~,>~,>=,>,><]ver */ if (APK_BLOB_IS_NULL(*b)) goto fail; @@ -231,6 +232,10 @@ void apk_blob_pull_dep(apk_blob_t *b, struct apk_database *db, struct apk_depend case '>': mask |= APK_VERSION_GREATER; break; + case '~': + mask |= APK_VERSION_FUZZY|APK_VERSION_EQUAL; + fuzzy = TRUE; + break; case '=': mask |= APK_VERSION_EQUAL; break; @@ -259,6 +264,7 @@ void apk_blob_pull_dep(apk_blob_t *b, struct apk_database *db, struct apk_depend .repository_tag = tag, .result_mask = mask, .conflict = conflict, + .fuzzy = fuzzy, }; return; fail: @@ -320,7 +326,7 @@ int apk_dep_is_provided(struct apk_dependency *dep, struct apk_provider *p) default: if (p->version == &apk_null_blob) return dep->conflict; - if (apk_version_compare_blob(*p->version, *dep->version) + if (apk_version_compare_blob_fuzzy(*p->version, *dep->version, dep->fuzzy) & dep->result_mask) return !dep->conflict; return dep->conflict; @@ -341,7 +347,7 @@ int apk_dep_is_materialized(struct apk_dependency *dep, struct apk_package *pkg) case APK_DEPMASK_ANY: return !dep->conflict; default: - if (apk_version_compare_blob(*pkg->version, *dep->version) + if (apk_version_compare_blob_fuzzy(*pkg->version, *dep->version, dep->fuzzy) & dep->result_mask) return !dep->conflict; return dep->conflict; -- cgit v1.2.3