xref: /aosp_15_r20/external/pytorch/tools/linter/adapters/lintrunner_version_linter.py (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1from __future__ import annotations
2
3import json
4import subprocess
5import sys
6from enum import Enum
7from typing import NamedTuple
8
9
10LINTER_CODE = "LINTRUNNER_VERSION"
11
12
13class LintSeverity(str, Enum):
14    ERROR = "error"
15    WARNING = "warning"
16    ADVICE = "advice"
17    DISABLED = "disabled"
18
19
20class LintMessage(NamedTuple):
21    path: str | None
22    line: int | None
23    char: int | None
24    code: str
25    severity: LintSeverity
26    name: str
27    original: str | None
28    replacement: str | None
29    description: str | None
30
31
32def toVersionString(version_tuple: tuple[int, int, int]) -> str:
33    return ".".join(str(x) for x in version_tuple)
34
35
36if __name__ == "__main__":
37    version_str = (
38        subprocess.run(["lintrunner", "-V"], stdout=subprocess.PIPE)
39        .stdout.decode("utf-8")
40        .strip()
41    )
42
43    import re
44
45    version_match = re.compile(r"lintrunner (\d+)\.(\d+)\.(\d+)").match(version_str)
46
47    if not version_match:
48        err_msg = LintMessage(
49            path="<none>",
50            line=None,
51            char=None,
52            code=LINTER_CODE,
53            severity=LintSeverity.ERROR,
54            name="command-failed",
55            original=None,
56            replacement=None,
57            description="Lintrunner is not installed, did you forget to run `make setup-lint && make lint`?",
58        )
59        sys.exit(0)
60
61    curr_version = int(version_match[1]), int(version_match[2]), int(version_match[3])
62    min_version = (0, 10, 7)
63
64    if curr_version < min_version:
65        err_msg = LintMessage(
66            path="<none>",
67            line=None,
68            char=None,
69            code=LINTER_CODE,
70            severity=LintSeverity.ADVICE,
71            name="command-failed",
72            original=None,
73            replacement=None,
74            description="".join(
75                (
76                    f"Lintrunner is out of date (you have v{toVersionString(curr_version)} ",
77                    f"instead of v{toVersionString(min_version)}). ",
78                    "Please run `pip install lintrunner -U` to update it",
79                )
80            ),
81        )
82        print(json.dumps(err_msg._asdict()), flush=True)
83