xref: /openbmc/openbmc/poky/bitbake/lib/prserv/__init__.py (revision c124f4f2e04dca16a428a76c89677328bc7bf908)
1#
2# Copyright BitBake Contributors
3#
4# SPDX-License-Identifier: GPL-2.0-only
5#
6
7
8__version__ = "2.0.0"
9
10import logging
11logger = logging.getLogger("BitBake.PRserv")
12
13from bb.asyncrpc.client import parse_address, ADDR_TYPE_UNIX, ADDR_TYPE_WS
14
15def create_server(addr, dbpath, upstream=None, read_only=False):
16    from . import serv
17
18    s = serv.PRServer(dbpath, upstream=upstream, read_only=read_only)
19    host, port = addr.split(":")
20    s.start_tcp_server(host, int(port))
21
22    return s
23
24def increase_revision(ver):
25    """Take a revision string such as "1" or "1.2.3" or even a number and increase its last number
26    This fails if the last number is not an integer"""
27
28    fields=str(ver).split('.')
29    last = fields[-1]
30
31    try:
32         val = int(last)
33    except Exception as e:
34         logger.critical("Unable to increase revision value %s: %s" % (ver, e))
35         raise e
36
37    return ".".join(fields[0:-1] + [ str(val + 1) ])
38
39def _revision_greater_or_equal(rev1, rev2):
40    """Compares x.y.z revision numbers, using integer comparison
41    Returns True if rev1 is greater or equal to rev2"""
42
43    fields1 = rev1.split(".")
44    fields2 = rev2.split(".")
45    l1 = len(fields1)
46    l2 = len(fields2)
47
48    for i in range(l1):
49       val1 = int(fields1[i])
50       if i < l2:
51           val2 = int(fields2[i])
52           if val2 < val1:
53              return True
54           elif val2 > val1:
55              return False
56       else:
57          return True
58    return True
59
60def revision_smaller(rev1, rev2):
61    """Compares x.y.z revision numbers, using integer comparison
62    Returns True if rev1 is strictly smaller than rev2"""
63    return not(_revision_greater_or_equal(rev1, rev2))
64
65def revision_greater(rev1, rev2):
66    """Compares x.y.z revision numbers, using integer comparison
67    Returns True if rev1 is strictly greater than rev2"""
68    return _revision_greater_or_equal(rev1, rev2) and (rev1 != rev2)
69
70def create_client(addr):
71    from . import client
72
73    c = client.PRClient()
74
75    try:
76        (typ, a) = parse_address(addr)
77        c.connect_tcp(*a)
78        return c
79    except Exception as e:
80        c.close()
81        raise e
82
83async def create_async_client(addr):
84    from . import client
85
86    c = client.PRAsyncClient()
87
88    try:
89        (typ, a) = parse_address(addr)
90        await c.connect_tcp(*a)
91        return c
92
93    except Exception as e:
94        await c.close()
95        raise e
96