aboutsummaryrefslogtreecommitdiff
blob: 9c63c25599d592cdceb281a26cdc4c386fb37711 (plain)
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
# Copyright 2014-2020 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

import collections

from portage.versions import _pkg_str


pkg_desc_index_node = collections.namedtuple(
    "pkg_desc_index_node", ["cp", "cpv_list", "desc"]
)


class pkg_node(str):
    """
    A minimal package node class. For performance reasons, inputs
    are not validated.
    """

    def __init__(self, cp, version, repo=None):
        self.__dict__["cp"] = cp
        self.__dict__["repo"] = repo
        self.__dict__["version"] = version
        self.__dict__["build_time"] = None

    def __new__(cls, cp, version, repo=None):
        return str.__new__(cls, cp + "-" + version)

    def __setattr__(self, name, value):
        raise AttributeError(
            "pkg_node instances are immutable", self.__class__, name, value
        )


def pkg_desc_index_line_format(cp, pkgs, desc):
    return f"{cp} {' '.join(_pkg_str(cpv).version for cpv in pkgs)}: {desc}\n"


def pkg_desc_index_line_read(line, repo=None):
    try:
        pkgs, desc = line.split(":", 1)
    except ValueError:
        return None
    desc = desc.strip()

    try:
        cp, pkgs = pkgs.split(" ", 1)
    except ValueError:
        return None

    cp_list = []
    for ver in pkgs.split():
        cp_list.append(pkg_node(cp, ver, repo))

    return pkg_desc_index_node(cp, tuple(cp_list), desc)