File: sparse_profiles.py

package info (click to toggle)
firefox 148.0.2-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,719,544 kB
  • sloc: cpp: 7,618,291; javascript: 6,701,749; ansic: 3,781,787; python: 1,418,389; xml: 638,647; asm: 438,962; java: 186,285; sh: 62,894; makefile: 19,011; objc: 13,092; perl: 12,763; 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 (68 lines) | stat: -rw-r--r-- 2,290 bytes parent folder | download | duplicates (2)
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
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

import functools
from pathlib import Path

from gecko_taskgraph import GECKO


@functools.cache
def _get_taskgraph_sparse_profile():
    """
    Parse the taskgraph sparse profile and return the paths and globs it includes.
    """

    # We need this nested function to handle %include directives recursively
    def parse(profile_path):
        paths = set()
        globs = set()

        full_path = Path(GECKO) / profile_path
        if not full_path.exists():
            raise FileNotFoundError(
                f"Sparse profile '{full_path.stem}' not found at {full_path}"
            )

        for raw_line in full_path.read_text().splitlines():
            line = raw_line.strip()
            if not line or line.startswith("#") or line.startswith("["):
                continue
            if line.startswith("%include "):
                included_profile = line[len("%include ") :].strip()
                included_paths, included_globs = parse(included_profile)
                paths.update(included_paths)
                globs.update(included_globs)
            elif line.startswith("path:"):
                path = line[len("path:") :].strip()
                paths.add(Path(path))
            elif line.startswith("glob:"):
                glob = line[len("glob:") :].strip()
                globs.add(glob)

        return paths, globs

    return parse("build/sparse-profiles/taskgraph")


@functools.cache
def is_path_covered_by_taskgraph_sparse_profile(path):
    """
    Check if a given path would be included in the taskgraph sparse checkout.
    """
    profile_paths, profile_globs = _get_taskgraph_sparse_profile()
    path = Path(path)

    for profile_path in profile_paths:
        if path == profile_path or profile_path in path.parents:
            return True

    # Path.match requires at least one directory for ** patterns to match
    # root-level files, so we prepend a fake parent directory
    path_with_parent = Path("_", path)
    for pattern in profile_globs:
        if path_with_parent.match(pattern):
            return True

    return False