diff options
| author | ruki <[email protected]> | 2021-06-27 12:18:58 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2021-06-27 12:18:58 +0800 |
| commit | 7889872bbab1af633391e9fff588e36ea90419af (patch) | |
| tree | 9d0d98cb5aa7ade7241b173f6f15343310691cc3 /core/src | |
| parent | 2422929bc24e00d9c0b13480bc95fffcc2bf8461 (diff) | |
improve semver.select
Diffstat (limited to 'core/src')
| -rw-r--r-- | core/src/xmake/semver/select.c | 44 |
1 files changed, 41 insertions, 3 deletions
diff --git a/core/src/xmake/semver/select.c b/core/src/xmake/semver/select.c index e4f109f62..221baf46d 100644 --- a/core/src/xmake/semver/select.c +++ b/core/src/xmake/semver/select.c @@ -33,7 +33,7 @@ /* ////////////////////////////////////////////////////////////////////////////////////// * 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) +static tb_bool_t xm_semver_select_from_versions_tags1(lua_State* lua, tb_int_t fromidx, semver_t* semver, semver_range_t const* range, semvers_t* matches) { // clear matches semvers_pclear(matches); @@ -77,6 +77,28 @@ static tb_bool_t xm_semver_select_from_versions_tags(lua_State* lua, tb_int_t fr // ok return tb_true; } +static tb_bool_t xm_semver_select_from_versions_tags2(lua_State* lua, tb_int_t fromidx, semver_t* semver, tb_char_t const* version_str, tb_size_t version_len) +{ + 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 && tb_strncmp(source_str, version_str, version_len) == 0) + { + lua_createtable(lua, 0, 2); + lua_pushstring(lua, source_str); + lua_setfield(lua, -2, "version"); + lua_pushstring(lua, fromidx == 2? "versions" : "tags"); + lua_setfield(lua, -2, "source"); + return tb_true; + } + } + return tb_false; +} static tb_bool_t xm_semver_select_from_branches(lua_State* lua, tb_int_t fromidx, tb_char_t const* range_str, tb_size_t range_len) { lua_Integer i = 0; @@ -185,14 +207,30 @@ tb_int_t xm_semver_select(lua_State* lua) if (is_range) { // attempt to select version from the versions list first - if (xm_semver_select_from_versions_tags(lua, 2, &semver, &range, &matches)) + if (xm_semver_select_from_versions_tags1(lua, 2, &semver, &range, &matches)) + { + ok = tb_true; + break; + } + + // attempt to select version from the tags list + if (xm_semver_select_from_versions_tags1(lua, 3, &semver, &range, &matches)) + { + ok = tb_true; + break; + } + } + else + { + // attempt to select version from the versions list first + if (xm_semver_select_from_versions_tags2(lua, 2, &semver, range_str, range_len)) { ok = tb_true; break; } // attempt to select version from the tags list - if (xm_semver_select_from_versions_tags(lua, 3, &semver, &range, &matches)) + if (xm_semver_select_from_versions_tags2(lua, 3, &semver, range_str, range_len)) { ok = tb_true; break; |
