Exemple #1
0
// semver.compare("v1.0.1-beta", "1.2") > 0?
tb_int_t xm_semver_compare(lua_State* lua)
{
    // check
    tb_assert_and_check_return_val(lua, 0);

    // get the version1 string
    tb_char_t const* version1_str = luaL_checkstring(lua, 1);
    tb_check_return_val(version1_str, 0);

    // get the version2 string
    tb_char_t const* version2_str = luaL_checkstring(lua, 2);
    tb_check_return_val(version2_str, 0);

    // try to parse version1 string
    semver_t semver1 = {0};
    if (semver_tryn(&semver1, version1_str, tb_strlen(version1_str))) 
    {
        lua_pushnil(lua);
        lua_pushfstring(lua, "unable to parse semver '%s'", version1_str);
        return 2;
    }


    // try to parse version2 string
    semver_t semver2 = {0};
    if (semver_tryn(&semver2, version2_str, tb_strlen(version2_str))) 
    {
        lua_pushnil(lua);
        lua_pushfstring(lua, "unable to parse semver '%s'", version2_str);
        return 2;
    }

    // do compare 
    lua_pushinteger(lua, semver_pcmp(&semver1, &semver2));

    // end
    semver_dtor(&semver1);
    semver_dtor(&semver2);
    return 1;
}
Exemple #2
0
/* //////////////////////////////////////////////////////////////////////////////////////
 * private implementation
 */
static tb_bool_t xm_semver_select_from_versions_tags(lua_State* lua, tb_int_t fromidx, semver_t* semver, semver_range_t const* range, semvers_t* matches)
{
    // clear matches
    semvers_pclear(matches);

    // select all matches
    lua_Integer i = 0;
    luaL_checktype(lua, fromidx, LUA_TTABLE);
    for (i = lua_objlen(lua, fromidx); i > 0; --i) 
    {
        lua_pushinteger(lua, i);
        lua_gettable(lua, fromidx);

        tb_char_t const* source_str = luaL_checkstring(lua, -1);
        if (source_str && semver_tryn(semver, source_str, tb_strlen(source_str)) == 0) 
        {
            if (semver_range_pmatch(semver, range)) semvers_ppush(matches, *semver);
            else semver_dtor(semver);
        }
    }

    // no matches?
    tb_check_return_val(matches->length, tb_false);

    // sort matches
    semvers_psort(matches);

    // get the newest version 
    semver_t top = semvers_ppop(matches);
    lua_createtable(lua, 0, 2);

    // return results
    lua_pushstring(lua, top.raw);
    lua_setfield(lua, -2, "version");

    lua_pushstring(lua, fromidx == 2? "versions" : "tags");
    lua_setfield(lua, -2, "source");

    // exit the popped semver 
    semver_dtor(&top);

    // ok
    return tb_true;
}
Exemple #3
0
// satisfies wrapper
tb_int_t xm_semver_select(lua_State* lua)
{
    semver_t semver = {0};
    semvers_t matches = {0};
    semver_range_t range = {0};
    lua_Integer i;
    size_t range_len = 0, source_len;
    tb_char_t const* source_str;
    tb_char_t const* source;
    tb_bool_t is_range;

    lua_settop(lua, 4);

    // check
    tb_assert_and_check_return_val(lua, 0);

    // get the version string
    tb_char_t const* range_str = luaL_checkstring(lua, 1);
    tb_check_return_val(range_str, 0);
    range_len = tb_strlen(range_str);

    is_range = semver_rangen(&range, range_str, range_len) == 0;
    if (is_range) {
        source = "versions";
        luaL_checktype(lua, 2, LUA_TTABLE);
        for (i = lua_objlen(lua, 2); i > 0; --i) {
            lua_pushinteger(lua, i);
            lua_gettable(lua, 2);

            source_str = luaL_checkstring(lua, -1);
            tb_check_return_val(source_str, 0);

            if (semver_tryn(&semver, source_str, tb_strlen(source_str)) == 0) {
                if (semver_range_match(semver, range)) {
                    semvers_push(matches, semver);
                } else {
                    semver_dtor(&semver);
                }
            }
        }
        if (matches.length) {
            goto match;
        }
        semvers_clear(matches);
        source = "tags";
        luaL_checktype(lua, 3, LUA_TTABLE);
        for (i = lua_objlen(lua, 3); i > 0; --i) {
            lua_pushinteger(lua, i);
            lua_gettable(lua, 3);

            source_str = luaL_checkstring(lua, -1);
            tb_check_return_val(source_str, 0);

            if (semver_tryn(&semver, source_str, tb_strlen(source_str)) == 0) {
                if (semver_range_match(semver, range)) {
                    semvers_push(matches, semver);
                } else {
                    semver_dtor(&semver);
                }
            }
        }
        if (matches.length) {
            goto match;
        }
        semvers_dtor(matches);
        semver_range_dtor(&range);
    }

    source = "branches";
    luaL_checktype(lua, 4, LUA_TTABLE);
    for (i = lua_objlen(lua, 4); i > 0; --i) {
        lua_pushinteger(lua, i);
        lua_gettable(lua, 4);

        source_str = luaL_checkstring(lua, -1);
        tb_check_return_val(source_str, 0);
        source_len = tb_strlen(source_str);

        if (source_len == range_len && tb_memcmp(source_str, range_str, source_len) == 0) {
            lua_createtable(lua, 0, 2);

            lua_pushlstring(lua, source_str, source_len);
            lua_setfield(lua, -2, "version");

            lua_pushstring(lua, source);
            lua_setfield(lua, -2, "source");

            return 1;
        }
    }

    if (!is_range)  {
        lua_pushnil(lua);
        lua_pushfstring(lua, "Unable to parse semver range '%s'", range_str);

        return 2;
    }
    lua_pushnil(lua);
    lua_pushfstring(lua, "Unable to select version for range '%s'", range_str);

    return 2;
    match:
    semvers_sort(matches);
    semver = semvers_pop(matches);
    lua_createtable(lua, 0, 2);

    lua_pushstring(lua, semver.raw);
    lua_setfield(lua, -2, "version");

    lua_pushstring(lua, source);
    lua_setfield(lua, -2, "source");

    semvers_dtor(matches);
    semver_dtor(&semver);
    semver_range_dtor(&range);

    return 1;
}