tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

update_codeowners.py (2902B)


      1 import argparse
      2 import os
      3 from typing import Optional, Set
      4 
      5 import requests
      6 
      7 from ..manifest import manifest
      8 from ..wpt import metadata, virtualenv
      9 
     10 here = os.path.dirname(__file__)
     11 wpt_root = os.path.abspath(os.path.join(here, os.pardir, os.pardir))
     12 
     13 
     14 def get_parser() -> argparse.ArgumentParser:
     15    parser = argparse.ArgumentParser()
     16    parser.add_argument("--manifest", dest="manifest_path", help="Path to MANIFEST.json")
     17    parser.add_argument("metadata_path", help="Path to wpt metadata repository")
     18    return parser
     19 
     20 
     21 def get_labels(interop_year: int = 2025) -> Set[str]:
     22    data_url = "https://raw.githubusercontent.com/web-platform-tests/wpt.fyi/refs/heads/main/webapp/static/interop-data.json"
     23    resp = requests.get(data_url)
     24    resp.raise_for_status()
     25    data = resp.json()
     26    focus_areas = data[str(interop_year)]["focus_areas"]
     27    labels = set()
     28    for focus_area in focus_areas.values():
     29        labels |= set(focus_area["labels"])
     30 
     31    return labels
     32 
     33 
     34 def run_update_codeowners(venv: virtualenv.Virtualenv,
     35                          metadata_path: str,
     36                          manifest_path: Optional[str],
     37                          interop_year: int = 2025,
     38                          reviewer: Optional[str] = "@web-platform-tests/interop") -> int:
     39    if manifest_path is None:
     40        manifest_path = os.path.join(wpt_root, "MANIFEST.json")
     41    wpt_manifest = manifest.load_and_update(wpt_root, manifest_path, "/")
     42 
     43    labels = get_labels(interop_year)
     44    metadata_map = metadata.load_metadata_map(metadata_path)
     45    tests_by_label = metadata.get_labelled_tests(metadata_map,
     46                                                 list(labels))
     47    all_labelled_tests = set()
     48    for labelled_tests in tests_by_label.values():
     49        all_labelled_tests |= set(labelled_tests)
     50 
     51    test_lines = []
     52    for _test_type, rel_path, tests in wpt_manifest:
     53        if any(test.id in all_labelled_tests for test in tests):
     54            test_lines.append(f"{rel_path} {reviewer}\n")
     55 
     56    output = []
     57    start_line = "# GENERATED: interop-tests"
     58    end_line = "# END GENERATED"
     59    in_generated = False
     60    found_generated = False
     61    with open(os.path.join(wpt_root, "CODEOWNERS")) as f:
     62        for line in f:
     63            if not in_generated:
     64                if line.strip() == start_line:
     65                    output.append(line)
     66                    found_generated = True
     67                    in_generated = True
     68                    output.extend(test_lines)
     69                else:
     70                    output.append(line)
     71            else:
     72                if line.strip() == end_line:
     73                    in_generated = False
     74                    output.append(line)
     75    if not found_generated:
     76        output.extend(["\n", start_line + "\n"] + test_lines + [end_line + "\n"])
     77    with open(os.path.join(wpt_root, "CODEOWNERS"), "w") as f:
     78        f.writelines(output)
     79 
     80    return 0