File size: 2,753 Bytes
f10d14f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""How many of the public replay's G flags (Developer Flow merge requests, the agent's own version) are tests deleted
together with a feature flag: a `tests_removed` extra whose removed lines name a flag whose definition
(config/feature_flags/**/<name>.yml) the same diff deletes. Found after labelling (fleet 8, P1), not pre-registered;
the rules are not changed by it. Reads only the replay's cache (eval/cache/gitlab/).

usage: python3 eval/flag_tests.py            (writes results/public_replay_flag_tests.json)"""
from __future__ import annotations

import json, pathlib, re, sys

sys.path.insert(0, str(pathlib.Path(__file__).resolve().parent))
import replay_gitlab as G

FLAG = re.compile(r"(?:^|/)config/feature_flags/(?:.+/)?([^/]+)\.yml$")
OUT = G.ROOT / "results" / "public_replay_flag_tests.json"


def deleted_flags(files: list) -> set:
    return {m.group(1) for f in files if f.get("status") == "removed" and (m := FLAG.search(f["filename"]))}


def removed_text(f: dict | None) -> str:
    return "\n".join(l for l in ((f or {}).get("patch") or "").split("\n") if l.startswith("-") and not l.startswith("---"))


def flag_tests(files: list, extras: list) -> list:
    """The listed `tests_removed` extras whose removed lines name a flag the same diff deletes."""
    flags, by = deleted_flags(files), {f["filename"]: f for f in files}
    return [e for e in extras if e["kind"] == "tests_removed" and flags
            and any(re.search(rf"\b{re.escape(n)}\b", removed_text(by.get(e["path"]))) for n in flags)]


def summarize(rows: list, files_of) -> dict:
    out = {"merge_requests": 0, "deletes_a_flag_definition": 0, "extras": 0, "tests_removed": 0, "tests_naming_a_deleted_flag": 0}
    for r in rows:
        files = files_of(r)
        out["merge_requests"] += 1
        out["deletes_a_flag_definition"] += bool(deleted_flags(files))
        out["extras"] += len(r["extras"])
        out["tests_removed"] += sum(e["kind"] == "tests_removed" for e in r["extras"])
        out["tests_naming_a_deleted_flag"] += len(flag_tests(files, r["extras"]))
    return out


def main() -> int:
    G.AMENDMENT = 1
    raw = json.loads((G.ROOT / "results" / "public_replay_a1_raw.json").read_text())
    rows = sorted((r for r in raw if r["pop"] == "G" and r["version"] == "agent" and not r.get("excluded") and r.get("extras")),
                  key=lambda r: r["ref"])
    def files_of(r):
        return G.to_files(G.agent_version(G.versions_oldest_first(G.GITLAB, int(r["ref"].split("!")[1])))["diffs"])
    s = summarize(rows, files_of)
    OUT.write_text(json.dumps({"what": __doc__.split("\n\n")[0].replace("\n", " "), "G_agent_flagged": s}, indent=1) + "\n")
    print(s)
    return 0


if __name__ == "__main__":
    sys.exit(main())