diff options
Diffstat (limited to 'sys-apps/apk-tools/files/apk-tools-2.6.6-fuzzy-versions.patch')
-rw-r--r-- | sys-apps/apk-tools/files/apk-tools-2.6.6-fuzzy-versions.patch | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/sys-apps/apk-tools/files/apk-tools-2.6.6-fuzzy-versions.patch b/sys-apps/apk-tools/files/apk-tools-2.6.6-fuzzy-versions.patch new file mode 100644 index 000000000..11843b218 --- /dev/null +++ b/sys-apps/apk-tools/files/apk-tools-2.6.6-fuzzy-versions.patch @@ -0,0 +1,193 @@ +From 4d71ddcd8f4a370babdaba22cbf43c4a00524c5b Mon Sep 17 00:00:00 2001 +From: Andrew Wilcox <AWilcox@Wilcox-Tech.com> +Date: Sun, 18 Oct 2015 10:59:54 -0500 +Subject: [PATCH 1/3] Add ~ operator for fuzzy version matching. + +--- + src/add.c | 2 +- + src/apk_package.h | 1 + + src/apk_version.h | 1 + + src/package.c | 16 ++++++++++++---- + src/version.c | 9 +++++++-- + 5 files changed, 22 insertions(+), 7 deletions(-) + +diff --git a/src/add.c b/src/add.c +index 2df4dc8..742df07 100644 +--- a/src/add.c ++++ b/src/add.c +@@ -137,7 +137,7 @@ static int add_main(void *ctx, struct apk_database *db, struct apk_string_array + + apk_blob_pull_dep(&b, db, &dep); + if (APK_BLOB_IS_NULL(b) || b.len > 0) { +- apk_error("'%s' is not a valid dependency, format is name(@tag)([<>=]version)", ++ apk_error("'%s' is not a valid dependency, format is name(@tag)([<>~=]version)", + *parg); + return -1; + } +diff --git a/src/apk_package.h b/src/apk_package.h +index 1b0e2cf..30de39a 100644 +--- a/src/apk_package.h ++++ b/src/apk_package.h +@@ -73,6 +73,7 @@ struct apk_dependency { + unsigned repository_tag : 6; + unsigned conflict : 1; + unsigned result_mask : 3; ++ unsigned fuzzy : 1; + }; + APK_ARRAY(apk_dependency_array, struct apk_dependency); + +diff --git a/src/apk_version.h b/src/apk_version.h +index 4275343..01e401b 100644 +--- a/src/apk_version.h ++++ b/src/apk_version.h +@@ -26,6 +26,7 @@ + const char *apk_version_op_string(int result_mask); + int apk_version_result_mask(const char *str); + int apk_version_validate(apk_blob_t ver); ++int apk_version_compare_blob_fuzzy(apk_blob_t a, apk_blob_t b, int fuzzy); + int apk_version_compare_blob(apk_blob_t a, apk_blob_t b); + int apk_version_compare(const char *str1, const char *str2); + +diff --git a/src/package.c b/src/package.c +index 65f105d..24a4f94 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) /*<*/, ++ [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,9 @@ void apk_blob_pull_dep(apk_blob_t *b, struct apk_database *db, struct apk_depend + case '>': + mask |= APK_VERSION_GREATER; + break; ++ case '~': ++ fuzzy = 1; ++ mask |= APK_VERSION_FUZZY; // XXX implicit + 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,8 @@ 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 +348,8 @@ 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; +diff --git a/src/version.c b/src/version.c +index 00c78d1..212a5d1 100644 +--- a/src/version.c ++++ b/src/version.c +@@ -186,7 +186,7 @@ int apk_version_validate(apk_blob_t ver) + return t == TOKEN_END; + } + +-int apk_version_compare_blob(apk_blob_t a, apk_blob_t b) ++int apk_version_compare_blob_fuzzy(apk_blob_t a, apk_blob_t b, int fuzzy) + { + int at = TOKEN_DIGIT, bt = TOKEN_DIGIT, tt; + int av = 0, bv = 0; +@@ -215,7 +215,7 @@ int apk_version_compare_blob(apk_blob_t a, apk_blob_t b) + return APK_VERSION_GREATER; + + /* both have TOKEN_END or TOKEN_INVALID next? */ +- if (at == bt) ++ if (at == bt || fuzzy) + return APK_VERSION_EQUAL; + + /* leading version components and their values are equal, +@@ -235,6 +235,11 @@ int apk_version_compare_blob(apk_blob_t a, apk_blob_t b) + return APK_VERSION_EQUAL; + } + ++int apk_version_compare_blob(apk_blob_t a, apk_blob_t b) ++{ ++ return apk_version_compare_blob_fuzzy(a, b, 0); ++} ++ + int apk_version_compare(const char *str1, const char *str2) + { + return apk_version_compare_blob(APK_BLOB_STR(str1), APK_BLOB_STR(str2)); +diff --git a/src/apk_package.h b/src/apk_package.h +index 30de39a..9984080 100644 +--- a/src/apk_package.h ++++ b/src/apk_package.h +@@ -72,7 +72,7 @@ struct apk_dependency { + unsigned broken : 1; + unsigned repository_tag : 6; + unsigned conflict : 1; +- unsigned result_mask : 3; ++ unsigned result_mask : 4; + unsigned fuzzy : 1; + }; + APK_ARRAY(apk_dependency_array, struct apk_dependency); +diff --git a/src/apk_version.h b/src/apk_version.h +index 01e401b..e13c534 100644 +--- a/src/apk_version.h ++++ b/src/apk_version.h +@@ -18,9 +18,10 @@ + #define APK_VERSION_EQUAL 1 + #define APK_VERSION_LESS 2 + #define APK_VERSION_GREATER 4 ++#define APK_VERSION_FUZZY 8 + + #define APK_DEPMASK_ANY (APK_VERSION_EQUAL|APK_VERSION_LESS|\ +- APK_VERSION_GREATER) ++ APK_VERSION_FUZZY|APK_VERSION_GREATER) + #define APK_DEPMASK_CHECKSUM (APK_VERSION_LESS|APK_VERSION_GREATER) + + const char *apk_version_op_string(int result_mask); +diff --git a/src/version.c b/src/version.c +index 5a790b5..14c61d8 100644 +--- a/src/version.c ++++ b/src/version.c +@@ -147,6 +147,9 @@ const char *apk_version_op_string(int mask) + return "<="; + case APK_VERSION_EQUAL: + return "="; ++ case APK_VERSION_EQUAL|APK_VERSION_FUZZY: ++ case APK_VERSION_FUZZY: ++ return "~"; + case APK_VERSION_GREATER|APK_VERSION_EQUAL: + return ">="; + case APK_VERSION_GREATER: +-- +2.9.2 + |