summaryrefslogtreecommitdiff
path: root/core/src
diff options
context:
space:
mode:
authorruki <[email protected]>2021-06-27 12:18:58 +0800
committerruki <[email protected]>2021-06-27 12:18:58 +0800
commit7889872bbab1af633391e9fff588e36ea90419af (patch)
tree9d0d98cb5aa7ade7241b173f6f15343310691cc3 /core/src
parent2422929bc24e00d9c0b13480bc95fffcc2bf8461 (diff)
improve semver.select
Diffstat (limited to 'core/src')
-rw-r--r--core/src/xmake/semver/select.c44
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;