[Tarantool-patches] [PATCH vshard 2/4] util: introduce Tarantool's semver parser

Oleg Babin olegrok at tarantool.org
Wed Feb 9 20:53:37 MSK 2022


Thanks for your patch.


Looks good. Probably it's worth to move this code into separate module.

There are several modules in Tarantool ecosystem that implement its own 
parsers.

One note below.


On 09.02.2022 03:32, Vladislav Shpilevoy wrote:
> Tarantool's version since recently has semver-like format. It
> made impossible to check for features existence if they were
> introduced not in the first release of one x.x.x triplet.
>
> An alternative would be to test for feature existence by its
> usage, but it is not always possible with ease.
>
> This patch improves version parser in vshard to understand new
> version names.
>
> It will be used by a future commit about netbox's return_raw
> feature adoption to skip its tests for old versions
> (<= 2.10.0-beta2).
>
<stripped>

> +local release_type_weight = {
> +    alpha = 0,
> +    beta = 1,
> +    rc = 2,
> +}
> +
> +local function release_type_cmp(t1, t2)
> +    t1 = release_type_weight[t1]
> +    t2 = release_type_weight[t2]
> +    -- 'No release type' means the greatest.
> +    if not t1 then
> +        if not t2 then
> +            return 0
> +        end
> +        return 1
> +    end
> +    if not t2 then
> +        return -1
> +    end
> +    return t1 - t2
> +end
> +
> +local function version_cmp(ver1, ver2)
> +    if ver1.id_major ~= ver2.id_major then
> +        return ver1.id_major - ver2.id_major
> +    end
> +    if ver1.id_middle ~= ver2.id_middle then
> +        return ver1.id_middle - ver2.id_middle
> +    end
> +    if ver1.id_minor ~= ver2.id_minor then
> +        return ver1.id_minor - ver2.id_minor
> +    end
> +    if ver1.rel_type ~= ver2.rel_type then
> +        return release_type_cmp(ver1.rel_type, ver2.rel_type)
> +    end
> +    if ver1.rel_num ~= ver2.rel_num then
> +        return ver1.rel_num - ver2.rel_num
> +    end
> +    if ver1.id_commit ~= ver2.id_commit then
> +        return ver1.id_commit - ver2.id_commit
> +    end
> +    return 0
> +end
> +
> +local version_mt = {
> +    __eq = function(l, r)
> +        return version_cmp(l, r) == 0
> +    end,
> +    __lt = function(l, r)
> +        return version_cmp(l, r) < 0
> +    end,
> +    __le = function(l, r)
> +        return version_cmp(l, r) <= 0
> +    end,
> +}
> +
> +local function version_new(id_major, id_middle, id_minor, rel_type, rel_num,
> +                           id_commit)

I think we could validate that at least id_major is not nil.

> +    -- There is no any validation - the API is not public.
> +    return setmetatable({
> +        id_major = id_major,
> +        id_middle = id_middle,
> +        id_minor = id_minor,
> +        rel_type = rel_type,
> +        rel_num = rel_num,
> +        id_commit = id_commit,
> +    }, version_mt)
> +end
> +
>


More information about the Tarantool-patches mailing list