File: update_codeowners.py

package info (click to toggle)
firefox 147.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,683,324 kB
  • sloc: cpp: 7,607,156; javascript: 6,532,492; ansic: 3,775,158; python: 1,415,368; xml: 634,556; asm: 438,949; java: 186,241; sh: 62,751; makefile: 18,079; objc: 13,092; perl: 12,808; yacc: 4,583; cs: 3,846; pascal: 3,448; lex: 1,720; ruby: 1,003; php: 436; lisp: 258; awk: 247; sql: 66; sed: 54; csh: 10; exp: 6
file content (80 lines) | stat: -rw-r--r-- 2,902 bytes parent folder | download | duplicates (13)
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
import argparse
import os
from typing import Optional, Set

import requests

from ..manifest import manifest
from ..wpt import metadata, virtualenv

here = os.path.dirname(__file__)
wpt_root = os.path.abspath(os.path.join(here, os.pardir, os.pardir))


def get_parser() -> argparse.ArgumentParser:
    parser = argparse.ArgumentParser()
    parser.add_argument("--manifest", dest="manifest_path", help="Path to MANIFEST.json")
    parser.add_argument("metadata_path", help="Path to wpt metadata repository")
    return parser


def get_labels(interop_year: int = 2025) -> Set[str]:
    data_url = "https://raw.githubusercontent.com/web-platform-tests/wpt.fyi/refs/heads/main/webapp/static/interop-data.json"
    resp = requests.get(data_url)
    resp.raise_for_status()
    data = resp.json()
    focus_areas = data[str(interop_year)]["focus_areas"]
    labels = set()
    for focus_area in focus_areas.values():
        labels |= set(focus_area["labels"])

    return labels


def run_update_codeowners(venv: virtualenv.Virtualenv,
                          metadata_path: str,
                          manifest_path: Optional[str],
                          interop_year: int = 2025,
                          reviewer: Optional[str] = "@web-platform-tests/interop") -> int:
    if manifest_path is None:
        manifest_path = os.path.join(wpt_root, "MANIFEST.json")
    wpt_manifest = manifest.load_and_update(wpt_root, manifest_path, "/")

    labels = get_labels(interop_year)
    metadata_map = metadata.load_metadata_map(metadata_path)
    tests_by_label = metadata.get_labelled_tests(metadata_map,
                                                 list(labels))
    all_labelled_tests = set()
    for labelled_tests in tests_by_label.values():
        all_labelled_tests |= set(labelled_tests)

    test_lines = []
    for _test_type, rel_path, tests in wpt_manifest:
        if any(test.id in all_labelled_tests for test in tests):
            test_lines.append(f"{rel_path} {reviewer}\n")

    output = []
    start_line = "# GENERATED: interop-tests"
    end_line = "# END GENERATED"
    in_generated = False
    found_generated = False
    with open(os.path.join(wpt_root, "CODEOWNERS")) as f:
        for line in f:
            if not in_generated:
                if line.strip() == start_line:
                    output.append(line)
                    found_generated = True
                    in_generated = True
                    output.extend(test_lines)
                else:
                    output.append(line)
            else:
                if line.strip() == end_line:
                    in_generated = False
                    output.append(line)
    if not found_generated:
        output.extend(["\n", start_line + "\n"] + test_lines + [end_line + "\n"])
    with open(os.path.join(wpt_root, "CODEOWNERS"), "w") as f:
        f.writelines(output)

    return 0