diff options
| author | apocelipes <[email protected]> | 2026-08-09 21:12:51 +0800 |
|---|---|---|
| committer | apocelipes <[email protected]> | 2026-08-09 21:12:51 +0800 |
| commit | 579b9f0ca6126d9d0570a9c76243d7ed142da3fd (patch) | |
| tree | 77ea50b2e22ec19eccbc3fbf73cee51a1586b22f | |
| parent | 1d8683111e485d8a1172b6b689da6dddb3127735 (diff) | |
fix: skipping a leading v/= before exact comparing
| -rw-r--r-- | core/src/xmake/semver/select.c | 20 | ||||
| -rwxr-xr-x | tests/modules/semver/test.lua | 17 |
2 files changed, 33 insertions, 4 deletions
diff --git a/core/src/xmake/semver/select.c b/core/src/xmake/semver/select.c index 82de60e74..f9f3f6424 100644 --- a/core/src/xmake/semver/select.c +++ b/core/src/xmake/semver/select.c @@ -33,7 +33,15 @@ /* ////////////////////////////////////////////////////////////////////////////////////// * private implementation */ +static tb_char_t const *xm_semver_skip_version_prefix(tb_char_t const *version_str, tb_size_t *version_len) { + if (*version_len && (version_str[0] == 'v' || version_str[0] == '=')) { + ++version_str; + --*version_len; + } + return version_str; +} static tb_bool_t xm_semver_is_exact_version(tb_char_t const *version_str, tb_size_t version_len) { + version_str = xm_semver_skip_version_prefix(version_str, &version_len); semver_t version = { 0 }; if (!semvern(&version, version_str, version_len)) { semver_dtor(&version); @@ -87,7 +95,8 @@ static tb_bool_t xm_semver_select_from_versions_tags1( 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_State *lua, tb_int_t fromidx, tb_char_t const *version_str, tb_size_t version_len) { + version_str = xm_semver_skip_version_prefix(version_str, &version_len); lua_Integer i = 0; luaL_checktype(lua, fromidx, LUA_TTABLE); for (i = lua_objlen(lua, fromidx); i > 0; --i) { @@ -96,8 +105,11 @@ static tb_bool_t xm_semver_select_from_versions_tags2( tb_char_t const *source_str = luaL_checkstring(lua, -1); tb_size_t source_len = tb_strlen(source_str); + tb_size_t source_version_len = source_len; + tb_char_t const *source_version_str = xm_semver_skip_version_prefix(source_str, &source_version_len); lua_pop(lua, 1); - if (source_len == version_len && tb_strncmp(source_str, version_str, version_len) == 0) { + // semver comparison ignores build metadata, so compare the normalized strings + if (source_version_len == version_len && tb_strncmp(source_version_str, version_str, version_len) == 0) { lua_createtable(lua, 0, 2); lua_pushlstring(lua, source_str, source_len); lua_setfield(lua, -2, "version"); @@ -206,7 +218,7 @@ tb_int_t xm_semver_select(lua_State *lua) { // attempt to select version from the versions list first if ((is_exact || !is_range) && - xm_semver_select_from_versions_tags2(lua, 2, &semver, range_str, range_len)) { + xm_semver_select_from_versions_tags2(lua, 2, range_str, range_len)) { ok = tb_true; break; } @@ -217,7 +229,7 @@ tb_int_t xm_semver_select(lua_State *lua) { // attempt to select version from the tags list if ((is_exact || !is_range) && - xm_semver_select_from_versions_tags2(lua, 3, &semver, range_str, range_len)) { + xm_semver_select_from_versions_tags2(lua, 3, range_str, range_len)) { ok = tb_true; break; } diff --git a/tests/modules/semver/test.lua b/tests/modules/semver/test.lua index 3c14ad1d7..e8cb26177 100755 --- a/tests/modules/semver/test.lua +++ b/tests/modules/semver/test.lua @@ -30,6 +30,10 @@ function test_semver_select(t) , "1.2.3" , {"1.2.3+1", "1.2.3"}) + _check_semver_select(t, {"1.2.3", "version"} + , "=1.2.3" + , {"1.2.3+7", "1.2.3"}) + _check_semver_select(t, {"1.2.9", "version"} , "1.2" , {"1.2", "1.2.9"}) @@ -43,6 +47,14 @@ function test_semver_select(t) , {"v1.2.3+7"} , {"1.2.3"}) + _check_semver_select(t, {"v1.2.3+7", "version"} + , "1.2.3+7" + , {"v1.2.3+8", "v1.2.3+7"}) + + _check_semver_select(t, {"1.2.3+7", "version"} + , "v1.2.3+7" + , {"1.2.3+8", "1.2.3+7"}) + _check_semver_select(t, {"3.53.0+200", "tag"} , "3.53.0+200" , nil @@ -53,6 +65,11 @@ function test_semver_select(t) , nil , {"3.53.0+100"}) + _check_semver_select(t, {"v1.2.3+7", "tag"} + , "=1.2.3+7" + , nil + , {"v1.2.3+7", "v1.2.3+8"}) + _check_semver_select(t, {"master", "branch"} , "master" , {"1.4.0", "1.5.0", "1.5.1"} |
