about summary refs log tree commit diff
path: root/pkgs/applications/editors/emacs/elisp-packages/manual-packages/tree-sitter-langs/update-defaults.py
blob: 128ce66dda8bcc3f16d61a2e2a611901e70d998a (plain) (blame)
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
#!/usr/bin/env nix-shell
#! nix-shell ../../../../../../../. -i python3 -p python3 -p nix

from os.path import (
    dirname,
    abspath,
    join,
)
from typing import (
    List,
    Any,
)
import subprocess
import json
import sys
import os


def fmt_grammar(grammar: str) -> str:
    return "tree-sitter-" + grammar


def eval_expr(nixpkgs: str, expr: str) -> Any:
    p = subprocess.run(
        [
            "nix-instantiate",
            "--json",
            "--eval",
            "--expr",
            ("with import %s {}; %s" % (nixpkgs, expr)),
        ],
        check=True,
        stdout=subprocess.PIPE,
    )
    return json.loads(p.stdout)


def check_grammar_exists(nixpkgs: str, grammar: str) -> bool:
    return eval_expr(
        nixpkgs, f'lib.hasAttr "{fmt_grammar(grammar)}" tree-sitter-grammars'
    )


def build_attr(nixpkgs, attr: str) -> str:
    return (
        subprocess.run(
            ["nix-build", "--no-out-link", nixpkgs, "-A", attr],
            check=True,
            stdout=subprocess.PIPE,
        )
        .stdout.decode()
        .strip()
    )


if __name__ == "__main__":
    cwd = dirname(abspath(__file__))
    nixpkgs = abspath(join(cwd, "../../../../../.."))

    src_dir = build_attr(nixpkgs, "emacs.pkgs.tree-sitter-langs.src")

    existing: List[str] = []

    grammars = os.listdir(join(src_dir, "repos"))
    for g in grammars:
        exists = check_grammar_exists(nixpkgs, g)
        if exists:
            existing.append(fmt_grammar(g))
        else:
            sys.stderr.write("Missing grammar: " + fmt_grammar(g) + "\n")
            sys.stderr.flush()

    with open(join(cwd, "default-grammars.json"), mode="w") as f:
        json.dump(sorted(existing), f, indent=2)
        f.write("\n")