diff options
author | William Pitcock <nenolod@dereferenced.org> | 2017-05-27 21:49:53 +0000 |
---|---|---|
committer | William Pitcock <nenolod@dereferenced.org> | 2017-05-27 21:49:53 +0000 |
commit | 693b4bcdb0f22904a521a7c8ac4f13e697dc4d71 (patch) | |
tree | a4cdf39e5c4ad6169bf3a3a261d1c833298238f5 /src/package.c | |
parent | ee5ce7284aef8679fabcf728dd5bd5a17c965798 (diff) | |
download | apk-tools-693b4bcdb0f22904a521a7c8ac4f13e697dc4d71.tar.gz apk-tools-693b4bcdb0f22904a521a7c8ac4f13e697dc4d71.tar.bz2 apk-tools-693b4bcdb0f22904a521a7c8ac4f13e697dc4d71.tar.xz apk-tools-693b4bcdb0f22904a521a7c8ac4f13e697dc4d71.zip |
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.
Diffstat (limited to 'src/package.c')
-rw-r--r-- | src/package.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/src/package.c b/src/package.c index c1d7b77..0bb3747 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; |