From 39810762d2cd4ad6a513566b54b5f50fc6be328d Mon Sep 17 00:00:00 2001 From: Asish Kumar <87874775+officialasishkumar@users.noreply.github.com> Date: Mon, 13 Apr 2026 22:15:45 +0530 Subject: [PATCH] fix: use describe mode for SGLang version detection (#22600) Signed-off-by: Asish Kumar --- 3rdparty/amd/wheel/sglang/pyproject.toml | 4 +- python/pyproject.toml | 2 +- python/pyproject_cpu.toml | 4 +- python/pyproject_npu.toml | 4 +- python/pyproject_other.toml | 4 +- python/pyproject_xpu.toml | 2 +- .../unit/tools/test_get_version_tag.py | 87 +++++++++++++++++++ 7 files changed, 101 insertions(+), 6 deletions(-) create mode 100644 test/registered/unit/tools/test_get_version_tag.py diff --git a/3rdparty/amd/wheel/sglang/pyproject.toml b/3rdparty/amd/wheel/sglang/pyproject.toml index 9b9c24fd2..99a99c0b5 100644 --- a/3rdparty/amd/wheel/sglang/pyproject.toml +++ b/3rdparty/amd/wheel/sglang/pyproject.toml @@ -210,4 +210,6 @@ exclude = [ [tool.setuptools_scm] root = ".." version_file = "sglang/_version.py" -git_describe_command = ["python3", "python/tools/get_version_tag.py", "--tag-only"] +git_describe_command = ["python3", "python/tools/get_version_tag.py"] +# Allow editable installs even when .git metadata is not available. +fallback_version = "0.0.0.dev0" diff --git a/python/pyproject.toml b/python/pyproject.toml index 7eeb44f59..80ba96cc6 100755 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -205,7 +205,7 @@ exclude = [ [tool.setuptools_scm] root = ".." version_file = "sglang/_version.py" -git_describe_command = ["python3", "python/tools/get_version_tag.py", "--tag-only"] +git_describe_command = ["python3", "python/tools/get_version_tag.py"] # Allow editable installs even when .git metadata is not available. fallback_version = "0.0.0.dev0" diff --git a/python/pyproject_cpu.toml b/python/pyproject_cpu.toml index 550780ffc..1597212e9 100644 --- a/python/pyproject_cpu.toml +++ b/python/pyproject_cpu.toml @@ -127,4 +127,6 @@ exclude = [ [tool.setuptools_scm] root = ".." version_file = "sglang/_version.py" -git_describe_command = ["python3", "python/tools/get_version_tag.py", "--tag-only"] +git_describe_command = ["python3", "python/tools/get_version_tag.py"] +# Allow editable installs even when .git metadata is not available. +fallback_version = "0.0.0.dev0" diff --git a/python/pyproject_npu.toml b/python/pyproject_npu.toml index 704df6e3e..e2bbfd798 100644 --- a/python/pyproject_npu.toml +++ b/python/pyproject_npu.toml @@ -146,4 +146,6 @@ exclude = [ [tool.setuptools_scm] root = ".." version_file = "sglang/_version.py" -git_describe_command = ["python3", "python/tools/get_version_tag.py", "--tag-only"] +git_describe_command = ["python3", "python/tools/get_version_tag.py"] +# Allow editable installs even when .git metadata is not available. +fallback_version = "0.0.0.dev0" diff --git a/python/pyproject_other.toml b/python/pyproject_other.toml index b7f4411cf..0e6da96c1 100755 --- a/python/pyproject_other.toml +++ b/python/pyproject_other.toml @@ -214,4 +214,6 @@ exclude = [ [tool.setuptools_scm] root = ".." version_file = "sglang/_version.py" -git_describe_command = ["python3", "python/tools/get_version_tag.py", "--tag-only"] +git_describe_command = ["python3", "python/tools/get_version_tag.py"] +# Allow editable installs even when .git metadata is not available. +fallback_version = "0.0.0.dev0" diff --git a/python/pyproject_xpu.toml b/python/pyproject_xpu.toml index 821dc88e5..8e15e14c8 100644 --- a/python/pyproject_xpu.toml +++ b/python/pyproject_xpu.toml @@ -154,6 +154,6 @@ exclude = [ [tool.setuptools_scm] root = ".." version_file = "sglang/_version.py" -git_describe_command = ["python3", "python/tools/get_version_tag.py", "--tag-only"] +git_describe_command = ["python3", "python/tools/get_version_tag.py"] # Allow editable installs even when .git metadata is not available. fallback_version = "0.0.0.dev0" diff --git a/test/registered/unit/tools/test_get_version_tag.py b/test/registered/unit/tools/test_get_version_tag.py new file mode 100644 index 000000000..d64dac347 --- /dev/null +++ b/test/registered/unit/tools/test_get_version_tag.py @@ -0,0 +1,87 @@ +import importlib.util +import sys +import unittest +from pathlib import Path +from unittest.mock import patch + +REPO_ROOT = Path(__file__).resolve().parents[4] +CI_REGISTER_PATH = REPO_ROOT / "python" / "sglang" / "test" / "ci" / "ci_register.py" +VERSION_HELPER_PATH = REPO_ROOT / "python" / "tools" / "get_version_tag.py" +PYPROJECT_PATHS = [ + REPO_ROOT / "python" / "pyproject.toml", + REPO_ROOT / "python" / "pyproject_cpu.toml", + REPO_ROOT / "python" / "pyproject_npu.toml", + REPO_ROOT / "python" / "pyproject_other.toml", + REPO_ROOT / "python" / "pyproject_xpu.toml", + REPO_ROOT / "3rdparty" / "amd" / "wheel" / "sglang" / "pyproject.toml", +] +DESCRIBE_COMMAND = ( + 'git_describe_command = ["python3", "python/tools/get_version_tag.py"]' +) +TAG_ONLY_DESCRIBE_COMMAND = ( + 'git_describe_command = ["python3", "python/tools/get_version_tag.py", ' + '"--tag-only"]' +) +FALLBACK_VERSION = 'fallback_version = "0.0.0.dev0"' + + +def _load_module(name, path): + spec = importlib.util.spec_from_file_location(name, path) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +register_cpu_ci = _load_module("ci_register", CI_REGISTER_PATH).register_cpu_ci +register_cpu_ci(est_time=2, suite="stage-a-test-cpu") + + +class TestGetVersionTag(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.version_helper = _load_module("get_version_tag", VERSION_HELPER_PATH) + + def test_parse_version_tuple_sorts_stable_above_rc_and_post_above_stable(self): + tags = ["v0.5.10rc0", "v0.5.9", "v0.5.10.post1", "v0.5.10"] + + self.assertEqual( + sorted(tags, key=self.version_helper.parse_version_tuple, reverse=True), + ["v0.5.10.post1", "v0.5.10", "v0.5.10rc0", "v0.5.9"], + ) + + def test_exact_version_tag_takes_precedence_over_latest_tag(self): + with patch.object( + self.version_helper, "get_exact_version_tag", return_value="v0.5.9" + ), patch.object( + self.version_helper, "get_latest_version_tag_describe" + ) as latest_describe: + self.assertEqual(self.version_helper.get_version_describe(), "v0.5.9") + + latest_describe.assert_not_called() + + def test_pyprojects_use_describe_mode_for_setuptools_scm(self): + for path in PYPROJECT_PATHS: + with self.subTest(path=path): + content = path.read_text() + self.assertIn(DESCRIBE_COMMAND, content) + self.assertNotIn(TAG_ONLY_DESCRIBE_COMMAND, content) + self.assertIn(FALLBACK_VERSION, content) + + def test_tag_only_cli_mode_remains_available_for_callers_that_need_latest_tag(self): + with patch.object( + sys, "argv", ["get_version_tag.py", "--tag-only"] + ), patch.object( + self.version_helper, "get_latest_version_tag", return_value="v0.5.10" + ), patch.object( + self.version_helper, "get_version_describe" + ) as version_describe, patch( + "builtins.print" + ) as print_mock: + self.version_helper.main() + + version_describe.assert_not_called() + print_mock.assert_called_once_with("v0.5.10") + + +if __name__ == "__main__": + unittest.main()