File size: 4,694 Bytes
61ba51e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#!/usr/bin/env python3
"""
Check if sgl-kernel version from sgl-kernel/pyproject.toml matches the versions
used in SGLang files (python/pyproject.toml, engine.py, and Dockerfile).
Sets GitHub Actions output variables to indicate if sync is needed.
"""

import os
import re
import sys
from pathlib import Path

try:
    import tomllib  # Python 3.11+
except ImportError:
    import tomli as tomllib  # Fallback for older Python versions


def get_kernel_version_from_source() -> str:
    """Extract version from sgl-kernel/pyproject.toml (line 11)"""
    pyproject_path = Path("sgl-kernel/pyproject.toml")

    if not pyproject_path.exists():
        print(f"Error: {pyproject_path} not found")
        sys.exit(1)

    with open(pyproject_path, "rb") as f:
        data = tomllib.load(f)

    version = data.get("project", {}).get("version")
    if not version:
        print("Error: Could not find version in sgl-kernel/pyproject.toml")
        sys.exit(1)

    return version


def get_kernel_version_from_python_pyproject() -> str:
    """Extract sgl-kernel version from python/pyproject.toml"""
    pyproject_path = Path("python/pyproject.toml")

    if not pyproject_path.exists():
        print(f"Error: {pyproject_path} not found")
        sys.exit(1)

    content = pyproject_path.read_text()

    # Match "sgl-kernel==x.x.x"
    match = re.search(r'"sgl-kernel==([^"]+)"', content)
    if not match:
        print("Error: Could not find sgl-kernel version in python/pyproject.toml")
        sys.exit(1)

    return match.group(1)


def get_kernel_version_from_engine() -> str:
    """Extract sgl-kernel version from python/sglang/srt/entrypoints/engine.py"""
    engine_path = Path("python/sglang/srt/entrypoints/engine.py")

    if not engine_path.exists():
        print(f"Error: {engine_path} not found")
        sys.exit(1)

    content = engine_path.read_text()

    # Find the assert_pkg_version call for sgl-kernel
    # Look for the pattern: assert_pkg_version("sgl-kernel", "version", ...)
    match = re.search(
        r'assert_pkg_version\s*\(\s*"sgl-kernel"\s*,\s*"([^"]+)"', content
    )
    if not match:
        print("Error: Could not find sgl-kernel version in engine.py")
        sys.exit(1)

    return match.group(1)


def get_kernel_version_from_dockerfile() -> str:
    """Extract SGL_KERNEL_VERSION from docker/Dockerfile"""
    dockerfile_path = Path("docker/Dockerfile")

    if not dockerfile_path.exists():
        print(f"Error: {dockerfile_path} not found")
        sys.exit(1)

    content = dockerfile_path.read_text()

    # Match ARG SGL_KERNEL_VERSION=x.x.x
    match = re.search(r"^ARG\s+SGL_KERNEL_VERSION=(.+)$", content, re.MULTILINE)
    if not match:
        print("Error: Could not find SGL_KERNEL_VERSION in Dockerfile")
        sys.exit(1)

    return match.group(1).strip()


def main():
    kernel_version = get_kernel_version_from_source()
    pyproject_version = get_kernel_version_from_python_pyproject()
    engine_version = get_kernel_version_from_engine()
    dockerfile_version = get_kernel_version_from_dockerfile()

    print(f"Kernel version in sgl-kernel/pyproject.toml: {kernel_version}")
    print(f"Kernel version in python/pyproject.toml: {pyproject_version}")
    print(f"Kernel version in engine.py: {engine_version}")
    print(f"Kernel version in Dockerfile: {dockerfile_version}")

    # Check if any version differs from the source
    needs_sync = (
        kernel_version != pyproject_version
        or kernel_version != engine_version
        or kernel_version != dockerfile_version
    )

    # Set GitHub Actions output
    github_output = os.getenv("GITHUB_OUTPUT")
    if github_output:
        with open(github_output, "a") as f:
            f.write(f"needs_sync={'true' if needs_sync else 'false'}\n")
            f.write(f"kernel_version={kernel_version}\n")

    if needs_sync:
        print(f"\n✓ Sync needed to version: {kernel_version}")
        mismatches = []
        if kernel_version != pyproject_version:
            mismatches.append(
                f"  - python/pyproject.toml: {pyproject_version}{kernel_version}"
            )
        if kernel_version != engine_version:
            mismatches.append(f"  - engine.py: {engine_version}{kernel_version}")
        if kernel_version != dockerfile_version:
            mismatches.append(
                f"  - Dockerfile: {dockerfile_version}{kernel_version}"
            )

        print("Changes needed:")
        for mismatch in mismatches:
            print(mismatch)

        sys.exit(0)
    else:
        print("\n✓ All versions are in sync, no action needed")
        sys.exit(0)


if __name__ == "__main__":
    main()