File: filter.py

package info (click to toggle)
apt-mirror2 15-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,388 kB
  • sloc: python: 5,337; sh: 23; makefile: 14
file content (64 lines) | stat: -rw-r--r-- 2,027 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
# SPDX-License-Identifer: GPL-3.0-or-later


class PackageFilter:
    def __init__(self) -> None:
        self.include_source_name: set[str] = set()
        self.exclude_source_name: set[str] = set()
        self.include_binary_packages: set[str] = set()
        self.exclude_binary_packages: set[str] = set()
        self.include_sections: set[str] = set()
        self.exclude_sections: set[str] = set()
        self.include_tags: set[str] = set()
        self.exclude_tags: set[str] = set()

    def package_allowed(
        self,
        source_name: str,
        package_name: str | None = None,
        section: str | None = None,
        tags: set[str] | None = None,
    ) -> bool:
        if self.include_source_name and source_name not in self.include_source_name:
            return False

        if self.exclude_source_name and source_name in self.exclude_source_name:
            return False

        if package_name:
            if (
                self.include_binary_packages
                and package_name not in self.include_binary_packages
            ):
                return False

            if (
                self.exclude_binary_packages
                and package_name in self.exclude_binary_packages
            ):
                return False

        if section:
            if self.include_sections and not any(
                s == section for s in self.include_sections
            ):
                return False

            if self.exclude_sections and any(
                s == section for s in self.exclude_sections
            ):
                return False

        if tags:
            tags = self._split_tags(tags)

            if self.include_tags and not any(t in tags for t in self.include_tags):
                return False

            if self.exclude_tags and any(t in tags for t in self.exclude_tags):
                return False

        return True

    def _split_tags(self, tags: set[str]) -> set[str]:
        return tags.union({t.split("::")[0] for t in tags})