summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorapocelipes <[email protected]>2026-08-09 21:12:51 +0800
committerapocelipes <[email protected]>2026-08-09 21:12:51 +0800
commit579b9f0ca6126d9d0570a9c76243d7ed142da3fd (patch)
tree77ea50b2e22ec19eccbc3fbf73cee51a1586b22f
parent1d8683111e485d8a1172b6b689da6dddb3127735 (diff)
fix: skipping a leading v/= before exact comparing
-rw-r--r--core/src/xmake/semver/select.c20
-rwxr-xr-xtests/modules/semver/test.lua17
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"}